git: 86a16ada1ea6 - main - __sflush(): on write error, if nothing was written, reset FILE state back
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 25 Jan 2022 15:26:10 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=86a16ada1ea608408cec370171d9f59353e97c77
commit 86a16ada1ea608408cec370171d9f59353e97c77
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2022-01-23 06:52:59 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2022-01-25 15:26:05 +0000
__sflush(): on write error, if nothing was written, reset FILE state back
otherwise the data is just dropped. Check for current position equal to
the buffer base at the entry of the function; if not equal, setvbuf()
was done from the write method and it is not our business to override
the decision.
PR: 76398
Reviewed by: markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D34007
---
lib/libc/stdio/fflush.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/lib/libc/stdio/fflush.c b/lib/libc/stdio/fflush.c
index f7d2fbdc28e5..decc974907f4 100644
--- a/lib/libc/stdio/fflush.c
+++ b/lib/libc/stdio/fflush.c
@@ -105,8 +105,8 @@ __weak_reference(__fflush, fflush_unlocked);
int
__sflush(FILE *fp)
{
- unsigned char *p;
- int n, t;
+ unsigned char *p, *old_p;
+ int n, t, old_w;
t = fp->_flags;
if ((t & __SWR) == 0)
@@ -121,7 +121,9 @@ __sflush(FILE *fp)
* Set these immediately to avoid problems with longjmp and to allow
* exchange buffering (via setvbuf) in user write function.
*/
+ old_p = fp->_p;
fp->_p = p;
+ old_w = fp->_w;
fp->_w = t & (__SLBF|__SNBF) ? 0 : fp->_bf._size;
for (; n > 0; n -= t, p += t) {
@@ -134,6 +136,9 @@ __sflush(FILE *fp)
fp->_p += n;
if ((fp->_flags & (__SLBF | __SNBF)) == 0)
fp->_w -= n;
+ } else if (p == fp->_p) { /* cond. to handle setvbuf */
+ fp->_p = old_p;
+ fp->_w = old_w;
}
fp->_flags |= __SERR;
return (EOF);