diff mbox series

linux-user: do prlimit selectively

Message ID 6d93d213-894b-8fc7-a008-62084c5c1a01@nonterra.com
State New
Headers show
Series linux-user: do prlimit selectively | expand

Commit Message

Tobias Koch March 5, 2020, 12:48 a.m. UTC
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.koch@nonterra.com>
---
 linux-user/syscall.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

         ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ?
&rold : 0));
diff mbox series

Patch

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;
         }