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

Reply via email to