From b08292a52064c37bc68f1bff05ba7ebf5db5ac0c Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 23 Oct 2013 16:05:40 +0200 Subject: [PATCH] semaphore: Support cancellation in wait functions of semaphore fallback Semaphore wait functions should be a thread cancellation point, but did not properly release the mutex in the fallback implementation. --- src/libstrongswan/threading/semaphore.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libstrongswan/threading/semaphore.c b/src/libstrongswan/threading/semaphore.c index b785ff944..d90588b50 100644 --- a/src/libstrongswan/threading/semaphore.c +++ b/src/libstrongswan/threading/semaphore.c @@ -26,6 +26,7 @@ #ifdef HAVE_SEM_TIMEDWAIT #include #else /* !HAVE_SEM_TIMEDWAIT */ +#include #include #endif /* HAVE_SEM_TIMEDWAIT */ @@ -73,12 +74,13 @@ METHOD(semaphore_t, wait_, void, sem_wait(&this->sem); #else /* !HAVE_SEM_TIMEDWAIT */ this->mutex->lock(this->mutex); + thread_cleanup_push((void*)this->mutex->unlock, this->mutex); while (this->count == 0) { this->cond->wait(this->cond, this->mutex); } this->count--; - this->mutex->unlock(this->mutex); + thread_cleanup_pop(TRUE); #endif /* HAVE_SEM_TIMEDWAIT */ } @@ -96,16 +98,17 @@ METHOD(semaphore_t, timed_wait_abs, bool, return sem_timedwait(&this->sem, &ts) == -1; #else /* !HAVE_SEM_TIMEDWAIT */ this->mutex->lock(this->mutex); + thread_cleanup_push((void*)this->mutex->unlock, this->mutex); while (this->count == 0) { if (this->cond->timed_wait_abs(this->cond, this->mutex, tv)) { - this->mutex->unlock(this->mutex); + thread_cleanup_pop(TRUE); return TRUE; } } this->count--; - this->mutex->unlock(this->mutex); + thread_cleanup_pop(TRUE); return FALSE; #endif /* HAVE_SEM_TIMEDWAIT */ } @@ -176,4 +179,3 @@ semaphore_t *semaphore_create(u_int value) return &this->public; } -