libc: Restore fp state upon flush error in fputc
This is akin to commitbafaa70b6f
. Reported by: Guy Yur <guyyur@gmail.com> Fixes:86a16ada1e
MFC after: 3 days Sponsored by: The FreeBSD Foundation
This commit is contained in:
parent
ecd764b0ea
commit
6e13794fbe
@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
|
||||
int
|
||||
__swbuf(int c, FILE *fp)
|
||||
{
|
||||
unsigned char *old_p;
|
||||
int n;
|
||||
|
||||
/*
|
||||
@ -87,8 +88,15 @@ __swbuf(int c, FILE *fp)
|
||||
}
|
||||
fp->_w--;
|
||||
*fp->_p++ = c;
|
||||
if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n'))
|
||||
if (__fflush(fp))
|
||||
old_p = fp->_p;
|
||||
if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n')) {
|
||||
if (__fflush(fp)) {
|
||||
if (fp->_p == old_p) {
|
||||
fp->_p--;
|
||||
fp->_w++;
|
||||
}
|
||||
return (EOF);
|
||||
}
|
||||
}
|
||||
return (c);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user