From 53b9a24ce38acc79d8086b502f0e8ff048ef67bc Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 27 Jun 2009 22:28:47 +0200 Subject: [PATCH] tldap: Don't fire off more than one read_ldap request during searches --- source3/lib/tldap.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/source3/lib/tldap.c b/source3/lib/tldap.c index 376e03f80c3..0f9e67869c3 100644 --- a/source3/lib/tldap.c +++ b/source3/lib/tldap.c @@ -591,20 +591,32 @@ static void tldap_msg_received(struct tevent_req *subreq) ev = state->ev; talloc_set_destructor(req, NULL); - tldap_msg_destructor(req); + tldap_msg_unset_pending(req); + num_pending = talloc_array_length(ld->pending); + tevent_req_done(req); done: - if (talloc_array_length(ld->pending) > 0) { - state = tevent_req_data(ld->pending[0], - struct tldap_msg_state); - subreq = read_ldap_send(ld->pending, state->ev, ld->fd); - if (subreq == NULL) { - status = TLDAP_NO_MEMORY; - goto fail; - } - tevent_req_set_callback(subreq, tldap_msg_received, ld); + if (num_pending == 0) { + return; + } + if (talloc_array_length(ld->pending) > num_pending) { + /* + * The callback functions called from tevent_req_done() above + * have put something on the pending queue. We don't have to + * trigger the read_ldap_send(), tldap_msg_set_pending() has + * done it for us already. + */ + return; + } + + state = tevent_req_data(ld->pending[0], struct tldap_msg_state); + subreq = read_ldap_send(ld->pending, state->ev, ld->fd); + if (subreq == NULL) { + status = TLDAP_NO_MEMORY; + goto fail; } + tevent_req_set_callback(subreq, tldap_msg_received, ld); return; fail: -- 2.34.1