diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-03-19 17:16:14 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2013-04-19 10:57:16 +0200 |
commit | cfd529c003bb9174c22f67224f1060f4292bfb30 (patch) | |
tree | db123ad285b411ab36ff4165c98f7adbe52385db | |
parent | 3136ee75bee344d292d6817e8391980ee7a28bea (diff) | |
download | fuse-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-- | ChangeLog | 6 | ||||
-rw-r--r-- | lib/fuse_loop_mt.c | 2 |
2 files changed, 8 insertions, 0 deletions
@@ -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); |