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