00.t revision 166065
1#!/bin/sh
2# $FreeBSD: head/tools/regression/fstest/tests/chown/00.t 166065 2007-01-17 01:42:12Z pjd $
3
4desc="chown changes ownership"
5
6dir=`dirname $0`
7. ${dir}/../misc.sh
8
9if supported lchmod; then
10	echo "1..186"
11else
12	echo "1..171"
13fi
14
15n0=`namegen`
16n1=`namegen`
17n2=`namegen`
18
19expect 0 mkdir ${n2} 0755
20cdir=`pwd`
21cd ${n2}
22
23# super-user can always modify ownership
24# 2
25expect 0 create ${n0} 0644
26expect 0 chown ${n0} 123 456
27expect 123,456 lstat ${n0} uid,gid
28expect 0 chown ${n0} 0 0
29expect 0,0 lstat ${n0} uid,gid
30expect 0 unlink ${n0}
31# 8
32expect 0 mkfifo ${n0} 0644
33expect 0 chown ${n0} 123 456
34expect 123,456 lstat ${n0} uid,gid
35expect 0 chown ${n0} 0 0
36expect 0,0 lstat ${n0} uid,gid
37expect 0 unlink ${n0}
38# 14
39expect 0 mkdir ${n0} 0755
40expect 0 chown ${n0} 123 456
41expect 123,456 lstat ${n0} uid,gid
42expect 0 chown ${n0} 0 0
43expect 0,0 lstat ${n0} uid,gid
44expect 0 rmdir ${n0}
45# 20
46expect 0 create ${n0} 0644
47expect 0 symlink ${n0} ${n1}
48expect 0 chown ${n1} 123 456
49expect 123,456 stat ${n1} uid,gid
50expect 123,456 stat ${n0} uid,gid
51expect 0 lchown ${n1} 135 579
52expect 135,579 lstat ${n1} uid,gid
53expect 123,456 stat ${n1} uid,gid
54expect 123,456 stat ${n0} uid,gid
55expect 0 unlink ${n0}
56expect 0 unlink ${n1}
57
58# non-super-user can modify file group if he is owner of a file and
59# gid he is setting is in his groups list.
60# 31
61expect 0 create ${n0} 0644
62expect 0 chown ${n0} 65534 65533
63expect 65534,65533 lstat ${n0} uid,gid
64expect 0 -u 65534 -g 65532,65531 chown ${n0} -1 65532
65expect 65534,65532 lstat ${n0} uid,gid
66expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531
67expect 65534,65531 lstat ${n0} uid,gid
68expect 0 unlink ${n0}
69
70# chown(2) return 0 if user is not owner of a file, but chown(2) is called
71# with both uid and gid equal to -1.
72# 39
73expect 0 create ${n0} 0644
74expect 0 chown ${n0} 65534 65533
75expect 0 -u 65532 -g 65531 chown ${n0} -1 -1
76expect 0 unlink ${n0}
77
78# when super-user calls chown(2), set-uid and set-gid bits are not removed.
79# 43
80expect 0 create ${n0} 0644
81expect 0 chown ${n0} 65534 65533
82expect 0 chmod ${n0} 06555
83expect 06555 lstat ${n0} mode
84expect 0 chown ${n0} 65532 65531
85expect 06555 lstat ${n0} mode
86expect 0 unlink ${n0}
87# 50
88expect 0 create ${n0} 0644
89expect 0 chown ${n0} 0 0
90expect 0 chmod ${n0} 06555
91expect 06555 lstat ${n0} mode
92expect 0 chown ${n0} 65534 65533
93expect 06555 lstat ${n0} mode
94expect 0 unlink ${n0}
95# 57
96expect 0 create ${n0} 0644
97expect 0 chown ${n0} 65534 65533
98expect 0 chmod ${n0} 06555
99expect 06555 lstat ${n0} mode
100expect 0 chown ${n0} 0 0
101expect 06555 lstat ${n0} mode
102expect 0 unlink ${n0}
103
104# when non-super-user calls chown(2) successfully, set-uid and set-gid bits are
105# removed, except when both uid and gid are equal to -1.
106# 64
107expect 0 create ${n0} 0644
108expect 0 chown ${n0} 65534 65533
109expect 0 chmod ${n0} 06555
110expect 06555 lstat ${n0} mode
111expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
112expect 0555,65534,65532 lstat ${n0} mode,uid,gid
113expect 0 chmod ${n0} 06555
114expect 06555 lstat ${n0} mode
115expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 65533
116expect 0555,65534,65533 lstat ${n0} mode,uid,gid
117expect 0 chmod ${n0} 06555
118expect 06555 lstat ${n0} mode
119expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 -1
120expect 06555,65534,65533 lstat ${n0} mode,uid,gid
121expect 0 unlink ${n0}
122# 79
123expect 0 mkdir ${n0} 0755
124expect 0 chown ${n0} 65534 65533
125expect 0 chmod ${n0} 06555
126expect 06555 lstat ${n0} mode
127expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
128expect 0555,65534,65532 lstat ${n0} mode,uid,gid
129expect 0 chmod ${n0} 06555
130expect 06555 lstat ${n0} mode
131expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 65533
132expect 0555,65534,65533 lstat ${n0} mode,uid,gid
133expect 0 chmod ${n0} 06555
134expect 06555 lstat ${n0} mode
135expect 0 -u 65534 -g 65533,65532 chown ${n0} -1 -1
136expect 06555,65534,65533 lstat ${n0} mode,uid,gid
137expect 0 rmdir ${n0}
138# 94
139if supported lchmod; then
140	expect 0 symlink ${n1} ${n0}
141	expect 0 lchown ${n0} 65534 65533
142	expect 0 lchmod ${n0} 06555
143	expect 06555 lstat ${n0} mode
144	expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532
145	expect 0555,65534,65532 lstat ${n0} mode,uid,gid
146	expect 0 lchmod ${n0} 06555
147	expect 06555 lstat ${n0} mode
148	expect 0 -u 65534 -g 65533,65532 lchown ${n0} -1 65533
149	expect 0555,65534,65533 lstat ${n0} mode,uid,gid
150	expect 0 lchmod ${n0} 06555
151	expect 06555 lstat ${n0} mode
152	expect 0 -u 65534 -g 65533,65532 lchown ${n0} -1 -1
153	expect 06555,65534,65533 lstat ${n0} mode,uid,gid
154	expect 0 unlink ${n0}
155fi
156
157# successfull chown(2) call (except uid and gid equal to -1) updates ctime.
158# 109
159expect 0 create ${n0} 0644
160ctime1=`${fstest} stat ${n0} ctime`
161sleep 1
162expect 0 chown ${n0} 65534 65533
163expect 65534,65533 lstat ${n0} uid,gid
164ctime2=`${fstest} stat ${n0} ctime`
165test_check $ctime1 -lt $ctime2
166expect 0 unlink ${n0}
167# 114
168expect 0 mkdir ${n0} 0755
169ctime1=`${fstest} stat ${n0} ctime`
170sleep 1
171expect 0 chown ${n0} 65534 65533
172expect 65534,65533 lstat ${n0} uid,gid
173ctime2=`${fstest} stat ${n0} ctime`
174test_check $ctime1 -lt $ctime2
175expect 0 rmdir ${n0}
176# 119
177expect 0 mkfifo ${n0} 0644
178ctime1=`${fstest} stat ${n0} ctime`
179sleep 1
180expect 0 chown ${n0} 65534 65533
181expect 65534,65533 lstat ${n0} uid,gid
182ctime2=`${fstest} stat ${n0} ctime`
183test_check $ctime1 -lt $ctime2
184expect 0 unlink ${n0}
185# 124
186expect 0 symlink ${n1} ${n0}
187ctime1=`${fstest} lstat ${n0} ctime`
188sleep 1
189expect 0 lchown ${n0} 65534 65533
190expect 65534,65533 lstat ${n0} uid,gid
191ctime2=`${fstest} lstat ${n0} ctime`
192test_check $ctime1 -lt $ctime2
193expect 0 unlink ${n0}
194# 129
195expect 0 create ${n0} 0644
196expect 0 chown ${n0} 65534 65533
197ctime1=`${fstest} stat ${n0} ctime`
198sleep 1
199expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
200expect 65534,65532 lstat ${n0} uid,gid
201ctime2=`${fstest} stat ${n0} ctime`
202test_check $ctime1 -lt $ctime2
203expect 0 unlink ${n0}
204# 135
205expect 0 mkdir ${n0} 0755
206expect 0 chown ${n0} 65534 65533
207ctime1=`${fstest} stat ${n0} ctime`
208sleep 1
209expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
210expect 65534,65532 lstat ${n0} uid,gid
211ctime2=`${fstest} stat ${n0} ctime`
212test_check $ctime1 -lt $ctime2
213expect 0 rmdir ${n0}
214# 141
215expect 0 mkfifo ${n0} 0644
216expect 0 chown ${n0} 65534 65533
217ctime1=`${fstest} stat ${n0} ctime`
218sleep 1
219expect 0 chown ${n0} 65534 65533
220expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
221expect 65534,65532 lstat ${n0} uid,gid
222ctime2=`${fstest} stat ${n0} ctime`
223test_check $ctime1 -lt $ctime2
224expect 0 unlink ${n0}
225# 148
226expect 0 symlink ${n1} ${n0}
227expect 0 lchown ${n0} 65534 65533
228ctime1=`${fstest} lstat ${n0} ctime`
229sleep 1
230expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532
231expect 65534,65532 lstat ${n0} uid,gid
232ctime2=`${fstest} lstat ${n0} ctime`
233test_check $ctime1 -lt $ctime2
234expect 0 unlink ${n0}
235# 154
236expect 0 create ${n0} 0644
237ctime1=`${fstest} stat ${n0} ctime`
238sleep 1
239expect 0 chown ${n0} -1 -1
240ctime2=`${fstest} stat ${n0} ctime`
241test_check $ctime1 -eq $ctime2
242expect 0 unlink ${n0}
243# 158
244expect 0 mkdir ${n0} 0644
245ctime1=`${fstest} stat ${n0} ctime`
246sleep 1
247expect 0 chown ${n0} -1 -1
248ctime2=`${fstest} stat ${n0} ctime`
249test_check $ctime1 -eq $ctime2
250expect 0 rmdir ${n0}
251# 162
252expect 0 mkfifo ${n0} 0644
253ctime1=`${fstest} stat ${n0} ctime`
254sleep 1
255expect 0 chown ${n0} -1 -1
256ctime2=`${fstest} stat ${n0} ctime`
257test_check $ctime1 -eq $ctime2
258expect 0 unlink ${n0}
259# 166
260expect 0 symlink ${n1} ${n0}
261ctime1=`${fstest} lstat ${n0} ctime`
262sleep 1
263expect 0 lchown ${n0} -1 -1
264ctime2=`${fstest} lstat ${n0} ctime`
265test_check $ctime1 -eq $ctime2
266expect 0 unlink ${n0}
267
268# unsuccessful chown(2) does not update ctime.
269# 170
270expect 0 create ${n0} 0644
271ctime1=`${fstest} stat ${n0} ctime`
272sleep 1
273expect EPERM -u 65534 chown ${n0} 65534 -1
274ctime2=`${fstest} stat ${n0} ctime`
275test_check $ctime1 -eq $ctime2
276expect 0 unlink ${n0}
277# 174
278expect 0 mkdir ${n0} 0755
279ctime1=`${fstest} stat ${n0} ctime`
280sleep 1
281expect EPERM -u 65534 -g 65534 chown ${n0} -1 65534
282ctime2=`${fstest} stat ${n0} ctime`
283test_check $ctime1 -eq $ctime2
284expect 0 rmdir ${n0}
285# 178
286expect 0 mkfifo ${n0} 0644
287ctime1=`${fstest} stat ${n0} ctime`
288sleep 1
289expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534
290ctime2=`${fstest} stat ${n0} ctime`
291test_check $ctime1 -eq $ctime2
292expect 0 unlink ${n0}
293# 182
294expect 0 symlink ${n1} ${n0}
295ctime1=`${fstest} lstat ${n0} ctime`
296sleep 1
297expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534
298ctime2=`${fstest} lstat ${n0} ctime`
299test_check $ctime1 -eq $ctime2
300expect 0 unlink ${n0}
301
302# 186
303cd ${cdir}
304expect 0 rmdir ${n2}
305