diff options
author | Kamen Mazdrashki <kamen.mazdrashki@postpath.com> | 2010-01-25 12:22:39 +0200 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2010-01-29 14:09:53 +0100 |
commit | a4d0ed5a1027f4cb58732c78cb63464dbf9cc287 (patch) | |
tree | ef058178e5b12210710c2cdcbb94e02c8a9a84c2 | |
parent | e3d50e89ab5081ae858017f83f3258283baaf978 (diff) | |
download | samba-a4d0ed5a1027f4cb58732c78cb63464dbf9cc287.tar.gz samba-a4d0ed5a1027f4cb58732c78cb63464dbf9cc287.tar.bz2 samba-a4d0ed5a1027f4cb58732c78cb63464dbf9cc287.zip |
s4/ldap: Fix nested searches SEGFAULT bug
Signed-off-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r-- | source4/lib/ldb/ldb_ildap/ldb_ildap.c | 11 | ||||
-rw-r--r-- | source4/libcli/ldap/ldap_client.h | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/source4/lib/ldb/ldb_ildap/ldb_ildap.c b/source4/lib/ldb/ldb_ildap/ldb_ildap.c index 53257a1ab0..6eb2e1719c 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 084de2e6dc..d6ca29f8a7 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 { |