X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fstdio%2Fvfscanf.c;h=64fa97543142e16012f34c632ffbca209cf05cf6;hb=cb81b6947c0277a6a27ddc699d716e9cf2b524aa;hp=926d8a9d13d4c3aa455aa8bb6c4610ac742dde7e;hpb=03de77f5210addfd2ca2b35137152edfe2ab70be;p=musl diff --git a/src/stdio/vfscanf.c b/src/stdio/vfscanf.c index 926d8a9d..64fa9754 100644 --- a/src/stdio/vfscanf.c +++ b/src/stdio/vfscanf.c @@ -227,14 +227,14 @@ int vfscanf(FILE *f, const char *fmt, va_list ap) scanset[0] = 0; if (*p == '-') p++, scanset[1+'-'] = 1-invert; - if (*p == ']') p++, scanset[1+']'] = 1-invert; - for (; *p && *p != ']'; p++) { - if (*p=='-' && p[1] != ']') + else if (*p == ']') p++, scanset[1+']'] = 1-invert; + for (; *p != ']'; p++) { + if (!*p) goto fmt_fail; + if (*p=='-' && p[1] && p[1] != ']') for (c=p++[-1]; c<*p; c++) scanset[1+c] = 1-invert; scanset[1+*p] = 1-invert; } - if (!*p) goto fmt_fail; if (size == SIZE_l) { st = (mbstate_t){0}; @@ -291,7 +291,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap) case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': - y = __floatscan(f, -1, size, 0); + y = __floatscan(f, size, 0); if (!shcnt(f)) goto match_fail; if (dest) switch (size) { case SIZE_def: @@ -312,6 +312,7 @@ int vfscanf(FILE *f, const char *fmt, va_list ap) if (readwc(c, &wcs, &st) < 0) goto input_fail; } + shunget(f); if (!mbsinit(&st)) goto input_fail; if (dest) *wcs++ = 0; break;