diff options
author | Kamen Mazdrashki <kamen.mazdrashki@postpath.com> | 2010-01-29 19:05:51 +0200 |
---|---|---|
committer | Anatoliy Atanasov <anatoliy.atanasov@postpath.com> | 2010-02-17 18:03:31 +0200 |
commit | 80786148145e128c961a6f80a05585a17dfca63b (patch) | |
tree | cea8adfe8ad056b63792843dbabdf53d87efc20a /source4/lib/ldb | |
parent | d07cd37b993d3c9beded20323174633b806196b5 (diff) | |
download | samba-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.c | 24 |
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; } |