diff options
authorMinchan Kim <>2020-05-30 14:51:09 +1000
committerStephen Rothwell <>2020-06-02 19:15:36 +1000
commite52f021612a6063902ce26a6ba1d61b094e1a8a2 (patch)
parentb4e6875644ed112a492f1bcd8ba21febb5df31f8 (diff)
mm: return EBADF if pidfd is invalid
This patch makes returning of EBADF when the fd passed as argument is invalid. The implementaion relies on pidfd_get_pid's error return. This patch also fixes syscall declare part since we removed pid support. Link: Signed-off-by: Minchan Kim <> Cc: Suren Baghdasaryan <> Cc: Christian Brauner <> Signed-off-by: Andrew Morton <> Signed-off-by: Stephen Rothwell <>
3 files changed, 5 insertions, 9 deletions
diff --git a/include/linux/compat.h b/include/linux/compat.h
index 2e2f0a2700ab..86b61e873947 100644
--- a/include/linux/compat.h
+++ b/include/linux/compat.h
@@ -827,10 +827,10 @@ asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
unsigned long vlen, loff_t pos, rwf_t flags);
-asmlinkage ssize_t compat_sys_process_madvise(compat_int_t which,
- compat_pid_t upid, const struct compat_iovec __user *vec,
+asmlinkage ssize_t compat_sys_process_madvise(compat_int_t pidfd,
+ const struct compat_iovec __user *vec,
compat_ulong_t vlen, compat_int_t behavior,
- compat_ulong_t flags);
+ compat_int_t flags);
* Deprecated system calls which are still defined in
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 2cbd3660e8e6..63ffa6dc9da3 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -879,9 +879,8 @@ asmlinkage long sys_munlockall(void);
asmlinkage long sys_mincore(unsigned long start, size_t len,
unsigned char __user * vec);
asmlinkage long sys_madvise(unsigned long start, size_t len, int behavior);
-asmlinkage long sys_process_madvise(int which, pid_t upid,
- const struct iovec __user *vec, unsigned long vlen,
- int behavior, unsigned long flags);
+asmlinkage long sys_process_madvise(int pidfd, const struct iovec __user *vec,
+ unsigned long vlen, int behavior, unsigned int flags);
asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
unsigned long prot, unsigned long pgoff,
unsigned long flags);
diff --git a/mm/madvise.c b/mm/madvise.c
index f2a9619d8d46..39e2850481dc 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1242,9 +1242,6 @@ static ssize_t do_process_madvise(int pidfd, struct iov_iter *iter,
if (flags != 0)
return -EINVAL;
- if (pidfd < 0)
- return -EINVAL;
pid = pidfd_get_pid(pidfd);
if (IS_ERR(pid))
return PTR_ERR(pid);