__sfvwrite(FILE *fp, struct __suio *uio)
{
size_t len;
+ unsigned char *old_p;
char *p;
struct __siov *iov;
int w, s;
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);
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)