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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.