From 5ca69148844e2f8940b571aef0812e85e08b7cc5 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 27 Feb 2013 10:18:44 -0800 Subject: tevent: Fix multiple handler on the same fd bug in the tevent select backend. When we're deciding what handlers to call in the select backend, we didn't take into account the fact that the same fd may have been added into the read FD_SET and the write FD_SET but with different handlers. We must match on both the file descriptor and the flags requested before calling the handler. Signed-off-by: Jeremy Allison Reviewed-by: Stefan Metzmacher --- lib/tevent/tevent_select.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/tevent') diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c index ffb0d18c2e..24032631f8 100644 --- a/lib/tevent/tevent_select.c +++ b/lib/tevent/tevent_select.c @@ -210,8 +210,12 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru for (fde = select_ev->ev->fd_events; fde; fde = fde->next) { uint16_t flags = 0; - if (FD_ISSET(fde->fd, &r_fds)) flags |= TEVENT_FD_READ; - if (FD_ISSET(fde->fd, &w_fds)) flags |= TEVENT_FD_WRITE; + if (FD_ISSET(fde->fd, &r_fds) && (fde->flags & TEVENT_FD_READ)) { + flags |= TEVENT_FD_READ; + } + if (FD_ISSET(fde->fd, &w_fds) && (fde->flags & TEVENT_FD_WRITE)) { + flags |= TEVENT_FD_WRITE; + } if (flags) { fde->handler(select_ev->ev, fde, flags, fde->private_data); break; -- cgit