glibc/libio
Siddhesh Poyarekar ea33158c96 Fix offset caching for streams and use it for ftell (BZ #16680)
The ftell implementation was made conservative to ensure that
incorrectly cached offsets never affect it.  However, this causes
problems for append mode when a file stream is rewound.  Additionally,
the 'clever' trick of using stat to get position for append mode files
caused more problems than it solved and broke old behavior.  I have
described the various problems that it caused and then finally the
solution.

For a and a+ mode files, rewinding the stream should result in ftell
returning 0 as the offset, but the stat() trick caused it to
(incorrectly) always return the end of file.  Now I couldn't find
anything in POSIX that specifies the stream position after rewind()
for a file opened in 'a' mode, but for 'a+' mode it should be set to
0.  For 'a' mode too, it probably makes sense to keep it set to 0 in
the interest of retaining old behavior.

The initial file position for append mode files is implementation
defined, so the implementation could either retain the current file
position or move the position to the end of file.  The earlier ftell
implementation would move the offset to end of file for append-only
mode, but retain the old offset for a+ mode.  It would also cache the
offset (this detail is important).  My patch broke this and would set
the initial position to end of file for both append modes, thus
breaking old behavior.  I was ignorant enough to write an incorrect
test case for it too.

The Change:

I have now brought back the behavior of seeking to end of file for
append-only streams, but with a slight difference.  I don't cache the
offset though, since we would want ftell to query the current file
position through lseek while the stream is not active.  Since the
offset is moved to the end of file, we can rely on the file position
reported by lseek and we don't need to resort to the stat() nonsense.

Finally, the cache is always reliable, except when there are unflished
writes in an append mode stream (i.e. both a and a+).  In the latter
case, it is safe to just do an lseek to SEEK_END.  The value can be
safely cached too, since the file handle is already active at this
point.  Incidentally, this is the only state change we affect in the
file handle (apart from taking locks of course).

I have also updated the test case to correct my impression of the
initial file position for a+ streams to the initial behavior.  I have
verified that this does not break any existing tests in the testsuite
and also passes with the new tests.
2014-03-17 21:23:56 +05:30
..
bits Complete _BSD_SOURCE / _SVID_source followup cleanup. 2014-02-21 21:45:26 +00:00
__fbufsize.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__flbf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__fpending.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__fpurge.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__freadable.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__freading.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__fsetlocking.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__fwritable.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
__fwriting.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
bug-fopena+.c Update. 2002-08-27 06:41:29 +00:00
bug-fseek.c Update. 2002-07-24 11:18:48 +00:00
bug-ftell.c * libio/bug-ftell.c (do_test): Add a cast. 2003-11-01 21:11:05 +00:00
bug-memstream1.c [BZ #1996] 2006-08-14 22:16:14 +00:00
bug-mmap-fflush.c Update. 2002-08-27 12:10:11 +00:00
bug-rewind2.c Update. 2002-08-26 08:08:50 +00:00
bug-rewind.c Update. 2002-08-26 08:08:50 +00:00
bug-ungetc2.c Update. 2003-09-06 09:56:14 +00:00
bug-ungetc3.c Update. 2004-11-09 07:05:27 +00:00
bug-ungetc4.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
bug-ungetc.c 2002-07-24 Roland McGrath <roland@frob.com> 2002-07-24 09:34:59 +00:00
bug-ungetwc1.c Update. 2002-04-03 09:26:58 +00:00
bug-ungetwc2.c Update. 2002-04-24 21:09:14 +00:00
bug-wfflush.c * libio/bug-wfflush.c (do_test): Call rewind instead of fsetpos. 2002-11-11 06:55:22 +00:00
bug-wmemstream1.c * posix/glob.c (glob_in_dir): Add some comments and asserts to 2006-09-30 15:09:35 +00:00
bug-wsetpos.c Fix fsetpos on wide stream. 2009-09-02 19:45:33 -07:00
clearerr_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
clearerr.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
Depend New file, libio needs localedata for tests. 2000-07-29 07:57:34 +00:00
fcloseall.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
feof_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
feof.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ferror_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ferror.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
filedoalloc.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
fileno.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fileops.c Fix offset caching for streams and use it for ftell (BZ #16680) 2014-03-17 21:23:56 +05:30
fmemopen.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
fputc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fputc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fputwc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fputwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
freopen64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
freopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fseek.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fseeko64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fseeko.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ftello64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ftello.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fwide.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fwprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
fwscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
genops.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getchar_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getchar.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getwc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getwchar_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
getwchar.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofclose.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofdopen.c Fix offset caching for streams and use it for ftell (BZ #16680) 2014-03-17 21:23:56 +05:30
iofflush_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofflush.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofgetpos64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofgetpos.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofgets_u.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
iofgets.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
iofgetws_u.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
iofgetws.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
iofopen64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofopncook.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofputs_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofputs.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofputws_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofputws.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofread_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofread.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofsetpos64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofsetpos.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioftell.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofwide.c Use cached offset in ftell when reliable 2014-03-04 12:23:28 +05:30
iofwrite_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iofwrite.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iogetdelim.c Use glibc_likely instead __builtin_expect. 2014-02-10 15:07:12 +01:00
iogetline.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iogets.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iogetwline.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iolibio.h Remove use of INTDEF/INTUSE in libio 2012-05-24 23:06:20 +02:00
iopadn.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iopopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioputs.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioseekoff.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioseekpos.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iosetbuffer.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iosetvbuf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioungetc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
ioungetwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iovdprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iovsprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iovsscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iovswscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
iowpadn.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
libc_fatal.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
libio.h Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
libioP.h Separate ftell from fseek logic and avoid modifying FILE data (#16532) 2014-03-04 07:45:58 +05:30
Makefile Enumerate tests with special rules in tests-special variable. 2014-03-06 22:35:33 +00:00
memstream.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
obprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldfileops.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofclose.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofdopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofgetpos64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofgetpos.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofsetpos64.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiofsetpos.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldiopopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldpclose.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldstdfiles.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
oldtmpfile.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
pclose.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
peekc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putchar_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putchar.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putwc_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putwchar_u.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
putwchar.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
rewind.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
setbuf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
setlinebuf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
stdfiles.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
stdio.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
stdio.h Complete _BSD_SOURCE / _SVID_source followup cleanup. 2014-02-21 21:45:26 +00:00
strfile.h Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
strops.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
swprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
swscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
test-fmemopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
test-freopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
test-freopen.sh Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst_getwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst_getwc.input Update. 2000-06-23 06:22:36 +00:00
tst_putwc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst_swprintf.c Fix format strings. 2002-09-30 07:47:16 +00:00
tst_swscanf.c Update. 2001-02-09 17:57:28 +00:00
tst_wprintf2.c Update. 2000-07-20 08:56:12 +00:00
tst_wprintf.c Update. 2000-06-17 19:22:43 +00:00
tst_wscanf.c Update. 2001-02-09 17:57:28 +00:00
tst_wscanf.input Update. 1999-06-16 22:55:47 +00:00
tst-atime.c Update. 2002-09-05 10:28:51 +00:00
tst-eof.c pdate. 2002-07-23 00:31:41 +00:00
tst-ext2.c * libio/Makefile (tests): Add tst-ext2. 2007-10-13 07:33:09 +00:00
tst-ext.c Update. 2001-03-27 00:16:51 +00:00
tst-fgetwc.c (do_test): Use de_DE.UTF-8 as locale name. 2009-06-15 17:27:48 -07:00
tst-fgetwc.input 2009-02-04 Ulrich Drepper <drepper@redhat.com> 2009-02-04 21:27:48 +00:00
tst-fgetws.c Fix format strings. 2002-09-30 07:47:16 +00:00
tst-fopenloc2.c [BZ #2173] 2006-01-19 01:35:28 +00:00
tst-fopenloc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-freopen.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-fseek.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-ftell-active-handler.c Fix offset caching for streams and use it for ftell (BZ #16680) 2014-03-17 21:23:56 +05:30
tst-ftell-partial-wide.c Fix infinite loop in ftell when writing wide char data (BZ #16398) 2014-02-05 12:49:00 +05:30
tst-fwrite-error.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-memstream1.c * libio/wmemstream.c: New file. 2006-01-12 02:03:42 +00:00
tst-memstream2.c * libio/wmemstream.c: New file. 2006-01-12 02:03:42 +00:00
tst-mmap2-eofsync.c * catgets/open_catalog.c (__open_catalog): Don't use a value type 2002-09-24 04:24:25 +00:00
tst-mmap-eofsync.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-fflushsync.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-offend.c * locale/xlocale.h (struct __locale_struct): New member `__names'. 2002-08-30 10:36:44 +00:00
tst-mmap-setvbuf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-popen1.c * sysdeps/unix/sysv/linux/syscalls.list: Add __pipe2 alias. 2008-07-27 18:26:13 +00:00
tst-setvbuf1.c [BZ #2337] 2006-12-13 23:17:54 +00:00
tst-sscanf.c Update. 2001-08-22 18:40:06 +00:00
tst-swscanf.c Update. 2002-02-26 18:08:08 +00:00
tst-ungetwc1.c * libio/tst-ungetwc1.c (main): Add a const to quiet a warning. 2001-08-23 08:36:47 +00:00
tst-ungetwc2.c Update. 2001-08-17 04:49:12 +00:00
tst-widetext.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
tst-widetext.input Rename Oriya locale to Odia (bug 15601) 2013-11-20 17:47:41 +05:30
tst-wmemstream1.c * posix/glob.c (glob_in_dir): Add some comments and asserts to 2006-09-30 15:09:35 +00:00
tst-wmemstream2.c * posix/glob.c (glob_in_dir): Add some comments and asserts to 2006-09-30 15:09:35 +00:00
vasprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
Versions Remove mention of open_obstack_stream, which has never existed in libio. 2011-10-26 16:53:02 -07:00
vscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
vsnprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
vswprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
vwprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
vwscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wfiledoalloc.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wfileops.c Fix offset caching for streams and use it for ftell (BZ #16680) 2014-03-17 21:23:56 +05:30
wgenops.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wmemstream.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wprintf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wscanf.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00
wstrops.c Update copyright notices with scripts/update-copyrights 2014-01-01 22:00:23 +10:00