Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-08-01 02:01:00 +0400
committerFelix Fietkau <nbd@openwrt.org>2013-08-01 02:01:40 +0400
commit04f194aa8a04926fe7f2e42bbf9ba6c62d49339e (patch)
treea8f00f6f8ec6da3c946d087343ad0c7f2832b7b3 /uloop.c
parentef9b6b92df223e783a365f34998bc0f299b977f2 (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.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/uloop.c b/uloop.c
index deb08a3..9a0590f 100644
--- 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);