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