[PATCH v2] linux-user: do prlimit selectively

Tobias Koch posted 1 patch 5 years, 8 months ago
Test docker-mingw@fedora passed
Test checkpatch passed
Test docker-quick@centos7 passed
Test FreeBSD passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20200305202400.27574-1-tobias.koch@nonterra.com
Maintainers: Riku Voipio <riku.voipio@iki.fi>, Laurent Vivier <laurent@vivier.eu>
linux-user/syscall.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
[PATCH v2] linux-user: do prlimit selectively
Posted by Tobias Koch 5 years, 8 months ago
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 | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 8d27d10807..4f2f9eb12b 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -11871,7 +11871,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
         struct target_rlimit64 *target_rnew, *target_rold;
         struct host_rlimit64 rnew, rold, *rnewp = 0;
         int resource = target_to_host_resource(arg2);
-        if (arg3) {
+
+        if (arg3 && (resource != RLIMIT_AS &&
+                     resource != RLIMIT_DATA &&
+                     resource != RLIMIT_STACK)) {
             if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
                 return -TARGET_EFAULT;
             }
-- 
2.20.1


Re: [PATCH v2] linux-user: do prlimit selectively
Posted by Laurent Vivier 5 years, 8 months ago
Le 05/03/2020 à 21:24, Tobias Koch a écrit :
> 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 | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 8d27d10807..4f2f9eb12b 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11871,7 +11871,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>          struct target_rlimit64 *target_rnew, *target_rold;
>          struct host_rlimit64 rnew, rold, *rnewp = 0;
>          int resource = target_to_host_resource(arg2);
> -        if (arg3) {
> +
> +        if (arg3 && (resource != RLIMIT_AS &&
> +                     resource != RLIMIT_DATA &&
> +                     resource != RLIMIT_STACK)) {
>              if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
>                  return -TARGET_EFAULT;
>              }
> 

Applied to my linux-user branch.

Thanks,
Laurent

Re: [PATCH v2] linux-user: do prlimit selectively
Posted by Laurent Vivier 5 years, 8 months ago
Le 05/03/2020 à 21:24, Tobias Koch a écrit :
> 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 | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 8d27d10807..4f2f9eb12b 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -11871,7 +11871,10 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
>          struct target_rlimit64 *target_rnew, *target_rold;
>          struct host_rlimit64 rnew, rold, *rnewp = 0;
>          int resource = target_to_host_resource(arg2);
> -        if (arg3) {
> +
> +        if (arg3 && (resource != RLIMIT_AS &&
> +                     resource != RLIMIT_DATA &&
> +                     resource != RLIMIT_STACK)) {
>              if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
>                  return -TARGET_EFAULT;
>              }
> 

Reviewed-by: Laurent Vivier <laurent@vivier.eu>