From a69800b16b1ef3ae1da0a5d37d2d34bba4c20de4 Mon Sep 17 00:00:00 2001 From: Philippe Gerum Date: Sat, 28 Mar 2020 16:46:00 +0100 Subject: [PATCH] eshi: fix access race to thread index tree Signed-off-by: Philippe Gerum --- eshi/thread.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/eshi/thread.c b/eshi/thread.c index 66be9d1..3bb274f 100644 --- a/eshi/thread.c +++ b/eshi/thread.c @@ -22,6 +22,8 @@ struct evl_tsd { pthread_t thread; } evl_tsd; +static pthread_mutex_t evl_tsd_lock = PTHREAD_MUTEX_INITIALIZER; + static pthread_key_t tsd_key; static void *fdtree_root; @@ -51,7 +53,9 @@ int evl_attach_self(const char *fmt, ...) evl_tsd.fd = fd; evl_tsd.thread = pthread_self(); + pthread_mutex_lock(&evl_tsd_lock); node = (struct evl_tsd **)tsearch(&evl_tsd, &fdtree_root, compare_nodes); + pthread_mutex_unlock(&evl_tsd_lock); if (!node) { close(fd); return -ENOMEM; @@ -71,7 +75,9 @@ int evl_detach_self(void) return -EPERM; pthread_setspecific(tsd_key, NULL); + pthread_mutex_lock(&evl_tsd_lock); tdelete(&evl_tsd, &fdtree_root, compare_nodes); + pthread_mutex_unlock(&evl_tsd_lock); close(evl_efd); evl_efd = -1; @@ -89,7 +95,9 @@ pthread_t eshi_find_thread_by_fd(int fd) .fd = fd, }, **node; + pthread_mutex_lock(&evl_tsd_lock); node = tsearch(&tsd, &fdtree_root, compare_nodes); + pthread_mutex_unlock(&evl_tsd_lock); if (!node) return (pthread_t)NULL;