diff options
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r-- | kernel/ptrace.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index b9d5f4e4f6a4..f764b8806955 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -171,6 +171,14 @@ int ptrace_attach(struct task_struct *task) | |||
171 | if (same_thread_group(task, current)) | 171 | if (same_thread_group(task, current)) |
172 | goto out; | 172 | goto out; |
173 | 173 | ||
174 | /* Protect exec's credential calculations against our interference; | ||
175 | * SUID, SGID and LSM creds get determined differently under ptrace. | ||
176 | */ | ||
177 | retval = mutex_lock_interruptible(¤t->cred_exec_mutex); | ||
178 | if (retval < 0) | ||
179 | goto out; | ||
180 | |||
181 | retval = -EPERM; | ||
174 | repeat: | 182 | repeat: |
175 | /* | 183 | /* |
176 | * Nasty, nasty. | 184 | * Nasty, nasty. |
@@ -210,6 +218,7 @@ repeat: | |||
210 | bad: | 218 | bad: |
211 | write_unlock_irqrestore(&tasklist_lock, flags); | 219 | write_unlock_irqrestore(&tasklist_lock, flags); |
212 | task_unlock(task); | 220 | task_unlock(task); |
221 | mutex_unlock(¤t->cred_exec_mutex); | ||
213 | out: | 222 | out: |
214 | return retval; | 223 | return retval; |
215 | } | 224 | } |