[lxc-devel] [PATCH 1/1] cgmanager: have root escape to root cgroup before starting

Serge Hallyn serge.hallyn at ubuntu.com
Mon Feb 3 21:11:16 UTC 2014


If a user in cgroup /a/b/c does 'lxc-start -n u1', then u1
should be started under /a/b/c/u1.  However if he does
'sudo lxc-start -n u1', then that cgroup shoudl start under
/lxc/u1.

Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
---
 src/lxc/cgmanager.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
index 60f9cbe..29a0b58 100644
--- a/src/lxc/cgmanager.c
+++ b/src/lxc/cgmanager.c
@@ -171,6 +171,25 @@ static bool lxc_cgmanager_create(const char *controller, const char *cgroup_path
 	return true;
 }
 
+static bool lxc_cgmanager_escape(void)
+{
+	pid_t me = getpid();
+	int i;
+	for (i = 0; i < nr_subsystems; i++) {
+		if (cgmanager_move_pid_abs_sync(NULL, cgroup_manager,
+					subsystems[i], "/", me) != 0) {
+			NihError *nerr;
+			nerr = nih_error_get();
+			ERROR("call to cgmanager_move_pid_abs_sync(%s) failed: %s",
+					subsystems[i], nerr->message);
+			nih_free(nerr);
+			return false;
+		}
+	}
+
+	return true;
+}
+
 struct chown_data {
 	const char *controller;
 	const char *cgroup_path;
@@ -589,7 +608,12 @@ out_free:
 
 static inline bool cgm_init(struct lxc_handler *handler)
 {
-	return collect_subsytems();
+	if (!collect_subsytems())
+		return false;
+	if (geteuid())
+		return true;
+	// root;  try to escape to root cgroup
+	return lxc_cgmanager_escape();
 }
 
 static bool cgm_unfreeze_fromhandler(struct lxc_handler *handler)
-- 
1.9.rc1



More information about the lxc-devel mailing list