Greetings all.
Attached is a small patch that aims to clean up a few minor bugs in the
cmdopt.cpp. Log below.
--Andrew Black
Log:
* cmdopt.cpp (parse_limit_opts): Restrict sub-option values to
non-negative integers
(eval_options): Ditto for -t, --exit, and --sleep, Fix off-by one error
in logic for --ignore and --ulimit, leading to incorrect parsing
Index: cmdopt.cpp
===================================================================
--- cmdopt.cpp (revision 449032)
+++ cmdopt.cpp (working copy)
@@ -333,6 +333,10 @@
arg += limits [i].len + 1;
+ if (!isdigit(*arg)) {
+ return 1;
+ }
+
char *end;
const long lim = strtol (arg, &end, 10);
@@ -461,8 +465,10 @@
optname = opt_timeout;
optarg = get_short_val (argv, &i);
if (optarg) {
+ if (!isdigit(*optarg))
+ bad_value (optname, optarg);
timeout = strtol (optarg, &end, 10);
- if (*end || timeout < 0 || errno)
+ if (*end || errno)
bad_value (optname, optarg);
}
else
@@ -512,6 +518,8 @@
optname = opt_exit;
optarg = get_long_val (argv, &i, sizeof opt_exit - 1);
if (optarg && *optarg) {
+ if (!isdigit(*optarg))
+ bad_value (optname, optarg);
const long code = strtol (optarg, &end, 10);
if ('\0' == *end && !errno)
exit (code);
@@ -528,6 +536,8 @@
optname = opt_sleep;
optarg = get_long_val (argv, &i, sizeof opt_sleep - 1);
if (optarg && *optarg) {
+ if (!isdigit(*optarg))
+ bad_value (optname, optarg);
const long nsec = strtol (optarg, &end, 10);
if ('\0' == *end && 0 <= nsec && !errno) {
rw_sleep (nsec);
@@ -549,10 +559,10 @@
}
}
}
- else if ( sizeof opt_ignore <= arglen
+ else if ( sizeof opt_ignore - 1 <= arglen
&& !memcmp (opt_ignore, argv [i], sizeof opt_ignore - 1)) {
optname = opt_ignore;
- optarg = get_long_val (argv, &i, sizeof opt_ignore);
+ optarg = get_long_val (argv, &i, sizeof opt_ignore - 1);
if (optarg && *optarg) {
const long signo = get_signo (optarg);
if (0 <= signo) {
@@ -563,7 +573,7 @@
}
}
}
- else if ( sizeof opt_ulimit <= arglen
+ else if ( sizeof opt_ulimit - 1 <= arglen
&& !memcmp (opt_ulimit, argv [i], sizeof opt_ulimit - 1)) {
optname = opt_ulimit;
optarg = get_long_val (argv, &i, sizeof opt_ulimit - 1);