]> git.proxmox.com Git - mirror_lxc.git/commitdiff
attach: minor tweaks
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 24 Dec 2017 18:24:35 +0000 (19:24 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 9 Jan 2018 12:20:20 +0000 (13:20 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/attach.c

index d33c6b506aa9fcf59518d13446469de3119f5b80..b6f290ad394ed1251b8e62e4395bdb23d78cd88d 100644 (file)
@@ -260,10 +260,16 @@ static inline void lxc_proc_close_ns_fd(struct lxc_proc_context_info *ctx)
 static void lxc_proc_put_context_info(struct lxc_proc_context_info *ctx)
 {
        free(ctx->lsm_label);
-       if (ctx->container)
+       ctx->lsm_label = NULL;
+
+       if (ctx->container) {
                lxc_container_put(ctx->container);
+               ctx->container = NULL;
+       }
+
        lxc_proc_close_ns_fd(ctx);
        free(ctx);
+       ctx = NULL;
 }
 
 /**
@@ -894,6 +900,12 @@ static int attach_child_main(struct attach_clone_payload *payload)
                TRACE("Received LSM label file descriptor %d from parent", lsm_fd);
        }
 
+       if (options->stdin_fd > 0 && isatty(options->stdin_fd)) {
+               ret = lxc_make_controlling_pty(options->stdin_fd);
+               if (ret < 0)
+                       goto on_error;
+       }
+
        /* Set {u,g}id. */
        new_uid = 0;
        new_gid = 0;
@@ -908,18 +920,6 @@ static int attach_child_main(struct attach_clone_payload *payload)
        if (options->gid != (gid_t)-1)
                new_gid = options->gid;
 
-       if (options->stdin_fd && isatty(options->stdin_fd)) {
-               ret = setsid();
-               if (ret < 0)
-                       goto on_error;
-               TRACE("Became session leader");
-
-               ret = ioctl(options->stdin_fd, TIOCSCTTY, (char *)NULL);
-               if (ret < 0)
-                       goto on_error;
-               TRACE("Set controlling terminal");
-       }
-
        /* Try to set the {u,g}id combination. */
        if (new_uid != 0 || new_gid != 0 || options->namespaces & CLONE_NEWUSER) {
                ret = lxc_switch_uid_gid(new_uid, new_gid);
@@ -972,19 +972,23 @@ static int attach_child_main(struct attach_clone_payload *payload)
        /* Fd handling for stdin, stdout and stderr; ignore errors here, user
         * may want to make sure the fds are closed, for example.
         */
-       if (options->stdin_fd >= 0 && options->stdin_fd != 0)
-               dup2(options->stdin_fd, 0);
-       if (options->stdout_fd >= 0 && options->stdout_fd != 1)
-               dup2(options->stdout_fd, 1);
-       if (options->stderr_fd >= 0 && options->stderr_fd != 2)
-               dup2(options->stderr_fd, 2);
+       if (options->stdin_fd >= 0 && options->stdin_fd != STDIN_FILENO)
+               dup2(options->stdin_fd, STDIN_FILENO);
+
+       if (options->stdout_fd >= 0 && options->stdout_fd != STDOUT_FILENO)
+               dup2(options->stdout_fd, STDOUT_FILENO);
+
+       if (options->stderr_fd >= 0 && options->stderr_fd != STDERR_FILENO)
+               dup2(options->stderr_fd, STDERR_FILENO);
 
        /* close the old fds */
-       if (options->stdin_fd > 2)
+       if (options->stdin_fd > STDERR_FILENO)
                close(options->stdin_fd);
-       if (options->stdout_fd > 2)
+
+       if (options->stdout_fd > STDERR_FILENO)
                close(options->stdout_fd);
-       if (options->stderr_fd > 2)
+
+       if (options->stderr_fd > STDERR_FILENO)
                close(options->stderr_fd);
 
        /* Try to remove FD_CLOEXEC flag from stdin/stdout/stderr, but also