From 4e458a6b46c20ed61695df2c8fc765139d021419 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 7 Oct 2009 14:06:53 +0200 Subject: s3:winbind: Only ever handle one event after a select call While handling an fd event, the situation with other fds can change. I've just seen a winbind stuck in the accept() call on the privileged pipe. I can only imagine this happen because under high load we first handled other requests and meanwhile the client on the privileged pipe went away. (cherry picked from commit 8ef4a183da8bdc9997c198678a931b111396c104) --- source3/winbindd/winbindd.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'source3') diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 7d899408915..e98b7994adb 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1037,7 +1037,9 @@ static void process_loop(void) int maxfd = 0, selret; struct timeval timeout, ev_timeout; - run_events(winbind_event_context(), 0, NULL, NULL); + if (run_events(winbind_event_context(), 0, NULL, NULL)) { + return; + } /* Initialise fd lists for select() */ @@ -1091,7 +1093,9 @@ static void process_loop(void) /* selret > 0 */ - run_events(winbind_event_context(), selret, &r_fds, &w_fds); + if (run_events(winbind_event_context(), selret, &r_fds, &w_fds)) { + return; + } ev = fd_events; while (ev != NULL) { @@ -1101,8 +1105,10 @@ static void process_loop(void) flags |= EVENT_FD_READ; if (FD_ISSET(ev->fd, &w_fds)) flags |= EVENT_FD_WRITE; - if (flags) + if (flags) { ev->handler(ev, flags); + return; + } ev = next; } -- cgit v1.2.1