diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | stdio-common/tstscanf.c | 6 | ||||
-rw-r--r-- | stdio-common/vfscanf.c | 36 |
3 files changed, 30 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog index 2b8890f6ce..0c53481876 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-10-04 Jakub Jelinek <jakub@redhat.com> + + * stdio-common/vfscanf.c (_IO_vfscanf): For [ conversion do + input_error() if EOF is seen before processing. + * stdio-common/tstscanf.c (main): Add testcase. + 2000-10-04 Ulrich Drepper <drepper@redhat.com> * argp/argp-help.c: Make sure we get the correct gettext and diff --git a/stdio-common/tstscanf.c b/stdio-common/tstscanf.c index 4732657e53..6cf5738416 100644 --- a/stdio-common/tstscanf.c +++ b/stdio-common/tstscanf.c @@ -46,6 +46,12 @@ main (int argc, char **argv) result = 1; } + if (sscanf ("", "%10[a-z]", buf) != EOF) + { + fputs ("test failed!\n", stdout); + result = 1; + } + sscanf ("conversion] Zero flag Ze]ro#\n", "%*[^]] %[^#]\n", buf); if (strcmp (buf, "] Zero flag Ze]ro") != 0) { diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c index 43d25ee7a7..cf3befd399 100644 --- a/stdio-common/vfscanf.c +++ b/stdio-common/vfscanf.c @@ -1973,13 +1973,13 @@ __vfscanf (FILE *s, const char *format, va_list argptr) { size_t now = read_in; #ifdef COMPILE_WSCANF + if (inchar () == WEOF) + input_error (); + do { wchar_t *runp; - if (inchar () == WEOF) - break; - /* Test whether it's in the scanlist. */ runp = tw; while (runp < wp) @@ -2063,21 +2063,20 @@ __vfscanf (FILE *s, const char *format, va_list argptr) } } } - while (--width > 0); + while (--width > 0 && inchar () != WEOF); out: #else char buf[MB_LEN_MAX]; size_t cnt = 0; mbstate_t cstate; + if (inchar () == EOF) + input_error (); + memset (&cstate, '\0', sizeof (cstate)); do { - again: - if (inchar () == EOF) - break; - if (wp[c] == not_in) { ungetc_not_eof (c, s); @@ -2097,7 +2096,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr) /* Possibly correct character, just not enough input. */ assert (cnt < MB_CUR_MAX); - goto again; + continue; } if (n != cnt) @@ -2142,8 +2141,11 @@ __vfscanf (FILE *s, const char *format, va_list argptr) } } } + + if (--width <= 0) + break; } - while (--width > 0); + while (inchar () != EOF); if (cnt != 0) /* We stopped in the middle of recognizing another @@ -2175,6 +2177,10 @@ __vfscanf (FILE *s, const char *format, va_list argptr) else { size_t now = read_in; + + if (inchar () == EOF) + input_error (); + #ifdef COMPILE_WSCANF memset (&state, '\0', sizeof (state)); @@ -2184,9 +2190,6 @@ __vfscanf (FILE *s, const char *format, va_list argptr) wchar_t *runp; size_t n; - if (inchar () == WEOF) - break; - /* Test whether it's in the scanlist. */ runp = tw; while (runp < wp) @@ -2275,14 +2278,11 @@ __vfscanf (FILE *s, const char *format, va_list argptr) assert (n <= MB_CUR_MAX); str += n; } - while (--width > 0); + while (--width > 0 && inchar () != WEOF); out2: #else do { - if (inchar () == EOF) - break; - if (wp[c] == not_in) { ungetc_not_eof (c, s); @@ -2328,7 +2328,7 @@ __vfscanf (FILE *s, const char *format, va_list argptr) } } } - while (--width > 0); + while (--width > 0 && inchar () != EOF); #endif if (now == read_in) |