From: Serge Hallyn Date: Thu, 13 Jun 2013 15:06:15 +0000 (-0500) Subject: don't set up console for lxc-execute X-Git-Tag: lxc-1.0.0.alpha1~1^2~153 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=37903589a2de0cbd62f94c5fd06d0aa8d57ca140;p=thirdparty%2Flxc.git don't set up console for lxc-execute 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 Acked-by: Stéphane Graber Acked-by: Dwight Engen --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 90aea609c..6a43aee73 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 2fd3ab1ca..9b1677e5d 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 3720c5b06..f7a59d8b3 100644 --- a/src/lxc/console.c +++ b/src/lxc/console.c @@ -272,6 +272,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; @@ -559,6 +564,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 ec5cd29d9..5f416793b 100644 --- a/src/lxc/execute.c +++ b/src/lxc/execute.c @@ -165,5 +165,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); }