On Wed, Oct 14, 2015 at 03:13:47AM +0000, Serge Hallyn wrote:
> lxc-usernsexec was using fd 0 and reopening it as 0,1,2 for
> the new task.  If doing "lxc-usernsexec .. < script" this
> will corrupt the file 'script'.
> 
> Reported-by: Fiedler Roman <[email protected]>
> Signed-off-by: Serge Hallyn <[email protected]>

Acked-by: Stéphane Graber <[email protected]>

> ---
>  src/lxc/lxc_usernsexec.c | 43 ++++++++++++++++++++++++++++++-------------
>  1 file changed, 30 insertions(+), 13 deletions(-)
> 
> diff --git a/src/lxc/lxc_usernsexec.c b/src/lxc/lxc_usernsexec.c
> index 19049ff..99927cf 100644
> --- a/src/lxc/lxc_usernsexec.c
> +++ b/src/lxc/lxc_usernsexec.c
> @@ -74,12 +74,16 @@ static void usage(const char *name)
>       exit(1);
>  }
>  
> -static void opentty(const char * tty) {
> -     int i, fd, flags;
> +static void opentty(const char * tty, int which) {
> +     int fd, flags;
> +
> +     if (tty[0] == '\0')
> +             return;
>  
>       fd = open(tty, O_RDWR | O_NONBLOCK);
>       if (fd == -1) {
>               printf("WARN: could not reopen tty: %s\n", strerror(errno));
> +             close(which);
>               return;
>       }
>  
> @@ -87,16 +91,15 @@ static void opentty(const char * tty) {
>       flags &= ~O_NONBLOCK;
>       if (fcntl(fd, F_SETFL, flags) < 0) {
>               printf("WARN: could not set fd flags: %s\n", strerror(errno));
> +             close(which);
>               return;
>       }
>  
> -     for (i = 0; i < fd; i++)
> -             close(i);
> -     for (i = 0; i < 3; i++)
> -             if (fd != i)
> -                     dup2(fd, i);
> -     if (fd >= 3)
> +     close(which);
> +     if (fd != which) {
> +             dup2(fd, which);
>               close(fd);
> +     }
>  }
>  // Code copy end
>  
> @@ -265,7 +268,7 @@ int main(int argc, char *argv[])
>  {
>       int c;
>       unsigned long flags = CLONE_NEWUSER | CLONE_NEWNS;
> -     char ttyname[256];
> +     char ttyname0[256], ttyname1[256], ttyname2[256];
>       int status;
>       int ret;
>       int pid;
> @@ -274,12 +277,24 @@ int main(int argc, char *argv[])
>       int pipe1[2],  // child tells parent it has unshared
>           pipe2[2];  // parent tells child it is mapped and may proceed
>  
> -     memset(ttyname, '\0', sizeof(ttyname));
> -     ret = readlink("/proc/self/fd/0", ttyname, sizeof(ttyname));
> +     memset(ttyname0, '\0', sizeof(ttyname0));
> +     memset(ttyname1, '\0', sizeof(ttyname1));
> +     memset(ttyname2, '\0', sizeof(ttyname2));
> +     ret = readlink("/proc/self/fd/0", ttyname0, sizeof(ttyname0));
>       if (ret < 0) {
> -             perror("readlink on fd 0");
> +             perror("unable to open stdin.");
>               exit(1);
>       }
> +     ret = readlink("/proc/self/fd/1", ttyname1, sizeof(ttyname1));
> +     if (ret < 0) {
> +             printf("Warning: unable to open stdout, continuing.");
> +             memset(ttyname1, '\0', sizeof(ttyname1));
> +     }
> +     ret = readlink("/proc/self/fd/2", ttyname2, sizeof(ttyname2));
> +     if (ret < 0) {
> +             printf("Warning: unable to open stderr, continueing.");
> +             memset(ttyname2, '\0', sizeof(ttyname2));
> +     }
>  
>       lxc_list_init(&active_map);
>  
> @@ -315,7 +330,9 @@ int main(int argc, char *argv[])
>  
>               close(pipe1[0]);
>               close(pipe2[1]);
> -             opentty(ttyname);
> +             opentty(ttyname0, 0);
> +             opentty(ttyname1, 1);
> +             opentty(ttyname2, 2);
>  
>               ret = unshare(flags);
>               if (ret < 0) {
> -- 
> 2.5.0
> 
> _______________________________________________
> lxc-devel mailing list
> [email protected]
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com

Attachment: signature.asc
Description: Digital signature

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to