2 # Make sure cp -p isn't too generous with existing file permissions.
4 # Copyright (C) 2006-2008 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
25 require_membership_in_two_groups_
35 skip_test_ "fifos not supported"
39 chgrp $g2 fifo-copy &&
40 chmod g+r fifo-copy || framework-failure
42 # Copy a fifo's contents. That way, we can examine the
43 # destination permissions before they're finalized.
44 cp -p --copy-contents fifo fifo-copy &
48 # Now 'cp' is reading the fifo. Wait for the destination file to
49 # be written to, encouraging things along by echoing to the fifo.
50 while test ! -s fifo-copy; do
54 # Check the permissions of the destination.
55 ls -l -n fifo-copy >ls.out &&
57 # Close the fifo so that "cp" can continue. But output first,
58 # before exiting, otherwise some shells would optimize away the file
59 # descriptor that holds the fifo open.
63 # Check that the destination mode is safe while the file is being copied.
64 read mode links owner group etc <ls.out || fail=1
68 # FIXME: Remove the following case; the file mode should always be
69 # 600 while the data are being copied. This will require changing
70 # cp so that it also does not put $g1's data in a file that is
71 # accessible to $g2. This fix will not close a security hole, since
72 # a $g2 process can maintain an open file descriptor to the
73 # destination, but it's safer anyway.
75 # If the file has group $g1 and is group-readable, that is definitely
76 # bogus, as neither the source nor the destination was readable to group $g1.
77 test "$group" = "$g1" && fail=1;;
82 wait $cp_pid || fail=1
84 # Check that the final mode and group are right.
85 ls -l -n fifo-copy >ls.out &&
86 read mode links owner group etc <ls.out || fail=1
88 -rw-------*) test "$group" = "$g1" || fail=1;;