mirror of
https://github.com/samba-team/samba.git
synced 2025-08-03 04:22:09 +03:00
s4/ldap: Refactor the fix for ldap nested searches
Current implementation synchronizes processing for all types of LDAP request, not only LDAP_Search ones. Synchronization for ldap replies processing is done locally in ldb_ildap module as this concerns only ildb_callback() function. Signed-off-by: Anatoliy Atanasov <anatoliy.atanasov@postpath.com>
This commit is contained in:
committed by
Anatoliy Atanasov
parent
d07cd37b99
commit
8078614814
@ -61,6 +61,10 @@ struct ildb_context {
|
||||
struct ildb_private *ildb;
|
||||
struct ldap_request *ireq;
|
||||
|
||||
/* indicate we are already processing
|
||||
* the ldap_request in ildb_callback() */
|
||||
bool in_ildb_callback;
|
||||
|
||||
bool done;
|
||||
|
||||
struct ildb_destructor_ctx *dc;
|
||||
@ -223,6 +227,13 @@ static void ildb_callback(struct ldap_request *req)
|
||||
request_done = false;
|
||||
controls = NULL;
|
||||
|
||||
/* check if we are already processing this request */
|
||||
if (ac->in_ildb_callback) {
|
||||
return;
|
||||
}
|
||||
/* mark the request as being in process */
|
||||
ac->in_ildb_callback = true;
|
||||
|
||||
if (!NT_STATUS_IS_OK(req->status)) {
|
||||
ret = ildb_map_error(ac->module, req->status);
|
||||
ildb_request_done(ac, NULL, ret);
|
||||
@ -278,13 +289,6 @@ 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++) {
|
||||
|
||||
@ -359,8 +363,6 @@ static void ildb_callback(struct ldap_request *req)
|
||||
}
|
||||
}
|
||||
|
||||
req->in_dispatch_replies = false;
|
||||
|
||||
talloc_free(req->replies);
|
||||
req->replies = NULL;
|
||||
req->num_replies = 0;
|
||||
@ -384,6 +386,10 @@ static void ildb_callback(struct ldap_request *req)
|
||||
if (request_done) {
|
||||
ildb_request_done(ac, controls, ret);
|
||||
}
|
||||
|
||||
/* unmark the request as beign in progress */
|
||||
ac->in_ildb_callback = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -37,10 +37,6 @@ 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 {
|
||||
|
Reference in New Issue
Block a user