summaryrefslogtreecommitdiff
path: root/source4/lib/ldb
diff options
context:
space:
mode:
authorKamen Mazdrashki <kamen.mazdrashki@postpath.com>2010-01-29 19:05:51 +0200
committerAnatoliy Atanasov <anatoliy.atanasov@postpath.com>2010-02-17 18:03:31 +0200
commit80786148145e128c961a6f80a05585a17dfca63b (patch)
treecea8adfe8ad056b63792843dbabdf53d87efc20a /source4/lib/ldb
parentd07cd37b993d3c9beded20323174633b806196b5 (diff)
downloadsamba-80786148145e128c961a6f80a05585a17dfca63b.tar.gz
samba-80786148145e128c961a6f80a05585a17dfca63b.tar.bz2
samba-80786148145e128c961a6f80a05585a17dfca63b.zip
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>
Diffstat (limited to 'source4/lib/ldb')
-rw-r--r--source4/lib/ldb/ldb_ildap/ldb_ildap.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/source4/lib/ldb/ldb_ildap/ldb_ildap.c b/source4/lib/ldb/ldb_ildap/ldb_ildap.c
index 6eb2e1719c..b731f6570b 100644
--- a/source4/lib/ldb/ldb_ildap/ldb_ildap.c
+++ b/source4/lib/ldb/ldb_ildap/ldb_ildap.c
@@ -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;
}