|
@@ -41,6 +41,7 @@
|
|
|
#include <linux/page_idle.h>
|
|
|
#include <linux/page_owner.h>
|
|
|
#include <linux/sched/mm.h>
|
|
|
+#include <linux/ptrace.h>
|
|
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
|
@@ -1652,7 +1653,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
|
|
|
const int __user *, nodes,
|
|
|
int __user *, status, int, flags)
|
|
|
{
|
|
|
- const struct cred *cred = current_cred(), *tcred;
|
|
|
struct task_struct *task;
|
|
|
struct mm_struct *mm;
|
|
|
int err;
|
|
@@ -1676,14 +1676,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
|
|
|
|
|
|
/*
|
|
|
* Check if this process has the right to modify the specified
|
|
|
- * process. The right exists if the process has administrative
|
|
|
- * capabilities, superuser privileges or the same
|
|
|
- * userid as the target process.
|
|
|
+ * process. Use the regular "ptrace_may_access()" checks.
|
|
|
*/
|
|
|
- tcred = __task_cred(task);
|
|
|
- if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) &&
|
|
|
- !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) &&
|
|
|
- !capable(CAP_SYS_NICE)) {
|
|
|
+ if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) {
|
|
|
rcu_read_unlock();
|
|
|
err = -EPERM;
|
|
|
goto out;
|