diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2020-01-29 18:47:33 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2020-01-29 18:53:44 +0100 |
commit | 2607f00423ead393f24b81b9fe5a39a37e036af8 (patch) | |
tree | 73f63d13d44b15f2cd0cfa10d25a4a86ab5c553a /newlib/libc/stdio64 | |
parent | f36262d56ac78f04de147746ce4a85c6155e4a23 (diff) | |
download | newlib-2607f00423ead393f24b81b9fe5a39a37e036af8.zip newlib-2607f00423ead393f24b81b9fe5a39a37e036af8.tar.gz newlib-2607f00423ead393f24b81b9fe5a39a37e036af8.tar.bz2 |
Revert "newlib: fix fseek optimization with SEEK_CUR"
This reverts commit 59362c80e3a02c011fd0ef3d7f07a20098d2a9d5.
This breaks gnulib's autoconf test for POSIX compatibility of
fflush/fseek. After fflush/fseek, ftello and lseek are out of
sync, with lseek having the wrong offset. This breaks backward
compatibility with Cygwin applications.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib/libc/stdio64')
-rw-r--r-- | newlib/libc/stdio64/fseeko64.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/newlib/libc/stdio64/fseeko64.c b/newlib/libc/stdio64/fseeko64.c index f380055..0672086 100644 --- a/newlib/libc/stdio64/fseeko64.c +++ b/newlib/libc/stdio64/fseeko64.c @@ -142,12 +142,31 @@ _fseeko64_r (struct _reent *ptr, switch (whence) { case SEEK_CUR: - curoff = _ftello64_r(ptr, fp); - if (curoff == -1L) - { - _newlib_flockfile_exit (fp); - return EOF; - } + /* + * In order to seek relative to the current stream offset, + * we have to first find the current stream offset a la + * ftell (see ftell for details). + */ + _fflush_r (ptr, fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + curoff = seekfn (ptr, fp->_cookie, (_fpos64_t) 0, SEEK_CUR); + if (curoff == -1L) + { + _newlib_flockfile_exit(fp); + return EOF; + } + } + if (fp->_flags & __SRD) + { + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + else if (fp->_flags & __SWR && fp->_p != NULL) + curoff += fp->_p - fp->_bf._base; offset += curoff; whence = SEEK_SET; |