diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-08-01 02:01:00 +0400 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-08-01 02:01:40 +0400 |
commit | 04f194aa8a04926fe7f2e42bbf9ba6c62d49339e (patch) | |
tree | a8f00f6f8ec6da3c946d087343ad0c7f2832b7b3 /uloop.c | |
parent | ef9b6b92df223e783a365f34998bc0f299b977f2 (diff) |
uloop: fix deleting pending fd events on uloop_fd_del
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>
Diffstat (limited to 'uloop.c')
-rw-r--r-- | uloop.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -392,15 +392,16 @@ int uloop_fd_delete(struct uloop_fd *fd) { 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); |