Skip to content

Commit

Permalink
proc: hold cred_guard_mutex in check_mem_permission()
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Stephen Wilson authored and Al Viro committed Mar 23, 2011
1 parent 26947f8 commit 18f661b
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions fs/proc/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 18f661b

Please sign in to comment.