From: Serge Hallyn Date: Fri, 8 Nov 2013 04:20:33 +0000 (-0600) Subject: api_start: refuse to run undaemonized if multithreaded X-Git-Tag: lxc-1.0.0.alpha3~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d834aa8074b3e8f7341ad9feff7a7c5b695a3b3;p=thirdparty%2Flxc.git api_start: refuse to run undaemonized if multithreaded lxc-start is not safe (and doesn't actually make sense) if the task is nto single-threaded. Signed-off-by: Serge Hallyn Acked-by: Stéphane Graber --- diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c index 05e540587..827cae0a6 100644 --- a/src/lxc/lxccontainer.c +++ b/src/lxc/lxccontainer.c @@ -506,6 +506,38 @@ static bool wait_on_daemonized_start(struct lxc_container *c) return lxcapi_wait(c, "RUNNING", timeout); } +static bool am_single_threaded(void) +{ + struct dirent dirent, *direntp; + DIR *dir; + int count=0; + + process_lock(); + dir = opendir("/proc/self/task"); + process_unlock(); + if (!dir) { + INFO("failed to open /proc/self/task"); + return false; + } + + while (!readdir_r(dir, &dirent, &direntp)) { + if (!direntp) + break; + + if (!strcmp(direntp->d_name, ".")) + continue; + + if (!strcmp(direntp->d_name, "..")) + continue; + if (++count > 1) + break; + } + process_lock(); + closedir(dir); + process_unlock(); + return count == 1; +} + /* * I can't decide if it'd be more convenient for callers if we accept '...', * or a null-terminated array (i.e. execl vs execv) @@ -598,6 +630,11 @@ static bool lxcapi_start(struct lxc_container *c, int useinit, char * const argv open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); setsid(); + } else { + if (!am_single_threaded()) { + ERROR("Cannot start non-daemonized container when threaded"); + return false; + } } reboot: