lkml.org 
[lkml]   [2011]   [Mar]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 resend 10/12] proc: hold cred_guard_mutex in check_mem_permission()
    Date
    Avoid a potential race when task exec's and we get a new ->mm but check against
    the old credentials in ptrace_may_access().

    Holding of the mutex is implemented by factoring out the body of the code into a
    helper function __check_mem_permission(). Performing this factorization now
    simplifies upcoming changes and minimizes churn in the diff's.

    Signed-off-by: Stephen Wilson <wilsons@start.ca>
    ---
    fs/proc/base.c | 26 ++++++++++++++++++++++----
    1 files changed, 22 insertions(+), 4 deletions(-)

    diff --git a/fs/proc/base.c b/fs/proc/base.c
    index 13c5e8c..084d046 100644
    --- a/fs/proc/base.c
    +++ b/fs/proc/base.c
    @@ -191,10 +191,7 @@ static int proc_root_link(struct inode *inode, struct path *path)
    return result;
    }

    -/*
    - * Return zero if current may access user memory in @task, -error if not.
    - */
    -static int check_mem_permission(struct task_struct *task)
    +static int __check_mem_permission(struct task_struct *task)
    {
    /*
    * A task can always look at itself, in case it chooses
    @@ -222,6 +219,27 @@ static int check_mem_permission(struct task_struct *task)
    return -EPERM;
    }

    +/*
    + * Return zero if current may access user memory in @task, -error if not.
    + */
    +static int check_mem_permission(struct task_struct *task)
    +{
    + int err;
    +
    + /*
    + * Avoid racing if task exec's as we might get a new mm but validate
    + * against old credentials.
    + */
    + err = mutex_lock_killable(&task->signal->cred_guard_mutex);
    + if (err)
    + return err;
    +
    + err = __check_mem_permission(task);
    + mutex_unlock(&task->signal->cred_guard_mutex);
    +
    + return err;
    +}
    +
    struct mm_struct *mm_for_maps(struct task_struct *task)
    {
    struct mm_struct *mm;
    --
    1.7.3.5


    \
     
     \ /
      Last update: 2011-03-23 15:53    [W:0.023 / U:30.636 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site