1271294Sngie#!/bin/sh
2271294Sngie# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/09.t 211352 2010-08-15 21:24:17Z pjd $
3271294Sngie
4271294Sngiedesc="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"
5271294Sngie
6271294Sngiedir=`dirname $0`
7271294Sngie. ${dir}/../misc.sh
8271294Sngie
9271294Sngieecho "1..2353"
10271294Sngie
11271294Sngien0=`namegen`
12271294Sngien1=`namegen`
13271294Sngien2=`namegen`
14271294Sngien3=`namegen`
15271294Sngien4=`namegen`
16271294Sngie
17271294Sngieexpect 0 mkdir ${n4} 0755
18271294Sngiecdir=`pwd`
19271294Sngiecd ${n4}
20271294Sngie
21271294Sngieexpect 0 mkdir ${n0} 0755
22271294Sngieexpect 0 chmod ${n0} 01777
23271294Sngieexpect 0 chown ${n0} 65534 65534
24271294Sngie
25271294Sngieexpect 0 mkdir ${n1} 0755
26271294Sngieexpect 0 chown ${n1} 65534 65534
27271294Sngie
28271294Sngiefor type in regular fifo block char socket symlink; do
29271294Sngie	# User owns both: the source sticky directory and the source file.
30271294Sngie	expect 0 chown ${n0} 65534 65534
31271294Sngie	create_file ${type} ${n0}/${n2} 65534 65534
32271294Sngie	inode=`${fstest} lstat ${n0}/${n2} inode`
33271294Sngie
34271294Sngie	for type in none regular fifo block char socket symlink; do
35271294Sngie		create_file ${type} ${n1}/${n3} 65534 65534
36271294Sngie		expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
37271294Sngie		expect ENOENT lstat ${n0}/${n2} inode
38271294Sngie		expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
39271294Sngie		expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
40271294Sngie		expect ${inode} lstat ${n0}/${n2} inode
41271294Sngie		expect ENOENT lstat ${n1}/${n3} inode
42271294Sngie	done
43271294Sngie
44271294Sngie	expect 0 unlink ${n0}/${n2}
45271294Sngie
46271294Sngie	# User owns the source sticky directory, but doesn't own the source file.
47271294Sngie	for id in 0 65533; do
48271294Sngie		expect 0 chown ${n0} 65534 65534
49271294Sngie		create_file ${type} ${n0}/${n2} ${id} ${id}
50271294Sngie		inode=`${fstest} lstat ${n0}/${n2} inode`
51271294Sngie
52271294Sngie		for type in none regular fifo block char socket symlink; do
53271294Sngie			create_file ${type} ${n1}/${n3} 65534 65534
54271294Sngie			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
55271294Sngie			expect ENOENT lstat ${n0}/${n2} inode
56271294Sngie			expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid
57271294Sngie			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
58271294Sngie			expect ${inode} lstat ${n0}/${n2} inode
59271294Sngie			expect ENOENT lstat ${n1}/${n3} inode
60271294Sngie		done
61271294Sngie
62271294Sngie		expect 0 unlink ${n0}/${n2}
63271294Sngie	done
64271294Sngie
65271294Sngie	# User owns the source file, but doesn't own the source sticky directory.
66271294Sngie	for id in 0 65533; do
67271294Sngie		expect 0 chown ${n0} ${id} ${id}
68271294Sngie		create_file ${type} ${n0}/${n2} 65534 65534
69271294Sngie		inode=`${fstest} lstat ${n0}/${n2} inode`
70271294Sngie
71271294Sngie		for type in none regular fifo block char socket symlink; do
72271294Sngie			create_file ${type} ${n1}/${n3} 65534 65534
73271294Sngie			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
74271294Sngie			expect ENOENT lstat ${n0}/${n2} inode
75271294Sngie			expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
76271294Sngie			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
77271294Sngie			expect ${inode} lstat ${n0}/${n2} inode
78271294Sngie			expect ENOENT lstat ${n1}/${n3} inode
79271294Sngie		done
80271294Sngie
81271294Sngie		expect 0 unlink ${n0}/${n2}
82271294Sngie	done
83271294Sngie
84271294Sngie	# User doesn't own the source sticky directory nor the source file.
85271294Sngie	for id in 0 65533; do
86271294Sngie		expect 0 chown ${n0} ${id} ${id}
87271294Sngie		create_file ${type} ${n0}/${n2} ${id} ${id}
88271294Sngie		inode=`${fstest} lstat ${n0}/${n2} inode`
89271294Sngie
90271294Sngie		for type in none regular fifo block char socket symlink; do
91271294Sngie			create_file ${type} ${n1}/${n3} 65534 65534
92271294Sngie			expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
93271294Sngie			expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
94271294Sngie			if [ "${type}" != "none" ]; then
95271294Sngie				expect 65534,65534 lstat ${n1}/${n3} uid,gid
96271294Sngie				expect 0 unlink ${n1}/${n3}
97271294Sngie			fi
98271294Sngie		done
99271294Sngie
100271294Sngie		expect 0 unlink ${n0}/${n2}
101271294Sngie	done
102271294Sngiedone
103271294Sngie
104271294Sngie# User owns both: the source sticky directory and the source directory.
105271294Sngieexpect 0 chown ${n0} 65534 65534
106271294Sngiecreate_file dir ${n0}/${n2} 65534 65534
107271294Sngieinode=`${fstest} lstat ${n0}/${n2} inode`
108271294Sngie
109271294Sngieexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
110271294Sngieexpect ENOENT lstat ${n0}/${n2} type
111271294Sngieexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
112271294Sngieexpect 0 rename ${n1}/${n3} ${n0}/${n2}
113271294Sngie
114271294Sngieexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
115271294Sngieexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
116271294Sngieexpect ENOENT lstat ${n0}/${n2} type
117271294Sngieexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
118271294Sngieexpect 0 rmdir ${n1}/${n3}
119271294Sngie
120271294Sngie# User owns the source sticky directory, but doesn't own the source directory.
121271294Sngie# This fails when changing parent directory, because this will modify
122271294Sngie# source directory inode (the .. link in it), but we can still rename it
123271294Sngie# without changing its parent directory.
124271294Sngiefor id in 0 65533; do
125271294Sngie	expect 0 chown ${n0} 65534 65534
126271294Sngie	create_file dir ${n0}/${n2} ${id} ${id}
127271294Sngie	inode=`${fstest} lstat ${n0}/${n2} inode`
128271294Sngie
129271294Sngie	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
130271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
131271294Sngie	expect ENOENT lstat ${n1}/${n3} type
132271294Sngie
133271294Sngie	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
134271294Sngie	expect ENOENT lstat ${n0}/${n2} type
135271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
136271294Sngie	expect 0 rename ${n0}/${n3} ${n0}/${n2}
137271294Sngie
138271294Sngie	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
139271294Sngie	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
140271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
141271294Sngie	expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid
142271294Sngie	expect 0 rmdir ${n1}/${n3}
143271294Sngie
144271294Sngie	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755
145271294Sngie	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
146271294Sngie	expect ENOENT lstat ${n0}/${n2} type
147271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
148271294Sngie	expect 0 rmdir ${n0}/${n3}
149271294Sngiedone
150271294Sngie
151271294Sngie# User owns the source directory, but doesn't own the source sticky directory.
152271294Sngiefor id in 0 65533; do
153271294Sngie	expect 0 chown ${n0} ${id} ${id}
154271294Sngie	create_file dir ${n0}/${n2} 65534 65534
155271294Sngie	inode=`${fstest} lstat ${n0}/${n2} inode`
156271294Sngie
157271294Sngie	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
158271294Sngie	expect ENOENT lstat ${n0}/${n2} type
159271294Sngie	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
160271294Sngie	expect 0 rename ${n1}/${n3} ${n0}/${n2}
161271294Sngie
162271294Sngie	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
163271294Sngie	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
164271294Sngie	expect ENOENT lstat ${n0}/${n2} type
165271294Sngie	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
166271294Sngie	expect 0 rmdir ${n1}/${n3}
167271294Sngiedone
168271294Sngie
169271294Sngie# User doesn't own the source sticky directory nor the source directory.
170271294Sngiefor id in 0 65533; do
171271294Sngie	expect 0 chown ${n0} ${id} ${id}
172271294Sngie	create_file dir ${n0}/${n2} ${id} ${id}
173271294Sngie	inode=`${fstest} lstat ${n0}/${n2} inode`
174271294Sngie
175271294Sngie	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
176271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
177271294Sngie	expect ENOENT lstat ${n1}/${n3} type
178271294Sngie
179271294Sngie	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
180271294Sngie	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
181271294Sngie	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
182271294Sngie	expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid
183271294Sngie	expect 0 rmdir ${n0}/${n2}
184271294Sngie	expect 0 rmdir ${n1}/${n3}
185271294Sngiedone
186271294Sngie
187271294Sngieexpect 0 rmdir ${n1}
188271294Sngieexpect 0 rmdir ${n0}
189271294Sngie
190271294Sngiecd ${cdir}
191271294Sngieexpect 0 rmdir ${n4}
192