|
@@ -2346,11 +2346,26 @@ static int cgroup_rename(struct kernfs_node *kn, struct kernfs_node *new_parent,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* set uid and gid of cgroup dirs and files to that of the creator */
|
|
|
|
+static int cgroup_kn_set_ugid(struct kernfs_node *kn)
|
|
|
|
+{
|
|
|
|
+ struct iattr iattr = { .ia_valid = ATTR_UID | ATTR_GID,
|
|
|
|
+ .ia_uid = current_fsuid(),
|
|
|
|
+ .ia_gid = current_fsgid(), };
|
|
|
|
+
|
|
|
|
+ if (uid_eq(iattr.ia_uid, GLOBAL_ROOT_UID) &&
|
|
|
|
+ gid_eq(iattr.ia_gid, GLOBAL_ROOT_GID))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return kernfs_setattr(kn, &iattr);
|
|
|
|
+}
|
|
|
|
+
|
|
static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
|
|
static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
|
|
{
|
|
{
|
|
char name[CGROUP_FILE_NAME_MAX];
|
|
char name[CGROUP_FILE_NAME_MAX];
|
|
struct kernfs_node *kn;
|
|
struct kernfs_node *kn;
|
|
struct lock_class_key *key = NULL;
|
|
struct lock_class_key *key = NULL;
|
|
|
|
+ int ret;
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
key = &cft->lockdep_key;
|
|
key = &cft->lockdep_key;
|
|
@@ -2358,7 +2373,13 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cftype *cft)
|
|
kn = __kernfs_create_file(cgrp->kn, cgroup_file_name(cgrp, cft, name),
|
|
kn = __kernfs_create_file(cgrp->kn, cgroup_file_name(cgrp, cft, name),
|
|
cgroup_file_mode(cft), 0, cft->kf_ops, cft,
|
|
cgroup_file_mode(cft), 0, cft->kf_ops, cft,
|
|
NULL, false, key);
|
|
NULL, false, key);
|
|
- return PTR_ERR_OR_ZERO(kn);
|
|
|
|
|
|
+ if (IS_ERR(kn))
|
|
|
|
+ return PTR_ERR(kn);
|
|
|
|
+
|
|
|
|
+ ret = cgroup_kn_set_ugid(kn);
|
|
|
|
+ if (ret)
|
|
|
|
+ kernfs_remove(kn);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -3753,6 +3774,10 @@ static long cgroup_create(struct cgroup *parent, const char *name,
|
|
*/
|
|
*/
|
|
idr_replace(&root->cgroup_idr, cgrp, cgrp->id);
|
|
idr_replace(&root->cgroup_idr, cgrp, cgrp->id);
|
|
|
|
|
|
|
|
+ err = cgroup_kn_set_ugid(kn);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_destroy;
|
|
|
|
+
|
|
err = cgroup_addrm_files(cgrp, cgroup_base_files, true);
|
|
err = cgroup_addrm_files(cgrp, cgroup_base_files, true);
|
|
if (err)
|
|
if (err)
|
|
goto err_destroy;
|
|
goto err_destroy;
|