diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2021-04-22 16:02:23 -0700 |
---|---|---|
committer | Laurent Vivier <laurent@vivier.eu> | 2021-05-18 07:10:32 +0200 |
commit | 02fb28e8effe5090ded4d36ea1c947a615099c26 (patch) | |
tree | 1b7d0312a0b3f09b487a22a1c706b7169cee225b /linux-user/signal.c | |
parent | f20a9ca6d09796a50e850bd105ba03aa96918e5f (diff) |
linux-user: Pass ka_restorer to do_sigaction
The value of ka_restorer needs to be saved in sigact_table.
At the moment, the attempt to save it in do_syscall is
improperly clobbering user memory.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20210422230227.314751-4-richard.henderson@linaro.org>
[lv: remove tab]
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'linux-user/signal.c')
-rw-r--r-- | linux-user/signal.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/linux-user/signal.c b/linux-user/signal.c index cbd80b28cf..9016896dcd 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -842,7 +842,7 @@ abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, /* do_sigaction() return target values and host errnos */ int do_sigaction(int sig, const struct target_sigaction *act, - struct target_sigaction *oact) + struct target_sigaction *oact, abi_ulong ka_restorer) { struct target_sigaction *k; struct sigaction act1; @@ -876,6 +876,9 @@ int do_sigaction(int sig, const struct target_sigaction *act, #ifdef TARGET_ARCH_HAS_SA_RESTORER __get_user(k->sa_restorer, &act->sa_restorer); #endif +#ifdef TARGET_ARCH_HAS_KA_RESTORER + k->ka_restorer = ka_restorer; +#endif /* To be swapped in target_to_host_sigset. */ k->sa_mask = act->sa_mask; |