[PATCH 2/6] proc: unify ptrace_may_access locking code

From: Cong Wang
Date: Wed Apr 11 2012 - 02:00:43 EST


Unify mutex_lock+ptrace_may_access code and rename lock_trace()
to task_access_lock(), which better describes what it does.

Cc: Oleg Nesterov <oleg@xxxxxxxxxx>
Cc: Alexey Dobriyan <adobriyan@xxxxxxxxx>
Signed-off-by: Cong Wang <xiyou.wangcong@xxxxxxxxx>
---
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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/