When a fd gets deleted internally due to errors, fd->registered gets set
to false before events are moved to the staging array.
This leads to pending events not getting cleared properly when the fd
user finally calls uloop_fd_del.
Fix this by moving the check down and always checking for pending
events.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
{
int i;
- if (!fd->registered)
- return 0;
-
for (i = 0; i < cur_nfds; i++) {
if (cur_fds[cur_fd + i].fd != fd)
continue;
cur_fds[cur_fd + i].fd = NULL;
}
+
+ if (!fd->registered)
+ return 0;
+
fd->registered = false;
uloop_fd_stack_event(fd, -1);
return __uloop_fd_delete(fd);