From 783aa85c1b95e1256eb815ecde7a2b160379a498 Mon Sep 17 00:00:00 2001 From: Jonas Zeiger Date: Wed, 12 Feb 2020 15:06:25 +0100 Subject: [PATCH] GUACAMOLE-958: Avoid race/deadlock in guacd_timed_client_free() --- src/guacd/proc.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/guacd/proc.c b/src/guacd/proc.c index 27ad69c2..aacf2b03 100644 --- a/src/guacd/proc.c +++ b/src/guacd/proc.c @@ -267,24 +267,24 @@ static int guacd_timed_client_free(guac_client* client, int timeout) { .tv_nsec = current_time.tv_usec * 1000 }; - /* Free the client in a separate thread, so we can time the free operation */ - if (pthread_create(&client_free_thread, NULL, - guacd_client_free_thread, &free_operation)) - return 1; - /* The mutex associated with the pthread conditional and flag MUST be * acquired before attempting to wait for the condition */ if (pthread_mutex_lock(&free_operation.completed_mutex)) return 1; - /* Wait a finite amount of time for the free operation to finish */ - if (pthread_cond_timedwait(&free_operation.completed_cond, - &free_operation.completed_mutex, &deadline)) - return 1; + /* Free the client in a separate thread, so we can time the free operation */ + if (!pthread_create(&client_free_thread, NULL, + guacd_client_free_thread, &free_operation)) { + + /* Wait a finite amount of time for the free operation to finish */ + (void) pthread_cond_timedwait(&free_operation.completed_cond, + &free_operation.completed_mutex, &deadline); + } + + (void) pthread_mutex_unlock(&free_operation.completed_mutex); /* Return status of free operation */ return !free_operation.completed; - } /**