diff options
author | Wolfgang Bumiller <wry.git@bumiller.com> | 2013-11-15 20:54:27 +1000 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2013-12-15 20:09:37 +1000 |
commit | 20127e732c66897506449c38baff9ec1a893032c (patch) | |
tree | 5ab307081b4b8329ac199753592915b3ca929e78 | |
parent | 759c48cd34235a0650f8189223b812dad53780cc (diff) | |
download | 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>
-rw-r--r-- | lib/libalpm/util.c | 1 |
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) { |