diff mbox series

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

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

Commit Message

Richard Henderson Dec. 20, 2021, 9:41 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.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 52 insertions(+), 4 deletions(-)

Comments

Philippe Mathieu-Daudé Dec. 20, 2021, 10:41 p.m. UTC | #1
On 12/20/21 22:41, Richard Henderson wrote:
> 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.
> 
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 52 insertions(+), 4 deletions(-)

> +    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:
>      default:

Unfortunately prctl values are not enumerated, so we can't remove
the default case to catch new values at build time.

Maybe a qemu_log_mask(LOG_UNIMP) call would help here? (only
for default?)

Regardless:
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> -        /* Most prctl options have no pointer arguments */
> -        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
> +        /* Disable to prevent the target disabling stuff we need. */
> +        return -TARGET_EINVAL;
>      }
>  }
>
Laurent Vivier Dec. 22, 2021, 8:50 p.m. UTC | #2
Le 20/12/2021 à 23:41, Philippe Mathieu-Daudé a écrit :
> On 12/20/21 22:41, Richard Henderson wrote:
>> 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.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>>   linux-user/syscall.c | 56 ++++++++++++++++++++++++++++++++++++++++----
>>   1 file changed, 52 insertions(+), 4 deletions(-)
> 
>> +    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:
>>       default:
> 
> Unfortunately prctl values are not enumerated, so we can't remove
> the default case to catch new values at build time.
> 
> Maybe a qemu_log_mask(LOG_UNIMP) call would help here? (only

Yes, I think a qemu_log_mask(LOG_UNIMP) for the default case would help.
> for default?)
> 
> Regardless:
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

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

> 
>> -        /* Most prctl options have no pointer arguments */
>> -        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
>> +        /* Disable to prevent the target disabling stuff we need. */
>> +        return -TARGET_EINVAL;
>>       }
>>   }
>>   
>
diff mbox series

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index b93b8a4f5e..ef7a955dbb 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6336,6 +6336,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"
 
@@ -6432,13 +6439,54 @@  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. */
-        return -TARGET_EINVAL;
+    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:
     default:
-        /* Most prctl options have no pointer arguments */
-        return get_errno(prctl(option, arg2, arg3, arg4, arg5));
+        /* Disable to prevent the target disabling stuff we need. */
+        return -TARGET_EINVAL;
     }
 }