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.
This commit is contained in:
Tobias Brunner 2023-04-18 15:55:10 +02:00
parent 34e9cdbcac
commit 705a20619f

View File

@ -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,