aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog.rst6
-rw-r--r--lib/fuse_signals.c14
2 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog.rst b/ChangeLog.rst
index 2b119a9..3bf56b7 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -1,3 +1,9 @@
+Unreleased Changes
+==================
+
+* `fuse_main()` / `fuse_remove_signal_handlers()`: do not reset
+ `SIGPIPE` handler to `SIG_DFL` it was not set by us.
+
libfuse 3.0.2 (2017-05-24)
==========================
diff --git a/lib/fuse_signals.c b/lib/fuse_signals.c
index a1bf1d5..db059e1 100644
--- a/lib/fuse_signals.c
+++ b/lib/fuse_signals.c
@@ -32,6 +32,11 @@ static void exit_handler(int sig)
}
}
+static void do_nothing(int sig)
+{
+ (void) sig;
+}
+
static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
{
struct sigaction sa;
@@ -57,10 +62,15 @@ static int set_one_signal_handler(int sig, void (*handler)(int), int remove)
int fuse_set_signal_handlers(struct fuse_session *se)
{
+ /* If we used SIG_IGN instead of the do_nothing function,
+ then we would be unable to tell if we set SIG_IGN (and
+ thus should reset to SIG_DFL in fuse_remove_signal_handlers)
+ or if it was already set to SIG_IGN (and should be left
+ untouched. */
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)
+ set_one_signal_handler(SIGPIPE, do_nothing, 0) == -1)
return -1;
fuse_instance = se;
@@ -78,5 +88,5 @@ void fuse_remove_signal_handlers(struct fuse_session *se)
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);
+ set_one_signal_handler(SIGPIPE, do_nothing, 1);
}