lkml.org 
[lkml]   [2012]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/6] proc: unify ptrace_may_access locking code
    Date
    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@redhat.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
    ---
    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


    \
     
     \ /
      Last update: 2012-04-11 08:03    [W:0.027 / U:2.628 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site