From 0869b74a1edc1e3375b560f788038615f37feac4 Mon Sep 17 00:00:00 2001 From: loli10K Date: Tue, 28 May 2019 20:14:58 +0200 Subject: [PATCH] Endless loop in zpool_do_remove() on platforms with unsigned char On systems where "char" is an unsigned type the value returned by getopt() will never be negative (-1), leading to an endless loop: this issue prevents both 'zpool remove' and 'zstreamdump' for working on some systems. Reviewed-by: Igor Kozhukhov Reviewed-by: Brian Behlendorf Reviewed-by: Chris Dunlop Signed-off-by: loli10K Closes #8789 --- cmd/zfs/zfs_main.c | 4 ++-- cmd/zpool/zpool_main.c | 2 +- cmd/zstreamdump/zstreamdump.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c index c85154479..d75f089ac 100644 --- a/cmd/zfs/zfs_main.c +++ b/cmd/zfs/zfs_main.c @@ -2239,7 +2239,7 @@ zfs_do_upgrade(int argc, char **argv) boolean_t showversions = B_FALSE; int ret = 0; upgrade_cbdata_t cb = { 0 }; - signed char c; + int c; int flags = ZFS_ITER_ARGS_CAN_BE_PATHS; /* check options */ @@ -3933,7 +3933,7 @@ static int zfs_do_snapshot(int argc, char **argv) { int ret = 0; - signed char c; + int c; nvlist_t *props; snap_cbdata_t sd = { 0 }; boolean_t multiple_snaps = B_FALSE; diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index 5d3191476..2cb6774b9 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -973,7 +973,7 @@ zpool_do_remove(int argc, char **argv) int i, ret = 0; zpool_handle_t *zhp = NULL; boolean_t stop = B_FALSE; - char c; + int c; boolean_t noop = B_FALSE; boolean_t parsable = B_FALSE; diff --git a/cmd/zstreamdump/zstreamdump.c b/cmd/zstreamdump/zstreamdump.c index ed88729b5..a162eceda 100644 --- a/cmd/zstreamdump/zstreamdump.c +++ b/cmd/zstreamdump/zstreamdump.c @@ -237,7 +237,7 @@ main(int argc, char *argv[]) struct drr_write_embedded *drrwe = &thedrr.drr_u.drr_write_embedded; struct drr_object_range *drror = &thedrr.drr_u.drr_object_range; struct drr_checksum *drrc = &thedrr.drr_u.drr_checksum; - char c; + int c; boolean_t verbose = B_FALSE; boolean_t very_verbose = B_FALSE; boolean_t first = B_TRUE;