diff --git a/include/libbb.h b/include/libbb.h index 9e0970095..638c58412 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -544,6 +544,8 @@ void sig_unblock(int sig) FAST_FUNC; int sigaction_set(int sig, const struct sigaction *act) FAST_FUNC; /* SIG_BLOCK/SIG_UNBLOCK all signals: */ int sigprocmask_allsigs(int how) FAST_FUNC; +/* SIG_SETMASK set, and return old set in the same set: */ +int sigprocmask_SIG_SETMASK(sigset_t *set) FAST_FUNC; /* Standard handler which just records signo */ extern smallint bb_got_signal; void record_signo(int signo); /* not FAST_FUNC! */ diff --git a/libbb/lineedit.c b/libbb/lineedit.c index b6fcd7af0..378f0900a 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -2309,6 +2309,16 @@ static int32_t reverse_i_search(int timeout) } #endif +static void sigaction2(int sig, struct sigaction *act) +{ + // Grr... gcc 8.1.1: + // "passing argument 3 to restrict-qualified parameter aliases with argument 2" + // dance around that... + struct sigaction *oact FIX_ALIASING; + oact = act; + sigaction(sig, act, oact); +} + /* maxsize must be >= 2. * Returns: * -1 on read errors or EOF, or on bare Ctrl-D, @@ -2419,7 +2429,7 @@ int FAST_FUNC read_line_input(line_input_t *st, const char *prompt, char *comman /* Install window resize handler (NB: after *all* init is complete) */ S.SIGWINCH_handler.sa_handler = win_changed; S.SIGWINCH_handler.sa_flags = SA_RESTART; - sigaction(SIGWINCH, &S.SIGWINCH_handler, &S.SIGWINCH_handler); + sigaction2(SIGWINCH, &S.SIGWINCH_handler); #endif read_key_buffer[0] = 0; while (1) { diff --git a/libbb/signals.c b/libbb/signals.c index 3f589321c..5a1544db7 100644 --- a/libbb/signals.c +++ b/libbb/signals.c @@ -31,6 +31,16 @@ int FAST_FUNC sigprocmask_allsigs(int how) return sigprocmask(how, &set, NULL); } +int FAST_FUNC sigprocmask_SIG_SETMASK(sigset_t *set) +{ + // Grr... gcc 8.1.1: + // "passing argument 3 to restrict-qualified parameter aliases with argument 2" + // dance around that... + sigset_t *oset FIX_ALIASING; + oset = set; + return sigprocmask(SIG_SETMASK, set, oset); +} + void FAST_FUNC bb_signals(int sigs, void (*f)(int)) { int sig_no = 0; diff --git a/shell/ash.c b/shell/ash.c index 9ce1d1a76..456aca4f0 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -4217,7 +4217,7 @@ wait_block_or_sig(int *status) /* Children exist, but none are ready. Sleep until interesting signal */ #if 1 sigfillset(&mask); - sigprocmask(SIG_SETMASK, &mask, &mask); + sigprocmask_SIG_SETMASK(&mask); /* mask is updated */ while (!got_sigchld && !pending_sig) sigsuspend(&mask); sigprocmask(SIG_SETMASK, &mask, NULL); diff --git a/shell/hush.c b/shell/hush.c index 90191408d..5953ceb9f 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -11442,7 +11442,7 @@ static int wait_for_child_or_signal(struct pipe *waitfor_pipe, pid_t waitfor_pid * and get stuck in sigsuspend... */ sigfillset(&oldset); /* block all signals, remember old set */ - sigprocmask(SIG_SETMASK, &oldset, &oldset); + sigprocmask_SIG_SETMASK(&oldset); if (!sigisemptyset(&G.pending_set)) { /* Crap! we raced with some signal! */