Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#!/bin/sh
# vim: filetype=sh noexpandtab ts=8 sw=8
# $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}