s3:winbind: Only ever handle one event after a select call
authorVolker Lendecke <vl@samba.org>
Wed, 7 Oct 2009 12:06:53 +0000 (14:06 +0200)
committerKarolin Seeger <kseeger@samba.org>
Tue, 20 Oct 2009 13:00:26 +0000 (15:00 +0200)
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

index 7d8994089159ab0863f2f65ff0584a8510fcbe1d..e98b7994adb20d493640046cf840b9443eb8540e 100644 (file)
@@ -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;
        }