summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2015-10-15 10:22:20 +0100
committerPádraig Brady <P@draigBrady.com>2015-10-15 11:55:18 +0100
commit3a68c3e99065fd17436260889fe821caa19a855e (patch)
tree85bec3af1f52854c199385d0ea7bbddcf189c19d
parent2366daf725574b0ebfde9308c969b000a6707fc8 (diff)
downloadcoreutils-3a68c3e99065fd17436260889fe821caa19a855e.tar.xz
tests: avoid false failure in rm/r-root.sh with gdb warnings
* tests/rm/r-root.sh: Skip the test if there are gdb warnings that will impact further stderr checks. For example some buggy gdb versions may report "Got object file from memory but can't read symbols: File truncated". Also fix an incorrect stderr check from the previous change. Reported by Bernhard Voelker.
-rwxr-xr-xtests/rm/r-root.sh59
1 files changed, 32 insertions, 27 deletions
diff --git a/tests/rm/r-root.sh b/tests/rm/r-root.sh
index e0564b825..cf1623991 100755
--- a/tests/rm/r-root.sh
+++ b/tests/rm/r-root.sh
@@ -32,6 +32,10 @@ skip_if_root_
# LD_PRELOAD environment variable. This requires shared libraries to work.
require_gcc_shared_
+# Ensure this variable is unset as it's
+# used later in the unlinkat() wrapper.
+unset CU_TEST_SKIP_EXIT
+
# Use gdb to provide further protection by limiting calls to unlinkat().
( timeout 10s gdb --version ) > gdb.out 2>&1
case $(cat gdb.out) in
@@ -89,6 +93,19 @@ def breakpoint_handler (event):
gdb.events.stop.connect(breakpoint_handler)
EOF.py
+# In order of the sed expressions below, this cleans:
+#
+# 1. gdb uses the full path when running rm, so remove the leading dirs.
+# 2. For some of the "/" synonyms, the error diagnostic slightly differs from
+# that of the basic "/" case (see gnulib's fts_open' and ROOT_DEV_INO_WARN):
+# rm: it is dangerous to operate recursively on 'FILE' (same as '/')
+# Strip that part off for the following comparison.
+clean_rm_err_()
+{
+ sed "s/.*rm: /rm: /; \
+ s/\(rm: it is dangerous to operate recursively on\).*$/\1 '\/'/"
+}
+
#-------------------------------------------------------------------------------
# exercise_rm_r_root: shell function to test "rm -r '/'"
# The caller must provide the FILE to remove as well as any options
@@ -121,9 +138,13 @@ exercise_rm_r_root ()
--eval-command='source bp.py' \
--eval-command="run -rv --one-file-system $*" \
--eval-command='quit' \
- rm < /dev/null > out 2> err
+ rm < /dev/null > out 2> err.t
+
+ ret=$?
+
+ clean_rm_err_ < err.t > err || framework_failure_
- return $?
+ return $ret
}
# Verify that "rm -r dir" basically works.
@@ -143,6 +164,7 @@ for file in dir file ; do
test -e "$file" || skip=1
test -f x || skip=1
test -f excise.break || skip=1 # gdb works and breakpoint hit
+ compare /dev/null err || skip=1
test "$skip" = 1 \
&& { cat out; cat err; \
@@ -156,19 +178,6 @@ rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
EOD
-# In order of the sed expressions below, this cleans:
-#
-# 1. gdb uses the full path when running rm, so remove the leading dirs.
-# 2. For some of the "/" synonyms, the error diagnostic slightly differs from
-# that of the basic "/" case (see gnulib's fts_open' and ROOT_DEV_INO_WARN):
-# rm: it is dangerous to operate recursively on 'FILE' (same as '/')
-# Strip that part off for the following comparison.
-clean_rm_err()
-{
- sed "s/.*rm: /rm: /; \
- s/\(rm: it is dangerous to operate recursively on\).*$/\1 '\/'/"
-}
-
#-------------------------------------------------------------------------------
# Exercise "rm -r /" without and with the --preserve-root option.
# Exercise various synonyms of "/" including symlinks to it.
@@ -190,14 +199,12 @@ for opts in \
returns_ 1 exercise_rm_r_root $opts || fail=1
- clean_rm_err < err > err2 || framework_failure_
-
- # Expect nothing in 'out' and the above error diagnostic in 'err2'.
+ # Expect nothing in 'out' and the above error diagnostic in 'err'.
# As rm(1) should have skipped the "/" argument, it does not call unlinkat().
# Therefore, the evidence file "x" should not exist.
- compare /dev/null out || fail=1
- compare exp err2 || fail=1
- test -f x && fail=1
+ compare /dev/null out || fail=1
+ compare exp err || fail=1
+ test -f x && fail=1
# Do nothing more if this test failed.
test $fail = 1 && { cat out; cat err; Exit $fail; }
@@ -219,8 +226,6 @@ CU_TEST_SKIP_EXIT=1
returns_ 1 exercise_rm_r_root --preserve-root file1 '/' file2 || fail=1
-clean_rm_err < err > err2 || framework_failure_
-
unset CU_TEST_SKIP_EXIT
cat <<EOD > out_removed
@@ -232,9 +237,9 @@ EOD
# Both 'file1' and 'file2' should be removed. Simply verify that in the
# "out" file, as the replacement unlinkat() dummy did not remove them.
# Expect the evidence file "x" to exist.
-compare out_removed out || fail=1
-compare exp err2 || fail=1
-test -f x || fail=1
+compare out_removed out || fail=1
+compare exp err || fail=1
+test -f x || fail=1
# Do nothing more if this test failed.
test $fail = 1 && { cat out; cat err; Exit $fail; }
@@ -283,7 +288,7 @@ exercise_rm_r_root --interactive=never --no-preserve-root '/' \
|| fail=1
# The 'err' file should not contain the above error diagnostic.
-grep "^rm: it is dangerous to operate recursively on '/'" err && fail=1
+grep "rm: it is dangerous to operate recursively on '/'" err && fail=1
# Instead, rm(1) should have called the intercepted unlinkat() function,
# i.e., the evidence file "x" should exist.