summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2009-10-07 14:06:53 +0200
committerKarolin Seeger <kseeger@samba.org>2009-10-20 15:00:26 +0200
commit4e458a6b46c20ed61695df2c8fc765139d021419 (patch)
tree19b69b446318dad1aeadf58f06faf88e0cb6d51a /source3
parentede45f4fab7768fb0838d1546d0b78e4abc2ea34 (diff)
downloadsamba-4e458a6b46c20ed61695df2c8fc765139d021419.tar.gz
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)
Diffstat (limited to 'source3')
-rw-r--r--source3/winbindd/winbindd.c12
1 files changed, 9 insertions, 3 deletions
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;
}