multipathd: fix signal blocking logic
authorMartin Wilck <mwilck@suse.com>
Mon, 5 Mar 2018 23:15:07 +0000 (00:15 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Wed, 7 Mar 2018 09:40:32 +0000 (10:40 +0100)
commit24f2844de845fde8c257a9b3a0c5778c09ef2b46
tree9069526c600d345681f403da74d3b9efe769ac57
parent29637e87f5cd6fb10d518d68b1d138006f464ed6
multipathd: fix signal blocking logic

multipathd is supposed to block all signals in all threads, except
the uxlsnr thread which handles termination and reconfiguration
signals (SIGUSR1) in its ppoll() call, SIGUSR2 in the waiter thread
and the marginal path checker thread, and occasional SIGALRM. The current
logic does exactly the oppsite, it blocks termination signals in SIGPOLL and
allows multipathd to be killed e.g. by SIGALRM.

Fix that by inverting the logic. The argument to pthread_sigmask and
ppoll is the set of *blocked* signals, not vice versa.

The marginal paths code needs to unblock SIGUSR2 now explicity, as
the dm-event waiter code already does. Doing this with pselect()
avoids asynchronous cancellation.

Fixes: 810082e "libmultipath, multipathd: Rework SIGPIPE handling"
Fixes: 534ec4c "multipathd: Ensure that SIGINT, SIGTERM, SIGHUP and SIGUSR1
are delivered to the uxsock thread"

Signed-off-by: Martin Wilck <mwilck@suse.com>
libmultipath/io_err_stat.c
multipathd/main.c
multipathd/uxlsnr.c