xref: /freebsd/contrib/pjdfstest/tests/rename/10.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/10.t 211352 2010-08-15 21:24:17Z pjd $
440a8ac8fSEnji Cooper
540a8ac8fSEnji Cooperdesc="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"
640a8ac8fSEnji Cooper
740a8ac8fSEnji Cooperdir=`dirname $0`
840a8ac8fSEnji Cooper. ${dir}/../misc.sh
940a8ac8fSEnji Cooper
1040a8ac8fSEnji Cooperecho "1..2099"
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 chown ${n0} 65534 65534
2440a8ac8fSEnji Cooper
2540a8ac8fSEnji Cooperexpect 0 mkdir ${n1} 0755
2640a8ac8fSEnji Cooperexpect 0 chmod ${n1} 01777
2740a8ac8fSEnji Cooper
2840a8ac8fSEnji Cooperfor type in regular fifo block char socket symlink; do
2940a8ac8fSEnji Cooper	# User owns both: the sticky directory and the destination file.
3040a8ac8fSEnji Cooper	expect 0 chown ${n1} 65534 65534
3140a8ac8fSEnji Cooper	create_file ${type} ${n0}/${n2} 65534 65534
3240a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
3340a8ac8fSEnji Cooper
3440a8ac8fSEnji Cooper	for type in regular fifo block char socket symlink; do
3540a8ac8fSEnji Cooper		create_file ${type} ${n1}/${n3} 65534 65534
3640a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
3740a8ac8fSEnji Cooper		expect ENOENT lstat ${n0}/${n2} inode
3840a8ac8fSEnji Cooper		expect ${inode} lstat ${n1}/${n3} inode
3940a8ac8fSEnji Cooper		expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
4040a8ac8fSEnji Cooper		expect ${inode} lstat ${n0}/${n2} inode
4140a8ac8fSEnji Cooper		expect ENOENT lstat ${n1}/${n3} inode
4240a8ac8fSEnji Cooper	done
4340a8ac8fSEnji Cooper
4440a8ac8fSEnji Cooper	expect 0 unlink ${n0}/${n2}
4540a8ac8fSEnji Cooper
4640a8ac8fSEnji Cooper	# User owns the sticky directory, but doesn't own the destination file.
4740a8ac8fSEnji Cooper	for id in 0 65533; do
4840a8ac8fSEnji Cooper		expect 0 chown ${n1} 65534 65534
4940a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} 65534 65534
5040a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
5140a8ac8fSEnji Cooper
5240a8ac8fSEnji Cooper		for type in regular fifo block char socket symlink; do
5340a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} ${id} ${id}
5440a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
5540a8ac8fSEnji Cooper			expect ENOENT lstat ${n0}/${n2} inode
5640a8ac8fSEnji Cooper			expect ${inode} lstat ${n1}/${n3} inode
5740a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
5840a8ac8fSEnji Cooper			expect ${inode} lstat ${n0}/${n2} inode
5940a8ac8fSEnji Cooper			expect ENOENT lstat ${n1}/${n3} inode
6040a8ac8fSEnji Cooper		done
6140a8ac8fSEnji Cooper
6240a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
6340a8ac8fSEnji Cooper	done
6440a8ac8fSEnji Cooper
6540a8ac8fSEnji Cooper	# User owns the destination file, but doesn't own the sticky directory.
6640a8ac8fSEnji Cooper	for id in 0 65533; do
6740a8ac8fSEnji Cooper		expect 0 chown ${n1} ${id} ${id}
6840a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} 65534 65534
6940a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
7040a8ac8fSEnji Cooper
7140a8ac8fSEnji Cooper		for type in regular fifo block char socket symlink; do
7240a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} 65534 65534
7340a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
7440a8ac8fSEnji Cooper			expect ENOENT lstat ${n0}/${n2} inode
7540a8ac8fSEnji Cooper			expect ${inode} lstat ${n1}/${n3} inode
7640a8ac8fSEnji Cooper			expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
7740a8ac8fSEnji Cooper			expect ${inode} lstat ${n0}/${n2} inode
7840a8ac8fSEnji Cooper			expect ENOENT lstat ${n1}/${n3} inode
7940a8ac8fSEnji Cooper		done
8040a8ac8fSEnji Cooper
8140a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
8240a8ac8fSEnji Cooper	done
8340a8ac8fSEnji Cooper
8440a8ac8fSEnji Cooper	# User doesn't own the sticky directory nor the destination file.
8540a8ac8fSEnji Cooper	for id in 0 65533; do
8640a8ac8fSEnji Cooper		expect 0 chown ${n1} ${id} ${id}
8740a8ac8fSEnji Cooper		create_file ${type} ${n0}/${n2} 65534 65534
8840a8ac8fSEnji Cooper		inode=`${fstest} lstat ${n0}/${n2} inode`
8940a8ac8fSEnji Cooper
9040a8ac8fSEnji Cooper		for type in regular fifo block char socket symlink; do
9140a8ac8fSEnji Cooper			create_file ${type} ${n1}/${n3} ${id} ${id}
9240a8ac8fSEnji Cooper			expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
9340a8ac8fSEnji Cooper			expect ${inode} lstat ${n0}/${n2} inode
9440a8ac8fSEnji Cooper			expect ${id},${id} lstat ${n1}/${n3} uid,gid
9540a8ac8fSEnji Cooper			expect 0 unlink ${n1}/${n3}
9640a8ac8fSEnji Cooper		done
9740a8ac8fSEnji Cooper
9840a8ac8fSEnji Cooper		expect 0 unlink ${n0}/${n2}
9940a8ac8fSEnji Cooper	done
10040a8ac8fSEnji Cooperdone
10140a8ac8fSEnji Cooper
10240a8ac8fSEnji Cooper# User owns both: the sticky directory and the destination directory.
10340a8ac8fSEnji Cooperexpect 0 chown ${n1} 65534 65534
10440a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
10540a8ac8fSEnji Cooperinode=`${fstest} lstat ${n0}/${n2} inode`
10640a8ac8fSEnji Cooper
10740a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
10840a8ac8fSEnji Cooperexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
10940a8ac8fSEnji Cooperexpect ENOENT lstat ${n0}/${n2} type
11040a8ac8fSEnji Cooperexpect ${inode} lstat ${n1}/${n3} inode
11140a8ac8fSEnji Cooperexpect 0 rmdir ${n1}/${n3}
11240a8ac8fSEnji Cooper
11340a8ac8fSEnji Cooper# User owns the sticky directory, but doesn't own the destination directory.
11440a8ac8fSEnji Cooperfor id in 0 65533; do
11540a8ac8fSEnji Cooper	expect 0 chown ${n1} 65534 65534
11640a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
11740a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
11840a8ac8fSEnji Cooper
11940a8ac8fSEnji Cooper	expect 0 -u ${id} -g ${id} mkdir ${n1}/${n3} 0755
12040a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
12140a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
12240a8ac8fSEnji Cooper	expect ${inode} lstat ${n1}/${n3} inode
12340a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
12440a8ac8fSEnji Cooperdone
12540a8ac8fSEnji Cooper
12640a8ac8fSEnji Cooper# User owns the destination directory, but doesn't own the sticky directory.
12740a8ac8fSEnji Cooperfor id in 0 65533; do
12840a8ac8fSEnji Cooper	expect 0 chown ${n1} ${id} ${id}
12940a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
13040a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
13140a8ac8fSEnji Cooper
13240a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
13340a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
13440a8ac8fSEnji Cooper	expect ENOENT lstat ${n0}/${n2} type
13540a8ac8fSEnji Cooper	expect ${inode} lstat ${n1}/${n3} inode
13640a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
13740a8ac8fSEnji Cooperdone
13840a8ac8fSEnji Cooper
13940a8ac8fSEnji Cooper# User doesn't own the sticky directory nor the destination directory.
14040a8ac8fSEnji Cooperfor id in 0 65533; do
14140a8ac8fSEnji Cooper	expect 0 chown ${n1} ${id} ${id}
14240a8ac8fSEnji Cooper	expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
14340a8ac8fSEnji Cooper	inode=`${fstest} lstat ${n0}/${n2} inode`
14440a8ac8fSEnji Cooper
14540a8ac8fSEnji Cooper	expect 0 -u ${id} -g ${id} mkdir ${n1}/${n3} 0755
14640a8ac8fSEnji Cooper	expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
14740a8ac8fSEnji Cooper	expect ${inode} lstat ${n0}/${n2} inode
14840a8ac8fSEnji Cooper	expect ${id},${id} lstat ${n1}/${n3} uid,gid
14940a8ac8fSEnji Cooper	expect 0 rmdir ${n0}/${n2}
15040a8ac8fSEnji Cooper	expect 0 rmdir ${n1}/${n3}
15140a8ac8fSEnji Cooperdone
15240a8ac8fSEnji Cooper
15340a8ac8fSEnji Cooperexpect 0 rmdir ${n1}
15440a8ac8fSEnji Cooperexpect 0 rmdir ${n0}
15540a8ac8fSEnji Cooper
15640a8ac8fSEnji Coopercd ${cdir}
15740a8ac8fSEnji Cooperexpect 0 rmdir ${n4}
158