diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-03-13 12:37:51 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-03-13 12:37:51 -0400 |
commit | 291f839a440423a15487ba95822247adb2b098f6 (patch) | |
tree | 6cc1237ffcb458a394e4785290fdfc55a35e5fd9 | |
parent | bf9d9dcaa631db9918452d05c188f01c8e5f537f (diff) | |
download | musl-291f839a440423a15487ba95822247adb2b098f6.tar.gz musl-291f839a440423a15487ba95822247adb2b098f6.tar.xz musl-291f839a440423a15487ba95822247adb2b098f6.zip |
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.
-rw-r--r-- | src/stdio/__scanf.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/src/stdio/__scanf.c b/src/stdio/__scanf.c index 062327d7..7c82cca4 100644 --- a/src/stdio/__scanf.c +++ b/src/stdio/__scanf.c @@ -319,34 +319,29 @@ int __scanf(rctx_t *r, const wchar_t *fmt, va_list ap) unread(r); break; } + m = 1; 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 (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) { |