[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] utils/settrans: fix the teardown of chrooted environments
From: |
Samuel Thibault |
Subject: |
Re: [PATCH] utils/settrans: fix the teardown of chrooted environments |
Date: |
Wed, 11 Dec 2013 00:21:29 +0100 |
User-agent: |
Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) |
Justus Winter, le Tue 10 Dec 2013 18:08:13 +0100, a écrit :
> Previously, settrans --chroot would just exec the target. Create a
> new process for that purpose. Wait for its completion, then ask the
> translator (nicely by default) to go away. If it refuses with EBUSY,
> it might be because some process has daemonized inside the chrooted
> environment.
>
> This fixes the following bug when settrans is used with fakeroot:
>
> % fakeroot-hurd /bin/true 2>&1 | tee
> <hangs>
>
> Here, fakeroot-hurd execs settrans with --chroot, settrans execs
> /hurd/fakeauth which will eventually exec the target /bin/true. When
> true terminates, it will close its stdout and stderr. But
> /hurd/fakeroot's stderr is also connected to tee's stdin, preventing
> tee from exiting.
>
> * utils/settrans.c (main): Fix the teardown of chrooted environments.
Oops, I meant this one of course.
> ---
> utils/settrans.c | 69
> ++++++++++++++++++++++++++++++++++--------------------
> 1 file changed, 44 insertions(+), 25 deletions(-)
>
> diff --git a/utils/settrans.c b/utils/settrans.c
> index d13e7c4..ecc6d75 100644
> --- a/utils/settrans.c
> +++ b/utils/settrans.c
> @@ -25,6 +25,7 @@
> #include <error.h>
> #include <fcntl.h>
> #include <unistd.h>
> +#include <sys/wait.h>
>
> #include <error.h>
> #include <argz.h>
> @@ -279,33 +280,51 @@ main(int argc, char *argv[])
>
> if (chroot_command)
> {
> - /* We will act as the parent filesystem would for a lookup
> - of the active translator's root node, then use this port
> - as our root directory while we exec the command. */
> -
> - char retry_name[1024]; /* XXX */
> - retry_type do_retry;
> - mach_port_t root;
> - err = fsys_getroot (active_control,
> - MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND,
> - NULL, 0, NULL, 0, 0, &do_retry, retry_name, &root);
> - mach_port_deallocate (mach_task_self (), active_control);
> - if (err)
> - error (6, err, "fsys_getroot");
> - err = hurd_file_name_lookup_retry (&_hurd_ports_use, &getdport, 0,
> - do_retry, retry_name, 0, 0,
> - &root);
> - if (err)
> - error (6, err, "cannot resolve root port");
> + pid_t pid;
> + switch ((pid = fork ()))
> + {
> + case -1:
> + error (6, errno, "fork");
> +
> + case 0:; /* Child. */
> + /* We will act as the parent filesystem would for a lookup
> + of the active translator's root node, then use this port
> + as our root directory while we exec the command. */
> +
> + char retry_name[1024]; /* XXX */
> + retry_type do_retry;
> + mach_port_t root;
> + err = fsys_getroot (active_control,
> + MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND,
> + NULL, 0, NULL, 0, 0,
> + &do_retry, retry_name, &root);
> + mach_port_deallocate (mach_task_self (), active_control);
> + if (err)
> + error (6, err, "fsys_getroot");
> + err = hurd_file_name_lookup_retry (&_hurd_ports_use, &getdport, 0,
> + do_retry, retry_name, 0, 0,
> + &root);
> + if (err)
> + error (6, err, "cannot resolve root port");
> +
> + if (setcrdir (root))
> + error (7, errno, "cannot install root port");
> + mach_port_deallocate (mach_task_self (), root);
> + if (chdir ("/"))
> + error (8, errno, "cannot chdir to new root");
> +
> + execvp (chroot_command[0], chroot_command);
> + error (8, errno, "cannot execute %s", chroot_command[0]);
> + break;
>
> - if (setcrdir (root))
> - error (7, errno, "cannot install root port");
> - mach_port_deallocate (mach_task_self (), root);
> - if (chdir ("/"))
> - error (8, errno, "cannot chdir to new root");
> + default: /* Parent. */
> + if (waitpid (pid, NULL, 0) == -1)
> + error (8, errno, "waitpid");
>
> - execvp (chroot_command[0], chroot_command);
> - error (8, errno, "cannot execute %s", chroot_command[0]);
> + err = fsys_goaway (active_control, goaway_flags);
> + if (err && err != EBUSY)
> + error (9, err, "fsys_goaway");
> + }
> }
>
> return 0;
> --
> 1.7.10.4
>
--
Samuel
<b> il faut combien de chevaux pour tirer une doloréan à 88 morph ?
***b vient de remarque que 88 mph c'est 142 km/h
<y> aaaaah
<y> c'est pour ça qu'ils limitent à 130 km/h sur les autoroutes
<y> c'est pour éviter que les gens voyagent dans le temps
<b> probablement
- [PATCH 2/5] trans/fakeroot: fix ownership of newly created files, (continued)
- [PATCH 2/5] trans/fakeroot: fix ownership of newly created files, Justus Winter, 2013/12/10
- [PATCH 3/5] trans/fakeroot: drop else, Justus Winter, 2013/12/10
- [PATCH 4/5] trans/fakeroot: remove dead code, Justus Winter, 2013/12/10
- [PATCH 5/5] trans/fakeroot: remove dead code, Justus Winter, 2013/12/10
- updated 1st patch, Justus Winter, 2013/12/10
- Re: [PATCH 1/5] utils/settrans: fix the teardown of chrooted environments, Samuel Thibault, 2013/12/10