1166065Spjd#!/bin/sh 2166065Spjd# $FreeBSD$ 3166065Spjd 4166065Spjddesc="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" 5166065Spjd 6166065Spjddir=`dirname $0` 7166065Spjd. ${dir}/../misc.sh 8166065Spjd 9211180Spjdecho "1..2353" 10166065Spjd 11166065Spjdn0=`namegen` 12166065Spjdn1=`namegen` 13166065Spjdn2=`namegen` 14166065Spjdn3=`namegen` 15166065Spjdn4=`namegen` 16166065Spjd 17166065Spjdexpect 0 mkdir ${n4} 0755 18166065Spjdcdir=`pwd` 19166065Spjdcd ${n4} 20166065Spjd 21166065Spjdexpect 0 mkdir ${n0} 0755 22211180Spjdexpect 0 chmod ${n0} 01777 23166065Spjdexpect 0 chown ${n0} 65534 65534 24166065Spjd 25166065Spjdexpect 0 mkdir ${n1} 0755 26166065Spjdexpect 0 chown ${n1} 65534 65534 27166065Spjd 28211180Spjdfor type in regular fifo block char socket symlink; do 29211180Spjd # User owns both: the source sticky directory and the source file. 30211180Spjd expect 0 chown ${n0} 65534 65534 31211180Spjd create_file ${type} ${n0}/${n2} 65534 65534 32211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 33211180Spjd 34211180Spjd for type in none regular fifo block char socket symlink; do 35211180Spjd create_file ${type} ${n1}/${n3} 65534 65534 36211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 37211180Spjd expect ENOENT lstat ${n0}/${n2} inode 38211180Spjd expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 39211180Spjd expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 40211180Spjd expect ${inode} lstat ${n0}/${n2} inode 41211180Spjd expect ENOENT lstat ${n1}/${n3} inode 42211180Spjd done 43211180Spjd 44211180Spjd expect 0 unlink ${n0}/${n2} 45211180Spjd 46211180Spjd # User owns the source sticky directory, but doesn't own the source file. 47211180Spjd for id in 0 65533; do 48211180Spjd expect 0 chown ${n0} 65534 65534 49211180Spjd create_file ${type} ${n0}/${n2} ${id} ${id} 50211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 51211180Spjd 52211180Spjd for type in none regular fifo block char socket symlink; do 53211180Spjd create_file ${type} ${n1}/${n3} 65534 65534 54211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 55211180Spjd expect ENOENT lstat ${n0}/${n2} inode 56211180Spjd expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid 57211180Spjd expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 58211180Spjd expect ${inode} lstat ${n0}/${n2} inode 59211180Spjd expect ENOENT lstat ${n1}/${n3} inode 60211180Spjd done 61211180Spjd 62211180Spjd expect 0 unlink ${n0}/${n2} 63211180Spjd done 64211180Spjd 65211180Spjd # User owns the source file, but doesn't own the source sticky directory. 66211180Spjd for id in 0 65533; do 67211180Spjd expect 0 chown ${n0} ${id} ${id} 68211180Spjd create_file ${type} ${n0}/${n2} 65534 65534 69211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 70211180Spjd 71211180Spjd for type in none regular fifo block char socket symlink; do 72211180Spjd create_file ${type} ${n1}/${n3} 65534 65534 73211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 74211180Spjd expect ENOENT lstat ${n0}/${n2} inode 75211180Spjd expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 76211180Spjd expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} 77211180Spjd expect ${inode} lstat ${n0}/${n2} inode 78211180Spjd expect ENOENT lstat ${n1}/${n3} inode 79211180Spjd done 80211180Spjd 81211180Spjd expect 0 unlink ${n0}/${n2} 82211180Spjd done 83211180Spjd 84211180Spjd # User doesn't own the source sticky directory nor the source file. 85211180Spjd for id in 0 65533; do 86211180Spjd expect 0 chown ${n0} ${id} ${id} 87211180Spjd create_file ${type} ${n0}/${n2} ${id} ${id} 88211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 89211180Spjd 90211180Spjd for type in none regular fifo block char socket symlink; do 91211180Spjd create_file ${type} ${n1}/${n3} 65534 65534 92211180Spjd expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 93211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 94211180Spjd if [ "${type}" != "none" ]; then 95211180Spjd expect 65534,65534 lstat ${n1}/${n3} uid,gid 96211180Spjd expect 0 unlink ${n1}/${n3} 97211180Spjd fi 98211180Spjd done 99211180Spjd 100211180Spjd expect 0 unlink ${n0}/${n2} 101211180Spjd done 102211180Spjddone 103211180Spjd 104211180Spjd# User owns both: the source sticky directory and the source directory. 105211180Spjdexpect 0 chown ${n0} 65534 65534 106211180Spjdcreate_file dir ${n0}/${n2} 65534 65534 107211180Spjdinode=`${fstest} lstat ${n0}/${n2} inode` 108211180Spjd 109166065Spjdexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 110211180Spjdexpect ENOENT lstat ${n0}/${n2} type 111211180Spjdexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 112211180Spjdexpect 0 rename ${n1}/${n3} ${n0}/${n2} 113166065Spjd 114211180Spjdexpect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 115166065Spjdexpect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 116211180Spjdexpect ENOENT lstat ${n0}/${n2} type 117211180Spjdexpect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 118211180Spjdexpect 0 rmdir ${n1}/${n3} 119166065Spjd 120211180Spjd# User owns the source sticky directory, but doesn't own the source directory. 121211180Spjd# This fails when changing parent directory, because this will modify 122211180Spjd# source directory inode (the .. link in it), but we can still rename it 123211180Spjd# without changing its parent directory. 124211180Spjdfor id in 0 65533; do 125211180Spjd expect 0 chown ${n0} 65534 65534 126211180Spjd create_file dir ${n0}/${n2} ${id} ${id} 127211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 128211180Spjd 129211180Spjd expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 130211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 131211180Spjd expect ENOENT lstat ${n1}/${n3} type 132211180Spjd 133211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} 134211180Spjd expect ENOENT lstat ${n0}/${n2} type 135211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid 136211180Spjd expect 0 rename ${n0}/${n3} ${n0}/${n2} 137211180Spjd 138211180Spjd expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 139211180Spjd expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 140211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 141211180Spjd expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid 142211180Spjd expect 0 rmdir ${n1}/${n3} 143211180Spjd 144211180Spjd expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755 145211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3} 146211180Spjd expect ENOENT lstat ${n0}/${n2} type 147211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid 148211180Spjd expect 0 rmdir ${n0}/${n3} 149211180Spjddone 150211180Spjd 151211180Spjd# User owns the source directory, but doesn't own the source sticky directory. 152211180Spjdfor id in 0 65533; do 153211180Spjd expect 0 chown ${n0} ${id} ${id} 154211180Spjd create_file dir ${n0}/${n2} 65534 65534 155211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 156211180Spjd 157211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 158211180Spjd expect ENOENT lstat ${n0}/${n2} type 159211180Spjd expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 160211180Spjd expect 0 rename ${n1}/${n3} ${n0}/${n2} 161211180Spjd 162211180Spjd expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 163211180Spjd expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 164211180Spjd expect ENOENT lstat ${n0}/${n2} type 165211180Spjd expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid 166211180Spjd expect 0 rmdir ${n1}/${n3} 167211180Spjddone 168211180Spjd 169211180Spjd# User doesn't own the source sticky directory nor the source directory. 170211180Spjdfor id in 0 65533; do 171211180Spjd expect 0 chown ${n0} ${id} ${id} 172211180Spjd create_file dir ${n0}/${n2} ${id} ${id} 173211180Spjd inode=`${fstest} lstat ${n0}/${n2} inode` 174211180Spjd 175211180Spjd expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 176211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 177211180Spjd expect ENOENT lstat ${n1}/${n3} type 178211180Spjd 179211180Spjd expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 180211180Spjd expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} 181211180Spjd expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid 182211180Spjd expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid 183211180Spjd expect 0 rmdir ${n0}/${n2} 184211180Spjd expect 0 rmdir ${n1}/${n3} 185211180Spjddone 186211180Spjd 187166065Spjdexpect 0 rmdir ${n1} 188166065Spjdexpect 0 rmdir ${n0} 189166065Spjd 190166065Spjdcd ${cdir} 191166065Spjdexpect 0 rmdir ${n4} 192