From b7169a1fb684a6b157e336d5ae4caa962d2d985b Mon Sep 17 00:00:00 2001 From: Cong Wang Date: Wed, 25 Apr 2012 11:04:43 +1000 Subject: [PATCH] proc: unify ptrace_may_access() locking code Unify mutex_lock+ptrace_may_access code and rename lock_trace() to task_access_lock(), which better describes what it does. Signed-off-by: Cong Wang Cc: Oleg Nesterov Cc: Alexey Dobriyan Cc: Hugh Dickins Signed-off-by: Andrew Morton --- fs/proc/base.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index a5e480670046..6c3d4c616440 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -281,19 +281,19 @@ static int proc_pid_wchan(struct task_struct *task, char *buffer) } #endif /* CONFIG_KALLSYMS */ -static int lock_trace(struct task_struct *task) +static int task_access_lock(struct task_struct *task, unsigned int mode) { int err = mutex_lock_killable(&task->signal->cred_guard_mutex); if (err) return err; - if (!ptrace_may_access(task, PTRACE_MODE_ATTACH)) { + if (!ptrace_may_access(task, mode)) { mutex_unlock(&task->signal->cred_guard_mutex); return -EPERM; } return 0; } -static void unlock_trace(struct task_struct *task) +static void task_access_unlock(struct task_struct *task) { mutex_unlock(&task->signal->cred_guard_mutex); } @@ -319,7 +319,7 @@ static int proc_pid_stack(struct seq_file *m, struct pid_namespace *ns, trace.entries = entries; trace.skip = 0; - err = lock_trace(task); + err = task_access_lock(task, PTRACE_MODE_ATTACH); if (!err) { save_stack_trace_tsk(task, &trace); @@ -327,7 +327,7 @@ static int proc_pid_stack(struct seq_file *m, struct pid_namespace *ns, seq_printf(m, "[<%pK>] %pS\n", (void *)entries[i], (void *)entries[i]); } - unlock_trace(task); + task_access_unlock(task); } kfree(entries); @@ -494,7 +494,7 @@ static int proc_pid_syscall(struct task_struct *task, char *buffer) { long nr; unsigned long args[6], sp, pc; - int res = lock_trace(task); + int res = task_access_lock(task, PTRACE_MODE_ATTACH); if (res) return res; @@ -508,7 +508,7 @@ static int proc_pid_syscall(struct task_struct *task, char *buffer) nr, args[0], args[1], args[2], args[3], args[4], args[5], sp, pc); - unlock_trace(task); + task_access_unlock(task); return res; } #endif /* CONFIG_HAVE_ARCH_TRACEHOOK */ @@ -2180,7 +2180,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, goto out; result = ERR_PTR(-EACCES); - if (lock_trace(task)) + if (task_access_lock(task, PTRACE_MODE_ATTACH)) goto out_put_task; result = ERR_PTR(-ENOENT); @@ -2202,7 +2202,7 @@ out_no_vma: up_read(&mm->mmap_sem); mmput(mm); out_unlock: - unlock_trace(task); + task_access_unlock(task); out_put_task: put_task_struct(task); out: @@ -2236,7 +2236,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) goto out; ret = -EACCES; - if (lock_trace(task)) + if (task_access_lock(task, PTRACE_MODE_ATTACH)) goto out_put_task; ret = 0; @@ -2336,7 +2336,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir) } out_unlock: - unlock_trace(task); + task_access_unlock(task); out_put_task: put_task_struct(task); out: @@ -2897,15 +2897,10 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) unsigned long flags; int result; - result = mutex_lock_killable(&task->signal->cred_guard_mutex); + result = task_access_lock(task, PTRACE_MODE_READ); if (result) return result; - if (!ptrace_may_access(task, PTRACE_MODE_READ)) { - result = -EACCES; - goto out_unlock; - } - if (whole && lock_task_sighand(task, &flags)) { struct task_struct *t = task; @@ -2930,8 +2925,7 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) (unsigned long long)acct.read_bytes, (unsigned long long)acct.write_bytes, (unsigned long long)acct.cancelled_write_bytes); -out_unlock: - mutex_unlock(&task->signal->cred_guard_mutex); + task_access_unlock(task); return result; } @@ -2949,10 +2943,10 @@ static int proc_tgid_io_accounting(struct task_struct *task, char *buffer) static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task) { - int err = lock_trace(task); + int err = task_access_lock(task, PTRACE_MODE_ATTACH); if (!err) { seq_printf(m, "%08x\n", task->personality); - unlock_trace(task); + task_access_unlock(task); } return err; } -- 2.39.5