suppress gcc 8 aliasing warnings
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 8 Dec 2018 12:49:15 +0000 (13:49 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 8 Dec 2018 12:49:15 +0000 (13:49 +0100)
function                                             old     new   delta
sigprocmask_SIG_SETMASK                                -      16     +16
wait_for_child_or_signal                             221     213      -8
dowait                                               432     424      -8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/libbb.h
libbb/lineedit.c
libbb/signals.c
shell/ash.c
shell/hush.c

index 9e097009578d438e467b1f3bc8e569f5b7311813..638c58412ce3f8dfe355de61db7231cb118768fc 100644 (file)
@@ -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! */
index b6fcd7af03bf2ec7ce69f57c04f0d3f566025710..378f0900af61098277e08eda920ced16258bc1cc 100644 (file)
@@ -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) {
index 3f589321c1d82a3d3be520873d019b9b714ab66d..5a1544db711c9d5b16cd35381d670ece617f790b 100644 (file)
@@ -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;
index 9ce1d1a76decf77c9371082430182d577884cb0d..456aca4f0e58f43cd7f77619517f2702147e6ab8 100644 (file)
@@ -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);
index 90191408d69062e9a2aa67678ad3402add7322fa..5953ceb9fc959b3ab89828fec8cbd9ab4d350c14 100644 (file)
@@ -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! */