Unverified Commit a218be90 by Stéphane Graber Committed by GitHub

Merge pull request #3676 from brauner/2021-02-16/fixes

cgroups: fixes
parents 858f6225 701be30e
...@@ -501,7 +501,7 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint, ...@@ -501,7 +501,7 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint,
__do_close int dfd_base = -EBADF, dfd_mnt = -EBADF; __do_close int dfd_base = -EBADF, dfd_mnt = -EBADF;
__do_free struct hierarchy *new = NULL; __do_free struct hierarchy *new = NULL;
__do_free_string_list char **controllers = clist; __do_free_string_list char **controllers = clist;
int newentry; int idx;
if (abspath(container_base_path)) if (abspath(container_base_path))
return syserrno(-errno, "Container base path must be relative to controller mount"); return syserrno(-errno, "Container base path must be relative to controller mount");
...@@ -514,14 +514,13 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint, ...@@ -514,14 +514,13 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint,
if (dfd_mnt < 0) if (dfd_mnt < 0)
return syserrno(-errno, "Failed to open %s", mountpoint); return syserrno(-errno, "Failed to open %s", mountpoint);
if (is_empty_string(container_base_path)) if (!is_empty_string(container_base_path)) {
dfd_base = dfd_mnt;
else
dfd_base = open_at(dfd_mnt, container_base_path, dfd_base = open_at(dfd_mnt, container_base_path,
PROTECT_OPATH_DIRECTORY, PROTECT_OPATH_DIRECTORY,
PROTECT_LOOKUP_BENEATH_XDEV, 0); PROTECT_LOOKUP_BENEATH_XDEV, 0);
if (dfd_base < 0) if (dfd_base < 0)
return syserrno(-errno, "Failed to open %d(%s)", dfd_base, container_base_path); return syserrno(-errno, "Failed to open %d(%s)", dfd_base, container_base_path);
}
if (!controllers) { if (!controllers) {
/* /*
...@@ -529,7 +528,10 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint, ...@@ -529,7 +528,10 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint,
* us and we are free to further delege all of the controllers listed * us and we are free to further delege all of the controllers listed
* in cgroup.controllers further down the hierarchy. * in cgroup.controllers further down the hierarchy.
*/ */
controllers = cg_unified_get_controllers(dfd_base, "cgroup.controllers"); if (dfd_base < 0)
controllers = cg_unified_get_controllers(dfd_mnt, "cgroup.controllers");
else
controllers = cg_unified_get_controllers(dfd_base, "cgroup.controllers");
if (!controllers) if (!controllers)
controllers = cg_unified_make_empty_controller(); controllers = cg_unified_make_empty_controller();
if (!controllers[0]) if (!controllers[0])
...@@ -557,12 +559,15 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint, ...@@ -557,12 +559,15 @@ static int add_hierarchy(struct cgroup_ops *ops, char **clist, char *mountpoint,
for (char *const *it = new->controllers; it && *it; it++) for (char *const *it = new->controllers; it && *it; it++)
TRACE("The detected hierarchy contains the %s controller", *it); TRACE("The detected hierarchy contains the %s controller", *it);
newentry = append_null_to_list((void ***)&ops->hierarchies); idx = append_null_to_list((void ***)&ops->hierarchies);
if (dfd_base < 0)
new->dfd_base = dfd_mnt;
else
new->dfd_base = move_fd(dfd_base);
new->dfd_mnt = move_fd(dfd_mnt); new->dfd_mnt = move_fd(dfd_mnt);
new->dfd_base = move_fd(dfd_base);
if (type == CGROUP2_SUPER_MAGIC) if (type == CGROUP2_SUPER_MAGIC)
ops->unified = new; ops->unified = new;
(ops->hierarchies)[newentry] = move_ptr(new); (ops->hierarchies)[idx] = move_ptr(new);
return 0; return 0;
} }
......
...@@ -23,7 +23,7 @@ typedef enum lxc_namespace_t { ...@@ -23,7 +23,7 @@ typedef enum lxc_namespace_t {
__hidden extern const struct ns_info { __hidden extern const struct ns_info {
#define MAX_NS_PROC_NAME 6 #define MAX_NS_PROC_NAME 6
const char proc_name[MAX_NS_PROC_NAME]; const char proc_name[MAX_NS_PROC_NAME + 1];
const char *proc_path; const char *proc_path;
int clone_flag; int clone_flag;
const char *flag_name; const char *flag_name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment