diff --git a/source4/lib/ldb/ldb_ildap/ldb_ildap.c b/source4/lib/ldb/ldb_ildap/ldb_ildap.c index 53257a1ab09..6eb2e1719c8 100644 --- a/source4/lib/ldb/ldb_ildap/ldb_ildap.c +++ b/source4/lib/ldb/ldb_ildap/ldb_ildap.c @@ -278,6 +278,13 @@ static void ildb_callback(struct ldap_request *req) break; case LDAP_TAG_SearchRequest: + /* check if we are already processing this request */ + if (req->in_dispatch_replies) { + return; + } + + req->in_dispatch_replies = true; + /* loop over all messages */ for (i = 0; i < req->num_replies; i++) { @@ -327,6 +334,7 @@ static void ildb_callback(struct ldap_request *req) if (ret != LDB_SUCCESS) { callback_failed = true; } + break; case LDAP_TAG_SearchResultReference: @@ -337,6 +345,7 @@ static void ildb_callback(struct ldap_request *req) if (ret != LDB_SUCCESS) { callback_failed = true; } + break; default: @@ -350,6 +359,8 @@ static void ildb_callback(struct ldap_request *req) } } + req->in_dispatch_replies = false; + talloc_free(req->replies); req->replies = NULL; req->num_replies = 0; diff --git a/source4/libcli/ldap/ldap_client.h b/source4/libcli/ldap/ldap_client.h index 084de2e6dc3..d6ca29f8a7d 100644 --- a/source4/libcli/ldap/ldap_client.h +++ b/source4/libcli/ldap/ldap_client.h @@ -37,6 +37,10 @@ struct ldap_request { int num_replies; struct ldap_message **replies; + /* mark while we are processing replies + * in request of type LDAP_TAG_SearchRequest */ + bool in_dispatch_replies; + NTSTATUS status; DATA_BLOB data; struct {