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 <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
This commit is contained in:
parent
69ae34076f
commit
51de7ccb42
|
@ -2239,7 +2239,7 @@ zfs_do_upgrade(int argc, char **argv)
|
||||||
boolean_t showversions = B_FALSE;
|
boolean_t showversions = B_FALSE;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
upgrade_cbdata_t cb = { 0 };
|
upgrade_cbdata_t cb = { 0 };
|
||||||
signed char c;
|
int c;
|
||||||
int flags = ZFS_ITER_ARGS_CAN_BE_PATHS;
|
int flags = ZFS_ITER_ARGS_CAN_BE_PATHS;
|
||||||
|
|
||||||
/* check options */
|
/* check options */
|
||||||
|
@ -3933,7 +3933,7 @@ static int
|
||||||
zfs_do_snapshot(int argc, char **argv)
|
zfs_do_snapshot(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
signed char c;
|
int c;
|
||||||
nvlist_t *props;
|
nvlist_t *props;
|
||||||
snap_cbdata_t sd = { 0 };
|
snap_cbdata_t sd = { 0 };
|
||||||
boolean_t multiple_snaps = B_FALSE;
|
boolean_t multiple_snaps = B_FALSE;
|
||||||
|
|
|
@ -973,7 +973,7 @@ zpool_do_remove(int argc, char **argv)
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
zpool_handle_t *zhp = NULL;
|
zpool_handle_t *zhp = NULL;
|
||||||
boolean_t stop = B_FALSE;
|
boolean_t stop = B_FALSE;
|
||||||
char c;
|
int c;
|
||||||
boolean_t noop = B_FALSE;
|
boolean_t noop = B_FALSE;
|
||||||
boolean_t parsable = B_FALSE;
|
boolean_t parsable = B_FALSE;
|
||||||
|
|
||||||
|
|
|
@ -237,7 +237,7 @@ main(int argc, char *argv[])
|
||||||
struct drr_write_embedded *drrwe = &thedrr.drr_u.drr_write_embedded;
|
struct drr_write_embedded *drrwe = &thedrr.drr_u.drr_write_embedded;
|
||||||
struct drr_object_range *drror = &thedrr.drr_u.drr_object_range;
|
struct drr_object_range *drror = &thedrr.drr_u.drr_object_range;
|
||||||
struct drr_checksum *drrc = &thedrr.drr_u.drr_checksum;
|
struct drr_checksum *drrc = &thedrr.drr_u.drr_checksum;
|
||||||
char c;
|
int c;
|
||||||
boolean_t verbose = B_FALSE;
|
boolean_t verbose = B_FALSE;
|
||||||
boolean_t very_verbose = B_FALSE;
|
boolean_t very_verbose = B_FALSE;
|
||||||
boolean_t first = B_TRUE;
|
boolean_t first = B_TRUE;
|
||||||
|
|
Loading…
Reference in New Issue