4 desc="chown changes ownership"
9 if supported lchmod; then
19 expect 0 mkdir ${n2} 0755
23 # super-user can always modify ownership
24 for type in regular dir fifo block char socket symlink; do
25 if [ "${type}" != "symlink" ]; then
26 create_file ${type} ${n0}
28 expect 0 chown ${n0} 123 456
29 expect 123,456 lstat ${n0} uid,gid
30 expect 0 chown ${n0} 0 0
31 expect 0,0 lstat ${n0} uid,gid
33 expect 0 symlink ${n0} ${n1}
34 uidgid=`${fstest} lstat ${n1} uid,gid`
35 expect 0 chown ${n1} 123 456
36 expect 123,456 stat ${n1} uid,gid
37 expect 123,456 stat ${n0} uid,gid
38 expect ${uidgid} lstat ${n1} uid,gid
41 if [ "${type}" = "dir" ]; then
48 create_file ${type} ${n0}
49 expect 0 lchown ${n0} 123 456
50 expect 123,456 lstat ${n0} uid,gid
51 if [ "${type}" = "dir" ]; then
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 for type in regular dir fifo block char socket symlink; do
61 if [ "${type}" != "symlink" ]; then
62 create_file ${type} ${n0}
64 expect 0 chown ${n0} 65534 65533
65 expect 65534,65533 lstat ${n0} uid,gid
66 expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532
67 expect 65534,65532 lstat ${n0} uid,gid
68 expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531
69 expect 65534,65531 lstat ${n0} uid,gid
71 expect 0 symlink ${n0} ${n1}
72 uidgid=`${fstest} lstat ${n1} uid,gid`
73 expect 0 chown ${n1} 65534 65533
74 expect 65534,65533 stat ${n0} uid,gid
75 expect 65534,65533 stat ${n1} uid,gid
76 expect ${uidgid} lstat ${n1} uid,gid
77 expect 0 -u 65534 -g 65532,65531 -- chown ${n1} -1 65532
78 expect 65534,65532 stat ${n0} uid,gid
79 expect 65534,65532 stat ${n1} uid,gid
80 expect ${uidgid} lstat ${n1} uid,gid
81 expect 0 -u 65534 -g 65532,65531 chown ${n1} 65534 65531
82 expect 65534,65531 stat ${n0} uid,gid
83 expect 65534,65531 stat ${n1} uid,gid
84 expect ${uidgid} lstat ${n1} uid,gid
87 if [ "${type}" = "dir" ]; then
94 create_file ${type} ${n0}
95 expect 0 lchown ${n0} 65534 65533
96 expect 65534,65533 lstat ${n0} uid,gid
97 expect 0 -u 65534 -g 65532,65531 -- lchown ${n0} -1 65532
98 expect 65534,65532 lstat ${n0} uid,gid
99 expect 0 -u 65534 -g 65532,65531 lchown ${n0} 65534 65531
100 expect 65534,65531 lstat ${n0} uid,gid
101 if [ "${type}" = "dir" ]; then
104 expect 0 unlink ${n0}
108 # chown(2) return 0 if user is not owner of a file, but chown(2) is called
109 # with both uid and gid equal to -1.
110 for type in regular dir fifo block char socket symlink; do
111 if [ "${type}" != "symlink" ]; then
112 create_file ${type} ${n0}
114 expect 0 chown ${n0} 65534 65533
115 expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1
116 expect 65534,65533 stat ${n0} uid,gid
118 expect 0 symlink ${n0} ${n1}
119 uidgid=`${fstest} lstat ${n1} uid,gid`
120 expect 0 chown ${n1} 65534 65533
121 expect 65534,65533 stat ${n0} uid,gid
122 expect 65534,65533 stat ${n1} uid,gid
123 expect ${uidgid} lstat ${n1} uid,gid
124 expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1
125 expect 65534,65533 stat ${n0} uid,gid
126 expect 65534,65533 stat ${n1} uid,gid
127 expect ${uidgid} lstat ${n1} uid,gid
128 expect 0 unlink ${n1}
130 if [ "${type}" = "dir" ]; then
133 expect 0 unlink ${n0}
137 create_file ${type} ${n0}
138 expect 0 lchown ${n0} 65534 65533
139 expect 0 -u 65532 -g 65531 -- lchown ${n0} -1 -1
140 expect 65534,65533 lstat ${n0} uid,gid
141 if [ "${type}" = "dir" ]; then
144 expect 0 unlink ${n0}
148 # when super-user calls chown(2), set-uid and set-gid bits may be removed.
149 for type in regular dir fifo block char socket symlink; do
150 if [ "${type}" != "symlink" ]; then
151 create_file ${type} ${n0}
153 expect 0 chown ${n0} 65534 65533
154 expect 0 chmod ${n0} 06555
155 expect 06555,65534,65533 stat ${n0} mode,uid,gid
156 expect 0 chown ${n0} 65532 65531
157 expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid
158 expect 0 chmod ${n0} 06555
159 expect 06555,65532,65531 stat ${n0} mode,uid,gid
160 expect 0 chown ${n0} 0 0
161 expect "(06555|0555),0,0" stat ${n0} mode,uid,gid
163 expect 0 symlink ${n0} ${n1}
164 expect 0 chown ${n1} 65534 65533
165 expect 0 chmod ${n1} 06555
166 expect 06555,65534,65533 stat ${n0} mode,uid,gid
167 expect 06555,65534,65533 stat ${n1} mode,uid,gid
168 expect 0 chown ${n1} 65532 65531
169 expect "(06555|0555),65532,65531" stat ${n0} mode,uid,gid
170 expect "(06555|0555),65532,65531" stat ${n1} mode,uid,gid
171 expect 0 chmod ${n1} 06555
172 expect 06555,65532,65531 stat ${n0} mode,uid,gid
173 expect 06555,65532,65531 stat ${n1} mode,uid,gid
174 expect 0 chown ${n1} 0 0
175 expect "(06555|0555),0,0" stat ${n0} mode,uid,gid
176 expect "(06555|0555),0,0" stat ${n1} mode,uid,gid
177 expect 0 unlink ${n1}
179 if [ "${type}" = "dir" ]; then
182 expect 0 unlink ${n0}
186 if [ "${type}" != "symlink" ] || supported lchmod; then
187 create_file ${type} ${n0}
188 expect 0 lchown ${n0} 65534 65533
189 if supported lchmod; then
190 expect 0 lchmod ${n0} 06555
192 expect 0 chmod ${n0} 06555
194 expect 06555,65534,65533 lstat ${n0} mode,uid,gid
195 expect 0 lchown ${n0} 65532 65531
196 expect "(06555|0555),65532,65531" lstat ${n0} mode,uid,gid
197 if supported lchmod; then
198 expect 0 lchmod ${n0} 06555
200 expect 0 chmod ${n0} 06555
202 expect 06555,65532,65531 lstat ${n0} mode,uid,gid
203 expect 0 lchown ${n0} 0 0
204 expect "(06555|0555),0,0" lstat ${n0} mode,uid,gid
205 if [ "${type}" = "dir" ]; then
208 expect 0 unlink ${n0}
213 # when non-super-user calls chown(2) successfully, set-uid and set-gid bits may
214 # be removed, except when both uid and gid are equal to -1.
215 for type in regular dir fifo block char socket symlink; do
216 if [ "${type}" != "symlink" ]; then
217 create_file ${type} ${n0}
219 expect 0 chown ${n0} 65534 65533
220 expect 0 chmod ${n0} 06555
221 expect 06555,65534,65533 stat ${n0} mode,uid,gid
222 expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
223 expect 0555,65534,65532 stat ${n0} mode,uid,gid
224 expect 0 chmod ${n0} 06555
225 expect 06555,65534,65532 stat ${n0} mode,uid,gid
226 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533
227 expect 0555,65534,65533 stat ${n0} mode,uid,gid
228 expect 0 chmod ${n0} 06555
229 expect 06555,65534,65533 stat ${n0} mode,uid,gid
230 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1
231 expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid
233 expect 0 symlink ${n0} ${n1}
234 expect 0 chown ${n1} 65534 65533
235 expect 0 chmod ${n1} 06555
236 expect 06555,65534,65533 stat ${n0} mode,uid,gid
237 expect 06555,65534,65533 stat ${n1} mode,uid,gid
238 expect 0 -u 65534 -g 65533,65532 chown ${n1} 65534 65532
239 expect 0555,65534,65532 stat ${n0} mode,uid,gid
240 expect 0555,65534,65532 stat ${n1} mode,uid,gid
241 expect 0 chmod ${n1} 06555
242 expect 06555,65534,65532 stat ${n0} mode,uid,gid
243 expect 06555,65534,65532 stat ${n1} mode,uid,gid
244 expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 65533
245 expect 0555,65534,65533 stat ${n0} mode,uid,gid
246 expect 0555,65534,65533 stat ${n1} mode,uid,gid
247 expect 0 chmod ${n1} 06555
248 expect 06555,65534,65533 stat ${n0} mode,uid,gid
249 expect 06555,65534,65533 stat ${n1} mode,uid,gid
250 expect 0 -u 65534 -g 65533,65532 -- chown ${n1} -1 -1
251 expect "(06555|0555),65534,65533" stat ${n0} mode,uid,gid
252 expect "(06555|0555),65534,65533" stat ${n1} mode,uid,gid
253 expect 0 unlink ${n1}
255 if [ "${type}" = "dir" ]; then
258 expect 0 unlink ${n0}
262 if [ "${type}" != "symlink" ] || supported lchmod; then
263 create_file ${type} ${n0}
265 expect 0 lchown ${n0} 65534 65533
266 if supported lchmod; then
267 expect 0 lchmod ${n0} 06555
269 expect 0 chmod ${n0} 06555
271 expect 06555,65534,65533 lstat ${n0} mode,uid,gid
272 expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532
273 expect 0555,65534,65532 lstat ${n0} mode,uid,gid
274 if supported lchmod; then
275 expect 0 lchmod ${n0} 06555
277 expect 0 chmod ${n0} 06555
279 expect 06555,65534,65532 lstat ${n0} mode,uid,gid
280 expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 65533
281 expect 0555,65534,65533 lstat ${n0} mode,uid,gid
282 if supported lchmod; then
283 expect 0 lchmod ${n0} 06555
285 expect 0 chmod ${n0} 06555
287 expect 06555,65534,65533 lstat ${n0} mode,uid,gid
288 expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 -1
289 expect "(06555|0555),65534,65533" lstat ${n0} mode,uid,gid
291 if [ "${type}" = "dir" ]; then
294 expect 0 unlink ${n0}
299 # successful chown(2) call (except uid and gid equal to -1) updates ctime.
300 for type in regular dir fifo block char socket symlink; do
301 if [ "${type}" != "symlink" ]; then
302 create_file ${type} ${n0}
304 ctime1=`${fstest} stat ${n0} ctime`
306 expect 0 chown ${n0} 65534 65533
307 expect 65534,65533 stat ${n0} uid,gid
308 ctime2=`${fstest} stat ${n0} ctime`
309 test_check $ctime1 -lt $ctime2
310 ctime1=`${fstest} stat ${n0} ctime`
312 expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
313 expect 65534,65532 stat ${n0} uid,gid
314 ctime2=`${fstest} stat ${n0} ctime`
315 test_check $ctime1 -lt $ctime2
317 expect 0 symlink ${n0} ${n1}
318 ctime1=`${fstest} stat ${n1} ctime`
320 expect 0 chown ${n1} 65533 65532
321 expect 65533,65532 stat ${n1} uid,gid
322 ctime2=`${fstest} stat ${n1} ctime`
323 test_check $ctime1 -lt $ctime2
324 ctime1=`${fstest} stat ${n1} ctime`
326 expect 0 -u 65533 -g 65531 chown ${n1} 65533 65531
327 expect 65533,65531 stat ${n1} uid,gid
328 ctime2=`${fstest} stat ${n1} ctime`
329 test_check $ctime1 -lt $ctime2
330 expect 0 unlink ${n1}
332 if [ "${type}" = "dir" ]; then
335 expect 0 unlink ${n0}
339 create_file ${type} ${n0}
341 ctime1=`${fstest} lstat ${n0} ctime`
343 expect 0 lchown ${n0} 65534 65533
344 expect 65534,65533 lstat ${n0} uid,gid
345 ctime2=`${fstest} lstat ${n0} ctime`
346 test_check $ctime1 -lt $ctime2
347 ctime1=`${fstest} lstat ${n0} ctime`
349 expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532
350 expect 65534,65532 lstat ${n0} uid,gid
351 ctime2=`${fstest} lstat ${n0} ctime`
352 test_check $ctime1 -lt $ctime2
354 if [ "${type}" = "dir" ]; then
357 expect 0 unlink ${n0}
361 for type in regular dir fifo block char socket symlink; do
362 if [ "${type}" != "symlink" ]; then
363 create_file ${type} ${n0}
365 ctime1=`${fstest} stat ${n0} ctime`
367 expect 0 -- chown ${n0} -1 -1
368 ctime2=`${fstest} stat ${n0} ctime`
369 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
370 test_check $ctime1 -eq $ctime2
371 expect 0,0 stat ${n0} uid,gid
373 expect 0 symlink ${n0} ${n1}
374 ctime1=`${fstest} stat ${n1} ctime`
376 expect 0 -- chown ${n1} -1 -1
377 ctime2=`${fstest} stat ${n1} ctime`
378 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
379 test_check $ctime1 -eq $ctime2
380 expect 0,0 stat ${n1} uid,gid
381 expect 0 unlink ${n1}
383 if [ "${type}" = "dir" ]; then
386 expect 0 unlink ${n0}
390 create_file ${type} ${n0}
392 ctime1=`${fstest} lstat ${n0} ctime`
394 expect 0 -- lchown ${n0} -1 -1
395 ctime2=`${fstest} lstat ${n0} ctime`
396 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
397 test_check $ctime1 -eq $ctime2
398 expect 0,0 lstat ${n0} uid,gid
400 if [ "${type}" = "dir" ]; then
403 expect 0 unlink ${n0}
407 # unsuccessful chown(2) does not update ctime.
408 for type in regular dir fifo block char socket symlink; do
409 if [ "${type}" != "symlink" ]; then
410 create_file ${type} ${n0}
412 ctime1=`${fstest} stat ${n0} ctime`
414 expect EPERM -u 65534 -- chown ${n0} 65534 -1
415 expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534
416 expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534
417 ctime2=`${fstest} stat ${n0} ctime`
418 test_check $ctime1 -eq $ctime2
419 expect 0,0 stat ${n0} uid,gid
421 expect 0 symlink ${n0} ${n1}
422 ctime1=`${fstest} stat ${n1} ctime`
424 expect EPERM -u 65534 -- chown ${n1} 65534 -1
425 expect EPERM -u 65534 -g 65534 -- chown ${n1} -1 65534
426 expect EPERM -u 65534 -g 65534 chown ${n1} 65534 65534
427 ctime2=`${fstest} stat ${n1} ctime`
428 test_check $ctime1 -eq $ctime2
429 expect 0,0 stat ${n1} uid,gid
430 expect 0 unlink ${n1}
432 if [ "${type}" = "dir" ]; then
435 expect 0 unlink ${n0}
439 create_file ${type} ${n0}
441 ctime1=`${fstest} lstat ${n0} ctime`
443 expect EPERM -u 65534 -- lchown ${n0} 65534 -1
444 expect EPERM -u 65534 -g 65534 -- lchown ${n0} -1 65534
445 expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534
446 ctime2=`${fstest} lstat ${n0} ctime`
447 test_check $ctime1 -eq $ctime2
448 expect 0,0 lstat ${n0} uid,gid
450 if [ "${type}" = "dir" ]; then
453 expect 0 unlink ${n0}