Pádraig Brady cfbfd8
From fd5f2b1569e2e0b31be755e14e236a7a02478fc0 Mon Sep 17 00:00:00 2001
Pádraig Brady cfbfd8
From: Bernhard Voelker <mail@bernhard-voelker.de>
Pádraig Brady cfbfd8
Date: Sun, 30 Aug 2015 22:49:35 +0200
Pádraig Brady cfbfd8
Subject: [PATCH] tests: avoid FP of ls/stat-free-color.sh with newer glibc
Pádraig Brady cfbfd8
Pádraig Brady cfbfd8
Since glibc-2.22, specifically commit [0], the opendir() implementation
Pádraig Brady cfbfd8
implicitly makes an additional stat call thus leading to a FP.
Pádraig Brady cfbfd8
Seen on openSUSE:Tumbleweed since snapshot 20150821.
Pádraig Brady cfbfd8
Pádraig Brady cfbfd8
[0]
Pádraig Brady cfbfd8
https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=46f894d8c60a
Pádraig Brady cfbfd8
Pádraig Brady cfbfd8
* tests/ls/stat-free-color.sh: Change the test to verify that ls(1)
Pádraig Brady cfbfd8
needs the same number of stat-like calls for a single, empty directory
Pádraig Brady cfbfd8
argument as for one with a few directory entries (sub-directory,
Pádraig Brady cfbfd8
regular file, symlink, etc.).
Pádraig Brady cfbfd8
---
Pádraig Brady cfbfd8
 tests/ls/stat-free-color.sh | 39 ++++++++++++++++++++++++---------------
Pádraig Brady cfbfd8
 1 file changed, 24 insertions(+), 15 deletions(-)
Pádraig Brady cfbfd8
Pádraig Brady cfbfd8
diff --git a/tests/ls/stat-free-color.sh b/tests/ls/stat-free-color.sh
Pádraig Brady cfbfd8
index fb2ee8b..35816a3 100755
Pádraig Brady cfbfd8
--- a/tests/ls/stat-free-color.sh
Pádraig Brady cfbfd8
+++ b/tests/ls/stat-free-color.sh
Pádraig Brady cfbfd8
@@ -27,8 +27,6 @@ stats='stat,lstat,stat64,lstat64,newfstatat'
Pádraig Brady cfbfd8
 require_strace_ $stats
Pádraig Brady cfbfd8
 require_dirent_d_type_
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
-ln -s nowhere dangle || framework_failure_
Pádraig Brady cfbfd8
-
Pádraig Brady cfbfd8
 # Disable enough features via LS_COLORS so that ls --color
Pádraig Brady cfbfd8
 # can do its job without calling stat (other than the obligatory
Pádraig Brady cfbfd8
 # one-call-per-command-line argument).
Pádraig Brady cfbfd8
@@ -54,22 +52,33 @@ EOF
Pádraig Brady cfbfd8
 eval $(dircolors -b color-without-stat)
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
 # The system may perform additional stat-like calls before main.
Pádraig Brady cfbfd8
-# To avoid counting those, first get a baseline count by running
Pádraig Brady cfbfd8
-# ls with only the --help option.  Then, compare that with the
Pádraig Brady cfbfd8
+# Furthermore, underlying library functions may also implicitly
Pádraig Brady cfbfd8
+# add an extra stat call, e.g. opendir since glibc-2.21-360-g46f894d.
Pádraig Brady cfbfd8
+# To avoid counting those, first get a baseline count for running
Pádraig Brady cfbfd8
+# ls with one empty directory argument.  Then, compare that with the
Pádraig Brady cfbfd8
 # invocation under test.
Pádraig Brady cfbfd8
-strace -o log-help -e $stats ls --help >/dev/null || fail=1
Pádraig Brady cfbfd8
-n_lines_help=$(wc -l < log-help)
Pádraig Brady cfbfd8
+mkdir d || framework_failure_
Pádraig Brady cfbfd8
+
Pádraig Brady cfbfd8
+strace -o log1 -e $stats ls --color=always d || fail=1
Pádraig Brady cfbfd8
+n_stat1=$(wc -l < log1) || framework_failure_
Pádraig Brady cfbfd8
+
Pádraig Brady cfbfd8
+test $n_stat1 = 0 \
Pádraig Brady cfbfd8
+  && skip_ 'No stat calls recognized on this platform'
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
-strace -o log -e $stats ls --color=always . || fail=1
Pádraig Brady cfbfd8
-n_lines=$(wc -l < log)
Pádraig Brady cfbfd8
+# Populate the test directory.
Pádraig Brady cfbfd8
+mkdir d/subdir \
Pádraig Brady cfbfd8
+  && touch d/regf \
Pádraig Brady cfbfd8
+  && ln d/regf d/hlink \
Pádraig Brady cfbfd8
+  && ln -s regf d/slink \
Pádraig Brady cfbfd8
+  && ln -s nowhere d/dangle \
Pádraig Brady cfbfd8
+  || framework_failure_
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
-n_stat=$(expr $n_lines - $n_lines_help)
Pádraig Brady cfbfd8
+# Invocation under test.
Pádraig Brady cfbfd8
+strace -o log2 -e $stats ls --color=always d || fail=1
Pádraig Brady cfbfd8
+n_stat2=$(wc -l < log2) || framework_failure_
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
-# Expect one stat call.
Pádraig Brady cfbfd8
-case $n_stat in
Pádraig Brady cfbfd8
-  0) skip_ 'No stat calls recognized on this platform' ;;
Pádraig Brady cfbfd8
-  1) ;; # Corresponding to stat(".")
Pádraig Brady cfbfd8
-  *) fail=1; head -n30 log* ;;
Pádraig Brady cfbfd8
-esac
Pádraig Brady cfbfd8
+# Expect the same number of stat calls.
Pádraig Brady cfbfd8
+test $n_stat1 = $n_stat2 \
Pádraig Brady cfbfd8
+  || { fail=1; head -n30 log*; }
Pádraig Brady cfbfd8
 
Pádraig Brady cfbfd8
 Exit $fail
Pádraig Brady cfbfd8
-- 
Pádraig Brady cfbfd8
2.4.1
Pádraig Brady cfbfd8