linux-user: Disable more prctl subcodes
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> Message-Id: <20211227150127.2659293-3-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
87e9bf2323
commit
220717a6f4
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user