The kernel allows doing this, so let's allow this in qemu as well.
Valgrind relies on this.
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
linux-user/signal.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 9016896dcd..bc3431708f 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -851,7 +851,11 @@ int do_sigaction(int sig, const struct target_sigaction *act,
trace_signal_do_sigaction_guest(sig, TARGET_NSIG);
- if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
+ if (sig < 1 || sig > TARGET_NSIG) {
+ return -TARGET_EINVAL;
+ }
+
+ if (act && (sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)) {
return -TARGET_EINVAL;
}
--
2.31.1
Le 01/06/2021 à 16:55, Ilya Leoshkevich a écrit :
> The kernel allows doing this, so let's allow this in qemu as well.
> Valgrind relies on this.
>
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
> linux-user/signal.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 9016896dcd..bc3431708f 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -851,7 +851,11 @@ int do_sigaction(int sig, const struct target_sigaction *act,
>
> trace_signal_do_sigaction_guest(sig, TARGET_NSIG);
>
> - if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
> + if (sig < 1 || sig > TARGET_NSIG) {
> + return -TARGET_EINVAL;
> + }
> +
> + if (act && (sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)) {
> return -TARGET_EINVAL;
> }
>
>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Le 01/06/2021 à 16:55, Ilya Leoshkevich a écrit :
> The kernel allows doing this, so let's allow this in qemu as well.
> Valgrind relies on this.
>
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
> linux-user/signal.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 9016896dcd..bc3431708f 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -851,7 +851,11 @@ int do_sigaction(int sig, const struct target_sigaction *act,
>
> trace_signal_do_sigaction_guest(sig, TARGET_NSIG);
>
> - if (sig < 1 || sig > TARGET_NSIG || sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP) {
> + if (sig < 1 || sig > TARGET_NSIG) {
> + return -TARGET_EINVAL;
> + }
> +
> + if (act && (sig == TARGET_SIGKILL || sig == TARGET_SIGSTOP)) {
> return -TARGET_EINVAL;
> }
>
>
Applied to my linux-user-for-6.1 branch.
Thanks,
Laurent
© 2016 - 2026 Red Hat, Inc.