blob: 311a8c8c56f8c5eacd577b33d8a08dbef1c1dd74 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#!/bin/sh
# $FreeBSD$
desc="chmod changes permission"
dir=`dirname $0`
. ${dir}/../misc.sh
if supported lchmod; then
echo "1..203"
else
echo "1..119"
fi
n0=`namegen`
n1=`namegen`
n2=`namegen`
expect 0 mkdir ${n2} 0755
cdir=`pwd`
cd ${n2}
for type in regular dir fifo block char socket symlink; do
if [ "${type}" != "symlink" ]; then
create_file ${type} ${n0}
expect 0 chmod ${n0} 0111
expect 0111 stat ${n0} mode
expect 0 symlink ${n0} ${n1}
mode=`${fstest} lstat ${n1} mode`
expect 0 chmod ${n1} 0222
expect 0222 stat ${n1} mode
expect 0222 stat ${n0} mode
expect ${mode} lstat ${n1} mode
expect 0 unlink ${n1}
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
if supported lchmod; then
create_file ${type} ${n0}
expect 0 lchmod ${n0} 0111
expect 0111 lstat ${n0} mode
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
done
# successful chmod(2) updates ctime.
for type in regular dir fifo block char socket symlink; do
if [ "${type}" != "symlink" ]; then
create_file ${type} ${n0}
ctime1=`${fstest} stat ${n0} ctime`
sleep 1
expect 0 chmod ${n0} 0111
ctime2=`${fstest} stat ${n0} ctime`
test_check $ctime1 -lt $ctime2
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
if supported lchmod; then
create_file ${type} ${n0}
ctime1=`${fstest} lstat ${n0} ctime`
sleep 1
expect 0 lchmod ${n0} 0111
ctime2=`${fstest} lstat ${n0} ctime`
test_check $ctime1 -lt $ctime2
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
done
# unsuccessful chmod(2) does not update ctime.
for type in regular dir fifo block char socket symlink; do
if [ "${type}" != "symlink" ]; then
create_file ${type} ${n0}
ctime1=`${fstest} stat ${n0} ctime`
sleep 1
expect EPERM -u 65534 chmod ${n0} 0111
ctime2=`${fstest} stat ${n0} ctime`
test_check $ctime1 -eq $ctime2
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
if supported lchmod; then
create_file ${type} ${n0}
ctime1=`${fstest} lstat ${n0} ctime`
sleep 1
expect EPERM -u 65534 lchmod ${n0} 0321
ctime2=`${fstest} lstat ${n0} ctime`
test_check $ctime1 -eq $ctime2
if [ "${type}" = "dir" ]; then
expect 0 rmdir ${n0}
else
expect 0 unlink ${n0}
fi
fi
done
# POSIX: If the calling process does not have appropriate privileges, and if
# the group ID of the file does not match the effective group ID or one of the
# supplementary group IDs and if the file is a regular file, bit S_ISGID
# (set-group-ID on execution) in the file's mode shall be cleared upon
# successful return from chmod().
expect 0 create ${n0} 0755
expect 0 chown ${n0} 65535 65535
expect 0 -u 65535 -g 65535 chmod ${n0} 02755
expect 02755 stat ${n0} mode
expect 0 -u 65535 -g 65535 chmod ${n0} 0755
expect 0755 stat ${n0} mode
todo FreeBSD "S_ISGID should be removed and chmod(2) should success and FreeBSD returns EPERM."
expect 0 -u 65535 -g 65534 chmod ${n0} 02755
expect 0755 stat ${n0} mode
expect 0 unlink ${n0}
cd ${cdir}
expect 0 rmdir ${n2}
|