about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--stdio-common/tstscanf.c6
-rw-r--r--stdio-common/vfscanf.c36
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)