diff options
author | Volker Lendecke <vl@samba.org> | 2009-10-07 14:06:53 +0200 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2009-10-20 15:00:26 +0200 |
commit | 4e458a6b46c20ed61695df2c8fc765139d021419 (patch) | |
tree | 19b69b446318dad1aeadf58f06faf88e0cb6d51a /source3 | |
parent | ede45f4fab7768fb0838d1546d0b78e4abc2ea34 (diff) | |
download | samba-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.c | 12 |
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; } |