From: Christian Brauner Date: Sun, 24 Dec 2017 18:24:35 +0000 (+0100) Subject: attach: minor tweaks X-Git-Tag: lxc-2.0.10~415 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e534be6ab3bed7e02f176a176a24548166044d6;p=thirdparty%2Flxc.git attach: minor tweaks Signed-off-by: Christian Brauner --- diff --git a/src/lxc/attach.c b/src/lxc/attach.c index 8d9555a15..f793059eb 100644 --- a/src/lxc/attach.c +++ b/src/lxc/attach.c @@ -252,10 +252,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; } /** @@ -855,6 +861,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; @@ -869,18 +881,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); @@ -924,19 +924,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