diff options
-rw-r--r-- | src/stdio/vfprintf.c | 7 | ||||
-rw-r--r-- | src/stdio/vfwprintf.c | 7 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c index 39c1e867..d421817c 100644 --- a/src/stdio/vfprintf.c +++ b/src/stdio/vfprintf.c @@ -158,7 +158,7 @@ static void pop_arg(union arg *arg, int type, va_list *ap) static void out(FILE *f, const char *s, size_t l) { - __fwritex((void *)s, l, f); + if (!(f->flags & F_ERR)) __fwritex((void *)s, l, f); } static void pad(FILE *f, char c, int w, int l, int fl) @@ -656,6 +656,7 @@ int vfprintf(FILE *restrict f, const char *restrict fmt, va_list ap) int nl_type[NL_ARGMAX+1] = {0}; union arg nl_arg[NL_ARGMAX+1]; unsigned char internal_buf[80], *saved_buf = 0; + int olderr; int ret; /* the copy allows passing va_list* even if va_list is an array */ @@ -666,6 +667,8 @@ int vfprintf(FILE *restrict f, const char *restrict fmt, va_list ap) } FLOCK(f); + olderr = f->flags & F_ERR; + if (f->mode < 1) f->flags &= ~F_ERR; if (!f->buf_size) { saved_buf = f->buf; f->wpos = f->wbase = f->buf = internal_buf; @@ -680,6 +683,8 @@ int vfprintf(FILE *restrict f, const char *restrict fmt, va_list ap) f->buf_size = 0; f->wpos = f->wbase = f->wend = 0; } + if (f->flags & F_ERR) ret = -1; + f->flags |= olderr; FUNLOCK(f); va_end(ap2); return ret; diff --git a/src/stdio/vfwprintf.c b/src/stdio/vfwprintf.c index c6400591..ebdff001 100644 --- a/src/stdio/vfwprintf.c +++ b/src/stdio/vfwprintf.c @@ -149,7 +149,7 @@ static void pop_arg(union arg *arg, int type, va_list *ap) static void out(FILE *f, const wchar_t *s, size_t l) { - while (l--) fputwc(*s++, f); + while (l-- && !(f->flags & F_ERR)) fputwc(*s++, f); } static int getint(wchar_t **s) { @@ -345,6 +345,7 @@ int vfwprintf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap) va_list ap2; int nl_type[NL_ARGMAX] = {0}; union arg nl_arg[NL_ARGMAX]; + int olderr; int ret; /* the copy allows passing va_list* even if va_list is an array */ @@ -356,7 +357,11 @@ int vfwprintf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap) FLOCK(f); f->mode |= f->mode+1; + olderr = f->flags & F_ERR; + f->flags &= ~F_ERR; ret = wprintf_core(f, fmt, &ap2, nl_arg, nl_type); + if (f->flags & F_ERR) ret = -1; + f->flags |= olderr; FUNLOCK(f); va_end(ap2); return ret; |