Fix a segmentation fault in argument processing.

The crash was caused by a command line such as this one:
# foldl -b1

PR:		bin/151592
Reported by:	Marcus Reid <marcus@blazingdot.com>
Tested by:	Marcus Reid <marcus@blazingdot.com>
MFC after:	3 days
This commit is contained in:
Jean-Sébastien Pédron 2010-11-06 17:48:46 +00:00
parent 9283118f01
commit 76423301d3

View File

@ -71,14 +71,14 @@ int sflag; /* Split on word boundaries */
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
int ch; int ch, previous_ch;
int rval, width; int rval, width;
char *p;
(void) setlocale(LC_CTYPE, ""); (void) setlocale(LC_CTYPE, "");
width = -1; width = -1;
while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1) previous_ch = 0;
while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1) {
switch (ch) { switch (ch) {
case 'b': case 'b':
bflag = 1; bflag = 1;
@ -93,17 +93,33 @@ main(int argc, char **argv)
break; break;
case '0': case '1': case '2': case '3': case '4': case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '5': case '6': case '7': case '8': case '9':
if (width == -1) { /* Accept a width as eg. -30. Note that a width
p = argv[optind - 1]; * specified using the -w option is always used prior
if (p[0] == '-' && p[1] == ch && !p[2]) * to this undocumented option. */
width = atoi(++p); switch (previous_ch) {
else case '0': case '1': case '2': case '3': case '4':
width = atoi(argv[optind] + 1); case '5': case '6': case '7': case '8': case '9':
/* The width is a number with multiple digits:
* add the last one. */
width = width * 10 + (ch - '0');
break;
default:
/* Set the width, unless it was previously
* set. For instance, the following options
* would all give a width of 5 and not 10:
* -10 -w5
* -5b10
* -5 -10b */
if (width == -1)
width = ch - '0';
break;
} }
break; break;
default: default:
usage(); usage();
} }
previous_ch = ch;
}
argv += optind; argv += optind;
argc -= optind; argc -= optind;