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


Reply via email to