aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2014-06-11 15:04:15 +0200
committerMartin Willi <martin@revosec.ch>2014-06-17 15:19:47 +0200
commitbc1139480f42859a4b26fe8518ef9dd7c2849a49 (patch)
treef988a5a397831b20697587dee855eab577cb9af2 /src
parent23750961d5b9052ddfe6d4746435e84ca0c87a10 (diff)
downloadstrongswan-bc1139480f42859a4b26fe8518ef9dd7c2849a49.tar.bz2
strongswan-bc1139480f42859a4b26fe8518ef9dd7c2849a49.tar.xz
watcher: Prevent race condition spawning multiple watcher threads
If file descriptors get added and removed in rapid succession, the active watcher thread might not take notice of it and continues running. However, add() spawns a watcher thread whenever a file descriptor is added to an empty set. This could result in multiple watcher threads, which is fixed by a proper check for running watchers.
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/processing/watcher.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/libstrongswan/processing/watcher.c b/src/libstrongswan/processing/watcher.c
index 560e47299..3518dfdae 100644
--- a/src/libstrongswan/processing/watcher.c
+++ b/src/libstrongswan/processing/watcher.c
@@ -260,8 +260,10 @@ static job_requeue_t watch(private_watcher_t *this)
FD_ZERO(&ex);
this->mutex->lock(this->mutex);
+
if (this->fds->get_count(this->fds) == 0)
{
+ this->running = FALSE;
this->mutex->unlock(this->mutex);
return JOB_REQUEUE_NONE;
}
@@ -405,7 +407,7 @@ METHOD(watcher_t, add, void,
this->mutex->lock(this->mutex);
this->fds->insert_last(this->fds, entry);
- if (this->fds->get_count(this->fds) == 1)
+ if (!this->running)
{
this->running = TRUE;
lib->processor->queue_job(lib->processor,