Commit 174ff59d authored by Jan Steffens's avatar Jan Steffens
Browse files

Add flock-based locking to chroots

This prevents accidents when chroots are shared between multiple users.
parent 5434d399
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -36,6 +36,19 @@ fi

if ${clean_first} || [ ! -d "${chroots}/${repo}-${arch}" ]; then
	echo "Creating chroot for [${repo}] (${arch})..."

	for copy in ${chroots}/${repo}-${arch}/*; do
		[[ -d $copy ]] || continue
		echo "Deleting chroot copy '$(basename "${copy}")'..."

		# Lock the copy
		exec 9>${copy}.lock
		flock 9

		rm -rf ${copy}
	done
	exec 9>&-

	rm -rf ${chroots}/${repo}-${arch}
	mkdir -p ${chroots}/${repo}-${arch}
	setarch ${arch} mkarchroot \
+23 −0
Original line number Diff line number Diff line
@@ -105,11 +105,34 @@ if [ ! -d "$chrootdir/root" ]; then
fi

umask 0022

# Lock the chroot we want to use. We'll keep this lock until we exit.
# Note this is the same FD number as in mkarchroot
exec 9>"$copydir.lock"
if ! flock -n 9; then
	echo -n "locking chroot copy '$copy'..."
	flock 9
	echo "done"
fi

if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then
	# Get a read lock on the root chroot to make
	# sure we don't clone a half-updated chroot
	exec 8>"$chrootdir/root.lock"

	if ! flock -sn 8; then
		echo -n "locking clean chroot..."
		flock -s 8
		echo "done"
	fi

	echo -n 'creating clean working copy...'
	mkdir -p "$copydir"
	rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
	echo 'done'

	# Drop the read lock again
	exec 8>&-
fi

if [ -n "$install_pkg" ]; then
+16 −0
Original line number Diff line number Diff line
@@ -141,6 +141,20 @@ chroot_umount () {
	umount "${working_dir}/${cache_dir}"
	[ -n "${host_mirror_path}" ] && umount "${working_dir}/${host_mirror_path}"
}

chroot_lock () {
	# Only reopen the FD if it wasn't handed to us
	if [ "$(readlink -f /dev/fd/9)" != "${working_dir}.lock" ]; then
	  exec 9>"${working_dir}.lock"
	fi

	# Lock the chroot. Take note of the FD number.
	if ! flock -n 9; then
		echo -n "locking chroot..."
		flock 9
		echo "done"
	fi
}
# }}}

umask 0022
@@ -153,6 +167,7 @@ if [ "$RUN" != "" ]; then
		exit 1
	fi

	chroot_lock
	chroot_mount
	copy_hostconf

@@ -169,6 +184,7 @@ else
	mkdir -p "${working_dir}/var/lib/pacman/sync"
	mkdir -p "${working_dir}/etc/"

	chroot_lock
	chroot_mount

	pacargs="--noconfirm --root=${working_dir} --cachedir=${cache_dir}"