xref: /openbsd-src/regress/sys/ffs/tests/rename/10.t (revision ec7c50bfa3724241accbdcc8f761ed61061a0645)
1#!/bin/sh
2# $FreeBSD: src/tools/regression/fstest/tests/rename/10.t,v 1.1 2007/01/17 01:42:10 pjd Exp $
3
4desc="rename returns EACCES or EPERM if the file pointed at by the 'to' argument exists, the directory containing 'to' is marked sticky, and neither the containing directory nor 'to' are owned by the effective user ID"
5
6n0=`namegen`
7n1=`namegen`
8n2=`namegen`
9n3=`namegen`
10n4=`namegen`
11
12expect 0 mkdir ${n4} 0755
13cdir=`pwd`
14cd ${n4}
15
16expect 0 mkdir ${n0} 0755
17expect 0 chown ${n0} 65534 65534
18
19expect 0 mkdir ${n1} 0755
20expect 0 chmod ${n1} 01777
21
22# User owns both: the sticky directory and the destination file.
23expect 0 chown ${n1} 65534 65534
24expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
25inode=`${FSTEST} lstat ${n0}/${n2} inode`
26expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644
27expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
28expect ENOENT lstat ${n0}/${n2} inode
29expect ${inode} lstat ${n1}/${n3} inode
30expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
31expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
32expect ${inode} lstat ${n0}/${n2} inode
33expect ENOENT lstat ${n1}/${n3} inode
34expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
35expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
36expect ENOENT lstat ${n0}/${n2} inode
37expect ${inode} lstat ${n1}/${n3} inode
38expect 0 unlink ${n1}/${n3}
39# User owns the sticky directory, but doesn't own the destination file.
40expect 0 chown ${n1} 65534 65534
41expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
42inode=`${FSTEST} lstat ${n0}/${n2} inode`
43expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644
44expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
45expect ENOENT lstat ${n0}/${n2} type
46expect ${inode} lstat ${n1}/${n3} inode
47expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
48expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
49expect ${inode} lstat ${n0}/${n2} inode
50expect ENOENT lstat ${n1}/${n3} inode
51expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
52expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
53expect ENOENT lstat ${n0}/${n2} inode
54expect ${inode} lstat ${n1}/${n3} inode
55expect 0 unlink ${n1}/${n3}
56# User owns the destination file, but doesn't own the sticky directory.
57expect 0 chown ${n1} 65533 65533
58expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
59inode=`${FSTEST} lstat ${n0}/${n2} inode`
60expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644
61expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
62expect ENOENT lstat ${n0}/${n2} type
63expect ${inode} lstat ${n1}/${n3} inode
64expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
65expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
66expect ${inode} lstat ${n0}/${n2} inode
67expect ENOENT lstat ${n1}/${n3} inode
68expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
69expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
70expect ENOENT lstat ${n0}/${n2} inode
71expect ${inode} lstat ${n1}/${n3} inode
72expect 0 unlink ${n1}/${n3}
73# User doesn't own the sticky directory nor the destination file.
74expect 0 chown ${n1} 65533 65533
75expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
76expect 0 -u 65533 -g 65533 create ${n1}/${n3} 0644
77inode=`${FSTEST} lstat ${n1}/${n3} inode`
78expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
79expect ${inode} lstat ${n1}/${n3} inode
80expect 0 unlink ${n0}/${n2}
81expect 0 unlink ${n1}/${n3}
82
83# User owns both: the sticky directory and the destination file.
84expect 0 chown ${n1} 65534 65534
85expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
86expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
87expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
88expect ENOENT lstat ${n0}/${n2} type
89expect 0 rmdir ${n1}/${n3}
90# User owns the sticky directory, but doesn't own the destination file.
91expect 0 chown ${n1} 65534 65534
92expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
93expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
94expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
95expect ENOENT lstat ${n0}/${n2} type
96expect 0 rmdir ${n1}/${n3}
97# User owns the destination file, but doesn't own the sticky directory.
98expect 0 chown ${n1} 65533 65533
99expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
100expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
101expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
102expect ENOENT lstat ${n0}/${n2} type
103expect 0 rmdir ${n1}/${n3}
104# User doesn't own the sticky directory nor the destination file.
105expect 0 chown ${n1} 65533 65533
106expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
107expect 0 -u 65533 -g 65533 mkdir ${n1}/${n3} 0755
108expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
109expect 0 rmdir ${n0}/${n2}
110expect 0 rmdir ${n1}/${n3}
111
112# User owns both: the sticky directory and the destination file.
113expect 0 chown ${n1} 65534 65534
114expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
115inode=`${FSTEST} lstat ${n0}/${n2} inode`
116expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
117expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
118expect ENOENT lstat ${n0}/${n2} inode
119expect ${inode} lstat ${n1}/${n3} inode
120expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
121expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
122expect ${inode} lstat ${n0}/${n2} inode
123expect ENOENT lstat ${n1}/${n3} inode
124expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
125expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
126expect ENOENT lstat ${n0}/${n2} inode
127expect ${inode} lstat ${n1}/${n3} inode
128expect 0 unlink ${n1}/${n3}
129# User owns the sticky directory, but doesn't own the destination file.
130expect 0 chown ${n1} 65534 65534
131expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
132inode=`${FSTEST} lstat ${n0}/${n2} inode`
133expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
134expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
135expect ENOENT lstat ${n0}/${n2} type
136expect ${inode} lstat ${n1}/${n3} inode
137expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
138expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
139expect ${inode} lstat ${n0}/${n2} inode
140expect ENOENT lstat ${n1}/${n3} inode
141expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
142expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
143expect ENOENT lstat ${n0}/${n2} inode
144expect ${inode} lstat ${n1}/${n3} inode
145expect 0 unlink ${n1}/${n3}
146# User owns the destination file, but doesn't own the sticky directory.
147expect 0 chown ${n1} 65533 65533
148expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
149inode=`${FSTEST} lstat ${n0}/${n2} inode`
150expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
151expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
152expect ENOENT lstat ${n0}/${n2} type
153expect ${inode} lstat ${n1}/${n3} inode
154expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
155expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
156expect ${inode} lstat ${n0}/${n2} inode
157expect ENOENT lstat ${n1}/${n3} inode
158expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
159expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
160expect ENOENT lstat ${n0}/${n2} inode
161expect ${inode} lstat ${n1}/${n3} inode
162expect 0 unlink ${n1}/${n3}
163# User doesn't own the sticky directory nor the destination file.
164expect 0 chown ${n1} 65533 65533
165expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644
166expect 0 -u 65533 -g 65533 mkfifo ${n1}/${n3} 0644
167inode=`${FSTEST} lstat ${n1}/${n3} inode`
168expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
169expect ${inode} lstat ${n1}/${n3} inode
170expect 0 unlink ${n0}/${n2}
171expect 0 unlink ${n1}/${n3}
172
173# User owns both: the sticky directory and the destination file.
174expect 0 chown ${n1} 65534 65534
175expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2}
176inode=`${FSTEST} lstat ${n0}/${n2} inode`
177expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
178expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
179expect ENOENT lstat ${n0}/${n2} inode
180expect ${inode} lstat ${n1}/${n3} inode
181expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
182expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
183expect ${inode} lstat ${n0}/${n2} inode
184expect ENOENT lstat ${n1}/${n3} inode
185expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
186expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
187expect ENOENT lstat ${n0}/${n2} inode
188expect ${inode} lstat ${n1}/${n3} inode
189expect 0 unlink ${n1}/${n3}
190# User owns the sticky directory, but doesn't own the destination file.
191expect 0 chown ${n1} 65534 65534
192expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2}
193inode=`${FSTEST} lstat ${n0}/${n2} inode`
194expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
195expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
196expect ENOENT lstat ${n0}/${n2} type
197expect ${inode} lstat ${n1}/${n3} inode
198expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
199expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
200expect ${inode} lstat ${n0}/${n2} inode
201expect ENOENT lstat ${n1}/${n3} inode
202expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
203expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
204expect ENOENT lstat ${n0}/${n2} inode
205expect ${inode} lstat ${n1}/${n3} inode
206expect 0 unlink ${n1}/${n3}
207# User owns the destination file, but doesn't own the sticky directory.
208expect 0 chown ${n1} 65533 65533
209expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2}
210inode=`${FSTEST} lstat ${n0}/${n2} inode`
211expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3}
212expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
213expect ENOENT lstat ${n0}/${n2} type
214expect ${inode} lstat ${n1}/${n3} inode
215expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644
216expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
217expect ${inode} lstat ${n0}/${n2} inode
218expect ENOENT lstat ${n1}/${n3} inode
219expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644
220expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
221expect ENOENT lstat ${n0}/${n2} inode
222expect ${inode} lstat ${n1}/${n3} inode
223expect 0 unlink ${n1}/${n3}
224# User doesn't own the sticky directory nor the destination file.
225expect 0 chown ${n1} 65533 65533
226expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2}
227expect 0 -u 65533 -g 65533 symlink test ${n1}/${n3}
228inode=`${FSTEST} lstat ${n1}/${n3} inode`
229expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
230expect ${inode} lstat ${n1}/${n3} inode
231expect 0 unlink ${n0}/${n2}
232expect 0 unlink ${n1}/${n3}
233
234expect 0 rmdir ${n1}
235expect 0 rmdir ${n0}
236
237cd ${cdir}
238expect 0 rmdir ${n4}
239