diff options
author | Ron Yorston <rmy@pobox.com> | 2024-11-06 15:14:41 +0000 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2024-12-09 02:16:44 +0100 |
commit | 175b8dda19022f5ca5b81f87248924817e7ea1cf (patch) | |
tree | ad6adc9957fcdbd317b1eba58a502acf36d4c14f | |
parent | e6f3a3b381fd32fc711b410aff9c9a37b75d353f (diff) | |
download | busybox-w32-175b8dda19022f5ca5b81f87248924817e7ea1cf.tar.gz busybox-w32-175b8dda19022f5ca5b81f87248924817e7ea1cf.tar.bz2 busybox-w32-175b8dda19022f5ca5b81f87248924817e7ea1cf.zip |
libbb: tidy argument checks in getopt32()
When getopt32() has complementary options it's possible to specify
the minimum and maximum number of arguments allowed. Checking
these values was inconsistent:
- '?' correctly checked that it was followed by a digit but set
the otherwise unused spec_flgs variable on error.
- '=' failed to check that it was followed by a digit.
function old new delta
vgetopt32 1307 1319 +12
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | libbb/getopt32.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/libbb/getopt32.c b/libbb/getopt32.c index e861d0567..a8dd85159 100644 --- a/libbb/getopt32.c +++ b/libbb/getopt32.c | |||
@@ -348,9 +348,6 @@ vgetopt32(char **argv, const char *applet_opts, const char *applet_long_options, | |||
348 | unsigned trigger; | 348 | unsigned trigger; |
349 | int min_arg = 0; | 349 | int min_arg = 0; |
350 | int max_arg = -1; | 350 | int max_arg = -1; |
351 | int spec_flgs = 0; | ||
352 | |||
353 | #define SHOW_USAGE_IF_ERROR 1 | ||
354 | 351 | ||
355 | on_off = complementary; | 352 | on_off = complementary; |
356 | memset(on_off, 0, sizeof(complementary)); | 353 | memset(on_off, 0, sizeof(complementary)); |
@@ -449,9 +446,7 @@ vgetopt32(char **argv, const char *applet_opts, const char *applet_long_options, | |||
449 | continue; | 446 | continue; |
450 | c = s[1]; | 447 | c = s[1]; |
451 | if (*s == '?') { | 448 | if (*s == '?') { |
452 | if (c < '0' || c > '9') { | 449 | if (c >= '0' && c <= '9') { |
453 | spec_flgs |= SHOW_USAGE_IF_ERROR; | ||
454 | } else { | ||
455 | max_arg = c - '0'; | 450 | max_arg = c - '0'; |
456 | s++; | 451 | s++; |
457 | } | 452 | } |
@@ -465,8 +460,10 @@ vgetopt32(char **argv, const char *applet_opts, const char *applet_long_options, | |||
465 | continue; | 460 | continue; |
466 | } | 461 | } |
467 | if (*s == '=') { | 462 | if (*s == '=') { |
468 | min_arg = max_arg = c - '0'; | 463 | if (c >= '0' && c <= '9') { |
469 | s++; | 464 | min_arg = max_arg = c - '0'; |
465 | s++; | ||
466 | } | ||
470 | continue; | 467 | continue; |
471 | } | 468 | } |
472 | for (on_off = complementary; on_off->opt_char; on_off++) | 469 | for (on_off = complementary; on_off->opt_char; on_off++) |