summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2013-03-19 17:16:14 +0100
committerMiklos Szeredi <mszeredi@suse.cz>2013-04-19 10:57:16 +0200
commitcfd529c003bb9174c22f67224f1060f4292bfb30 (patch)
treedb123ad285b411ab36ff4165c98f7adbe52385db
parent3136ee75bee344d292d6817e8391980ee7a28bea (diff)
downloadfuse-cfd529c003bb9174c22f67224f1060f4292bfb30.tar.gz
libfuse: fix thread cancel race
Exiting a worker my race with cancelling that same worker. This caused a segmenation fault. Reported and tested by Anatol Pomozov
-rw-r--r--ChangeLog6
-rw-r--r--lib/fuse_loop_mt.c2
2 files changed, 8 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ff215da..b949351 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-19 Miklos Szeredi <miklos@szeredi.hu>
+
+ * libfuse: fix thread cancel race. Exiting a worker my race with
+ cancelling that same worker. This caused a segmenation
+ fault. Reported and tested by Anatol Pomozov
+
2011-02-02 Miklos Szeredi <miklos@szeredi.hu>
* libfuse: In fuse_session_loop_mt() don't pause when exiting the
diff --git a/lib/fuse_loop_mt.c b/lib/fuse_loop_mt.c
index d3c4984..b8cad09 100644
--- a/lib/fuse_loop_mt.c
+++ b/lib/fuse_loop_mt.c
@@ -219,9 +219,11 @@ int fuse_session_loop_mt(struct fuse_session *se)
while (!fuse_session_exited(se))
sem_wait(&mt.finish);
+ pthread_mutex_lock(&mt.lock);
for (w = mt.main.next; w != &mt.main; w = w->next)
pthread_cancel(w->thread_id);
mt.exit = 1;
+ pthread_mutex_unlock(&mt.lock);
while (mt.main.next != &mt.main)
fuse_join_worker(&mt, mt.main.next);