This is the mail archive of the
mailing list for the glibc project.
Re: [PATCH v2] ftell: seek to end only when there are unflushed bytes (BZ #17647)
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Thu, 04 Dec 2014 11:16:29 -0200
- Subject: Re: [PATCH v2] ftell: seek to end only when there are unflushed bytes (BZ #17647)
- Authentication-results: sourceware.org; auth=none
- References: <20141125155404 dot GO12197 at spoyarek dot pnq dot redhat dot com> <547FC7C7 dot 4030000 at redhat dot com>
On 04-12-2014 00:32, Carlos O'Donell wrote:
> On 11/25/2014 10:54 AM, Siddhesh Poyarekar wrote:
>> Upon re-reading the standard, it seems like the intervening
>> fseek/fflush should not be required since ftruncate does not change
>> the file offset. So this is a bug and here's an updated patch:
>> Currently we seek to end of file if there are unflushed writes or the
>> stream is in write mode, to get the current offset for writing in
>> append mode, which is the end of file. The latter case (i.e. stream
>> is in write mode, but no unflushed writes) is unnecessary since it
>> will only happen when the stream has just been flushed, in which case
>> the recorded offset ought to be reliable.
>> Removing that case lets ftell give the correct offset when it follows
>> an ftruncate. The latter truncates the file, but does not change the
>> file position, due to which it is permissible to call ftell without an
>> intervening fseek call.
>> Tested on x86_64 to verify that the added test case fails without the
>> patch and succeeds with it, and that there are no additional
>> regressions due to it.
>> [BZ #17647]
>> * libio/fileops.c (do_ftell): Seek only when there are
>> unflushed writes.
>> * libio/wfileops.c (do_ftell_wide): Likewise.
>> * libio/tst-ftell-active-handler.c (do_ftruncate_test): New
>> test case.
>> (do_one_test): Call it.
> Looks good to me. OK with nits fixed (two superfluous uses of brackets
> and a comment).
I am getting a SEGFAULT with the 'tst-ftell-active-handler' on powerpc64:
ftell: fdopen (file, "a+"): old offset = 0, new offset = 30, offset after EOF = 36
ftell: fopen (file, "(null)"):
Program received signal SIGSEGV, Segmentation fault.
_IO_new_file_fopen (fp=0x212a2620, filename=0x212a0010 "/tmp/tst-active-handler-tmp.oSQlBj", mode=0x0, is32not64=1) at fileops.c:261
261 switch (*mode)
#0 _IO_new_file_fopen (fp=0x212a2620, filename=0x212a0010 "/tmp/tst-active-handler-tmp.oSQlBj", mode=0x0, is32not64=1) at fileops.c:261
#1 0x00003fffb7e7ee7c in __fopen_internal (filename=0x212a0010 "/tmp/tst-active-handler-tmp.oSQlBj", mode=0x0, is32=<optimized out>) at iofopen.c:86
#2 0x00003fffb7e7ef14 in _IO_new_fopen (filename=<optimized out>, mode=<optimized out>) at iofopen.c:97
#3 0x0000000010001f88 in ?? ()
#4 0x000000001000323c in ?? ()
#5 0x000000001000180c in ?? ()
#6 0x00003fffb7e2436c in generic_start_main (main=0x10015178, argc=<optimized out>, argv=0x3fffffffeb30, auxvec=0x3fffffffece0, init=<optimized out>, rtld_fini=<optimized out>,
stack_end=<optimized out>, fini=<optimized out>) at ../csu/libc-start.c:289
#7 0x00003fffb7e24594 in __libc_start_main (argc=<optimized out>, argv=<optimized out>, ev=<optimized out>, auxvec=<optimized out>, rtld_fini=<optimized out>, stinfo=<optimized out>,
stack_on_entry=<optimized out>) at ../sysdeps/unix/sysv/linux/powerpc/libc-start.c:80
#8 0x0000000000000000 in ?? ()
GLIBC built with GCC 4.9.3 / -O3 (I have not tested different compiler/flags). I tried to
debug a little and seems the test_modes is bogus somehow. The testcase also fails running
on system GLIBC (2.17/FC19 in my environment).