This is the mail archive of the mailing list for the glibc project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH v2] ftell: seek to end only when there are unflushed bytes (BZ #17647)

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)
(gdb) bt
#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).

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]