]> granicus.if.org Git - zfs/commitdiff
Endless loop in zpool_do_remove() on platforms with unsigned char
authorloli10K <loli10K@users.noreply.github.com>
Tue, 28 May 2019 18:14:58 +0000 (20:14 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 28 May 2019 18:14:58 +0000 (11:14 -0700)
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 <igor@dilos.org>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Chris Dunlop <chris@onthe.net.au>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #8789

cmd/zfs/zfs_main.c
cmd/zpool/zpool_main.c
cmd/zstreamdump/zstreamdump.c

index c85154479cbfb82e83ad5f8c1cb2130729a1c9a6..d75f089acd1fbd2c4738c8705858125765962f9a 100644 (file)
@@ -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;
index 5d3191476462344ea6a7bdb5a23b7a657bdec993..2cb6774b9adb0d17d913facf4fe4a1f58ae82494 100644 (file)
@@ -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;
 
index ed88729b5182616d229e3d6ea5b8f9abd225a893..a162eceda58fb05aa8f3225c3eb1598a9dff7fc6 100644 (file)
@@ -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;