diff options
Diffstat (limited to 'tools/regression/fstest/tests/rename/09.t')
-rw-r--r-- | tools/regression/fstest/tests/rename/09.t | 221 |
1 files changed, 159 insertions, 62 deletions
diff --git a/tools/regression/fstest/tests/rename/09.t b/tools/regression/fstest/tests/rename/09.t index 41270f1..91d16a6 100644 --- a/tools/regression/fstest/tests/rename/09.t +++ b/tools/regression/fstest/tests/rename/09.t @@ -6,7 +6,7 @@ desc="rename returns EACCES or EPERM if the directory containing 'from' is marke dir=`dirname $0` . ${dir}/../misc.sh -echo "1..56" +echo "1..2353" n0=`namegen` n1=`namegen` @@ -19,73 +19,170 @@ cdir=`pwd` cd ${n4} expect 0 mkdir ${n0} 0755 -expect 0 chown ${n0} 65534 65534 expect 0 chmod ${n0} 01777 +expect 0 chown ${n0} 65534 65534 expect 0 mkdir ${n1} 0755 - -# User owns both: the sticky directory and the file to be renamed. -expect 0 chown ${n1} 65534 65534 -expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 -expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User owns the file to be renamed, but doesn't own the sticky directory. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 -expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User owns the sticky directory, but doesn't own the file to be renamed. -expect 0 chown ${n1} 65534 65534 -expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 -expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User doesn't own the sticky directory nor the file to be renamed. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 -expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n0}/${n2} - -# User owns both: the sticky directory and the fifo to be renamed. -expect 0 chown ${n1} 65534 65534 -expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 -expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User owns the fifo to be renamed, but doesn't own the sticky directory. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 -expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User owns the sticky directory, but doesn't own the fifo to be renamed. -expect 0 chown ${n1} 65534 65534 -expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 -expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User doesn't own the sticky directory nor the fifo to be renamed. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 -expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n0}/${n2} - -# User owns both: the sticky directory and the symlink to be renamed. expect 0 chown ${n1} 65534 65534 -expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} + +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 0 unlink ${n1}/${n3} -# User owns the symlink to be renamed, but doesn't own the sticky directory. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} -expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n1}/${n3} -# User owns the sticky directory, but doesn't own the symlink to be renamed. -expect 0 chown ${n1} 65534 65534 -expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} +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 0 unlink ${n1}/${n3} -# User doesn't own the sticky directory nor the symlink to be renamed. -expect 0 chown ${n1} 65533 65533 -expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} -expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} -expect 0 unlink ${n0}/${n2} +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} |