When PR_GET_TASK_SIZE is passed to prctl, the kernel will attempt to copy the value of TASK_SIZE to the userspace address in arg2.
Suggested-by: Alexey Dobriyan <adobri...@gmail.com> Signed-off-by: Joel Savitz <jsav...@redhat.com> --- include/uapi/linux/prctl.h | 3 +++ kernel/sys.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index 094bb03b9cc2..2335fe0a8db8 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -229,4 +229,7 @@ struct prctl_mm_map { # define PR_PAC_APDBKEY (1UL << 3) # define PR_PAC_APGAKEY (1UL << 4) +/* Get the process virtual memory size */ +#define PR_GET_TASK_SIZE 55 + #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index 12df0e5434b8..7ced7dbd035d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2252,6 +2252,13 @@ static int propagate_has_child_subreaper(struct task_struct *p, void *data) return 1; } +static int prctl_get_tasksize(void __user * uaddr) +{ + unsigned long long task_size = TASK_SIZE; + return copy_to_user(uaddr, &task_size, sizeof(unsigned long long)) + ? -EFAULT : 0; +} + int __weak arch_prctl_spec_ctrl_get(struct task_struct *t, unsigned long which) { return -EINVAL; @@ -2486,6 +2493,9 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, return -EINVAL; error = PAC_RESET_KEYS(me, arg2); break; + case PR_GET_TASK_SIZE: + error = prctl_get_tasksize((void *)arg2) ; + break; default: error = -EINVAL; break; -- 2.18.1