From: Wolfgang Bumiller <[email protected]>

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 <[email protected]>
---
 lib/libalpm/util.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index f9fdb01..40a5ebd 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) {
-- 
1.8.4.2


Reply via email to