From cde88d5bbf3f9f9ead196fe7a7a544ccf2becf54 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sat, 7 Sep 2019 18:52:09 +0200 Subject: [PATCH] signal: Use SA_RESTORER on x86-64. * lib/linux/signal.c (signal)[x86_64]: Avoid segfault by setting SA_RESTORER flag. --- lib/linux/signal.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/linux/signal.c b/lib/linux/signal.c index fe18d048..2f17a320 100644 --- a/lib/linux/signal.c +++ b/lib/linux/signal.c @@ -60,7 +60,11 @@ signal (int signum, sighandler_t action) setup_action.sa_mask.items[bitindex / itembitcount] = 1UL << (bitindex % itembitcount); old.sa_handler = SIG_DFL; setup_action.sa_flags = SA_RESTART; - int r = _sys_call4 (SYS_rt_sigaction, signum, &setup_action, &old, sizeof (sigset_t)); +#if __x86_64__ + /* Tell kernel that we use a restorer, on penalty of segfault. */ + setup_action.sa_flags |= SA_RESTORER; +#endif + int r = _sys_call4 (SYS_rt_sigaction, signum, (long)&setup_action, (long)&old, sizeof (sigset_t)); if (r) return 0; return old.sa_handler;