fix scanf handling of "0" (followed by immediate EOF) with "%x"

other cases with %x were probably broken too.

I would actually like to go ahead and replace this code in scanf with
calls to the new __intparse framework, but for now this calls for a
quick and unobtrusive fix without the risk of breaking other things.
This commit is contained in:
Rich Felker 2012-03-13 12:37:51 -04:00
parent bf9d9dcaa6
commit 291f839a44
1 changed files with 6 additions and 11 deletions

View File

@ -319,34 +319,29 @@ int __scanf(rctx_t *r, const wchar_t *fmt, va_list ap)
unread(r);
break;
}
if (((c=read(r))|0x20) != 'x') {
if (t == 'i') {
t = 'o';
/* lone 0 is valid octal */
if ((unsigned)(c-'0') >= 8) {
m = 1;
goto int_finish;
}
}
if (((c=read(r))|0x20) != 'x') {
if (t == 'i') t = 'o';
unread(r);
break;
}
t = 'x';
m = 0;
}
}
switch (t) {
case 'd':
case 'u':
for (m=0; isdigit(c=read(r)); m=1)
for (; isdigit(c=read(r)); m=1)
i = 10*i + c-'0';
goto int_finish;
case 'o':
for (m=0; (unsigned)(c=read(r))-'0' < 8; m=1)
for (; (unsigned)(c=read(r))-'0' < 8; m=1)
i = (i<<3) + c-'0';
goto int_finish;
case 'x':
for (m=0; ; m=1) {
for (; ; m=1) {
if (isdigit(c=read(r))) {
i = (i<<4) + c-'0';
} else if ((unsigned)(c|0x20)-'a' < 6) {