From 3f1ba73fc762a3c553787605c2ce1d3ac0a58250 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 4 Jul 2019 02:21:24 +0200 Subject: [PATCH] Fix "struct sigaction" structure for rt_sigaction. * include/signal.h (sigset_t): Increase size. * lib/linux/signal.c (signal): Use new sigset_t. --- include/signal.h | 7 ++++++- lib/linux/signal.c | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/signal.h b/include/signal.h index 121d3027..877b2d55 100644 --- a/include/signal.h +++ b/include/signal.h @@ -25,8 +25,13 @@ #include_next #else //! SYSTEM_LIBC +#define _NSIG 64 -typedef long sigset_t; +#define _SIGSET_NITEMS (_NSIG / (8 * sizeof(unsigned long))) + +typedef struct { + unsigned long items[_SIGSET_NITEMS]; +} sigset_t; typedef long stack_t; #include diff --git a/lib/linux/signal.c b/lib/linux/signal.c index 19f09d64..6d95b6ab 100644 --- a/lib/linux/signal.c +++ b/lib/linux/signal.c @@ -41,12 +41,16 @@ signal (int signum, sighandler_t action) #if __i386__ return _sys_call2 (SYS_signal, signum, action); #else - static struct sigaction setup_action = { -1 }; + static struct sigaction setup_action = { 0 }; static struct sigaction old = { 0 }; + unsigned short bitindex; + unsigned short itembitcount; setup_action.sa_handler = action; setup_action.sa_restorer = _restorer; - setup_action.sa_mask = __sigmask (signum); + bitindex = signum - 1; + itembitcount = 8 * sizeof(setup_action.sa_mask.items[0]); + setup_action.sa_mask.items[bitindex / itembitcount] = 1 << (bitindex % itembitcount); old.sa_handler = SIG_DFL; setup_action.sa_flags = SA_RESTORER | SA_RESTART; int r = _sys_call4 (SYS_rt_sigaction, signum, &setup_action, &old, sizeof (sigset_t));