ls -l segfault + [PATCH]
Harald Küthe
harald-tuxbox at arcor.de
Fri Mar 16 12:38:27 PDT 2007
Hello List, Jan,
> On Wednesday 14 March 2007 13:26, Jan Evert van Grootheest wrote:
>> It seems that show_files is at line 430 and list_single is inlined.
>>
>> I also tried with valgrind. No problems reported. And it does not
>> segfault, either.
>>
>> I also made a binary that is compiled with -O0 (no optimization). It
>> failed myteriously thus:
>> (gdb) bt full
>> #0 0x0805891a in openvt_main (argc=804208, argv=0xb7f95ae0) at
>> console-tools/openvt.c:35
>> fd = 0
>> vtname = "\b\001\000\000\000ÿ\000\000\000¡\000\000"
>> #1 0x00000000 in ?? ()
>> This binary also works succesfully with valgrind. And without -l.
>I propose the following:
>1) try latest svn
>2) add debug printouts to ls.c [using write, not printf!
> printf can make such 'volatile' bugs disappear]:
> write(2, "HERE\n", 5);
> by adding them here and there, rerunning ls, you
> will fairly quickly narrow it down.
>3) show results to the list
>--
>vda
I have the same problem here and I narrowed it down to some point:
It seems that the buffer bb_common_bufsiz1 will be overwritten
if there are many files to be listed with <ls -l>.
Here it failes in list_single(struct dnode *dn)
when dn is wrong (looks like some previous ls printout is at dn, so it
crashes)
When I increase BUFSIZ there is no crash.
My preferred change is to use line buffered stdout handling instead of block
buffered:
bb/coreutils/ls.c line 795:
- setvbuf(stdout, bb_common_bufsiz1, _IOFBF, BUFSIZ);
+ setvbuf(stdout, bb_common_bufsiz1, _IOLBF, BUFSIZ);
I don't know why this doesn't happen with ls or ls -la.
It seems strace changes the way stdout is handled so it doesn't crash there
(and it does not crash in gdb :-()
my Env:
ppc8xx
linux-2.4.34
glibc-2.3.6
gcc-3.4.4
enabled 64bit stuff: _FILE_OFFSET_BITS=64
bb 1.4.1
Best regards
Harald
More information about the busybox
mailing list