]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
cgroups/cgfsng: keep mountpoint intact
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 31 Oct 2017 10:15:07 +0000 (11:15 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 6 Nov 2017 23:54:27 +0000 (00:54 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c

index ec6440c13b7c55bfc19a81c72882903ef96eb55d..561e873faed94ce0357e28f8c289e9edac94c6c2 100644 (file)
@@ -760,9 +760,10 @@ static char **get_controllers(char **klist, char **nlist, char *line)
 {
        /* the fourth field is /sys/fs/cgroup/comma-delimited-controller-list */
        int i;
-       char *p = line, *p2, *tok, *saveptr = NULL;
-       char **aret = NULL;
+       char *dup, *p2, *tok;
        bool is_cgroup_v2;
+       char *p = line, *saveptr = NULL;
+       char **aret = NULL;
 
        /* handle cgroup v2 */
        is_cgroup_v2 = is_cgroupfs_v2(line);
@@ -792,14 +793,24 @@ static char **get_controllers(char **klist, char **nlist, char *line)
        /* cgroup v2 does not have separate mountpoints for controllers */
        if (is_cgroup_v2) {
                must_append_controller(klist, nlist, &aret, "cgroup2");
-               return aret;
+               return NULL;
+       }
+
+       /* strdup() here for v1 hierarchies. Otherwise strtok_r() will destroy
+        * mountpoints such as "/sys/fs/cgroup/cpu,cpuacct".
+        */
+       dup = strdup(p);
+       if (!dup) {
+               SYSERROR("Failed to duplicate string");
+               return NULL;
        }
 
-       for (tok = strtok_r(p, ",", &saveptr); tok;
+       for (tok = strtok_r(dup, ",", &saveptr); tok;
                        tok = strtok_r(NULL, ",", &saveptr)) {
                must_append_controller(klist, nlist, &aret, tok);
        }
 
+       free(dup);
        return aret;
 }