From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753345Ab2DKGAs (ORCPT ); Wed, 11 Apr 2012 02:00:48 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:48331 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753293Ab2DKGAq (ORCPT ); Wed, 11 Apr 2012 02:00:46 -0400 From: Cong Wang To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Cong Wang , Oleg Nesterov , Alexey Dobriyan , Al Viro , Vasiliy Kulikov , David Rientjes Subject: [PATCH 2/6] proc: unify ptrace_may_access locking code Date: Wed, 11 Apr 2012 13:59:23 +0800 Message-Id: <1334123976-11681-2-git-send-email-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1334123976-11681-1-git-send-email-xiyou.wangcong@gmail.com> References: <1334123976-11681-1-git-send-email-xiyou.wangcong@gmail.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Unify mutex_lock+ptrace_may_access code and rename lock_trace() to task_access_lock(), which better describes what it does. Cc: Oleg Nesterov Cc: Alexey Dobriyan Signed-off-by: Cong Wang --- fs/proc/base.c | 36 +++++++++++++++--------------------- 1 files changed, 15 insertions(+), 21 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index f3c4887..919d14c 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; } -- 1.7.7.6