aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_signals.c
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2025-03-30 22:43:09 +0200
committerBernd Schubert <bernd@bsbernd.com>2025-04-24 16:10:40 +0200
commitc5dbcdce2d1942abb567d03bf9dafb74f06b5769 (patch)
tree9bf54e908b73c2acae3b326c930a1e243c354dad /lib/fuse_signals.c
parente025a78d9b296bc78e9e3ac2925d8bc0ec26d702 (diff)
downloadlibfuse-c5dbcdce2d1942abb567d03bf9dafb74f06b5769.tar.gz
Fix multi-threaded fuse session exit
Issue with previous code was that fuse_session_exit() didn't wake up the semaphore in fuse_loop_mt.c. Lock, semaphore and all uses of checking for "exited" are now moved to struct fuse_session to have it available for the signal handler. This also removes internal fuse_session_reset() calls, as that makes testing hard. From git history I also don't see why it was added. Closes: https://github.com/libfuse/libfuse/issues/997 Signed-off-by: Bernd Schubert <bschubert@ddn.com>
Diffstat (limited to 'lib/fuse_signals.c')
-rw-r--r--lib/fuse_signals.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/fuse_signals.c b/lib/fuse_signals.c
index 6ac7230..3848aec 100644
--- a/lib/fuse_signals.c
+++ b/lib/fuse_signals.c
@@ -22,7 +22,12 @@
#include <execinfo.h>
#endif
+/*
+ * Must not handle SIGCANCEL, as that is used to wake up threads from
+ * syscalls reading requests from /dev/fuse
+ */
static int teardown_sigs[] = { SIGHUP, SIGINT, SIGTERM };
+
static int ignore_sigs[] = { SIGPIPE};
static int fail_sigs[] = { SIGILL, SIGTRAP, SIGABRT, SIGBUS, SIGFPE, SIGSEGV };
static struct fuse_session *fuse_instance;
@@ -53,8 +58,14 @@ static void dump_stack(void)
static void exit_handler(int sig)
{
- if (fuse_instance == NULL)
+ if (fuse_instance == NULL) {
+ fuse_log(FUSE_LOG_ERR, "fuse_instance is NULL\n");
return;
+ }
+
+ if (fuse_instance->debug)
+ fuse_log(FUSE_LOG_ERR, "exit_handler called with sig %d\n",
+ sig);
fuse_session_exit(fuse_instance);