The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3180
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 26ed61e0815d75dd0c5469a794d8c87e27d68963 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Wed, 6 Nov 2019 14:03:43 +0100 Subject: [PATCH 1/2] terminal: make lxc_terminal_signal_fini() static Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/terminal.c | 10 +++++++++- src/lxc/terminal.h | 14 -------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 126eea475e..31186972a0 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -177,7 +177,15 @@ struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) return NULL; } -void lxc_terminal_signal_fini(struct lxc_terminal *terminal) +/** + * lxc_terminal_signal_fini: uninstall signal handler + * + * @terminal: terminal instance + * + * Restore the saved signal handler that was in effect at the time + * lxc_terminal_signal_init() was called. + */ +static void lxc_terminal_signal_fini(struct lxc_terminal *terminal) { struct lxc_terminal_state *state = terminal->tty_state; diff --git a/src/lxc/terminal.h b/src/lxc/terminal.h index 170c9d95c0..03be3af891 100644 --- a/src/lxc/terminal.h +++ b/src/lxc/terminal.h @@ -262,20 +262,6 @@ extern struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) extern int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, struct lxc_epoll_descr *descr); -/** - * lxc_terminal_signal_fini: uninstall signal handler - * - * @terminal - * - the lxc_terminal - * - * Restore the saved signal handler that was in effect at the time - * lxc_terminal_signal_init() was called. - * - * Must be called with process_lock held to protect the lxc_ttys list, or - * from a non-threaded context. - */ -extern void lxc_terminal_signal_fini(struct lxc_terminal *terminal); - extern int lxc_terminal_write_ringbuffer(struct lxc_terminal *terminal); extern int lxc_terminal_create_log_file(struct lxc_terminal *terminal); extern int lxc_terminal_io_cb(int fd, uint32_t events, void *data, From 1ba4ae8979cbee086caf6576358b7f3de771f106 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Wed, 6 Nov 2019 14:08:55 +0100 Subject: [PATCH 2/2] terminal: prevent returning invalid pointer Closes: https://github.com/lxc/lxd/issues/6408 Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- src/lxc/terminal.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 31186972a0..18769b794b 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -115,8 +115,8 @@ int lxc_terminal_signalfd_cb(int fd, uint32_t events, void *cbdata, struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) { + __do_close_prot_errno int signal_fd = -EBADF; __do_free struct lxc_terminal_state *ts = NULL; - bool istty = false; int ret; sigset_t mask; @@ -132,49 +132,40 @@ struct lxc_terminal_state *lxc_terminal_signal_init(int srcfd, int dstfd) ret = sigemptyset(&mask); if (ret < 0) { SYSERROR("Failed to initialize an empty signal set"); - goto on_error; + return NULL; } - istty = (isatty(srcfd) == 1); - if (!istty) { - INFO("fd %d does not refer to a tty device", srcfd); - } else { + if (isatty(srcfd)) { ret = sigaddset(&mask, SIGWINCH); if (ret < 0) SYSNOTICE("Failed to add SIGWINCH to signal set"); + } else { + INFO("fd %d does not refer to a tty device", srcfd); } /* Exit the mainloop cleanly on SIGTERM. */ ret = sigaddset(&mask, SIGTERM); if (ret < 0) { SYSERROR("Failed to add SIGWINCH to signal set"); - goto on_error; + return NULL; } ret = pthread_sigmask(SIG_BLOCK, &mask, &ts->oldmask); if (ret < 0) { WARN("Failed to block signals"); - goto on_error; + return NULL; } - ts->sigfd = signalfd(-1, &mask, SFD_CLOEXEC); - if (ts->sigfd < 0) { + signal_fd = signalfd(-1, &mask, SFD_CLOEXEC); + if (signal_fd < 0) { WARN("Failed to create signal fd"); (void)pthread_sigmask(SIG_SETMASK, &ts->oldmask, NULL); - goto on_error; - } - - DEBUG("Created signal fd %d", ts->sigfd); - return ts; - -on_error: - ERROR("Failed to create signal fd"); - if (ts->sigfd >= 0) { - close(ts->sigfd); - ts->sigfd = -1; + return NULL; } + ts->sigfd = move_fd(signal_fd); + TRACE("Created signal fd %d", ts->sigfd); - return NULL; + return move_ptr(ts); } /**
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel