Message ID | 20220315084308.433109-2-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | linux-user: signal mask fixes for pselect et al | expand |
Le 15/03/2022 à 09:43, Richard Henderson a écrit : > On alpha, the sigset argument for sigsuspend is in a register. > When we drop that into memory that happens in host-endianness, > but target_to_host_old_sigset will treat it as target-endianness. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > linux-user/syscall.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/linux-user/syscall.c b/linux-user/syscall.c > index b9b18a7eaf..ecd00382a8 100644 > --- a/linux-user/syscall.c > +++ b/linux-user/syscall.c > @@ -9559,7 +9559,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, > { > TaskState *ts = cpu->opaque; > #if defined(TARGET_ALPHA) > - abi_ulong mask = arg1; > + /* target_to_host_old_sigset will bswap back */ > + abi_ulong mask = tswapal(arg1); > target_to_host_old_sigset(&ts->sigsuspend_mask, &mask); > #else > if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1))) And what about target_set in TARGET_NR_ssetmask, mask in TARGET_NR_sigprocmask and in TARGET_NR_osf_sigprocmask? Thanks, Laurent
Le 22/03/2022 à 10:58, Laurent Vivier a écrit : > Le 15/03/2022 à 09:43, Richard Henderson a écrit : >> On alpha, the sigset argument for sigsuspend is in a register. >> When we drop that into memory that happens in host-endianness, >> but target_to_host_old_sigset will treat it as target-endianness. >> >> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> linux-user/syscall.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/linux-user/syscall.c b/linux-user/syscall.c >> index b9b18a7eaf..ecd00382a8 100644 >> --- a/linux-user/syscall.c >> +++ b/linux-user/syscall.c >> @@ -9559,7 +9559,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, >> { >> TaskState *ts = cpu->opaque; >> #if defined(TARGET_ALPHA) >> - abi_ulong mask = arg1; >> + /* target_to_host_old_sigset will bswap back */ >> + abi_ulong mask = tswapal(arg1); >> target_to_host_old_sigset(&ts->sigsuspend_mask, &mask); >> #else >> if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1))) > > And what about target_set in TARGET_NR_ssetmask, mask in TARGET_NR_sigprocmask and in > TARGET_NR_osf_sigprocmask? > Anyway, the fix is correct and I will add it in my next pull request. Reviewed-by: Laurent Vivier <laurent@vivier.eu>
diff --git a/linux-user/syscall.c b/linux-user/syscall.c index b9b18a7eaf..ecd00382a8 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -9559,7 +9559,8 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1, { TaskState *ts = cpu->opaque; #if defined(TARGET_ALPHA) - abi_ulong mask = arg1; + /* target_to_host_old_sigset will bswap back */ + abi_ulong mask = tswapal(arg1); target_to_host_old_sigset(&ts->sigsuspend_mask, &mask); #else if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
On alpha, the sigset argument for sigsuspend is in a register. When we drop that into memory that happens in host-endianness, but target_to_host_old_sigset will treat it as target-endianness. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- linux-user/syscall.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)