libfuse: fix fuse_remove_signal_handlers()
authorMiklos Szeredi <mszeredi@suse.cz>
Thu, 26 Feb 2015 15:57:41 +0000 (16:57 +0100)
committerMiklos Szeredi <mszeredi@suse.cz>
Thu, 26 Feb 2015 15:57:41 +0000 (16:57 +0100)
to properly restore the default signal handler.

Reported by: Chris Johnson <johnsocg@gmail.com>

ChangeLog
lib/fuse_signals.c

index 7c134fca536459baac0d2a0aa11a8c2d5b63aad3..983a7d958e020adcee5b21b1bb62e5714d2927e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-26  Miklos Szeredi <miklos@szeredi.hu>
+
+       * libfuse: fix fuse_remove_signal_handlers() to properly restore
+       the default signal handler.  Reported by: Chris Johnson
+
 2014-07-21  Miklos Szeredi <miklos@szeredi.hu>
 
        * libfuse: highlevel API: fix directory file handle passed to
index c78c62d50ca095fe220daf6ed95bd621c06ee631..b992b71f8caebcdd1579b74511c2c19756f48897 100755 (executable)
@@ -24,13 +24,13 @@ static void exit_handler(int sig)
 }
 /*! [doxygen_exit_handler] */
 
-static int set_one_signal_handler(int sig, void (*handler)(int))
+static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
 {
        struct sigaction sa;
        struct sigaction old_sa;
 
        memset(&sa, 0, sizeof(struct sigaction));
-       sa.sa_handler = handler;
+       sa.sa_handler = remove ? SIG_DFL : handler;
        sigemptyset(&(sa.sa_mask));
        sa.sa_flags = 0;
 
@@ -39,7 +39,7 @@ static int set_one_signal_handler(int sig, void (*handler)(int))
                return -1;
        }
 
-       if (old_sa.sa_handler == SIG_DFL &&
+       if (old_sa.sa_handler == (remove ? handler : SIG_DFL) &&
            sigaction(sig, &sa, NULL) == -1) {
                perror("fuse: cannot set signal handler");
                return -1;
@@ -49,10 +49,10 @@ static int set_one_signal_handler(int sig, void (*handler)(int))
 
 int fuse_set_signal_handlers(struct fuse_session *se)
 {
-       if (set_one_signal_handler(SIGHUP, exit_handler) == -1 ||
-           set_one_signal_handler(SIGINT, exit_handler) == -1 ||
-           set_one_signal_handler(SIGTERM, exit_handler) == -1 ||
-           set_one_signal_handler(SIGPIPE, SIG_IGN) == -1)
+       if (set_one_signal_handler(SIGHUP, exit_handler, 0) == -1 ||
+           set_one_signal_handler(SIGINT, exit_handler, 0) == -1 ||
+           set_one_signal_handler(SIGTERM, exit_handler, 0) == -1 ||
+           set_one_signal_handler(SIGPIPE, SIG_IGN, 0) == -1)
                return -1;
 
        fuse_instance = se;
@@ -67,9 +67,9 @@ void fuse_remove_signal_handlers(struct fuse_session *se)
        else
                fuse_instance = NULL;
 
-       set_one_signal_handler(SIGHUP, SIG_DFL);
-       set_one_signal_handler(SIGINT, SIG_DFL);
-       set_one_signal_handler(SIGTERM, SIG_DFL);
-       set_one_signal_handler(SIGPIPE, SIG_DFL);
+       set_one_signal_handler(SIGHUP, exit_handler, 1);
+       set_one_signal_handler(SIGINT, exit_handler, 1);
+       set_one_signal_handler(SIGTERM, exit_handler, 1);
+       set_one_signal_handler(SIGPIPE, SIG_IGN, 1);
 }