aboutsummaryrefslogtreecommitdiff
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 [^...]. */