]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
proc: unify ptrace_may_access() locking code
authorCong Wang <xiyou.wangcong@gmail.com>
Wed, 25 Apr 2012 01:04:43 +0000 (11:04 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Mon, 30 Apr 2012 05:17:39 +0000 (15:17 +1000)
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 <xiyou.wangcong@gmail.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/base.c

index a5e480670046f88798fa07c6b6c44848d53ba28b..6c3d4c6164400b8c16d5729d0f2adc0d11ff81af 100644 (file)
@@ -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;
 }