diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-09-08 05:37:58 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-08 05:37:58 -0400 |
| commit | 5a2cec83a9bb1b4295aa8ab728fcb8ca1811a33c (patch) | |
| tree | 2f83dc6949763e77cf6422e696dc6146684dcf4e /kernel/ptrace.c | |
| parent | f2c853bca542f5ac0b036377637192a74f2091c2 (diff) | |
| parent | caf39e87cc1182f7dae84eefc43ca14d54c78ef9 (diff) | |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'kernel/ptrace.c')
| -rw-r--r-- | kernel/ptrace.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 8dcb8f6288bc..019e04ec065a 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
| @@ -118,6 +118,33 @@ int ptrace_check_attach(struct task_struct *child, int kill) | |||
| 118 | return ret; | 118 | return ret; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | static int may_attach(struct task_struct *task) | ||
| 122 | { | ||
| 123 | if (!task->mm) | ||
| 124 | return -EPERM; | ||
| 125 | if (((current->uid != task->euid) || | ||
| 126 | (current->uid != task->suid) || | ||
| 127 | (current->uid != task->uid) || | ||
| 128 | (current->gid != task->egid) || | ||
| 129 | (current->gid != task->sgid) || | ||
| 130 | (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) | ||
| 131 | return -EPERM; | ||
| 132 | smp_rmb(); | ||
| 133 | if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) | ||
| 134 | return -EPERM; | ||
| 135 | |||
| 136 | return security_ptrace(current, task); | ||
| 137 | } | ||
| 138 | |||
| 139 | int ptrace_may_attach(struct task_struct *task) | ||
| 140 | { | ||
| 141 | int err; | ||
| 142 | task_lock(task); | ||
| 143 | err = may_attach(task); | ||
| 144 | task_unlock(task); | ||
| 145 | return !err; | ||
| 146 | } | ||
| 147 | |||
| 121 | int ptrace_attach(struct task_struct *task) | 148 | int ptrace_attach(struct task_struct *task) |
| 122 | { | 149 | { |
| 123 | int retval; | 150 | int retval; |
| @@ -127,22 +154,10 @@ int ptrace_attach(struct task_struct *task) | |||
| 127 | goto bad; | 154 | goto bad; |
| 128 | if (task == current) | 155 | if (task == current) |
| 129 | goto bad; | 156 | goto bad; |
| 130 | if (!task->mm) | ||
| 131 | goto bad; | ||
| 132 | if(((current->uid != task->euid) || | ||
| 133 | (current->uid != task->suid) || | ||
| 134 | (current->uid != task->uid) || | ||
| 135 | (current->gid != task->egid) || | ||
| 136 | (current->gid != task->sgid) || | ||
| 137 | (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE)) | ||
| 138 | goto bad; | ||
| 139 | smp_rmb(); | ||
| 140 | if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE)) | ||
| 141 | goto bad; | ||
| 142 | /* the same process cannot be attached many times */ | 157 | /* the same process cannot be attached many times */ |
| 143 | if (task->ptrace & PT_PTRACED) | 158 | if (task->ptrace & PT_PTRACED) |
| 144 | goto bad; | 159 | goto bad; |
| 145 | retval = security_ptrace(current, task); | 160 | retval = may_attach(task); |
| 146 | if (retval) | 161 | if (retval) |
| 147 | goto bad; | 162 | goto bad; |
| 148 | 163 | ||
