about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBartosz Brachaczek <b.brachaczek@gmail.com>2017-07-09 23:00:18 +0200
committerRich Felker <dalias@aerifal.cx>2017-09-04 16:59:38 -0400
commit9255dad97e7bfd4165d1aa0f93f2aae321a7a4d8 (patch)
treec8bb838f61cc2a6141199893fe49c92103e3a81d
parent51bdcdc424bd7169c8cccdc2de7cad17f5ea0f70 (diff)
downloadmusl-9255dad97e7bfd4165d1aa0f93f2aae321a7a4d8.tar.gz
musl-9255dad97e7bfd4165d1aa0f93f2aae321a7a4d8.tar.xz
musl-9255dad97e7bfd4165d1aa0f93f2aae321a7a4d8.zip
handle whitespace before %% in scanf
this is mandated by C and POSIX standards and is in accordance with
glibc behavior.
-rw-r--r--src/stdio/vfscanf.c10
-rw-r--r--src/stdio/vfwscanf.c8
2 files changed, 13 insertions, 5 deletions
diff --git a/src/stdio/vfscanf.c b/src/stdio/vfscanf.c
index d4d2454b..9e030fc4 100644
--- a/src/stdio/vfscanf.c
+++ b/src/stdio/vfscanf.c
@@ -89,15 +89,19 @@ int vfscanf(FILE *restrict f, const char *restrict fmt, va_list ap)
 			continue;
 		}
 		if (*p != '%' || p[1] == '%') {
-			p += *p=='%';
 			shlim(f, 0);
-			c = shgetc(f);
+			if (*p == '%') {
+				p++;
+				while (isspace((c=shgetc(f))));
+			} else {
+				c = shgetc(f);
+			}
 			if (c!=*p) {
 				shunget(f);
 				if (c<0) goto input_fail;
 				goto match_fail;
 			}
-			pos++;
+			pos += shcnt(f);
 			continue;
 		}
 
diff --git a/src/stdio/vfwscanf.c b/src/stdio/vfwscanf.c
index 1ebc5cef..a7cd0923 100644
--- a/src/stdio/vfwscanf.c
+++ b/src/stdio/vfwscanf.c
@@ -117,8 +117,12 @@ int vfwscanf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap)
 			continue;
 		}
 		if (*p != '%' || p[1] == '%') {
-			p += *p=='%';
-			c = getwc(f);
+			if (*p == '%') {
+				p++;
+				while (iswspace((c=getwc(f)))) pos++;
+			} else {
+				c = getwc(f);
+			}
 			if (c!=*p) {
 				ungetwc(c, f);
 				if (c<0) goto input_fail;