[lxc-devel] [PATCH] don't set up console for lxc-execute

Serge Hallyn serge.hallyn at ubuntu.com
Thu Jun 13 15:09:59 UTC 2013


Currently due to some safety checks for !rootfs.path, lxc-execute works
ok if you do not set lxc.rootfs at all in your lxc.conf. But if you
set lxc.rootfs = '/', then it sets up console, and when you do an
lxc-execute, the console appears hung.

However the lxc.rootfs NULL check was just incidental to not dereference
a NULL pointer.  In fact we should not be setting up a console if the
container isn't running a full-fledged distro with a getty/login
running on the container's /dev/console.

Have lxc_execute() mark in lxc_conf that this is a lxc-execute and not
an lxc-start, and don't set up the console.

The issue is documented at https://sourceforge.net/p/lxc/bugs/67/ .

Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/conf.c    |  4 ++--
 src/lxc/conf.h    |  1 +
 src/lxc/console.c | 10 ++++++++++
 src/lxc/execute.c |  1 +
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index a4ed218..d3dc9a5 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -2836,7 +2836,7 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
 		}
 	}
 
-	if (setup_console(&lxc_conf->rootfs, &lxc_conf->console, lxc_conf->ttydir)) {
+	if (!lxc_conf->is_execute && setup_console(&lxc_conf->rootfs, &lxc_conf->console, lxc_conf->ttydir)) {
 		ERROR("failed to setup the console for '%s'", name);
 		return -1;
 	}
@@ -2846,7 +2846,7 @@ int lxc_setup(const char *name, struct lxc_conf *lxc_conf)
 			ERROR("failed to setup kmsg for '%s'", name);
 	}
 
-	if (setup_tty(&lxc_conf->rootfs, &lxc_conf->tty_info, lxc_conf->ttydir)) {
+	if (!lxc_conf->is_execute && setup_tty(&lxc_conf->rootfs, &lxc_conf->tty_info, lxc_conf->ttydir)) {
 		ERROR("failed to setup the ttys for '%s'", name);
 		return -1;
 	}
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 2fd3ab1..9b1677e 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -251,6 +251,7 @@ struct saved_nic {
 };
 
 struct lxc_conf {
+	int is_execute;
 	char *fstab;
 	int tty;
 	int pts;
diff --git a/src/lxc/console.c b/src/lxc/console.c
index f801e0b..125890f 100644
--- a/src/lxc/console.c
+++ b/src/lxc/console.c
@@ -276,6 +276,11 @@ int lxc_console_mainloop_add(struct lxc_epoll_descr *descr,
 	struct lxc_conf *conf = handler->conf;
 	struct lxc_console *console = &conf->console;
 
+	if (conf->is_execute) {
+		INFO("no console for lxc-execute.");
+		return 0;
+	}
+
 	if (!conf->rootfs.path) {
 		INFO("no rootfs, no console.");
 		return 0;
@@ -564,6 +569,11 @@ int lxc_console_create(struct lxc_conf *conf)
 {
 	struct lxc_console *console = &conf->console;
 
+	if (conf->is_execute) {
+		INFO("no console for lxc-execute.");
+		return 0;
+	}
+
 	if (!conf->rootfs.path)
 		return 0;
 
diff --git a/src/lxc/execute.c b/src/lxc/execute.c
index 9bf33ca..3cf3540 100644
--- a/src/lxc/execute.c
+++ b/src/lxc/execute.c
@@ -158,5 +158,6 @@ int lxc_execute(const char *name, char *const argv[], int quiet,
 	if (lxc_check_inherited(conf, -1))
 		return -1;
 
+	conf->is_execute = 1;
 	return __lxc_start(name, conf, &execute_start_ops, &args, lxcpath);
 }
-- 
1.8.1.2





More information about the lxc-devel mailing list