[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