|
@@ -298,23 +298,18 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
|
|
|
goto free_proc_pages;
|
|
|
}
|
|
|
|
|
|
- task_lock(task);
|
|
|
- if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) {
|
|
|
- task_unlock(task);
|
|
|
- rc = -EPERM;
|
|
|
- goto put_task_struct;
|
|
|
- }
|
|
|
- mm = task->mm;
|
|
|
-
|
|
|
- if (!mm || (task->flags & PF_KTHREAD)) {
|
|
|
- task_unlock(task);
|
|
|
- rc = -EINVAL;
|
|
|
+ mm = mm_access(task, PTRACE_MODE_ATTACH);
|
|
|
+ if (!mm || IS_ERR(mm)) {
|
|
|
+ rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
|
|
|
+ /*
|
|
|
+ * Explicitly map EACCES to EPERM as EPERM is a more a
|
|
|
+ * appropriate error code for process_vw_readv/writev
|
|
|
+ */
|
|
|
+ if (rc == -EACCES)
|
|
|
+ rc = -EPERM;
|
|
|
goto put_task_struct;
|
|
|
}
|
|
|
|
|
|
- atomic_inc(&mm->mm_users);
|
|
|
- task_unlock(task);
|
|
|
-
|
|
|
for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {
|
|
|
rc = process_vm_rw_single_vec(
|
|
|
(unsigned long)rvec[i].iov_base, rvec[i].iov_len,
|