From: Li Zefan <lizf-BthXqXjhjHXQFUHtdCDX3A@public.gmane.org>
To: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
Cc: containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org
Subject: Re: [PATCH] Relax ns_can_attach checks to allow attaching to grandchild cgroups
Date: Tue, 13 Jan 2009 09:44:36 +0800 [thread overview]
Message-ID: <496BF204.3090206@cn.fujitsu.com> (raw)
In-Reply-To: <20090112163729.774b5b50.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
>> /**
>> - * cgroup_is_descendant - see if @cgrp is a descendant of current task's cgrp
>> + * cgroup_is_descendant - see if @cgrp is a descendant of @task's cgrp
>> * @cgrp: the cgroup in question
>> + * @task: the task in question
>> *
>> - * See if @cgrp is a descendant of the current task's cgroup in
>> - * the appropriate hierarchy.
>> + * See if @cgrp is a descendant of @task's cgroup in the appropriate
>> + * hierarchy.
>> *
>> * If we are sending in dummytop, then presumably we are creating
>> * the top cgroup in the subsystem.
>> *
>> * Called only by the ns (nsproxy) cgroup.
>> */
>> -int cgroup_is_descendant(const struct cgroup *cgrp)
>> +int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task)
>> {
>> int ret;
>> struct cgroup *target;
>> @@ -3125,7 +3126,7 @@ int cgroup_is_descendant(const struct cgroup *cgrp)
>> return 1;
>>
>> get_first_subsys(cgrp, NULL, &subsys_id);
>> - target = task_cgroup(current, subsys_id);
>> + target = task_cgroup(task, subsys_id);
>
> What locking prevents *task from vanishing here?
>
As *task is passed to this function, I think it's the caller's responsibility to
insure this ?
>> while (cgrp != target && cgrp!= cgrp->top_cgroup)
>> cgrp = cgrp->parent;
>> ret = (cgrp == target);
>> diff --git a/kernel/ns_cgroup.c b/kernel/ns_cgroup.c
>> index 43c2111..890691a 100644
>> --- a/kernel/ns_cgroup.c
>> +++ b/kernel/ns_cgroup.c
>> @@ -35,7 +35,7 @@ int ns_cgroup_clone(struct task_struct *task, struct pid *pid)
>>
>> /*
>> * Rules:
>> - * 1. you can only enter a cgroup which is a child of your current
>> + * 1. you can only enter a cgroup which is a descendant of your current
>> * cgroup
>> * 2. you can only place another process into a cgroup if
>> * a. you have CAP_SYS_ADMIN
>> @@ -46,21 +46,15 @@ int ns_cgroup_clone(struct task_struct *task, struct pid *pid)
>> static int ns_can_attach(struct cgroup_subsys *ss,
>> struct cgroup *new_cgroup, struct task_struct *task)
>> {
>> - struct cgroup *orig;
>> -
>> if (current != task) {
>> if (!capable(CAP_SYS_ADMIN))
>> return -EPERM;
>>
>> - if (!cgroup_is_descendant(new_cgroup))
>> + if (!cgroup_is_descendant(new_cgroup, current))
>> return -EPERM;
>> }
>>
>> - if (atomic_read(&new_cgroup->count) != 0)
>> - return -EPERM;
>> -
>> - orig = task_cgroup(task, ns_subsys_id);
>
> Same question applied to the previous code.
>
It's called by cgroup core, and cgroup guarantees the task won't vanish. (by get_task_struct)
>> - if (orig && orig != new_cgroup->parent)
>> + if (!cgroup_is_descendant(new_cgroup, task))
>> return -EPERM;
>>
>> return 0;
>> @@ -78,7 +72,7 @@ static struct cgroup_subsys_state *ns_create(struct cgroup_subsys *ss,
>>
>> if (!capable(CAP_SYS_ADMIN))
>> return ERR_PTR(-EPERM);
>> - if (!cgroup_is_descendant(cgroup))
>> + if (!cgroup_is_descendant(cgroup, current))
>> return ERR_PTR(-EPERM);
>>
>> ns_cgroup = kzalloc(sizeof(*ns_cgroup), GFP_KERNEL);
next prev parent reply other threads:[~2009-01-13 1:44 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-06 22:25 [PATCH] Relax ns_can_attach checks to allow attaching to grandchild cgroups Grzegorz Nosek
[not found] ` <20090106222536.GA25228-IaEwMO9oKu/77SC2UrCW1JJg/dWx8T/9@public.gmane.org>
2009-01-07 0:18 ` Serge E. Hallyn
2009-01-07 1:58 ` Li Zefan
2009-01-13 0:37 ` Andrew Morton
[not found] ` <20090112163729.774b5b50.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
2009-01-13 1:44 ` Li Zefan [this message]
[not found] <20081219120954.GB27472@megiteam.pl>
[not found] ` <20081219120954.GB27472-yp6mvK3Bdd2rDJvtcaxF/A@public.gmane.org>
2008-12-19 21:16 ` Andrew Morton
[not found] ` <20081219131641.cafc65ac.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
2008-12-19 22:23 ` Serge E. Hallyn
[not found] ` <20081219222304.GA25828-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2008-12-19 23:03 ` Grzegorz Nosek
[not found] ` <20081219230330.GA30623-IaEwMO9oKu/77SC2UrCW1JJg/dWx8T/9@public.gmane.org>
2008-12-19 23:34 ` Serge E. Hallyn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=496BF204.3090206@cn.fujitsu.com \
--to=lizf-bthxqxjhjhxqfuhtdcdx3a@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox