signal: Use SA_RESTORER on x86-64.

* lib/linux/signal.c (signal)[x86_64]: Avoid segfault by setting
SA_RESTORER flag.
This commit is contained in:
Jan Nieuwenhuizen 2019-09-07 18:52:09 +02:00
parent 23d857c834
commit 2db5ec2f55
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273

View file

@ -60,7 +60,11 @@ signal (int signum, sighandler_t action)
setup_action.sa_mask.items[bitindex / itembitcount] = 1UL << (bitindex % itembitcount); setup_action.sa_mask.items[bitindex / itembitcount] = 1UL << (bitindex % itembitcount);
old.sa_handler = SIG_DFL; old.sa_handler = SIG_DFL;
setup_action.sa_flags = SA_RESTART; 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) if (r)
return 0; return 0;
return old.sa_handler; return old.sa_handler;