diff options
author | Jim Meyering <jim@meyering.net> | 2006-12-14 17:17:31 +0100 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2006-12-14 17:17:31 +0100 |
commit | a6a1e73c0a1185702d33b3694c6fb8d9642340e8 (patch) | |
tree | 37d28bb5744dccb07dbcb5641d278561bfef359c /tests/cp | |
parent | c3154b2947abbb8d03a412d5874fcceb1fc29393 (diff) | |
download | coreutils-a6a1e73c0a1185702d33b3694c6fb8d9642340e8.tar.xz |
Test for a hard-to-detect race fix, using gdb.
* tests/cp/open-perm-race: New file, to test for the
cp --preserve=ownership fix of 2006-12-06.
* tests/cp/Makefile.am (TESTS_ENVIRONMENT): Define abs_top_builddir.
(TESTS): Add open-perm-race.
Diffstat (limited to 'tests/cp')
-rw-r--r-- | tests/cp/Makefile.am | 8 | ||||
-rwxr-xr-x | tests/cp/open-perm-race | 106 |
2 files changed, 111 insertions, 3 deletions
diff --git a/tests/cp/Makefile.am b/tests/cp/Makefile.am index 998b59fbd..1fb58de8a 100644 --- a/tests/cp/Makefile.am +++ b/tests/cp/Makefile.am @@ -21,6 +21,7 @@ AUTOMAKE_OPTIONS = 1.1 gnits TESTS = \ + open-perm-race \ backup-dir \ src-base-dot \ sparse \ @@ -33,7 +34,8 @@ TESTS = \ perm cp-HL cp-i special-bits link dir-rm-dest cp-parents deref-slink \ dir-vs-file into-self EXTRA_DIST = $(TESTS) trailing-slash -TESTS_ENVIRONMENT = \ - MAKE=$(MAKE) \ - CONFIG_HEADER=$(CONFIG_HEADER) \ +TESTS_ENVIRONMENT = \ + MAKE=$(MAKE) \ + abs_top_builddir=$(abs_top_builddir) \ + CONFIG_HEADER=$(CONFIG_HEADER) \ PATH="$(VG_PATH_PREFIX)`pwd`/../../src$(PATH_SEPARATOR)$$PATH" diff --git a/tests/cp/open-perm-race b/tests/cp/open-perm-race new file mode 100755 index 000000000..6c734389d --- /dev/null +++ b/tests/cp/open-perm-race @@ -0,0 +1,106 @@ +#!/bin/sh +# Ensure that when open creates a destination file, +# that file has properly restrictive permissions. +# Before coreutils-6.7, there was an interval in which +# a just-created file would have too-generous permissions. + +# Copyright (C) 2006 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +if test "$VERBOSE" = yes; then + set -x + cp --version +fi + +. $srcdir/../envvar-check +. $srcdir/../group-names +PRIV_CHECK_ARG=require-non-root . $srcdir/../priv-check + +pwd=`pwd` +t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$ +trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0 +trap '(exit $?); exit $?' 1 2 13 15 + +framework_failure=0 +mkdir -p $tmp || framework_failure=1 +cd $tmp || framework_failure=1 + +set _ $groups; shift +group_2=$2 + +umask 2 +mkdir d && chgrp $group_2 d && chmod g+s,g-w d || framework_failure=1 +touch file && chmod go+w file || framework_failure=1 + +( gdb --version ) > gdb.out 2>&1 +if test ! -s gdb.out; then + echo "$0: can't run gdb. Skipping this test." 1>&2 + (exit 77); exit 77 +fi + +( gdb -nx --batch-silent \ + --eval-command='break copy_reg' \ + --eval-command='break open_safer' \ + --eval-command='quit' \ + $abs_top_builddir/src/cp < /dev/null ) > gdb.out 2>&1 +if test -s gdb.out; then + cat <<EOF 1>&2 +$0: can't set breakpoints in cp. Skipping this test. +EOF + (exit 77); exit 77 +fi + +cat <<\EOF > gdb-cmd || framework_failure=1 +break copy_reg +run +break open_safer +continue +continue +finish +quit +EOF + +if test $framework_failure = 1; then + echo "$0: failure in testing framework" 1>&2 + (exit 1); exit 1 +fi + +( gdb -nx --batch-silent --command=gdb-cmd --args \ + $abs_top_builddir/src/cp -p file d ) > gdb.out 2>&1 +# Expect no output. + +if test -s gdb.out; then + cat <<EOF 1>&2 +$0: unexpected output from gdb: (skipping this test) +EOF + cat gdb.out 1>&2 + (exit 77); exit 77 +fi + +fail=0 + +# Before coreutils-6.7, the perm string would be -rw-rw---- +stat --printf='%A\n%g\n' d/file > out || fail=1 +cat <<EOF > exp || fail=1 +-rw------- +$group_2 +EOF + +cmp out exp || fail=1 +test $fail = 1 && diff out exp 2> /dev/null + +(exit $fail); exit $fail |