libc: Restore fp state upon flush error in fputc

This is akin to commit bafaa70b6f.

Reported by:	Guy Yur <guyyur@gmail.com>
Fixes:		86a16ada1e
MFC after:	3 days
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Mark Johnston 2022-03-25 10:46:24 -04:00
parent ecd764b0ea
commit 6e13794fbe

View File

@ -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);
}