From dbcdf3e39c359241b743a9455ae695e14a30caa9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 3 Jun 2011 12:31:11 -0700 Subject: Fix the poll() backend to correctly respond to POLLHUP|POLLERR returns on a fd selected for TEVENT_FD_WRITE only. Don't trigger the write handler and remove the POLLOUT flag for this fd. Report errors on TEVENT_FD_READ requests only. Metze please check ! Jeremy. Autobuild-User: Jeremy Allison Autobuild-Date: Fri Jun 3 22:53:52 CEST 2011 on sn-devel-104 --- lib/tevent/tevent_poll.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'lib/tevent') diff --git a/lib/tevent/tevent_poll.c b/lib/tevent/tevent_poll.c index 712255b373..0b782e99bb 100644 --- a/lib/tevent/tevent_poll.c +++ b/lib/tevent/tevent_poll.c @@ -233,7 +233,19 @@ static int poll_event_loop_poll(struct tevent_context *ev, pfd = &poll_ev->fds[pfd_idx]; - if (pfd->revents & (POLLIN|POLLHUP|POLLERR)) { + if (pfd->revents & (POLLHUP|POLLERR)) { + /* If we only wait for TEVENT_FD_WRITE, we + should not tell the event handler about it, + and remove the writable flag, as we only + report errors when waiting for read events + to match the select behavior. */ + if (!(fde->flags & TEVENT_FD_READ)) { + TEVENT_FD_NOT_WRITEABLE(fde); + continue; + } + flags |= TEVENT_FD_READ; + } + if (pfd->revents & POLLIN) { flags |= TEVENT_FD_READ; } if (pfd->revents & POLLOUT) { -- cgit