uloop: fix deleting pending fd events on uloop_fd_del
authorFelix Fietkau <nbd@openwrt.org>
Wed, 31 Jul 2013 22:01:00 +0000 (00:01 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 31 Jul 2013 22:01:40 +0000 (00:01 +0200)
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>
uloop.c

diff --git a/uloop.c b/uloop.c
index deb08a3..9a0590f 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -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);