about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--stdio-common/vfscanf.c12
2 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 2f95a048f7..203dcdc338 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-07-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* stdio-common/vfscanf.c (inchar): Restore errno from previous
+	underflow operation if c == (W)EOF.
+
 2002-07-03  Jakub Jelinek  <jakub@redhat.com>
 
 	* stdio-common/printf_fp.c (__printf_fp.c): If _FPIO_CONST_SHIFT is
diff --git a/stdio-common/vfscanf.c b/stdio-common/vfscanf.c
index 9586ab6890..b563a04b38 100644
--- a/stdio-common/vfscanf.c
+++ b/stdio-common/vfscanf.c
@@ -78,9 +78,10 @@
 				     INTUSE(_IO_sputbackwc) (s, c))))
 #  define ungetc_not_eof(c, s)	((void) (--read_in,			      \
 					 INTUSE(_IO_sputbackwc) (s, c)))
-#  define inchar()	(c == WEOF ? WEOF				      \
+#  define inchar()	(c == WEOF ? ((errno = inchar_errno), WEOF)	      \
 			 : ((c = _IO_getwc_unlocked (s)),		      \
-			    (void) (c != WEOF && ++read_in), c))
+			    (void) (c != WEOF				      \
+				    ? ++read_in : (inchar_errno = errno)), c))
 
 #  define MEMCPY(d, s, n) __wmemcpy (d, s, n)
 #  define ISSPACE(Ch)	  iswspace (Ch)
@@ -108,9 +109,10 @@
 				     INTUSE(_IO_sputbackc) (s, (unsigned char) c))))
 #  define ungetc_not_eof(c, s)	((void) (--read_in,			      \
 					 INTUSE(_IO_sputbackc) (s, (unsigned char) c)))
-#  define inchar()	(c == EOF ? EOF					      \
+#  define inchar()	(c == EOF ? ((errno = inchar_errno), EOF)	      \
 			 : ((c = _IO_getc_unlocked (s)),		      \
-			    (void) (c != EOF && ++read_in), c))
+			    (void) (c != EOF				      \
+				    ? ++read_in : (inchar_errno = errno)), c))
 #  define MEMCPY(d, s, n) memcpy (d, s, n)
 #  define ISSPACE(Ch)	  isspace (Ch)
 #  define ISDIGIT(Ch)	  isdigit (Ch)
@@ -272,6 +274,8 @@ __vfscanf (FILE *s, const char *format, va_list argptr)
   register int width;		/* Maximum field width.  */
   register int flags;		/* Modifiers for current format element.  */
 
+  /* Errno of last failed inchar call.  */
+  int inchar_errno = 0;
   /* Status for reading F-P nums.  */
   char got_dot, got_e, negative;
   /* If a [...] is a [^...].  */