From f490434c0f1f8e63de478c6d65f264277257968a Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 22 Feb 2006 00:26:56 +0000 Subject: r13606: An attempt to fix #3525. The problem was that the supportedControls were being stolen into the result sent to the client, then talloc_free()ed. This caused them to be invalid on the next rootDSE query. This also tries to avoid attaching the result to the long-term samdb context, and avoids an extra loop in the result processing (pointed out by tridge). Andrew BARtlett (This used to be commit d0b8957f38fda4d84a318d6121ad87ba53a9ddb3) --- source4/ldap_server/ldap_backend.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'source4/ldap_server') diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c index 37e45ce3e6..1399ac18e4 100644 --- a/source4/ldap_server/ldap_backend.c +++ b/source4/ldap_server/ldap_backend.c @@ -153,7 +153,7 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) struct ldap_Result *done; struct ldapsrv_reply *ent_r, *done_r; void *local_ctx; - struct ldb_context *samdb = call->conn->ldb; + struct ldb_context *samdb = talloc_get_type(call->conn->ldb, struct ldb_context); struct ldb_dn *basedn; struct ldb_result *res = NULL; struct ldb_request lreq; @@ -163,13 +163,13 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) int success_limit = 1; int result = LDAP_SUCCESS; int ldb_ret; - int i, j, y; + int i, j; DEBUG(10, ("SearchRequest")); DEBUGADD(10, (" basedn: %s", req->basedn)); DEBUGADD(10, (" filter: %s\n", ldb_filter_from_tree(call, req->tree))); - local_ctx = talloc_named(call, 0, "sldb_Search local memory context"); + local_ctx = talloc_new(call); NT_STATUS_HAVE_NO_MEMORY(local_ctx); basedn = ldb_dn_explode(local_ctx, req->basedn); @@ -228,7 +228,8 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) ldb_ret = ldb_request(samdb, &lreq); - res = talloc_steal(samdb, lreq.op.search.res); + /* Ensure we don't keep the search results around for too long */ + res = talloc_steal(local_ctx, lreq.op.search.res); if (ldb_ret == LDB_SUCCESS) { for (i = 0; i < res->count; i++) { @@ -253,14 +254,8 @@ static NTSTATUS ldapsrv_SearchRequest(struct ldapsrv_call *call) continue; } ent->attributes[j].num_values = res->msgs[i]->elements[j].num_values; - ent->attributes[j].values = talloc_array(ent->attributes, - DATA_BLOB, ent->attributes[j].num_values); - NT_STATUS_HAVE_NO_MEMORY(ent->attributes[j].values); - for (y=0; y < ent->attributes[j].num_values; y++) { - ent->attributes[j].values[y].length = res->msgs[i]->elements[j].values[y].length; - ent->attributes[j].values[y].data = talloc_steal(ent->attributes[j].values, - res->msgs[i]->elements[j].values[y].data); - } + ent->attributes[j].values = res->msgs[i]->elements[j].values; + talloc_steal(ent->attributes, res->msgs[i]->elements[j].values); } queue_reply: ldapsrv_queue_reply(call, ent_r); @@ -287,6 +282,7 @@ reply: } if (res->controls) { done_r->msg->controls = (struct ldap_Control **)(res->controls); + talloc_steal(done_r, res->controls); } } else { DEBUG(10,("SearchRequest: error\n")); -- cgit