|
@@ -237,20 +237,19 @@ struct mm_struct *mm_for_maps(struct task_struct *task)
|
|
|
struct mm_struct *mm = get_task_mm(task);
|
|
|
if (!mm)
|
|
|
return NULL;
|
|
|
+ if (mm != current->mm) {
|
|
|
+ /*
|
|
|
+ * task->mm can be changed before security check,
|
|
|
+ * in that case we must notice the change after.
|
|
|
+ */
|
|
|
+ if (!ptrace_may_access(task, PTRACE_MODE_READ) ||
|
|
|
+ mm != task->mm) {
|
|
|
+ mmput(mm);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
down_read(&mm->mmap_sem);
|
|
|
- task_lock(task);
|
|
|
- if (task->mm != mm)
|
|
|
- goto out;
|
|
|
- if (task->mm != current->mm &&
|
|
|
- __ptrace_may_access(task, PTRACE_MODE_READ) < 0)
|
|
|
- goto out;
|
|
|
- task_unlock(task);
|
|
|
return mm;
|
|
|
-out:
|
|
|
- task_unlock(task);
|
|
|
- up_read(&mm->mmap_sem);
|
|
|
- mmput(mm);
|
|
|
- return NULL;
|
|
|
}
|
|
|
|
|
|
static int proc_pid_cmdline(struct task_struct *task, char * buffer)
|