aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2017-09-07 09:51:49 +0200
committerTobias Brunner <tobias@strongswan.org>2017-10-10 11:13:53 +0200
commit0d08959a040708c74f1302d5af4c2ddabd328324 (patch)
tree79fd37f1616753fc42be43082762cd6e5205c103 /src
parent59db98fb941ca2c30b9d5c83da2fc7ae475ebeec (diff)
downloadstrongswan-0d08959a040708c74f1302d5af4c2ddabd328324.tar.bz2
strongswan-0d08959a040708c74f1302d5af4c2ddabd328324.tar.xz
watcher: Don't notify watcher if removed FD was not found
This can happen if a stream is used blocking exclusively (the FD is never registered with watcher, but is removed in the stream's destructor just in case it ever was - doing this conditionally would require an additional flag in streams). There may be no thread reading from the read end of the notify pipe (e.g. in starter), causing the write to the notify pipe to block after it's full. Anyway, doing a relatively expensive FD update is unnecessary if there were no changes. Fixes #1453.
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/processing/watcher.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libstrongswan/processing/watcher.c b/src/libstrongswan/processing/watcher.c
index df6066b19..4466e91eb 100644
--- a/src/libstrongswan/processing/watcher.c
+++ b/src/libstrongswan/processing/watcher.c
@@ -513,6 +513,7 @@ METHOD(watcher_t, remove_, void,
private_watcher_t *this, int fd)
{
entry_t *entry, *prev = NULL;
+ bool found = FALSE;
this->mutex->lock(this->mutex);
while (TRUE)
@@ -530,6 +531,7 @@ METHOD(watcher_t, remove_, void,
break;
}
entry = remove_entry(this, entry, prev);
+ found = TRUE;
continue;
}
prev = entry;
@@ -541,8 +543,10 @@ METHOD(watcher_t, remove_, void,
}
this->condvar->wait(this->condvar, this->mutex);
}
-
- update(this);
+ if (found)
+ {
+ update(this);
+ }
this->mutex->unlock(this->mutex);
}