[lxc-devel] [lxc/master] terminal: bugfixes
brauner on Github
lxc-bot at linuxcontainers.org
Wed Nov 6 13:10:11 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191106/4fa5b115/attachment.bin>
-------------- next part --------------
From 26ed61e0815d75dd0c5469a794d8c87e27d68963 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at 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.brauner at 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.brauner at 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.brauner at 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);
}
/**
More information about the lxc-devel
mailing list