aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2015-02-26 16:57:41 +0100
committerDan Pasanen <dan.pasanen@gmail.com>2015-10-28 21:00:19 -0500
commit5ebf4c9631d8df268b4b8bf646a1557d8bc64c8a (patch)
tree639c475dabe2096024a04b9a1912a57726c0bb11 /lib
parentf7f37f16aabe334c2422a933010ee4ff073938f7 (diff)
downloadandroid_external_fuse-5ebf4c9631d8df268b4b8bf646a1557d8bc64c8a.tar.gz
android_external_fuse-5ebf4c9631d8df268b4b8bf646a1557d8bc64c8a.tar.bz2
android_external_fuse-5ebf4c9631d8df268b4b8bf646a1557d8bc64c8a.zip
libfuse: fix fuse_remove_signal_handlers()
to properly restore the default signal handler. Reported by: Chris Johnson <johnsocg@gmail.com> Change-Id: I691b76b7b81ef53e276a1f7bcbed9a6b1b166bab
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse_signals.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/lib/fuse_signals.c b/lib/fuse_signals.c
index 88ac39e..353cb24 100644
--- a/lib/fuse_signals.c
+++ b/lib/fuse_signals.c
@@ -21,13 +21,13 @@ static void exit_handler(int sig)
fuse_session_exit(fuse_instance);
}
-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;
@@ -36,7 +36,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;
@@ -46,10 +46,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;
@@ -64,9 +64,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);
}