1166065Spjd#!/bin/sh
2166065Spjd# $FreeBSD$
3166065Spjd
4166065Spjddesc="rename returns EACCES or EPERM if the directory containing 'from' is marked sticky, and neither the containing directory nor 'from' are owned by the effective user ID"
5166065Spjd
6166065Spjddir=`dirname $0`
7166065Spjd. ${dir}/../misc.sh
8166065Spjd
9211180Spjdecho "1..2353"
10166065Spjd
11166065Spjdn0=`namegen`
12166065Spjdn1=`namegen`
13166065Spjdn2=`namegen`
14166065Spjdn3=`namegen`
15166065Spjdn4=`namegen`
16166065Spjd
17166065Spjdexpect 0 mkdir ${n4} 0755
18166065Spjdcdir=`pwd`
19166065Spjdcd ${n4}
20166065Spjd
21166065Spjdexpect 0 mkdir ${n0} 0755
22211180Spjdexpect 0 chmod ${n0} 01777
23166065Spjdexpect 0 chown ${n0} 65534 65534
24166065Spjd
25166065Spjdexpect 0 mkdir ${n1} 0755
26166065Spjdexpect 0 chown ${n1} 65534 65534
27166065Spjd
28211180Spjdfor type in regular fifo block char socket symlink; do
29211180Spjd	# User owns both: the source sticky directory and the source file.
30211180Spjd	expect 0 chown ${n0} 65534 65534
31211180Spjd	create_file ${type} ${n0}/${n2} 65534 65534
32211180Spjd	inode=`${fstest} lstat ${n0}/${n2} inode`
33211180Spjd
34211180Spjd	for type in none regular fifo block char socket symlink; do
35211180Spjd		create_file ${type} ${n1}/${n3} 65534 65534
36211180Spjd		expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
37211180Spjd		expect ENOENT lstat ${n0}/${n2} inode
38211180Spjd		expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
39211180Spjd		expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
40211180Spjd		expect ${inode} lstat ${n0}/${n2} inode
41211180Spjd		expect ENOENT lstat ${n1}/${n3} inode
42211180Spjd	done
43211180Spjd
44211180Spjd	expect 0 unlink ${n0}/${n2}
45211180Spjd
46211180Spjd	# User owns the source sticky directory, but doesn't own the source file.
47211180Spjd	for id in 0 65533; do
48211180Spjd		expect 0 chown ${n0} 65534 65534
49211180Spjd		create_file ${type} ${n0}/${n2} ${id} ${id}
50211180Spjd		inode=`${fstest} lstat ${n0}/${n2} inode`
51211180Spjd
52211180Spjd		for type in none regular fifo block char socket symlink; do
53211180Spjd			create_file ${type} ${n1}/${n3} 65534 65534
54211180Spjd			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
55211180Spjd			expect ENOENT lstat ${n0}/${n2} inode
56211180Spjd			expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid
57211180Spjd			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
58211180Spjd			expect ${inode} lstat ${n0}/${n2} inode
59211180Spjd			expect ENOENT lstat ${n1}/${n3} inode
60211180Spjd		done
61211180Spjd
62211180Spjd		expect 0 unlink ${n0}/${n2}
63211180Spjd	done
64211180Spjd
65211180Spjd	# User owns the source file, but doesn't own the source sticky directory.
66211180Spjd	for id in 0 65533; do
67211180Spjd		expect 0 chown ${n0} ${id} ${id}
68211180Spjd		create_file ${type} ${n0}/${n2} 65534 65534
69211180Spjd		inode=`${fstest} lstat ${n0}/${n2} inode`
70211180Spjd
71211180Spjd		for type in none regular fifo block char socket symlink; do
72211180Spjd			create_file ${type} ${n1}/${n3} 65534 65534
73211180Spjd			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
74211180Spjd			expect ENOENT lstat ${n0}/${n2} inode
75211180Spjd			expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
76211180Spjd			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
77211180Spjd			expect ${inode} lstat ${n0}/${n2} inode
78211180Spjd			expect ENOENT lstat ${n1}/${n3} inode
79211180Spjd		done
80211180Spjd
81211180Spjd		expect 0 unlink ${n0}/${n2}
82211180Spjd	done
83211180Spjd
84211180Spjd	# User doesn't own the source sticky directory nor the source file.
85211180Spjd	for id in 0 65533; do
86211180Spjd		expect 0 chown ${n0} ${id} ${id}
87211180Spjd		create_file ${type} ${n0}/${n2} ${id} ${id}
88211180Spjd		inode=`${fstest} lstat ${n0}/${n2} inode`
89211180Spjd
90211180Spjd		for type in none regular fifo block char socket symlink; do
91211180Spjd			create_file ${type} ${n1}/${n3} 65534 65534
92211180Spjd			expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
93211180Spjd			expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
94211180Spjd			if [ "${type}" != "none" ]; then
95211180Spjd				expect 65534,65534 lstat ${n1}/${n3} uid,gid
96211180Spjd				expect 0 unlink ${n1}/${n3}
97211180Spjd			fi
98211180Spjd		done
99211180Spjd
100211180Spjd		expect 0 unlink ${n0}/${n2}
101211180Spjd	done
102211180Spjddone
103211180Spjd
104211180Spjd# User owns both: the source sticky directory and the source directory.
105211180Spjdexpect 0 chown ${n0} 65534 65534
106211180Spjdcreate_file dir ${n0}/${n2} 65534 65534
107211180Spjdinode=`${fstest} lstat ${n0}/${n2} inode`
108211180Spjd
109166065Spjdexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
110211180Spjdexpect ENOENT lstat ${n0}/${n2} type
111211180Spjdexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
112211180Spjdexpect 0 rename ${n1}/${n3} ${n0}/${n2}
113166065Spjd
114211180Spjdexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
115166065Spjdexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
116211180Spjdexpect ENOENT lstat ${n0}/${n2} type
117211180Spjdexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
118211180Spjdexpect 0 rmdir ${n1}/${n3}
119166065Spjd
120211180Spjd# User owns the source sticky directory, but doesn't own the source directory.
121211180Spjd# This fails when changing parent directory, because this will modify
122211180Spjd# source directory inode (the .. link in it), but we can still rename it
123211180Spjd# without changing its parent directory.
124211180Spjdfor id in 0 65533; do
125211180Spjd	expect 0 chown ${n0} 65534 65534
126211180Spjd	create_file dir ${n0}/${n2} ${id} ${id}
127211180Spjd	inode=`${fstest} lstat ${n0}/${n2} inode`
128211180Spjd
129211180Spjd	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
130211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
131211180Spjd	expect ENOENT lstat ${n1}/${n3} type
132211180Spjd
133211180Spjd	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
134211180Spjd	expect ENOENT lstat ${n0}/${n2} type
135211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
136211180Spjd	expect 0 rename ${n0}/${n3} ${n0}/${n2}
137211180Spjd
138211180Spjd	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
139211180Spjd	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
140211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
141211180Spjd	expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid
142211180Spjd	expect 0 rmdir ${n1}/${n3}
143211180Spjd
144211180Spjd	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755
145211180Spjd	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
146211180Spjd	expect ENOENT lstat ${n0}/${n2} type
147211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
148211180Spjd	expect 0 rmdir ${n0}/${n3}
149211180Spjddone
150211180Spjd
151211180Spjd# User owns the source directory, but doesn't own the source sticky directory.
152211180Spjdfor id in 0 65533; do
153211180Spjd	expect 0 chown ${n0} ${id} ${id}
154211180Spjd	create_file dir ${n0}/${n2} 65534 65534
155211180Spjd	inode=`${fstest} lstat ${n0}/${n2} inode`
156211180Spjd
157211180Spjd	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
158211180Spjd	expect ENOENT lstat ${n0}/${n2} type
159211180Spjd	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
160211180Spjd	expect 0 rename ${n1}/${n3} ${n0}/${n2}
161211180Spjd
162211180Spjd	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
163211180Spjd	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
164211180Spjd	expect ENOENT lstat ${n0}/${n2} type
165211180Spjd	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
166211180Spjd	expect 0 rmdir ${n1}/${n3}
167211180Spjddone
168211180Spjd
169211180Spjd# User doesn't own the source sticky directory nor the source directory.
170211180Spjdfor id in 0 65533; do
171211180Spjd	expect 0 chown ${n0} ${id} ${id}
172211180Spjd	create_file dir ${n0}/${n2} ${id} ${id}
173211180Spjd	inode=`${fstest} lstat ${n0}/${n2} inode`
174211180Spjd
175211180Spjd	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
176211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
177211180Spjd	expect ENOENT lstat ${n1}/${n3} type
178211180Spjd
179211180Spjd	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
180211180Spjd	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
181211180Spjd	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
182211180Spjd	expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid
183211180Spjd	expect 0 rmdir ${n0}/${n2}
184211180Spjd	expect 0 rmdir ${n1}/${n3}
185211180Spjddone
186211180Spjd
187166065Spjdexpect 0 rmdir ${n1}
188166065Spjdexpect 0 rmdir ${n0}
189166065Spjd
190166065Spjdcd ${cdir}
191166065Spjdexpect 0 rmdir ${n4}
192