]> 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>
Thu, 9 Nov 2017 00:22:04 +0000 (01:22 +0100)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/cgroups/cgfsng.c

index f422f530374d421e64fe0d1be9a8a7929e222d60..125ecd3957405642a78d98db33ee495c036cfd17 100644 (file)
@@ -751,9 +751,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);
@@ -783,14 +784,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;
 }