From: Tobias Brunner Date: Tue, 18 Apr 2023 13:55:10 +0000 (+0200) Subject: watcher: Make sure to re-activate the correct entry after a callback X-Git-Tag: 5.9.11rc1~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=705a20619f4987983f93be5a26190bbb3c8c5ab9;p=thirdparty%2Fstrongswan.git 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. --- 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,