diff options
Diffstat (limited to 'contrib/pjdfstest/tests/rename/09.t')
-rw-r--r-- | contrib/pjdfstest/tests/rename/09.t | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/contrib/pjdfstest/tests/rename/09.t b/contrib/pjdfstest/tests/rename/09.t new file mode 100644 index 0000000..299ff64 --- /dev/null +++ b/contrib/pjdfstest/tests/rename/09.t @@ -0,0 +1,191 @@ +#!/bin/sh +# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/09.t 211352 2010-08-15 21:24:17Z pjd $ + +desc="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" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2353" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n4} 0755 +cdir=`pwd` +cd ${n4} + +expect 0 mkdir ${n0} 0755 +expect 0 chmod ${n0} 01777 +expect 0 chown ${n0} 65534 65534 + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 + +for type in regular fifo block char socket symlink; do + # User owns both: the source sticky directory and the source file. + expect 0 chown ${n0} 65534 65534 + create_file ${type} ${n0}/${n2} 65534 65534 + inode=`${fstest} lstat ${n0}/${n2} inode` + + for type in none regular fifo block char socket symlink; do + create_file ${type} ${n1}/${n3} 65534 65534 + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ENOENT lstat ${n0}/${n2} inode + expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid + expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} + expect ${inode} lstat ${n0}/${n2} inode + expect ENOENT lstat ${n1}/${n3} inode + done + + expect 0 unlink ${n0}/${n2} + + # User owns the source sticky directory, but doesn't own the source file. + for id in 0 65533; do + expect 0 chown ${n0} 65534 65534 + create_file ${type} ${n0}/${n2} ${id} ${id} + inode=`${fstest} lstat ${n0}/${n2} inode` + + for type in none regular fifo block char socket symlink; do + create_file ${type} ${n1}/${n3} 65534 65534 + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ENOENT lstat ${n0}/${n2} inode + expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid + expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} + expect ${inode} lstat ${n0}/${n2} inode + expect ENOENT lstat ${n1}/${n3} inode + done + + expect 0 unlink ${n0}/${n2} + done + + # User owns the source file, but doesn't own the source sticky directory. + for id in 0 65533; do + expect 0 chown ${n0} ${id} ${id} + create_file ${type} ${n0}/${n2} 65534 65534 + inode=`${fstest} lstat ${n0}/${n2} inode` + + for type in none regular fifo block char socket symlink; do + create_file ${type} ${n1}/${n3} 65534 65534 + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ENOENT lstat ${n0}/${n2} inode + expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid + expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} + expect ${inode} lstat ${n0}/${n2} inode + expect ENOENT lstat ${n1}/${n3} inode + done + + expect 0 unlink ${n0}/${n2} + done + + # User doesn't own the source sticky directory nor the source file. + for id in 0 65533; do + expect 0 chown ${n0} ${id} ${id} + create_file ${type} ${n0}/${n2} ${id} ${id} + inode=`${fstest} lstat ${n0}/${n2} inode` + + for type in none regular fifo block char socket symlink; do + create_file ${type} ${n1}/${n3} 65534 65534 + expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid + if [ "${type}" != "none" ]; then + expect 65534,65534 lstat ${n1}/${n3} uid,gid + expect 0 unlink ${n1}/${n3} + fi + done + + expect 0 unlink ${n0}/${n2} + done +done + +# User owns both: the source sticky directory and the source directory. +expect 0 chown ${n0} 65534 65534 +create_file dir ${n0}/${n2} 65534 65534 +inode=`${fstest} lstat ${n0}/${n2} inode` + +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid +expect 0 rename ${n1}/${n3} ${n0}/${n2} + +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid +expect 0 rmdir ${n1}/${n3} + +# User owns the source sticky directory, but doesn't own the source directory. +# This fails when changing parent directory, because this will modify +# source directory inode (the .. link in it), but we can still rename it +# without changing its parent directory. +for id in 0 65533; do + expect 0 chown ${n0} 65534 65534 + create_file dir ${n0}/${n2} ${id} ${id} + inode=`${fstest} lstat ${n0}/${n2} inode` + + expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid + expect ENOENT lstat ${n1}/${n3} type + + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} + expect ENOENT lstat ${n0}/${n2} type + expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid + expect 0 rename ${n0}/${n3} ${n0}/${n2} + + expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 + expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid + expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid + expect 0 rmdir ${n1}/${n3} + + expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755 + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} + expect ENOENT lstat ${n0}/${n2} type + expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid + expect 0 rmdir ${n0}/${n3} +done + +# User owns the source directory, but doesn't own the source sticky directory. +for id in 0 65533; do + expect 0 chown ${n0} ${id} ${id} + create_file dir ${n0}/${n2} 65534 65534 + inode=`${fstest} lstat ${n0}/${n2} inode` + + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ENOENT lstat ${n0}/${n2} type + expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid + expect 0 rename ${n1}/${n3} ${n0}/${n2} + + expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 + expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ENOENT lstat ${n0}/${n2} type + expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid + expect 0 rmdir ${n1}/${n3} +done + +# User doesn't own the source sticky directory nor the source directory. +for id in 0 65533; do + expect 0 chown ${n0} ${id} ${id} + create_file dir ${n0}/${n2} ${id} ${id} + inode=`${fstest} lstat ${n0}/${n2} inode` + + expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid + expect ENOENT lstat ${n1}/${n3} type + + expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 + expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} + expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid + expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid + expect 0 rmdir ${n0}/${n2} + expect 0 rmdir ${n1}/${n3} +done + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n4} |