multipathd: Do not perform POSIX mutex operations inside a signal handler
authorBart Van Assche <bart.vanassche@sandisk.com>
Wed, 27 Jul 2016 21:13:46 +0000 (14:13 -0700)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sun, 31 Jul 2016 09:01:48 +0000 (11:01 +0200)
According to the POSIX standard, only functions that are async-signal-safe
may be invoked from inside a signal handler. The only POSIX thread functions
that are async-signal-safe are pthread_kill(), pthread_self() and
pthread_sigmask(). See also
http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
multipathd/main.c
multipathd/uxlsnr.c
multipathd/uxlsnr.h

index 1bcbbc5..7d6d9b5 100644 (file)
@@ -117,6 +117,11 @@ struct udev * udev;
 
 struct config *multipath_conf;
 
+/* Local variables */
+static volatile sig_atomic_t exit_sig;
+static volatile sig_atomic_t reconfig_sig;
+static volatile sig_atomic_t log_reset_sig;
+
 const char *
 daemon_status(void)
 {
@@ -2070,6 +2075,10 @@ signal_set(int signo, void (*func) (int))
 void
 handle_signals(void)
 {
+       if (exit_sig) {
+               condlog(2, "exit (signal)");
+               exit_daemon();
+       }
        if (reconfig_sig) {
                condlog(2, "reconfigure (signal)");
                set_config_state(DAEMON_CONFIGURE);
@@ -2080,6 +2089,7 @@ handle_signals(void)
                log_reset("multipathd");
                pthread_mutex_unlock(&logq_lock);
        }
+       exit_sig = 0;
        reconfig_sig = 0;
        log_reset_sig = 0;
 }
@@ -2093,7 +2103,7 @@ sighup (int sig)
 static void
 sigend (int sig)
 {
-       exit_daemon();
+       exit_sig = 1;
 }
 
 static void
index 0159648..d2ef0b8 100644 (file)
@@ -49,8 +49,6 @@ struct client {
 LIST_HEAD(clients);
 pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER;
 struct pollfd *polls;
-volatile sig_atomic_t reconfig_sig = 0;
-volatile sig_atomic_t log_reset_sig = 0;
 
 /*
  * handle a new client joining
index 7839fce..4ef47d5 100644 (file)
@@ -6,7 +6,4 @@ typedef int (uxsock_trigger_fn)(char *, char **, int *, void *);
 void * uxsock_listen(uxsock_trigger_fn uxsock_trigger,
                     void * trigger_data);
 
-extern volatile sig_atomic_t reconfig_sig;
-extern volatile sig_atomic_t log_reset_sig;
-
 #endif