Subject: Re: bug#8909: tests/ls/stat-free-color: fails on OpenSuSE 11.4

From: Jim Meyering <[email-masked]>
Date: Tue, 21 Jun 2011 16:16:45 +0200

Bernhard Voelker wrote:
> On 06/21/2011 03:41 PM, Jim Meyering wrote:
>> Bernhard Voelker wrote:
>> ...
>>> LS_COLORS='rs=0:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=00:su=00:sg=00:ca=00:tw=00:ow=00:st=00:ex=00:mh=00:'
>>> ++ export LS_COLORS
>>> + strace -o log -e stat,lstat,stat64,lstat64 ls --color=always .
>>> color-without-stat
>>> dangle-1
>>> dangle-2
>>> dangle-3
>>> log
>>> ++ wc -l
>>> + n_lines=5
>>> + case $n_lines in
>>> + fail=1
>> ...
>>> How can I help?
>>
>> Thanks for testing and the report.
>> If you apply the patch below and rerun the test like this,
>>
>>      make check -C tests TESTS=ls/stat-free-color VERBOSE=yes
>>
>> then the offending strace output should help understand where
>> the extra stat calls are coming from.
>>
>> For reference, I get this single call on Fedora 15:
>>
>>      stat(".", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
>>
>> diff --git a/tests/ls/stat-free-color b/tests/ls/stat-free-color
>> index b1c4744..a1f6418 100755
>> --- a/tests/ls/stat-free-color
>> +++ b/tests/ls/stat-free-color
>> @@ -55,7 +55,7 @@ n_lines=$(wc -l<  log)
>>   # Expect one or two stat calls.
>>   case $n_lines in
>>     1|2) ;;
>> -  *) fail=1 ;;
>> +  *) fail=1; cat log;;
>>   esac
>>
>>   Exit $fail
>>
>> --------------------------
>>
>> It might be useful to see the entire strace output, too.
>> To get that, remove the "-e stat,lstat,stat64,lstat64" argument
>> from the strace invocation, and rerun the test.
>
> The output of both runs is attached.
> stat("/usr/lib64/mpi/gcc/openmpi/lib64") and friends is the culprit.

Thanks.

> I can't remember to have anything un-OpenSuSE-11.4-like in my toolchain.
>
> To me it seems that the test should count the difference of the
> number of stat,lstat,stat64,lstat64 calls when run
>   a) as a dummy:  ls --color=always --help
> and
>   b) for ".":     ls --color=always .

That would be more robust.
Do you feel like writing the patch?

...
> + cat log
> execve("/media/sdb5/berny/coreutils/src/ls", ["ls", "--color=always",
> "."], [/* 112 vars */]) = 0
> brk(0)                                  = 0x61e000
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0x7fe74c75f000
> access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
> open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64/librt.so.1",
> O_RDONLY) = -1 ENOENT (No such file or directory)
> stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls/x86_64", 0x7fffaa485600) =
> -1 ENOENT (No such file or directory)
> open("/usr/lib64/mpi/gcc/openmpi/lib64/tls/librt.so.1", O_RDONLY) = -1
> ENOENT (No such file or directory)
> stat("/usr/lib64/mpi/gcc/openmpi/lib64/tls", 0x7fffaa485600) = -1
> ENOENT (No such file or directory)
> open("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64/librt.so.1", O_RDONLY) =
> -1 ENOENT (No such file or directory)
> stat("/usr/lib64/mpi/gcc/openmpi/lib64/x86_64", 0x7fffaa485600) = -1
> ENOENT (No such file or directory)
> open("/usr/lib64/mpi/gcc/openmpi/lib64/librt.so.1", O_RDONLY) = -1
> ENOENT (No such file or directory)
> stat("/usr/lib64/mpi/gcc/openmpi/lib64", {st_mode=S_IFDIR|0755,
> st_size=4096, ...}) = 0
> open("/etc/ld.so.cache", O_RDONLY)      = 3
> fstat(3, {st_mode=S_IFREG|0644, st_size=115701, ...}) = 0
> mmap(NULL, 115701, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe74c742000
> close(3)                                = 0
> open("/lib64/librt.so.1", O_RDONLY)     = 3
> read(3,
> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\"\0\0\0\0\0\0"...,
> 832) = 832
> fstat(3, {st_mode=S_IFREG|0755, st_size=47329, ...}) = 0
> mmap(NULL, 2133008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3,
> 0) = 0x7fe74c33a000
> fadvise64(3, 0, 2133008, POSIX_FADV_WILLNEED) = 0
> mprotect(0x7fe74c342000, 2093056, PROT_NONE) = 0
> mmap(0x7fe74c541000, 8192, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fe74c541000
> close(3)                                = 0
> open("/usr/lib64/mpi/gcc/openmpi/lib64/libc.so.6", O_RDONLY) = -1
> ENOENT (No such file or directory)
> open("/lib64/libc.so.6", O_RDONLY)      = 3
> read(3,
> "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\355\1\0\0\0\0\0"...,
> 832) = 832
> fstat(3, {st_mode=S_IFREG|0755, st_size=1725484, ...}) = 0
> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0x7fe74c741000
> mmap(NULL, 3591144, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3,
> 0) = 0x7fe74bfcd000