From 705a20619f4987983f93be5a26190bbb3c8c5ab9 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 18 Apr 2023 15:55:10 +0200 Subject: [PATCH] watcher: Make sure to re-activate the correct entry after a callback Since the same FD may be added multiple times (e.g. with separate callbacks for WATCHER_READ and WATCHER_WRITE), the previous check might not have found the correct entry. As the entry can't be removed while in a callback, the pointer comparison is fine. --- src/libstrongswan/processing/watcher.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/libstrongswan/processing/watcher.c b/src/libstrongswan/processing/watcher.c index c4d11e9fc6..f78a6c5b1a 100644 --- a/src/libstrongswan/processing/watcher.c +++ b/src/libstrongswan/processing/watcher.c @@ -153,6 +153,8 @@ static entry_t *remove_entry(private_watcher_t *this, entry_t *entry, * Data we pass on for an async notification */ typedef struct { + /** triggering entry */ + entry_t *entry; /** file descriptor */ int fd; /** event type */ @@ -227,7 +229,7 @@ static void notify_end(notify_data_t *data) this->mutex->lock(this->mutex); for (entry = this->fds; entry; prev = entry, entry = entry->next) { - if (entry->fd == data->fd) + if (entry == data->entry) { if (!data->keep) { @@ -277,6 +279,7 @@ static void notify(private_watcher_t *this, entry_t *entry, /* get a copy of entry for async job, but with specific event */ INIT(data, + .entry = entry, .fd = entry->fd, .event = event, .cb = entry->cb, -- 2.47.2