tr: fix various issues with case conversion
[coreutils/ericb.git] / tests / cp / existing-perm-race
blobffd29f0f4ac2b012c94b27c78acff714cf4dc25d
1 #!/bin/sh
2 # Make sure cp -p isn't too generous with existing file permissions.
4 # Copyright (C) 2006-2010 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 if test "$VERBOSE" = yes; then
20 set -x
21 cp --version
24 . $srcdir/test-lib.sh
26 require_membership_in_two_groups_
28 # cp -p gives ENOTSUP on NFS on Linux 2.6.9 at least
29 require_local_dir_
31 set _ $groups; shift
32 g1=$1
33 g2=$2
36 umask 077
37 mkfifo fifo ||
38 skip_test_ "fifos not supported"
40 touch fifo-copy &&
41 chgrp $g1 fifo &&
42 chgrp $g2 fifo-copy &&
43 chmod g+r fifo-copy || framework-failure
45 # Copy a fifo's contents. That way, we can examine the
46 # destination permissions before they're finalized.
47 cp -p --copy-contents fifo fifo-copy &
48 cp_pid=$!
51 # Now 'cp' is reading the fifo. Wait for the destination file to
52 # be written to, encouraging things along by echoing to the fifo.
53 while test ! -s fifo-copy; do
54 echo foo
55 done
57 # Check the permissions of the destination.
58 ls -l -n fifo-copy >ls.out &&
60 # Close the fifo so that "cp" can continue. But output first,
61 # before exiting, otherwise some shells would optimize away the file
62 # descriptor that holds the fifo open.
63 echo foo
64 ) >fifo || fail=1
66 # Check that the destination mode is safe while the file is being copied.
67 read mode links owner group etc <ls.out || fail=1
68 case $mode in
69 -rw-------*) ;;
71 # FIXME: Remove the following case; the file mode should always be
72 # 600 while the data are being copied. This will require changing
73 # cp so that it also does not put $g1's data in a file that is
74 # accessible to $g2. This fix will not close a security hole, since
75 # a $g2 process can maintain an open file descriptor to the
76 # destination, but it's safer anyway.
77 -rw-r-----*)
78 # If the file has group $g1 and is group-readable, that is definitely
79 # bogus, as neither the source nor the destination was readable to group $g1.
80 test "$group" = "$g1" && fail=1;;
82 *) fail=1;;
83 esac
85 wait $cp_pid || fail=1
87 # Check that the final mode and group are right.
88 ls -l -n fifo-copy >ls.out &&
89 read mode links owner group etc <ls.out || fail=1
90 case $mode in
91 -rw-------*) test "$group" = "$g1" || fail=1;;
92 *) fail=1;;
93 esac
95 Exit $fail