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:
parent
9283118f01
commit
76423301d3
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user