Module Name: src Committed By: christos Date: Fri Jul 16 12:34:10 UTC 2021
Modified Files: src/lib/libc/stdio: fvwrite.c Log Message: When fflush fails, adjust pointers and the io vectors. From RVP. Fixes core-dump at cvs(1) exit(3). To generate a diff of this commit: cvs rdiff -u -r1.27 -r1.28 src/lib/libc/stdio/fvwrite.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/stdio/fvwrite.c diff -u src/lib/libc/stdio/fvwrite.c:1.27 src/lib/libc/stdio/fvwrite.c:1.28 --- src/lib/libc/stdio/fvwrite.c:1.27 Thu Jul 8 05:06:51 2021 +++ src/lib/libc/stdio/fvwrite.c Fri Jul 16 08:34:10 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: fvwrite.c,v 1.27 2021/07/08 09:06:51 christos Exp $ */ +/* $NetBSD: fvwrite.c,v 1.28 2021/07/16 12:34:10 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)fvwrite.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: fvwrite.c,v 1.27 2021/07/08 09:06:51 christos Exp $"); +__RCSID("$NetBSD: fvwrite.c,v 1.28 2021/07/16 12:34:10 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -51,6 +51,40 @@ __RCSID("$NetBSD: fvwrite.c,v 1.27 2021/ #include "local.h" #include "fvwrite.h" +static int +flush_adj(FILE *fp, struct __suio *uio, struct __siov *iov, ssize_t w) +{ + int rc; + + _DIAGASSERT(w >= 0); + _DIAGASSERT(fp->_w >= 0); + + if ((rc = fflush(fp)) == 0) + return 0; + + /* + * If we have to return without writing the whole buffer, + * adjust for how much fflush() has written for us. + * `w' is the amt. of new user data just copied into our + * internal buffer in _this_ fwrite() call. + */ + if (fp->_w < w) { + /* some new data was also written */ + ssize_t i = w - fp->_w; + + /* adjust amt. written */ + uio->uio_resid -= i; + iov->iov_len -= i; + } else { + /* only old stuff was written */ + + /* adjust _p and _w so user can retry */ + fp->_p -= w; + fp->_w += w; + } + return rc; +} + /* * Write some memory regions. Return zero on success, EOF on error. * @@ -102,10 +136,8 @@ __sfvwrite(FILE *fp, struct __suio *uio) if (w <= 0) \ goto err #define FLUSH(nw) \ - if (fflush(fp)) { \ - fp->_p -= nw; /* rewind unwritten */ \ - goto err; \ - } + if (flush_adj(fp, uio, iov - 1, nw)) \ + goto err if (fp->_flags & __SNBF) { /*