build: ensure make-prime-list doesn't access out of bounds memory
[platform/upstream/coreutils.git] / tests / misc / xattr.sh
1 #!/bin/sh
2 # Ensure that cp --preserve=xattr, cp --preserve=all and mv preserve extended
3 # attributes and install does not preserve extended attributes.
4 # cp -a should preserve xattr, error diagnostics should not be displayed
5
6 # Copyright (C) 2009-2013 Free Software Foundation, Inc.
7
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU General Public License for more details.
17
18 # You should have received a copy of the GNU General Public License
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
22 print_ver_ cp mv ginstall
23
24 # Skip this test if cp was built without xattr support:
25 touch src dest || framework_failure_
26 cp --preserve=xattr -n src dest \
27   || skip_ "coreutils built without xattr support"
28
29 # this code was taken from test mv/backup-is-src
30 cleanup_() { rm -rf "$other_partition_tmpdir"; }
31 . "$abs_srcdir/tests/other-fs-tmpdir"
32 b_other="$other_partition_tmpdir/b"
33 rm -f "$b_other" || framework_failure_
34
35 # testing xattr name-value pair
36 xattr_name="user.foo"
37 xattr_value="bar"
38 xattr_pair="$xattr_name=\"$xattr_value\""
39
40 # create new file and check its xattrs
41 touch a || framework_failure_
42 getfattr -d a >out_a || skip_ "failed to get xattr of file"
43 grep -F "$xattr_pair" out_a && framework_failure_
44
45 # try to set user xattr on file
46 setfattr -n "$xattr_name" -v "$xattr_value" a >out_a \
47   || skip_ "failed to set xattr of file"
48 getfattr -d a >out_a || skip_ "failed to get xattr of file"
49 grep -F "$xattr_pair" out_a \
50   || skip_ "failed to set xattr of file"
51
52
53 # cp should not preserve xattr by default
54 cp a b || fail=1
55 getfattr -d b >out_b || skip_ "failed to get xattr of file"
56 grep -F "$xattr_pair" out_b && fail=1
57
58 # test if --preserve=xattr option works
59 cp --preserve=xattr a b || fail=1
60 getfattr -d b >out_b || skip_ "failed to get xattr of file"
61 grep -F "$xattr_pair" out_b || fail=1
62
63 # test if --preserve=all option works
64 cp --preserve=all a c || fail=1
65 getfattr -d c >out_c || skip_ "failed to get xattr of file"
66 grep -F "$xattr_pair" out_c || fail=1
67
68 # cp's -a option must produce no diagnostics.
69 cp -a a d 2>err && test -s err && fail=1
70 getfattr -d d >out_d || skip_ "failed to get xattr of file"
71 grep -F "$xattr_pair" out_d || fail=1
72
73 # test if --preserve=xattr works even for files without write access
74 chmod a-w a || framework_failure_
75 rm -f e
76 cp --preserve=xattr a e || fail=1
77 getfattr -d e >out_e || skip_ "failed to get xattr of file"
78 grep -F "$xattr_pair" out_e || fail=1
79
80 # Ensure that permission bits are preserved, too.
81 src_perm=$(stat --format=%a a)
82 dst_perm=$(stat --format=%a e)
83 test "$dst_perm" = "$src_perm" || fail=1
84
85 chmod u+w a || framework_failure_
86
87 rm b || framework_failure_
88
89 # install should never preserve xattr
90 ginstall a b || fail=1
91 getfattr -d b >out_b || skip_ "failed to get xattr of file"
92 grep -F "$xattr_pair" out_b && fail=1
93
94 # mv should preserve xattr when renaming within a file system.
95 # This is implicitly done by rename () and doesn't need explicit
96 # xattr support in mv.
97 mv a b || fail=1
98 getfattr -d b >out_b || skip_ "failed to get xattr of file"
99 grep -F "$xattr_pair" out_b || cat >&2 <<EOF
100 =================================================================
101 $0: WARNING!!!
102 rename () does not preserve extended attributes
103 =================================================================
104 EOF
105
106 # try to set user xattr on file on other partition
107 test_mv=1
108 touch "$b_other" || framework_failure_
109 setfattr -n "$xattr_name" -v "$xattr_value" "$b_other" >out_a \
110   || test_mv=0
111 getfattr -d "$b_other" >out_b || test_mv=0
112 grep -F "$xattr_pair" out_b || test_mv=0
113 rm -f "$b_other" || framework_failure_
114
115 if test $test_mv -eq 1; then
116   # mv should preserve xattr when copying content from one partition to another
117   mv b "$b_other" || fail=1
118   getfattr -d "$b_other" >out_b ||
119     skip_ "failed to get xattr of file"
120   grep -F "$xattr_pair" out_b || fail=1
121 else
122   cat >&2 <<EOF
123 =================================================================
124 $0: WARNING!!!
125 failed to set xattr of file $b_other
126 =================================================================
127 EOF
128 fi
129
130 Exit $fail