From cfbfd8c4908e28c178eabff5c896e332f8789b4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A1draig=20Brady?=
Date: Tue, 1 Sep 2015 17:32:54 +0100
Subject: [PATCH] avoid check failure on glibc 2.22
glibc 2.22 introduces two extra stat() calls per opendir(),
which induces a false failure in a test counting stat() calls.
---
coreutils.spec | 3 ++
glibc-2.22-test-fix.patch | 83 +++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+)
create mode 100644 glibc-2.22-test-fix.patch
diff --git a/coreutils.spec b/coreutils.spec
index c4e1341..deac632 100644
--- a/coreutils.spec
+++ b/coreutils.spec
@@ -30,6 +30,8 @@ Patch104: coreutils-df-direct.patch
Patch107: coreutils-8.4-mkdir-modenote.patch
# Don't run the currently failing test-update-copyright.sh test
Patch108: coreutils-remove-test-update-copyright.patch
+#avoid false failure due to extra stat() calls done by opendir() in glibc 2.22
+Patch109: glibc-2.22-test-fix.patch
# sh-utils
#add info about TZ envvar to date manpage
@@ -132,6 +134,7 @@ the old GNU fileutils, sh-utils, and textutils packages.
%patch104 -p1 -b .dfdirect
%patch107 -p1 -b .mkdirmode
%patch108 -p1 -b .crtest
+%patch109 -p1 -b .opendir_stat
# sh-utils
%patch703 -p1 -b .dateman
diff --git a/glibc-2.22-test-fix.patch b/glibc-2.22-test-fix.patch
new file mode 100644
index 0000000..efbe850
--- /dev/null
+++ b/glibc-2.22-test-fix.patch
@@ -0,0 +1,83 @@
+From fd5f2b1569e2e0b31be755e14e236a7a02478fc0 Mon Sep 17 00:00:00 2001
+From: Bernhard Voelker
+Date: Sun, 30 Aug 2015 22:49:35 +0200
+Subject: [PATCH] tests: avoid FP of ls/stat-free-color.sh with newer glibc
+
+Since glibc-2.22, specifically commit [0], the opendir() implementation
+implicitly makes an additional stat call thus leading to a FP.
+Seen on openSUSE:Tumbleweed since snapshot 20150821.
+
+[0]
+https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=46f894d8c60a
+
+* tests/ls/stat-free-color.sh: Change the test to verify that ls(1)
+needs the same number of stat-like calls for a single, empty directory
+argument as for one with a few directory entries (sub-directory,
+regular file, symlink, etc.).
+---
+ tests/ls/stat-free-color.sh | 39 ++++++++++++++++++++++++---------------
+ 1 file changed, 24 insertions(+), 15 deletions(-)
+
+diff --git a/tests/ls/stat-free-color.sh b/tests/ls/stat-free-color.sh
+index fb2ee8b..35816a3 100755
+--- a/tests/ls/stat-free-color.sh
++++ b/tests/ls/stat-free-color.sh
+@@ -27,8 +27,6 @@ stats='stat,lstat,stat64,lstat64,newfstatat'
+ require_strace_ $stats
+ require_dirent_d_type_
+
+-ln -s nowhere dangle || framework_failure_
+-
+ # Disable enough features via LS_COLORS so that ls --color
+ # can do its job without calling stat (other than the obligatory
+ # one-call-per-command-line argument).
+@@ -54,22 +52,33 @@ EOF
+ eval $(dircolors -b color-without-stat)
+
+ # The system may perform additional stat-like calls before main.
+-# To avoid counting those, first get a baseline count by running
+-# ls with only the --help option. Then, compare that with the
++# Furthermore, underlying library functions may also implicitly
++# add an extra stat call, e.g. opendir since glibc-2.21-360-g46f894d.
++# To avoid counting those, first get a baseline count for running
++# ls with one empty directory argument. Then, compare that with the
+ # invocation under test.
+-strace -o log-help -e $stats ls --help >/dev/null || fail=1
+-n_lines_help=$(wc -l < log-help)
++mkdir d || framework_failure_
++
++strace -o log1 -e $stats ls --color=always d || fail=1
++n_stat1=$(wc -l < log1) || framework_failure_
++
++test $n_stat1 = 0 \
++ && skip_ 'No stat calls recognized on this platform'
+
+-strace -o log -e $stats ls --color=always . || fail=1
+-n_lines=$(wc -l < log)
++# Populate the test directory.
++mkdir d/subdir \
++ && touch d/regf \
++ && ln d/regf d/hlink \
++ && ln -s regf d/slink \
++ && ln -s nowhere d/dangle \
++ || framework_failure_
+
+-n_stat=$(expr $n_lines - $n_lines_help)
++# Invocation under test.
++strace -o log2 -e $stats ls --color=always d || fail=1
++n_stat2=$(wc -l < log2) || framework_failure_
+
+-# Expect one stat call.
+-case $n_stat in
+- 0) skip_ 'No stat calls recognized on this platform' ;;
+- 1) ;; # Corresponding to stat(".")
+- *) fail=1; head -n30 log* ;;
+-esac
++# Expect the same number of stat calls.
++test $n_stat1 = $n_stat2 \
++ || { fail=1; head -n30 log*; }
+
+ Exit $fail
+--
+2.4.1
+