if i pass "1filename" as an argument to -A, -B, or -C, it's not out
of range, it's not a number.
this converts the arg processing to use strtonum so the errors are
better.
however, maybe the errors are standardised and this breaks compat
with posix or something?
Index: grep.c
===================================================================
RCS file: /cvs/src/usr.bin/grep/grep.c,v
retrieving revision 1.51
diff -u -p -r1.51 grep.c
--- grep.c 30 Apr 2015 13:49:04 -0000 1.51
+++ grep.c 26 Aug 2015 00:29:30 -0000
@@ -235,7 +235,8 @@ main(int argc, char *argv[])
int c, lastc, prevoptind, newarg, i, needpattern, exprs, expr_sz;
struct patfile *patfile, *pf_next;
long l;
- char *ep, **expr;
+ char **expr;
+ const char *errstr;
SLIST_INIT(&patfilelh);
switch (__progname[0]) {
@@ -279,10 +280,9 @@ main(int argc, char *argv[])
break;
case 'A':
case 'B':
- l = strtol(optarg, &ep, 10);
- if (ep == optarg || *ep != '\0' ||
- l <= 0 || l >= INT_MAX)
- errx(2, "context out of range");
+ l = strtonum(optarg, 1, INT_MAX, &errstr);
+ if (errstr != NULL)
+ errx(2, "context %s", errstr);
if (c == 'A')
Aflag = (int)l;
else
@@ -292,10 +292,9 @@ main(int argc, char *argv[])
if (optarg == NULL)
Aflag = Bflag = 2;
else {
- l = strtol(optarg, &ep, 10);
- if (ep == optarg || *ep != '\0' ||
- l <= 0 || l >= INT_MAX)
- errx(2, "context out of range");
+ l = strtonum(optarg, 1, INT_MAX, &errstr);
+ if (errstr != NULL)
+ errx(2, "context %s", errstr);
Aflag = Bflag = (int)l;
}
break;