diff --git a/lib/libc/stdio/fvwrite.c b/lib/libc/stdio/fvwrite.c index 50b32b8eca6..2a161859afa 100644 --- a/lib/libc/stdio/fvwrite.c +++ b/lib/libc/stdio/fvwrite.c @@ -54,6 +54,7 @@ int __sfvwrite(FILE *fp, struct __suio *uio) { size_t len; + unsigned char *old_p; char *p; struct __siov *iov; int w, s; @@ -137,8 +138,12 @@ __sfvwrite(FILE *fp, struct __suio *uio) COPY(w); /* fp->_w -= w; */ /* unneeded */ fp->_p += w; - if (__fflush(fp)) + old_p = fp->_p; + if (__fflush(fp) == EOF) { + if (old_p == fp->_p) + fp->_p -= w; goto err; + } } else if (len >= (w = fp->_bf._size)) { /* write directly */ w = _swrite(fp, p, w); @@ -177,8 +182,12 @@ __sfvwrite(FILE *fp, struct __suio *uio) COPY(w); /* fp->_w -= w; */ fp->_p += w; - if (__fflush(fp)) + old_p = fp->_p; + if (__fflush(fp) == EOF) { + if (old_p == fp->_p) + fp->_p -= w; goto err; + } } else if (s >= (w = fp->_bf._size)) { w = _swrite(fp, p, w); if (w <= 0)