4 desc="chown changes ownership"
9 if supported lchmod; then
19 expect 0 mkdir ${n2} 0755
23 # super-user can always modify ownership
25 expect 0 create ${n0} 0644
26 expect 0 chown ${n0} 123 456
27 expect 123,456 lstat ${n0} uid,gid
28 expect 0 chown ${n0} 0 0
29 expect 0,0 lstat ${n0} uid,gid
32 expect 0 mkfifo ${n0} 0644
33 expect 0 chown ${n0} 123 456
34 expect 123,456 lstat ${n0} uid,gid
35 expect 0 chown ${n0} 0 0
36 expect 0,0 lstat ${n0} uid,gid
39 expect 0 mkdir ${n0} 0755
40 expect 0 chown ${n0} 123 456
41 expect 123,456 lstat ${n0} uid,gid
42 expect 0 chown ${n0} 0 0
43 expect 0,0 lstat ${n0} uid,gid
46 expect 0 create ${n0} 0644
47 expect 0 symlink ${n0} ${n1}
48 expect 0 chown ${n1} 123 456
49 expect 123,456 stat ${n1} uid,gid
50 expect 123,456 stat ${n0} uid,gid
51 expect 0 lchown ${n1} 135 579
52 expect 135,579 lstat ${n1} uid,gid
53 expect 123,456 stat ${n1} uid,gid
54 expect 123,456 stat ${n0} uid,gid
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.
61 expect 0 create ${n0} 0644
62 expect 0 chown ${n0} 65534 65533
63 expect 65534,65533 lstat ${n0} uid,gid
64 expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532
65 expect 65534,65532 lstat ${n0} uid,gid
66 expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531
67 expect 65534,65531 lstat ${n0} uid,gid
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.
73 expect 0 create ${n0} 0644
74 expect 0 chown ${n0} 65534 65533
75 expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1
78 # when super-user calls chown(2), set-uid and set-gid bits may be removed.
80 expect 0 create ${n0} 0644
81 expect 0 chown ${n0} 65534 65533
82 expect 0 chmod ${n0} 06555
83 expect 06555 lstat ${n0} mode
84 expect 0 chown ${n0} 65532 65531
85 expect "06555|0555" lstat ${n0} mode
88 expect 0 create ${n0} 0644
89 expect 0 chown ${n0} 0 0
90 expect 0 chmod ${n0} 06555
91 expect 06555 lstat ${n0} mode
92 expect 0 chown ${n0} 65534 65533
93 expect "06555|0555" lstat ${n0} mode
96 expect 0 create ${n0} 0644
97 expect 0 chown ${n0} 65534 65533
98 expect 0 chmod ${n0} 06555
99 expect 06555 lstat ${n0} mode
100 expect 0 chown ${n0} 0 0
101 expect "06555|0555" lstat ${n0} mode
102 expect 0 unlink ${n0}
104 # when non-super-user calls chown(2) successfully, set-uid and set-gid bits may
105 # be removed, except when both uid and gid are equal to -1.
107 expect 0 create ${n0} 0644
108 expect 0 chown ${n0} 65534 65533
109 expect 0 chmod ${n0} 06555
110 expect 06555 lstat ${n0} mode
111 expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
112 expect 0555,65534,65532 lstat ${n0} mode,uid,gid
113 expect 0 chmod ${n0} 06555
114 expect 06555 lstat ${n0} mode
115 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533
116 expect 0555,65534,65533 lstat ${n0} mode,uid,gid
117 expect 0 chmod ${n0} 06555
118 expect 06555 lstat ${n0} mode
119 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1
120 expect "06555,65534,65533|0555,65534,65533" lstat ${n0} mode,uid,gid
121 expect 0 unlink ${n0}
123 expect 0 mkdir ${n0} 0755
124 expect 0 chown ${n0} 65534 65533
125 expect 0 chmod ${n0} 06555
126 expect 06555 lstat ${n0} mode
127 expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532
128 expect "0555,65534,65532|06555,65534,65532" lstat ${n0} mode,uid,gid
129 expect 0 chmod ${n0} 06555
130 expect 06555 lstat ${n0} mode
131 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533
132 expect "0555,65534,65533|06555,65534,65533" lstat ${n0} mode,uid,gid
133 expect 0 chmod ${n0} 06555
134 expect 06555 lstat ${n0} mode
135 expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1
136 expect 06555,65534,65533 lstat ${n0} mode,uid,gid
139 if 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}
157 # successfull chown(2) call (except uid and gid equal to -1) updates ctime.
159 expect 0 create ${n0} 0644
160 ctime1=`${fstest} stat ${n0} ctime`
162 expect 0 chown ${n0} 65534 65533
163 expect 65534,65533 lstat ${n0} uid,gid
164 ctime2=`${fstest} stat ${n0} ctime`
165 test_check $ctime1 -lt $ctime2
166 expect 0 unlink ${n0}
168 expect 0 mkdir ${n0} 0755
169 ctime1=`${fstest} stat ${n0} ctime`
171 expect 0 chown ${n0} 65534 65533
172 expect 65534,65533 lstat ${n0} uid,gid
173 ctime2=`${fstest} stat ${n0} ctime`
174 test_check $ctime1 -lt $ctime2
177 expect 0 mkfifo ${n0} 0644
178 ctime1=`${fstest} stat ${n0} ctime`
180 expect 0 chown ${n0} 65534 65533
181 expect 65534,65533 lstat ${n0} uid,gid
182 ctime2=`${fstest} stat ${n0} ctime`
183 test_check $ctime1 -lt $ctime2
184 expect 0 unlink ${n0}
186 expect 0 symlink ${n1} ${n0}
187 ctime1=`${fstest} lstat ${n0} ctime`
189 expect 0 lchown ${n0} 65534 65533
190 expect 65534,65533 lstat ${n0} uid,gid
191 ctime2=`${fstest} lstat ${n0} ctime`
192 test_check $ctime1 -lt $ctime2
193 expect 0 unlink ${n0}
195 expect 0 create ${n0} 0644
196 expect 0 chown ${n0} 65534 65533
197 ctime1=`${fstest} stat ${n0} ctime`
199 expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
200 expect 65534,65532 lstat ${n0} uid,gid
201 ctime2=`${fstest} stat ${n0} ctime`
202 test_check $ctime1 -lt $ctime2
203 expect 0 unlink ${n0}
205 expect 0 mkdir ${n0} 0755
206 expect 0 chown ${n0} 65534 65533
207 ctime1=`${fstest} stat ${n0} ctime`
209 expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
210 expect 65534,65532 lstat ${n0} uid,gid
211 ctime2=`${fstest} stat ${n0} ctime`
212 test_check $ctime1 -lt $ctime2
215 expect 0 mkfifo ${n0} 0644
216 expect 0 chown ${n0} 65534 65533
217 ctime1=`${fstest} stat ${n0} ctime`
219 expect 0 chown ${n0} 65534 65533
220 expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532
221 expect 65534,65532 lstat ${n0} uid,gid
222 ctime2=`${fstest} stat ${n0} ctime`
223 test_check $ctime1 -lt $ctime2
224 expect 0 unlink ${n0}
226 expect 0 symlink ${n1} ${n0}
227 expect 0 lchown ${n0} 65534 65533
228 ctime1=`${fstest} lstat ${n0} ctime`
230 expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532
231 expect 65534,65532 lstat ${n0} uid,gid
232 ctime2=`${fstest} lstat ${n0} ctime`
233 test_check $ctime1 -lt $ctime2
234 expect 0 unlink ${n0}
236 expect 0 create ${n0} 0644
237 ctime1=`${fstest} stat ${n0} ctime`
239 expect 0 -- chown ${n0} -1 -1
240 ctime2=`${fstest} stat ${n0} ctime`
241 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
242 test_check $ctime1 -eq $ctime2
243 expect 0 unlink ${n0}
245 expect 0 mkdir ${n0} 0644
246 ctime1=`${fstest} stat ${n0} ctime`
248 expect 0 -- chown ${n0} -1 -1
249 ctime2=`${fstest} stat ${n0} ctime`
250 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
251 test_check $ctime1 -eq $ctime2
254 expect 0 mkfifo ${n0} 0644
255 ctime1=`${fstest} stat ${n0} ctime`
257 expect 0 -- chown ${n0} -1 -1
258 ctime2=`${fstest} stat ${n0} ctime`
259 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
260 test_check $ctime1 -eq $ctime2
261 expect 0 unlink ${n0}
263 expect 0 symlink ${n1} ${n0}
264 ctime1=`${fstest} lstat ${n0} ctime`
266 expect 0 -- lchown ${n0} -1 -1
267 ctime2=`${fstest} lstat ${n0} ctime`
268 todo Linux "According to POSIX: If both owner and group are -1, the times need not be updated."
269 test_check $ctime1 -eq $ctime2
270 expect 0 unlink ${n0}
272 # unsuccessful chown(2) does not update ctime.
274 expect 0 create ${n0} 0644
275 ctime1=`${fstest} stat ${n0} ctime`
277 expect EPERM -u 65534 -- chown ${n0} 65534 -1
278 ctime2=`${fstest} stat ${n0} ctime`
279 test_check $ctime1 -eq $ctime2
280 expect 0 unlink ${n0}
282 expect 0 mkdir ${n0} 0755
283 ctime1=`${fstest} stat ${n0} ctime`
285 expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534
286 ctime2=`${fstest} stat ${n0} ctime`
287 test_check $ctime1 -eq $ctime2
290 expect 0 mkfifo ${n0} 0644
291 ctime1=`${fstest} stat ${n0} ctime`
293 expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534
294 ctime2=`${fstest} stat ${n0} ctime`
295 test_check $ctime1 -eq $ctime2
296 expect 0 unlink ${n0}
298 expect 0 symlink ${n1} ${n0}
299 ctime1=`${fstest} lstat ${n0} ctime`
301 expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534
302 ctime2=`${fstest} lstat ${n0} ctime`
303 test_check $ctime1 -eq $ctime2
304 expect 0 unlink ${n0}