diff mbox series

[v2,2/6] linux-user: Disable more prctl subcodes

Message ID 20211227150127.2659293-3-richard.henderson@linaro.org
State Superseded
Headers show
Series linux-user: prctl improvements | expand

Commit Message

Richard Henderson Dec. 27, 2021, 3:01 p.m. UTC
Create a list of subcodes that we want to pass on, a list of
subcodes that should not be passed on because they would affect
the running qemu itself, and a list that probably could be
implemented but require extra work. Do not pass on unknown subcodes.

Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
v2: Log unknown prctl options.
---
 linux-user/syscall.c | 58 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 3 deletions(-)

Comments

Laurent Vivier Jan. 4, 2022, 11:44 a.m. UTC | #1
Le 27/12/2021 à 16:01, Richard Henderson a écrit :
> Create a list of subcodes that we want to pass on, a list of
> subcodes that should not be passed on because they would affect
> the running qemu itself, and a list that probably could be
> implemented but require extra work. Do not pass on unknown subcodes.
> 
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> v2: Log unknown prctl options.
> ---
>   linux-user/syscall.c | 58 +++++++++++++++++++++++++++++++++++++++++---
>   1 file changed, 55 insertions(+), 3 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index 0f0f67d567..d868ef2910 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -6337,6 +6337,13 @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
>   # define PR_MTE_TAG_SHIFT       3
>   # define PR_MTE_TAG_MASK        (0xffffUL << PR_MTE_TAG_SHIFT)
>   #endif
> +#ifndef PR_SET_IO_FLUSHER
> +# define PR_SET_IO_FLUSHER 57
> +# define PR_GET_IO_FLUSHER 58
> +#endif
> +#ifndef PR_SET_SYSCALL_USER_DISPATCH
> +# define PR_SET_SYSCALL_USER_DISPATCH 59
> +#endif
>   
>   #include "target_prctl.h"
>   
> @@ -6433,13 +6440,58 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
>               return -TARGET_EINVAL;
>           }
>           return do_prctl_get_tagged_addr_ctrl(env);
> +
> +    case PR_GET_DUMPABLE:
> +    case PR_SET_DUMPABLE:
> +    case PR_GET_KEEPCAPS:
> +    case PR_SET_KEEPCAPS:
> +    case PR_GET_TIMING:
> +    case PR_SET_TIMING:
> +    case PR_GET_TIMERSLACK:
> +    case PR_SET_TIMERSLACK:
> +    case PR_MCE_KILL:
> +    case PR_MCE_KILL_GET:
> +    case PR_GET_NO_NEW_PRIVS:
> +    case PR_SET_NO_NEW_PRIVS:
> +    case PR_GET_IO_FLUSHER:
> +    case PR_SET_IO_FLUSHER:
> +        /* Some prctl options have no pointer arguments and we can pass on. */
> +        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
> +
> +    case PR_GET_CHILD_SUBREAPER:
> +    case PR_SET_CHILD_SUBREAPER:
> +    case PR_GET_SPECULATION_CTRL:
> +    case PR_SET_SPECULATION_CTRL:
> +    case PR_GET_TID_ADDRESS:
> +        /* TODO */
> +        return -TARGET_EINVAL;
> +
> +    case PR_GET_FPEXC:
> +    case PR_SET_FPEXC:
> +        /* Was used for SPE on PowerPC. */
> +        return -TARGET_EINVAL;
> +
> +    case PR_GET_ENDIAN:
> +    case PR_SET_ENDIAN:
> +    case PR_GET_FPEMU:
> +    case PR_SET_FPEMU:
> +    case PR_SET_MM:
>       case PR_GET_SECCOMP:
>       case PR_SET_SECCOMP:
> -        /* Disable seccomp to prevent the target disabling syscalls we need. */
> +    case PR_SET_SYSCALL_USER_DISPATCH:
> +    case PR_GET_THP_DISABLE:
> +    case PR_SET_THP_DISABLE:
> +    case PR_GET_TSC:
> +    case PR_SET_TSC:
> +    case PR_GET_UNALIGN:
> +    case PR_SET_UNALIGN:
> +        /* Disable to prevent the target disabling stuff we need. */
>           return -TARGET_EINVAL;
> +
>       default:
> -        /* Most prctl options have no pointer arguments */
> -        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
> +        qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n",
> +                      option);
> +        return -TARGET_EINVAL;
>       }
>   }
>   

Applied to my linux-user-for-7.0 branch.

Thanks,
Laurent
diff mbox series

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0f0f67d567..d868ef2910 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6337,6 +6337,13 @@  abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
 # define PR_MTE_TAG_SHIFT       3
 # define PR_MTE_TAG_MASK        (0xffffUL << PR_MTE_TAG_SHIFT)
 #endif
+#ifndef PR_SET_IO_FLUSHER
+# define PR_SET_IO_FLUSHER 57
+# define PR_GET_IO_FLUSHER 58
+#endif
+#ifndef PR_SET_SYSCALL_USER_DISPATCH
+# define PR_SET_SYSCALL_USER_DISPATCH 59
+#endif
 
 #include "target_prctl.h"
 
@@ -6433,13 +6440,58 @@  static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
             return -TARGET_EINVAL;
         }
         return do_prctl_get_tagged_addr_ctrl(env);
+
+    case PR_GET_DUMPABLE:
+    case PR_SET_DUMPABLE:
+    case PR_GET_KEEPCAPS:
+    case PR_SET_KEEPCAPS:
+    case PR_GET_TIMING:
+    case PR_SET_TIMING:
+    case PR_GET_TIMERSLACK:
+    case PR_SET_TIMERSLACK:
+    case PR_MCE_KILL:
+    case PR_MCE_KILL_GET:
+    case PR_GET_NO_NEW_PRIVS:
+    case PR_SET_NO_NEW_PRIVS:
+    case PR_GET_IO_FLUSHER:
+    case PR_SET_IO_FLUSHER:
+        /* Some prctl options have no pointer arguments and we can pass on. */
+        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
+
+    case PR_GET_CHILD_SUBREAPER:
+    case PR_SET_CHILD_SUBREAPER:
+    case PR_GET_SPECULATION_CTRL:
+    case PR_SET_SPECULATION_CTRL:
+    case PR_GET_TID_ADDRESS:
+        /* TODO */
+        return -TARGET_EINVAL;
+
+    case PR_GET_FPEXC:
+    case PR_SET_FPEXC:
+        /* Was used for SPE on PowerPC. */
+        return -TARGET_EINVAL;
+
+    case PR_GET_ENDIAN:
+    case PR_SET_ENDIAN:
+    case PR_GET_FPEMU:
+    case PR_SET_FPEMU:
+    case PR_SET_MM:
     case PR_GET_SECCOMP:
     case PR_SET_SECCOMP:
-        /* Disable seccomp to prevent the target disabling syscalls we need. */
+    case PR_SET_SYSCALL_USER_DISPATCH:
+    case PR_GET_THP_DISABLE:
+    case PR_SET_THP_DISABLE:
+    case PR_GET_TSC:
+    case PR_SET_TSC:
+    case PR_GET_UNALIGN:
+    case PR_SET_UNALIGN:
+        /* Disable to prevent the target disabling stuff we need. */
         return -TARGET_EINVAL;
+
     default:
-        /* Most prctl options have no pointer arguments */
-        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
+        qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n",
+                      option);
+        return -TARGET_EINVAL;
     }
 }