xref: /freebsd/contrib/pjdfstest/tests/rename/09.t (revision 3416500a)
140a8ac8fSEnji Cooper#!/bin/sh
2*3416500aSEnji Cooper# vim: filetype=sh noexpandtab ts=8 sw=8
340a8ac8fSEnji Cooper# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/09.t 211352 2010-08-15 21:24:17Z pjd $
440a8ac8fSEnji Cooper
540a8ac8fSEnji Cooperdesc="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"
640a8ac8fSEnji Cooper
740a8ac8fSEnji Cooperdir=`dirname $0`
840a8ac8fSEnji Cooper. ${dir}/../misc.sh
940a8ac8fSEnji Cooper
1040a8ac8fSEnji Cooperecho "1..2353"
1140a8ac8fSEnji Cooper
1240a8ac8fSEnji Coopern0=`namegen`
1340a8ac8fSEnji Coopern1=`namegen`
1440a8ac8fSEnji Coopern2=`namegen`
1540a8ac8fSEnji Coopern3=`namegen`
1640a8ac8fSEnji Coopern4=`namegen`
1740a8ac8fSEnji Cooper
1840a8ac8fSEnji Cooperexpect 0 mkdir ${n4} 0755
1940a8ac8fSEnji Coopercdir=`pwd`
2040a8ac8fSEnji Coopercd ${n4}
2140a8ac8fSEnji Cooper
2240a8ac8fSEnji Cooperexpect 0 mkdir ${n0} 0755
2340a8ac8fSEnji Cooperexpect 0 chmod ${n0} 01777
2440a8ac8fSEnji Cooperexpect 0 chown ${n0} 65534 65534
2540a8ac8fSEnji Cooper
2640a8ac8fSEnji Cooperexpect 0 mkdir ${n1} 0755
2740a8ac8fSEnji Cooperexpect 0 chown ${n1} 65534 65534
2840a8ac8fSEnji Cooper
2940a8ac8fSEnji Cooperfor type in regular fifo block char socket symlink; do
3040a8ac8fSEnji Cooper	# User owns both: the source sticky directory and the source file.
3140a8ac8fSEnji Cooper	expect 0 chown ${n0} 65534 65534
3240a8ac8fSEnji Cooper	create_file ${type} ${n0}/${n2} 65534 65534
3340a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
3440a8ac8fSEnji Cooper
3540a8ac8fSEnji Cooper	for type in none regular fifo block char socket symlink; do
3640a8ac8fSEnji Cooper		create_file ${type} ${n1}/${n3} 65534 65534
3740a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
3840a8ac8fSEnji Cooper		expect ENOENT lstat ${n0}/${n2} inode
3940a8ac8fSEnji Cooper		expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
4040a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
4140a8ac8fSEnji Cooper		expect ${inode} lstat ${n0}/${n2} inode
4240a8ac8fSEnji Cooper		expect ENOENT lstat ${n1}/${n3} inode
4340a8ac8fSEnji Cooper	done
4440a8ac8fSEnji Cooper
4540a8ac8fSEnji Cooper	expect 0 unlink ${n0}/${n2}
4640a8ac8fSEnji Cooper
4740a8ac8fSEnji Cooper	# User owns the source sticky directory, but doesn't own the source file.
4840a8ac8fSEnji Cooper	for id in 0 65533; do
4940a8ac8fSEnji Cooper		expect 0 chown ${n0} 65534 65534
5040a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} ${id} ${id}
5140a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
5240a8ac8fSEnji Cooper
5340a8ac8fSEnji Cooper		for type in none regular fifo block char socket symlink; do
5440a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} 65534 65534
5540a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
5640a8ac8fSEnji Cooper			expect ENOENT lstat ${n0}/${n2} inode
5740a8ac8fSEnji Cooper			expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid
5840a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
5940a8ac8fSEnji Cooper			expect ${inode} lstat ${n0}/${n2} inode
6040a8ac8fSEnji Cooper			expect ENOENT lstat ${n1}/${n3} inode
6140a8ac8fSEnji Cooper		done
6240a8ac8fSEnji Cooper
6340a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
6440a8ac8fSEnji Cooper	done
6540a8ac8fSEnji Cooper
6640a8ac8fSEnji Cooper	# User owns the source file, but doesn't own the source sticky directory.
6740a8ac8fSEnji Cooper	for id in 0 65533; do
6840a8ac8fSEnji Cooper		expect 0 chown ${n0} ${id} ${id}
6940a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} 65534 65534
7040a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
7140a8ac8fSEnji Cooper
7240a8ac8fSEnji Cooper		for type in none regular fifo block char socket symlink; do
7340a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} 65534 65534
7440a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
7540a8ac8fSEnji Cooper			expect ENOENT lstat ${n0}/${n2} inode
7640a8ac8fSEnji Cooper			expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
7740a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
7840a8ac8fSEnji Cooper			expect ${inode} lstat ${n0}/${n2} inode
7940a8ac8fSEnji Cooper			expect ENOENT lstat ${n1}/${n3} inode
8040a8ac8fSEnji Cooper		done
8140a8ac8fSEnji Cooper
8240a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
8340a8ac8fSEnji Cooper	done
8440a8ac8fSEnji Cooper
8540a8ac8fSEnji Cooper	# User doesn't own the source sticky directory nor the source file.
8640a8ac8fSEnji Cooper	for id in 0 65533; do
8740a8ac8fSEnji Cooper		expect 0 chown ${n0} ${id} ${id}
8840a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} ${id} ${id}
8940a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
9040a8ac8fSEnji Cooper
9140a8ac8fSEnji Cooper		for type in none regular fifo block char socket symlink; do
9240a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} 65534 65534
9340a8ac8fSEnji Cooper			expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
9440a8ac8fSEnji Cooper			expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
9540a8ac8fSEnji Cooper			if [ "${type}" != "none" ]; then
9640a8ac8fSEnji Cooper				expect 65534,65534 lstat ${n1}/${n3} uid,gid
9740a8ac8fSEnji Cooper				expect 0 unlink ${n1}/${n3}
9840a8ac8fSEnji Cooper			fi
9940a8ac8fSEnji Cooper		done
10040a8ac8fSEnji Cooper
10140a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
10240a8ac8fSEnji Cooper	done
10340a8ac8fSEnji Cooperdone
10440a8ac8fSEnji Cooper
10540a8ac8fSEnji Cooper# User owns both: the source sticky directory and the source directory.
10640a8ac8fSEnji Cooperexpect 0 chown ${n0} 65534 65534
10740a8ac8fSEnji Coopercreate_file dir ${n0}/${n2} 65534 65534
10840a8ac8fSEnji Cooperinode=`${fstest} lstat ${n0}/${n2} inode`
10940a8ac8fSEnji Cooper
11040a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
11140a8ac8fSEnji Cooperexpect ENOENT lstat ${n0}/${n2} type
11240a8ac8fSEnji Cooperexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
11340a8ac8fSEnji Cooperexpect 0 rename ${n1}/${n3} ${n0}/${n2}
11440a8ac8fSEnji Cooper
11540a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
11640a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
11740a8ac8fSEnji Cooperexpect ENOENT lstat ${n0}/${n2} type
11840a8ac8fSEnji Cooperexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
11940a8ac8fSEnji Cooperexpect 0 rmdir ${n1}/${n3}
12040a8ac8fSEnji Cooper
12140a8ac8fSEnji Cooper# User owns the source sticky directory, but doesn't own the source directory.
12240a8ac8fSEnji Cooper# This fails when changing parent directory, because this will modify
12340a8ac8fSEnji Cooper# source directory inode (the .. link in it), but we can still rename it
12440a8ac8fSEnji Cooper# without changing its parent directory.
12540a8ac8fSEnji Cooperfor id in 0 65533; do
12640a8ac8fSEnji Cooper	expect 0 chown ${n0} 65534 65534
12740a8ac8fSEnji Cooper	create_file dir ${n0}/${n2} ${id} ${id}
12840a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
12940a8ac8fSEnji Cooper
13040a8ac8fSEnji Cooper	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
13140a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
13240a8ac8fSEnji Cooper	expect ENOENT lstat ${n1}/${n3} type
13340a8ac8fSEnji Cooper
13440a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
13540a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
13640a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
13740a8ac8fSEnji Cooper	expect 0 rename ${n0}/${n3} ${n0}/${n2}
13840a8ac8fSEnji Cooper
13940a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
14040a8ac8fSEnji Cooper	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
14140a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
14240a8ac8fSEnji Cooper	expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid
14340a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
14440a8ac8fSEnji Cooper
14540a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755
14640a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
14740a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
14840a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
14940a8ac8fSEnji Cooper	expect 0 rmdir ${n0}/${n3}
15040a8ac8fSEnji Cooperdone
15140a8ac8fSEnji Cooper
15240a8ac8fSEnji Cooper# User owns the source directory, but doesn't own the source sticky directory.
15340a8ac8fSEnji Cooperfor id in 0 65533; do
15440a8ac8fSEnji Cooper	expect 0 chown ${n0} ${id} ${id}
15540a8ac8fSEnji Cooper	create_file dir ${n0}/${n2} 65534 65534
15640a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
15740a8ac8fSEnji Cooper
15840a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
15940a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
16040a8ac8fSEnji Cooper	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
16140a8ac8fSEnji Cooper	expect 0 rename ${n1}/${n3} ${n0}/${n2}
16240a8ac8fSEnji Cooper
16340a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
16440a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
16540a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
16640a8ac8fSEnji Cooper	expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
16740a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
16840a8ac8fSEnji Cooperdone
16940a8ac8fSEnji Cooper
17040a8ac8fSEnji Cooper# User doesn't own the source sticky directory nor the source directory.
17140a8ac8fSEnji Cooperfor id in 0 65533; do
17240a8ac8fSEnji Cooper	expect 0 chown ${n0} ${id} ${id}
17340a8ac8fSEnji Cooper	create_file dir ${n0}/${n2} ${id} ${id}
17440a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
17540a8ac8fSEnji Cooper
17640a8ac8fSEnji Cooper	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
17740a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
17840a8ac8fSEnji Cooper	expect ENOENT lstat ${n1}/${n3} type
17940a8ac8fSEnji Cooper
18040a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
18140a8ac8fSEnji Cooper	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
18240a8ac8fSEnji Cooper	expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
18340a8ac8fSEnji Cooper	expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid
18440a8ac8fSEnji Cooper	expect 0 rmdir ${n0}/${n2}
18540a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
18640a8ac8fSEnji Cooperdone
18740a8ac8fSEnji Cooper
18840a8ac8fSEnji Cooperexpect 0 rmdir ${n1}
18940a8ac8fSEnji Cooperexpect 0 rmdir ${n0}
19040a8ac8fSEnji Cooper
19140a8ac8fSEnji Coopercd ${cdir}
19240a8ac8fSEnji Cooperexpect 0 rmdir ${n4}
193