bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/5] utils/settrans: fix the teardown of chrooted environment


From: Samuel Thibault
Subject: Re: [PATCH 1/5] utils/settrans: fix the teardown of chrooted environments
Date: Wed, 11 Dec 2013 00:16:58 +0100
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

Justus Winter, le Tue 10 Dec 2013 17:50:26 +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.

Ack.

> ---
>  utils/settrans.c |   69 
> ++++++++++++++++++++++++++++++++++--------------------
>  1 file changed, 44 insertions(+), 25 deletions(-)
> 
> diff --git a/utils/settrans.c b/utils/settrans.c
> index d13e7c4..77ec5de 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, 0);
> +       if (err && err != EBUSY)
> +         error (9, err, "fsys_goaway");
> +     }
>      }
>  
>    return 0;
> -- 
> 1.7.10.4
> 

-- 
Samuel
 FYLG> Tiens, vlà une URL qui va bien :
 FYLG> ftp://127.0.0.1/WaReZ/NiouZeS/WinDoZe/NeWSMoNGeR/SuPeR
 c'est gentil sauf que l'adresse ne fonctionne pas sa me fais une erreur
 -+- Furtif in Guide du Neuneu Usenet : <MODE CERVEAU OFF> -+-



reply via email to

[Prev in Thread] Current Thread [Next in Thread]