summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2015-11-01 06:15:14 +0000
committerache <ache@FreeBSD.org>2015-11-01 06:15:14 +0000
commit1b3f07327ec124b695514a80cb008185e30bcbe0 (patch)
treebd0eb700023f61c4af52d795422ae171f385ee5c /lib/libc/stdio
parent39d22b9678b8c571aab6902620c95907d5bef2db (diff)
downloadFreeBSD-src-1b3f07327ec124b695514a80cb008185e30bcbe0.zip
FreeBSD-src-1b3f07327ec124b695514a80cb008185e30bcbe0.tar.gz
Don't seek to the end if write buffer is empty (in append modes).
PR: 204156 MFC after: 1 week
Diffstat (limited to 'lib/libc/stdio')
-rw-r--r--lib/libc/stdio/ftell.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/libc/stdio/ftell.c b/lib/libc/stdio/ftell.c
index abb6da1..8cf94ee 100644
--- a/lib/libc/stdio/ftell.c
+++ b/lib/libc/stdio/ftell.c
@@ -119,7 +119,18 @@ _ftello(FILE *fp, fpos_t *offset)
if (HASUB(fp))
pos -= fp->_r; /* Can be negative at this point. */
} else if ((fp->_flags & __SWR) && fp->_p != NULL) {
- if ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP)) {
+ /*
+ * Writing. Any buffered characters cause the
+ * position to be greater than that in the
+ * underlying object.
+ */
+ n = fp->_p - fp->_bf._base;
+ if (pos > OFF_MAX - n) {
+ errno = EOVERFLOW;
+ return (1);
+ }
+ if (n > 0 &&
+ ((fp->_flags & __SAPP) || (fp->_flags2 & __S2OAP))) {
int serrno = errno;
errno = 0;
@@ -137,16 +148,6 @@ _ftello(FILE *fp, fpos_t *offset)
}
errno = serrno;
}
- /*
- * Writing. Any buffered characters cause the
- * position to be greater than that in the
- * underlying object.
- */
- n = fp->_p - fp->_bf._base;
- if (pos > OFF_MAX - n) {
- errno = EOVERFLOW;
- return (1);
- }
pos += n;
}
*offset = pos;
OpenPOWER on IntegriCloud