Merge to Fedora kernel-2.6.18-1.2255_FC5-vs2.0.2.2-rc9 patched with stable patch...
[linux-2.6.git] / fs / proc / base.c
index b7a5972..d491006 100644 (file)
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/ptrace.h>
-#include <linux/tracehook.h>
 #include <linux/seccomp.h>
 #include <linux/cpuset.h>
 #include <linux/audit.h>
 #include <linux/poll.h>
-#include <linux/vs_context.h>
-#include <linux/vs_network.h>
 
 #include "internal.h"
 
@@ -417,6 +414,13 @@ static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vf
        return result;
 }
 
+#define MAY_PTRACE(task) \
+       (task == current || \
+       (task->parent == current && \
+       (task->ptrace & PT_PTRACED) && \
+        (task->state == TASK_STOPPED || task->state == TASK_TRACED) && \
+        security_ptrace(current,task) == 0))
+
 struct mm_struct *mm_for_maps(struct task_struct *task)
 {
        struct mm_struct *mm = get_task_mm(task);
@@ -761,8 +765,7 @@ static ssize_t mem_read(struct file * file, char __user * buf,
        if (!task)
                goto out_no_task;
 
-       if (!tracehook_allow_access_process_vm(task)
-           || !ptrace_may_attach(task))
+       if (!MAY_PTRACE(task) || !ptrace_may_attach(task))
                goto out;
 
        ret = -ENOMEM;
@@ -788,8 +791,7 @@ static ssize_t mem_read(struct file * file, char __user * buf,
 
                this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
                retval = access_process_vm(task, src, page, this_len, 0);
-               if (!retval || !tracehook_allow_access_process_vm(task)
-                   || !ptrace_may_attach(task)) {
+               if (!retval || !MAY_PTRACE(task) || !ptrace_may_attach(task)) {
                        if (!ret)
                                ret = -EIO;
                        break;
@@ -833,8 +835,7 @@ static ssize_t mem_write(struct file * file, const char * buf,
        if (!task)
                goto out_no_task;
 
-       if (!tracehook_allow_access_process_vm(task)
-           || !ptrace_may_attach(task))
+       if (!MAY_PTRACE(task) || !ptrace_may_attach(task))
                goto out;
 
        copied = -ENOMEM;
@@ -1396,7 +1397,7 @@ static int pid_revalidate(struct dentry *dentry, struct nameidata *nd)
        if (task) {
                int pid = (inode->i_ino >> 16) & 0xFFFF;
 
-               if (!proc_pid_visible(task, pid))
+               if (!vx_proc_pid_visible(task, pid))
                        goto out_drop;
 
                ret = 1;
@@ -1694,6 +1695,9 @@ static struct inode_operations proc_tgid_attr_inode_operations;
 extern int proc_pid_vx_info(struct task_struct *, char *);
 extern int proc_pid_nx_info(struct task_struct *, char *);
 
+extern int proc_pid_vx_info(struct task_struct *, char *);
+extern int proc_pid_nx_info(struct task_struct *, char *);
+
 /* SMP-safe */
 static struct dentry *proc_pident_lookup(struct inode *dir, 
                                         struct dentry *dentry,
@@ -2123,7 +2127,7 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct
                goto out;
 
        rcu_read_lock();
-       task = find_proc_task_by_pid(tgid);
+       task = vx_find_proc_task_by_pid(tgid);
        if (task)
                get_task_struct(task);
        rcu_read_unlock();
@@ -2176,7 +2180,7 @@ static struct dentry *proc_task_lookup(struct inode *dir, struct dentry * dentry
                goto out;
 
        rcu_read_lock();
-       task = find_proc_task_by_pid(tid);
+       task = vx_find_proc_task_by_pid(tid);
        if (task)
                get_task_struct(task);
        rcu_read_unlock();
@@ -2232,7 +2236,7 @@ static struct task_struct *first_tgid(int tgid, unsigned int nr)
        struct task_struct *pos;
        rcu_read_lock();
        if (tgid && nr) {
-               pos = find_proc_task_by_pid(tgid);
+               pos = vx_find_proc_task_by_pid(tgid);
                if (pos && thread_group_leader(pos))
                        goto found;
        }
@@ -2310,7 +2314,7 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
                int len;
                ino_t ino;
                tgid = vx_map_tgid(task->pid);
-               if (!proc_pid_visible(task, tgid))
+               if (!vx_proc_pid_visible(task, tgid))
                        continue;
 
                len = snprintf(buf, sizeof(buf), "%d", tgid);
@@ -2346,7 +2350,7 @@ static struct task_struct *first_tid(struct task_struct *leader,
        rcu_read_lock();
        /* Attempt to start with the pid of a thread */
        if (tid && (nr > 0)) {
-               pos = find_proc_task_by_pid(tid);
+               pos = vx_find_proc_task_by_pid(tid);
                if (pos && (pos->group_leader == leader))
                        goto found;
        }
@@ -2437,7 +2441,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
             task = next_tid(task), pos++) {
                int len;
                tid = vx_map_pid(task->pid);
-               if (!proc_pid_visible(task, tid))
+               if (!vx_proc_pid_visible(task, tid))
                        continue;
 
                len = snprintf(buf, sizeof(buf), "%d", tid);