Analogous to what commit 5dfa88f7 did for setrlimit, this commit selectively ignores limits for memory-related resources in prlimit64 calls. This is to prevent too restrictive limits from causing QEMU itself to malfunction.
Signed-off-by: Tobias Koch <tobias.k...@nonterra.com> --- linux-user/syscall.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 8d27d10807..8554c77a38 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -11872,13 +11872,17 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, struct host_rlimit64 rnew, rold, *rnewp = 0; int resource = target_to_host_resource(arg2); if (arg3) { - if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) { - return -TARGET_EFAULT; + if (resource != RLIMIT_AS && + resource != RLIMIT_DATA && + resource != RLIMIT_STACK) { + if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) { + return -TARGET_EFAULT; + } + rnew.rlim_cur = tswap64(target_rnew->rlim_cur); + rnew.rlim_max = tswap64(target_rnew->rlim_max); + unlock_user_struct(target_rnew, arg3, 0); + rnewp = &rnew; } - rnew.rlim_cur = tswap64(target_rnew->rlim_cur); - rnew.rlim_max = tswap64(target_rnew->rlim_max); - unlock_user_struct(target_rnew, arg3, 0); - rnewp = &rnew; } ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ? &rold : 0)); -- 2.20.1