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 | |
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) { | 
