1271294Sngie#!/bin/sh 2271294Sngie# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/09.t 211352 2010-08-15 21:24:17Z pjd $ 3271294Sngie 4271294Sngiedesc="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" 5271294Sngie 6271294Sngiedir=`dirname $0` 7271294Sngie. ${dir}/../misc.sh 8271294Sngie 9271294Sngieecho "1..2353" 10271294Sngie 11271294Sngien0=`namegen` 12271294Sngien1=`namegen` 13271294Sngien2=`namegen` 14271294Sngien3=`namegen` 15271294Sngien4=`namegen` 16271294Sngie 17271294Sngieexpect 0 mkdir ${n4} 0755 18271294Sngiecdir=`pwd` 19271294Sngiecd ${n4} 20271294Sngie 21271294Sngieexpect 0 mkdir ${n0} 0755 22271294Sngieexpect 0 chmod ${n0} 01777 23271294Sngieexpect 0 chown ${n0} 65534 65534 24271294Sngie 25271294Sngieexpect 0 mkdir ${n1} 0755 26271294Sngieexpect 0 chown ${n1} 65534 65534 27271294Sngie 28271294Sngiefor type in regular fifo block char socket symlink; do 29271294Sngie # User owns both: the source sticky directory and the source file. 30271294Sngie expect 0 chown ${n0} 65534 65534 31271294Sngie create_file ${type} ${n0}/${n2} 65534 65534 32271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 33271294Sngie 34271294Sngie for type in none regular fifo block char socket symlink; do 35271294Sngie create_file ${type} ${n1}/${n3} 65534 65534 36271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 37271294Sngie expect ENOENT lstat ${n0}/${n2} inode 38271294Sngie expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 39271294Sngie expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 40271294Sngie expect ${inode} lstat ${n0}/${n2} inode 41271294Sngie expect ENOENT lstat ${n1}/${n3} inode 42271294Sngie done 43271294Sngie 44271294Sngie expect 0 unlink ${n0}/${n2} 45271294Sngie 46271294Sngie # User owns the source sticky directory, but doesn't own the source file. 47271294Sngie for id in 0 65533; do 48271294Sngie expect 0 chown ${n0} 65534 65534 49271294Sngie create_file ${type} ${n0}/${n2} ${id} ${id} 50271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 51271294Sngie 52271294Sngie for type in none regular fifo block char socket symlink; do 53271294Sngie create_file ${type} ${n1}/${n3} 65534 65534 54271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 55271294Sngie expect ENOENT lstat ${n0}/${n2} inode 56271294Sngie expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid 57271294Sngie expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 58271294Sngie expect ${inode} lstat ${n0}/${n2} inode 59271294Sngie expect ENOENT lstat ${n1}/${n3} inode 60271294Sngie done 61271294Sngie 62271294Sngie expect 0 unlink ${n0}/${n2} 63271294Sngie done 64271294Sngie 65271294Sngie # User owns the source file, but doesn't own the source sticky directory. 66271294Sngie for id in 0 65533; do 67271294Sngie expect 0 chown ${n0} ${id} ${id} 68271294Sngie create_file ${type} ${n0}/${n2} 65534 65534 69271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 70271294Sngie 71271294Sngie for type in none regular fifo block char socket symlink; do 72271294Sngie create_file ${type} ${n1}/${n3} 65534 65534 73271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 74271294Sngie expect ENOENT lstat ${n0}/${n2} inode 75271294Sngie expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 76271294Sngie expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 77271294Sngie expect ${inode} lstat ${n0}/${n2} inode 78271294Sngie expect ENOENT lstat ${n1}/${n3} inode 79271294Sngie done 80271294Sngie 81271294Sngie expect 0 unlink ${n0}/${n2} 82271294Sngie done 83271294Sngie 84271294Sngie # User doesn't own the source sticky directory nor the source file. 85271294Sngie for id in 0 65533; do 86271294Sngie expect 0 chown ${n0} ${id} ${id} 87271294Sngie create_file ${type} ${n0}/${n2} ${id} ${id} 88271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 89271294Sngie 90271294Sngie for type in none regular fifo block char socket symlink; do 91271294Sngie create_file ${type} ${n1}/${n3} 65534 65534 92271294Sngie expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 93271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 94271294Sngie if [ "${type}" != "none" ]; then 95271294Sngie expect 65534,65534 lstat ${n1}/${n3} uid,gid 96271294Sngie expect 0 unlink ${n1}/${n3} 97271294Sngie fi 98271294Sngie done 99271294Sngie 100271294Sngie expect 0 unlink ${n0}/${n2} 101271294Sngie done 102271294Sngiedone 103271294Sngie 104271294Sngie# User owns both: the source sticky directory and the source directory. 105271294Sngieexpect 0 chown ${n0} 65534 65534 106271294Sngiecreate_file dir ${n0}/${n2} 65534 65534 107271294Sngieinode=`${fstest} lstat ${n0}/${n2} inode` 108271294Sngie 109271294Sngieexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 110271294Sngieexpect ENOENT lstat ${n0}/${n2} type 111271294Sngieexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 112271294Sngieexpect 0 rename ${n1}/${n3} ${n0}/${n2} 113271294Sngie 114271294Sngieexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 115271294Sngieexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 116271294Sngieexpect ENOENT lstat ${n0}/${n2} type 117271294Sngieexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 118271294Sngieexpect 0 rmdir ${n1}/${n3} 119271294Sngie 120271294Sngie# User owns the source sticky directory, but doesn't own the source directory. 121271294Sngie# This fails when changing parent directory, because this will modify 122271294Sngie# source directory inode (the .. link in it), but we can still rename it 123271294Sngie# without changing its parent directory. 124271294Sngiefor id in 0 65533; do 125271294Sngie expect 0 chown ${n0} 65534 65534 126271294Sngie create_file dir ${n0}/${n2} ${id} ${id} 127271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 128271294Sngie 129271294Sngie expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 130271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 131271294Sngie expect ENOENT lstat ${n1}/${n3} type 132271294Sngie 133271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} 134271294Sngie expect ENOENT lstat ${n0}/${n2} type 135271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid 136271294Sngie expect 0 rename ${n0}/${n3} ${n0}/${n2} 137271294Sngie 138271294Sngie expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 139271294Sngie expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 140271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 141271294Sngie expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid 142271294Sngie expect 0 rmdir ${n1}/${n3} 143271294Sngie 144271294Sngie expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755 145271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} 146271294Sngie expect ENOENT lstat ${n0}/${n2} type 147271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid 148271294Sngie expect 0 rmdir ${n0}/${n3} 149271294Sngiedone 150271294Sngie 151271294Sngie# User owns the source directory, but doesn't own the source sticky directory. 152271294Sngiefor id in 0 65533; do 153271294Sngie expect 0 chown ${n0} ${id} ${id} 154271294Sngie create_file dir ${n0}/${n2} 65534 65534 155271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 156271294Sngie 157271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 158271294Sngie expect ENOENT lstat ${n0}/${n2} type 159271294Sngie expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 160271294Sngie expect 0 rename ${n1}/${n3} ${n0}/${n2} 161271294Sngie 162271294Sngie expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 163271294Sngie expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 164271294Sngie expect ENOENT lstat ${n0}/${n2} type 165271294Sngie expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 166271294Sngie expect 0 rmdir ${n1}/${n3} 167271294Sngiedone 168271294Sngie 169271294Sngie# User doesn't own the source sticky directory nor the source directory. 170271294Sngiefor id in 0 65533; do 171271294Sngie expect 0 chown ${n0} ${id} ${id} 172271294Sngie create_file dir ${n0}/${n2} ${id} ${id} 173271294Sngie inode=`${fstest} lstat ${n0}/${n2} inode` 174271294Sngie 175271294Sngie expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 176271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 177271294Sngie expect ENOENT lstat ${n1}/${n3} type 178271294Sngie 179271294Sngie expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 180271294Sngie expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 181271294Sngie expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 182271294Sngie expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid 183271294Sngie expect 0 rmdir ${n0}/${n2} 184271294Sngie expect 0 rmdir ${n1}/${n3} 185271294Sngiedone 186271294Sngie 187271294Sngieexpect 0 rmdir ${n1} 188271294Sngieexpect 0 rmdir ${n0} 189271294Sngie 190271294Sngiecd ${cdir} 191271294Sngieexpect 0 rmdir ${n4} 192