summaryrefslogtreecommitdiffstats
path: root/lib/libalpm
diff options
context:
space:
mode:
authorWolfgang Bumiller <wry.git@bumiller.com>2013-11-15 11:54:27 +0100
committerAllan McRae <allan@archlinux.org>2013-12-15 11:09:37 +0100
commit20127e732c66897506449c38baff9ec1a893032c (patch)
tree5ab307081b4b8329ac199753592915b3ca929e78 /lib/libalpm
parent759c48cd34235a0650f8189223b812dad53780cc (diff)
downloadpacman-20127e732c66897506449c38baff9ec1a893032c.tar.gz
pacman-20127e732c66897506449c38baff9ec1a893032c.tar.xz
Close file descirptor before fork
FreeBSD chroot(2) fails with EPERM when a directory file descriptor is open with either `kern.chroot_allow_open_directories` being 0, or when the process already is inside a chroot. This is exposed in alpm_run_chroot that uses opendir() to open a file descriptor to the current directory before doing the forking and chrooting. Since the file descriptor is not used in the forked process, we close it. Fixes FS#36161. Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib/libalpm')
-rw-r--r--lib/libalpm/util.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index f9fdb018..40a5ebd7 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -542,6 +542,7 @@ int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[])
while(dup2(pipefd[1], 2) == -1 && errno == EINTR);
close(pipefd[0]);
close(pipefd[1]);
+ close(cwdfd);
/* use fprintf instead of _alpm_log to send output through the parent */
if(chroot(handle->root) != 0) {