about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--manual/stdio.texi10
-rw-r--r--stdio-common/vfscanf.c26
3 files changed, 17 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index a9c4e8d489..ccb25c56d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2001-08-09  Ulrich Drepper  <drepper@redhat.com>
 
+	* stdio-common/vfscanf.c: Fix reading of wide chars and strings if
+	not COMPILE_WSCANF.
+
 	* libio/vswprintf.c (_IO_vswprintf): Fix return value handling
 	which is different from snprintf.
 	* libio/tst_swprintf.c: Add tests for too small output buffer.
diff --git a/manual/stdio.texi b/manual/stdio.texi
index bd140e46d7..19a84a4e4c 100644
--- a/manual/stdio.texi
+++ b/manual/stdio.texi
@@ -2295,11 +2295,11 @@ argument specifies the maximum number of characters to produce.  The
 trailing null character is counted towards this limit, so you should
 allocate at least @var{size} wide characters for the string @var{ws}.
 
-The return value is the number of characters which would be generated
-for the given input, excluding the trailing null.  If this value is
-greater or equal to @var{size}, not all characters from the result have
-been stored in @var{ws}.  You should try again with a bigger output
-string.
+The return value is the number of characters generated for the given
+input, excluding the trailing null.  If not all output fits into the
+provided buffer a negative value is returned.  You should try again with
+a bigger output string.  @emph{Note:} this is different from how
+@code{snprintf} handles this situation.
 
 Note that the corresponding narrow stream function takes fewer
 parameters.  @code{swprintf} in fact corresponds to the @code{snprintf}
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index 29d96e48a4..6312af719e 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -755,40 +755,35 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
 	  {
 	    /* We have to convert the multibyte input sequence to wide
 	       characters.  */
-	    char buf[MB_LEN_MAX];
+	    char buf[0];
 	    mbstate_t cstate;
 
 	    memset (&cstate, '\0', sizeof (cstate));
 
 	    do
 	      {
-		size_t cnt;
-
 		/* This is what we present the mbrtowc function first.  */
 		buf[0] = c;
-		cnt = 1;
 
 		while (1)
 		  {
 		    size_t n;
 
 		    n = __mbrtowc (!(flags & SUPPRESS) ? wstr : NULL,
-				   buf, cnt, &cstate);
+				   buf, 1, &cstate);
 
 		    if (n == (size_t) -2)
 		      {
 			/* Possibly correct character, just not enough
 			   input.  */
-			assert (cnt < MB_CUR_MAX);
-
 			if (inchar () == EOF)
 			  encode_error ();
 
-			buf[cnt++] = c;
+			buf[0] = c;
 			continue;
 		      }
 
-		    if (n != cnt)
+		    if (n != 1)
 		      encode_error ();
 
 		    /* We have a match.  */
@@ -1063,36 +1058,33 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
 		  }
 #else
 		{
-		  char buf[MB_LEN_MAX];
-		  size_t cnt;
+		  char buf[0];
 
 		  buf[0] = c;
-		  cnt = 1;
 
 		  while (1)
 		    {
 		      size_t n;
 
 		      n = __mbrtowc (!(flags & SUPPRESS) ? wstr : NULL,
-				     buf, cnt, &cstate);
+				     buf, 1, &cstate);
 
 		      if (n == (size_t) -2)
 			{
 			  /* Possibly correct character, just not enough
 			     input.  */
-			  assert (cnt < MB_CUR_MAX);
-
 			  if (inchar () == EOF)
 			    encode_error ();
 
-			  buf[cnt++] = c;
+			  buf[0] = c;
 			  continue;
 			}
 
-		      if (n != cnt)
+		      if (n != 1)
 			encode_error ();
 
 		      /* We have a match.  */
+		      ++wstr;
 		      break;
 		    }