lkml.org 
[lkml]   [2012]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 0/4] Was: deferring __fput()
    On Thu, Jun 28, 2012 at 06:45:39PM +0200, Oleg Nesterov wrote:
    > Forgot to mention...
    >
    > And I still think that task_work_add() should not succeed unconditionally,
    > it synchronize with exit_task_work(). Otherwise keyctl_session_to_parent()
    > is broken.

    Hmm... Look: if nothing else, we have
    /* the parent mustn't be init and mustn't be a kernel thread */
    if (parent->pid <= 1 || !parent->mm)
    goto unlock;
    in the caller. OTOH, on the exit side we have exit_mm() done first. And
    that will have ->mm set to NULL. So we are closing a very narrow race to start
    with. So why not do the following and be done with that?

    diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
    index 0291b3f..f1b59ae 100644
    --- a/security/keys/keyctl.c
    +++ b/security/keys/keyctl.c
    @@ -1486,6 +1486,7 @@ long keyctl_session_to_parent(void)
    oldwork = NULL;
    parent = me->real_parent;

    + task_lock(parent);
    /* the parent mustn't be init and mustn't be a kernel thread */
    if (parent->pid <= 1 || !parent->mm)
    goto unlock;
    @@ -1529,6 +1530,7 @@ long keyctl_session_to_parent(void)
    if (!ret)
    newwork = NULL;
    unlock:
    + task_unlock(parent);
    write_unlock_irq(&tasklist_lock);
    rcu_read_unlock();
    if (oldwork)

    \
     
     \ /
      Last update: 2012-06-30 09:01    [W:3.883 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site