about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-03-13 12:37:51 -0400
committerRich Felker <dalias@aerifal.cx>2012-03-13 12:37:51 -0400
commit291f839a440423a15487ba95822247adb2b098f6 (patch)
tree6cc1237ffcb458a394e4785290fdfc55a35e5fd9
parentbf9d9dcaa631db9918452d05c188f01c8e5f537f (diff)
downloadmusl-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.c17
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) {