[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-2016-gdfd56dd

Andrew Tridgell tridge at samba.org
Thu Jun 4 04:15:50 GMT 2009


The branch, master has been updated
       via  dfd56dd29415b06b5ea137f8c333da42e8ff1aa6 (commit)
       via  0849c1ef77a0538d5d232016a51c002e2197e776 (commit)
       via  8ca8dabe4615416153be9be7be16558e43d17381 (commit)
       via  da3ee2790089e771689afbebef021a8c8c776306 (commit)
      from  3ce37ae7505ec37d0d9bfb1fafe752a232741cca (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit dfd56dd29415b06b5ea137f8c333da42e8ff1aa6
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Jun 4 14:07:35 2009 +1000

    changed the auth path to use extended DN ops to avoid non-indexed searches
    
    Logs showed that every SAM authentication was causing a non-indexed
    ldb search for member=XXX. This was previously indexed in Samba4, but
    since we switched to using the indexes from the full AD schema it now
    isn't.
    
    The fix is to use the extended DN operations to allow us to ask the
    server for the memberOf attribute instead, with with the SIDs attached
    to the result. This also means one less search on every
    authentication.
    
    The patch is made more complex by the fact that some common routines
    use the result of these user searches, so we had to update all
    searches that uses user_attrs and those common routines to make sure
    they all returned a ldb_message with a memberOf filled in and the SIDs
    attached.

commit 0849c1ef77a0538d5d232016a51c002e2197e776
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Jun 4 13:52:40 2009 +1000

    fixed ldb rename now that we have unique indexes
    
    With unique indexes, any rename of a record that has an attribute that
    is uniquely indexed needs to be done as a delete followed by an add,
    otherwse you'll get an error that the attribute value already exists.

commit 8ca8dabe4615416153be9be7be16558e43d17381
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Jun 2 17:27:37 2009 +1000

    add gendb_search_single_extended_dn()
    
    This function searches for a single record using a given filter,
    adding the extended-dn control so that any returned DNs will have the
    GUID and SID fields returned. This will be used in the sam auth code
    to prevent us doing a member= search for the groups, which invokes an
    unindexed search.

commit da3ee2790089e771689afbebef021a8c8c776306
Author: Andrew Tridgell <tridge at samba.org>
Date:   Tue Jun 2 17:25:47 2009 +1000

    add NT_STATUS_HAVE_NO_MEMORY_AND_FREE()
    
    In many places we use NT_STATUS_HAVE_NO_MEMORY() to auto-return when a
    memory allocation fails. In quite a few places where we use this, we
    end up leaving a tmp_ctx behind, which creates a memory leak.
    
    This macro takes a memory context to free when returning the error

-----------------------------------------------------------------------

Summary of changes:
 lib/util/util_ldb.c               |   95 +++++++++++++++++++++++++++++++++++++
 lib/util/util_ldb.h               |    8 +++
 libcli/util/ntstatus.h            |    9 ++++
 source4/auth/ntlm/auth_sam.c      |   47 +++++++-----------
 source4/auth/sam.c                |   84 ++++++++++++++++++--------------
 source4/kdc/hdb-samba4.c          |   52 ++++++++++----------
 source4/lib/ldb/ldb_tdb/ldb_tdb.c |   41 ++++------------
 7 files changed, 214 insertions(+), 122 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/util_ldb.c b/lib/util/util_ldb.c
index c11b687..6aea776 100644
--- a/lib/util/util_ldb.c
+++ b/lib/util/util_ldb.c
@@ -130,3 +130,98 @@ char *wrap_casefold(void *context, void *mem_ctx, const char *s, size_t n)
 }
 
 
+
+/*
+  search the LDB for a single record, with the extended_dn control
+  return LDB_SUCCESS on success, or an ldb error code on error
+
+  if the search returns 0 entries, return LDB_ERR_NO_SUCH_OBJECT
+  if the search returns more than 1 entry, return LDB_ERR_CONSTRAINT_VIOLATION
+*/
+int gendb_search_single_extended_dn(struct ldb_context *ldb,
+				    TALLOC_CTX *mem_ctx,
+				    struct ldb_dn *basedn,
+				    enum ldb_scope scope,
+				    struct ldb_message **msg,
+				    const char * const *attrs,
+				    const char *format, ...) 
+{
+	va_list ap;
+	int ret;
+	struct ldb_request *req;
+	char *filter;
+	TALLOC_CTX *tmp_ctx;
+	struct ldb_result *res;
+	struct ldb_extended_dn_control *ctrl;
+
+	tmp_ctx = talloc_new(mem_ctx);
+
+	res = talloc_zero(tmp_ctx, struct ldb_result);
+	if (!res) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	va_start(ap, format);
+	filter = talloc_vasprintf(tmp_ctx, format, ap);
+	va_end(ap);
+
+	if (filter == NULL) {
+		talloc_free(tmp_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = ldb_build_search_req(&req, ldb, tmp_ctx,
+				   basedn,
+				   scope,
+				   filter,
+				   attrs,
+				   NULL,
+				   res,
+				   ldb_search_default_callback,
+				   NULL);
+	if (ret != LDB_SUCCESS) {
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+
+	ctrl = talloc(tmp_ctx, struct ldb_extended_dn_control);
+	if (ctrl == NULL) {
+		talloc_free(tmp_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;		
+	}
+
+	ctrl->type = 1;
+
+	ret = ldb_request_add_control(req, LDB_CONTROL_EXTENDED_DN_OID, true, ctrl);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	ret = ldb_request(ldb, req);
+	if (ret == LDB_SUCCESS) {
+		ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+	}
+
+	if (ret != LDB_SUCCESS) {
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+
+	if (res->count == 0) {
+		talloc_free(tmp_ctx);
+		return LDB_ERR_NO_SUCH_OBJECT;
+	}
+
+	if (res->count > 1) {
+		/* the function is only supposed to return a single
+		   entry */
+		talloc_free(tmp_ctx);
+		return LDB_ERR_CONSTRAINT_VIOLATION;
+	}
+
+	*msg = talloc_steal(mem_ctx, res->msgs[0]);
+
+	talloc_free(tmp_ctx);
+
+	return LDB_SUCCESS;
+}
diff --git a/lib/util/util_ldb.h b/lib/util/util_ldb.h
index f9eb028..4575c65 100644
--- a/lib/util/util_ldb.h
+++ b/lib/util/util_ldb.h
@@ -26,4 +26,12 @@ int gendb_search_dn(struct ldb_context *ldb,
 int gendb_add_ldif(struct ldb_context *ldb, const char *ldif_string);
 char *wrap_casefold(void *context, void *mem_ctx, const char *s, size_t n);
 
+int gendb_search_single_extended_dn(struct ldb_context *ldb,
+				    TALLOC_CTX *mem_ctx,
+				    struct ldb_dn *basedn,
+				    enum ldb_scope scope,
+				    struct ldb_message **msg,
+				    const char * const *attrs,
+				    const char *format, ...)  PRINTF_ATTRIBUTE(7,8);
+
 #endif /* __LIB_UTIL_UTIL_LDB_H__ */
diff --git a/libcli/util/ntstatus.h b/libcli/util/ntstatus.h
index a97ef53..dc1fcc4 100644
--- a/libcli/util/ntstatus.h
+++ b/libcli/util/ntstatus.h
@@ -651,6 +651,15 @@ extern bool ntstatus_check_dos_mapping;
 	}\
 } while (0)
 
+/* This varient is for when you want to free a local
+   temporary memory context in the error path */
+#define NT_STATUS_HAVE_NO_MEMORY_AND_FREE(x, ctx) do {	\
+	if (!(x)) {\
+		talloc_free(ctx); \
+		return NT_STATUS_NO_MEMORY;\
+	}\
+} while (0)
+
 #define NT_STATUS_IS_OK_RETURN(x) do { \
 	if (NT_STATUS_IS_OK(x)) {\
 		return x;\
diff --git a/source4/auth/ntlm/auth_sam.c b/source4/auth/ntlm/auth_sam.c
index 75ed324..0bb79e2 100644
--- a/source4/auth/ntlm/auth_sam.c
+++ b/source4/auth/ntlm/auth_sam.c
@@ -43,32 +43,23 @@ extern const char *domain_ref_attrs[];
 static NTSTATUS authsam_search_account(TALLOC_CTX *mem_ctx, struct ldb_context *sam_ctx,
 				       const char *account_name,
 				       struct ldb_dn *domain_dn,
-				       struct ldb_message ***ret_msgs)
+				       struct ldb_message **ret_msg)
 {
-	struct ldb_message **msgs;
-
 	int ret;
 
 	/* pull the user attributes */
-	ret = gendb_search(sam_ctx, mem_ctx, domain_dn, &msgs, user_attrs,
-			   "(&(sAMAccountName=%s)(objectclass=user))", 
-			   ldb_binary_encode_string(mem_ctx, account_name));
-	if (ret == -1) {
-		return NT_STATUS_INTERNAL_DB_CORRUPTION;
-	}
-
-	if (ret == 0) {
+	ret = gendb_search_single_extended_dn(sam_ctx, mem_ctx, domain_dn, LDB_SCOPE_SUBTREE,
+					      ret_msg, user_attrs,
+					      "(&(sAMAccountName=%s)(objectclass=user))", 
+					      ldb_binary_encode_string(mem_ctx, account_name));
+	if (ret == LDB_ERR_NO_SUCH_OBJECT) {
 		DEBUG(3,("sam_search_user: Couldn't find user [%s] in samdb, under %s\n", 
 			 account_name, ldb_dn_get_linearized(domain_dn)));
-		return NT_STATUS_NO_SUCH_USER;
+		return NT_STATUS_NO_SUCH_USER;		
 	}
-
-	if (ret > 1) {
-		DEBUG(0,("Found %d records matching user [%s]\n", ret, account_name));
+	if (ret != LDB_SUCCESS) {
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
-
-	*ret_msgs = msgs;
 	
 	return NT_STATUS_OK;
 }
@@ -147,14 +138,14 @@ static NTSTATUS authsam_password_ok(struct auth_context *auth_context,
 static NTSTATUS authsam_authenticate(struct auth_context *auth_context, 
 				     TALLOC_CTX *mem_ctx, struct ldb_context *sam_ctx, 
 				     struct ldb_dn *domain_dn,
-				     struct ldb_message **msgs,
+				     struct ldb_message *msg,
 				     const struct auth_usersupplied_info *user_info, 
 				     DATA_BLOB *user_sess_key, DATA_BLOB *lm_sess_key) 
 {
 	struct samr_Password *lm_pwd, *nt_pwd;
 	NTSTATUS nt_status;
 
-	uint16_t acct_flags = samdb_result_acct_flags(sam_ctx, mem_ctx, msgs[0], domain_dn);
+	uint16_t acct_flags = samdb_result_acct_flags(sam_ctx, mem_ctx, msg, domain_dn);
 	
 	/* Quit if the account was locked out. */
 	if (acct_flags & ACB_AUTOLOCK) {
@@ -170,7 +161,7 @@ static NTSTATUS authsam_authenticate(struct auth_context *auth_context,
 		}
 	}
 
-	nt_status = samdb_result_passwords(mem_ctx, auth_context->lp_ctx, msgs[0], &lm_pwd, &nt_pwd);
+	nt_status = samdb_result_passwords(mem_ctx, auth_context->lp_ctx, msg, &lm_pwd, &nt_pwd);
 	NT_STATUS_NOT_OK_RETURN(nt_status);
 
 	nt_status = authsam_password_ok(auth_context, mem_ctx, 
@@ -181,7 +172,7 @@ static NTSTATUS authsam_authenticate(struct auth_context *auth_context,
 	nt_status = authsam_account_ok(mem_ctx, sam_ctx, 
 				       user_info->logon_parameters,
 				       domain_dn,
-				       msgs[0],
+				       msg,
 				       user_info->workstation_name,
 				       user_info->mapped.account_name,
 				       false);
@@ -198,7 +189,7 @@ static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx
 {
 	NTSTATUS nt_status;
 	const char *account_name = user_info->mapped.account_name;
-	struct ldb_message **msgs;
+	struct ldb_message *msg;
 	struct ldb_context *sam_ctx;
 	struct ldb_dn *domain_dn;
 	DATA_BLOB user_sess_key, lm_sess_key;
@@ -226,13 +217,13 @@ static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx
 		return NT_STATUS_NO_SUCH_DOMAIN;
 	}
 
-	nt_status = authsam_search_account(tmp_ctx, sam_ctx, account_name, domain_dn, &msgs);
+	nt_status = authsam_search_account(tmp_ctx, sam_ctx, account_name, domain_dn, &msg);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		talloc_free(tmp_ctx);
 		return nt_status;
 	}
 
-	nt_status = authsam_authenticate(ctx->auth_ctx, tmp_ctx, sam_ctx, domain_dn, msgs, user_info,
+	nt_status = authsam_authenticate(ctx->auth_ctx, tmp_ctx, sam_ctx, domain_dn, msg, user_info,
 					 &user_sess_key, &lm_sess_key);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		talloc_free(tmp_ctx);
@@ -242,7 +233,7 @@ static NTSTATUS authsam_check_password_internals(struct auth_method_context *ctx
 	nt_status = authsam_make_server_info(tmp_ctx, sam_ctx, lp_netbios_name(ctx->auth_ctx->lp_ctx), 
  					     lp_sam_name(ctx->auth_ctx->lp_ctx),
 					     domain_dn,
-					     msgs[0],
+					     msg,
 					     user_sess_key, lm_sess_key,
 					     server_info);
 	if (!NT_STATUS_IS_OK(nt_status)) {
@@ -322,7 +313,7 @@ NTSTATUS authsam_get_server_info_principal(TALLOC_CTX *mem_ctx,
 	DATA_BLOB user_sess_key = data_blob(NULL, 0);
 	DATA_BLOB lm_sess_key = data_blob(NULL, 0);
 
-	struct ldb_message **msgs;
+	struct ldb_message *msg;
 	struct ldb_context *sam_ctx;
 	struct ldb_dn *domain_dn;
 	
@@ -339,7 +330,7 @@ NTSTATUS authsam_get_server_info_principal(TALLOC_CTX *mem_ctx,
 	}
 
 	nt_status = sam_get_results_principal(sam_ctx, tmp_ctx, principal, 
-					      &domain_dn, &msgs);
+					      &domain_dn, &msg);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		return nt_status;
 	}
@@ -348,7 +339,7 @@ NTSTATUS authsam_get_server_info_principal(TALLOC_CTX *mem_ctx,
 					     lp_netbios_name(auth_context->lp_ctx),
  					     lp_workgroup(auth_context->lp_ctx),
 					     domain_dn, 
-					     msgs[0],
+					     msg,
 					     user_sess_key, lm_sess_key,
 					     server_info);
 	if (NT_STATUS_IS_OK(nt_status)) {
diff --git a/source4/auth/sam.c b/source4/auth/sam.c
index c70c02c..68eaacf 100644
--- a/source4/auth/sam.c
+++ b/source4/auth/sam.c
@@ -28,6 +28,7 @@
 #include "libcli/security/security.h"
 #include "libcli/ldap/ldap.h"
 #include "librpc/gen_ndr/ndr_netlogon.h"
+#include "librpc/gen_ndr/ndr_security.h"
 #include "param/param.h"
 #include "auth/auth_sam.h"
 
@@ -66,6 +67,7 @@ const char *user_attrs[] = {
 	"badPwdCount",
 	"logonCount",
 	"primaryGroupID",
+	"memberOf",
 	NULL,
 };
 
@@ -261,9 +263,7 @@ _PUBLIC_ NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_conte
 					   struct auth_serversupplied_info **_server_info)
 {
 	struct auth_serversupplied_info *server_info;
-	struct ldb_message **group_msgs;
-	int group_ret;
-	const char *group_attrs[3] = { "sAMAccountType", "objectSid", NULL }; 
+	int group_ret = 0;
 	/* find list of sids */
 	struct dom_sid **groupSIDs = NULL;
 	struct dom_sid *account_sid;
@@ -271,39 +271,48 @@ _PUBLIC_ NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_conte
 	const char *str;
 	int i;
 	uint_t rid;
-	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
-
-	group_ret = gendb_search(sam_ctx,
-				 tmp_ctx, NULL, &group_msgs, group_attrs,
-				 "(&(member=%s)(sAMAccountType=*))", 
-				 ldb_dn_get_linearized(msg->dn));
-	if (group_ret == -1) {
-		talloc_free(tmp_ctx);
-		return NT_STATUS_INTERNAL_DB_CORRUPTION;
-	}
+	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);	
+	struct ldb_message_element *el;
 
-	server_info = talloc(mem_ctx, struct auth_serversupplied_info);
-	NT_STATUS_HAVE_NO_MEMORY(server_info);
+	server_info = talloc(tmp_ctx, struct auth_serversupplied_info);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info, tmp_ctx);
 	
-	if (group_ret > 0) {
+	el = ldb_msg_find_element(msg, "memberOf");
+	if (el != NULL) {
+		group_ret = el->num_values;
 		groupSIDs = talloc_array(server_info, struct dom_sid *, group_ret);
-		NT_STATUS_HAVE_NO_MEMORY(groupSIDs);
+		NT_STATUS_HAVE_NO_MEMORY_AND_FREE(groupSIDs, tmp_ctx);
 	}
 
-	/* Need to unroll some nested groups, but not aliases */
+	/* TODO Note: this is incomplete. We need to unroll some
+	 * nested groups, but not aliases */
 	for (i = 0; i < group_ret; i++) {
-		groupSIDs[i] = samdb_result_dom_sid(groupSIDs, 
-						    group_msgs[i], "objectSid");
-		NT_STATUS_HAVE_NO_MEMORY(groupSIDs[i]);
+		struct ldb_dn *dn;
+		const struct ldb_val *v;
+		enum ndr_err_code ndr_err;
+
+		dn = ldb_dn_from_ldb_val(tmp_ctx, sam_ctx, &el->values[i]);
+		if (dn == NULL) {
+			talloc_free(tmp_ctx);
+			return NT_STATUS_INTERNAL_DB_CORRUPTION;
+		}
+		v = ldb_dn_get_extended_component(dn, "SID");
+		groupSIDs[i] = talloc(groupSIDs, struct dom_sid);
+		NT_STATUS_HAVE_NO_MEMORY_AND_FREE(groupSIDs[i], tmp_ctx);
+
+		ndr_err = ndr_pull_struct_blob(v, groupSIDs[i], NULL, groupSIDs[i], 
+					       (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			talloc_free(tmp_ctx);
+			return NT_STATUS_INTERNAL_DB_CORRUPTION;
+		}
 	}
 
-	talloc_free(tmp_ctx);
-
 	account_sid = samdb_result_dom_sid(server_info, msg, "objectSid");
-	NT_STATUS_HAVE_NO_MEMORY(account_sid);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(account_sid, tmp_ctx);
 
 	primary_group_sid = dom_sid_dup(server_info, account_sid);
-	NT_STATUS_HAVE_NO_MEMORY(primary_group_sid);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(primary_group_sid, tmp_ctx);
 
 	rid = samdb_result_uint(msg, "primaryGroupID", ~0);
 	if (rid == ~0) {
@@ -325,30 +334,30 @@ _PUBLIC_ NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_conte
 	server_info->account_name = talloc_steal(server_info, samdb_result_string(msg, "sAMAccountName", NULL));
 
 	server_info->domain_name = talloc_strdup(server_info, domain_name);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->domain_name);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->domain_name, tmp_ctx);
 
 	str = samdb_result_string(msg, "displayName", "");
 	server_info->full_name = talloc_strdup(server_info, str);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->full_name);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->full_name, tmp_ctx);
 
 	str = samdb_result_string(msg, "scriptPath", "");
 	server_info->logon_script = talloc_strdup(server_info, str);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->logon_script);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->logon_script, tmp_ctx);
 
 	str = samdb_result_string(msg, "profilePath", "");
 	server_info->profile_path = talloc_strdup(server_info, str);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->profile_path);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->profile_path, tmp_ctx);
 
 	str = samdb_result_string(msg, "homeDirectory", "");
 	server_info->home_directory = talloc_strdup(server_info, str);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->home_directory);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->home_directory, tmp_ctx);
 
 	str = samdb_result_string(msg, "homeDrive", "");
 	server_info->home_drive = talloc_strdup(server_info, str);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->home_drive);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->home_drive, tmp_ctx);
 
 	server_info->logon_server = talloc_strdup(server_info, netbios_name);
-	NT_STATUS_HAVE_NO_MEMORY(server_info->logon_server);
+	NT_STATUS_HAVE_NO_MEMORY_AND_FREE(server_info->logon_server, tmp_ctx);
 
 	server_info->last_logon = samdb_result_nttime(msg, "lastLogon", 0);
 	server_info->last_logoff = samdb_result_nttime(msg, "lastLogoff", 0);
@@ -373,7 +382,7 @@ _PUBLIC_ NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_conte
 
 	server_info->authenticated = true;
 
-	*_server_info = server_info;
+	*_server_info = talloc_steal(mem_ctx, server_info);
 
 	return NT_STATUS_OK;
 }
@@ -381,7 +390,7 @@ _PUBLIC_ NTSTATUS authsam_make_server_info(TALLOC_CTX *mem_ctx, struct ldb_conte
 NTSTATUS sam_get_results_principal(struct ldb_context *sam_ctx,
 				   TALLOC_CTX *mem_ctx, const char *principal,
 				   struct ldb_dn **domain_dn,
-				   struct ldb_message ***msgs)
+				   struct ldb_message **msg)
 {			   
 	struct ldb_dn *user_dn;
 	NTSTATUS nt_status;
@@ -399,12 +408,13 @@ NTSTATUS sam_get_results_principal(struct ldb_context *sam_ctx,
 	}
 	
 	/* pull the user attributes */
-	ret = gendb_search_dn(sam_ctx, tmp_ctx, user_dn, msgs, user_attrs);
-	if (ret != 1) {
+	ret = gendb_search_single_extended_dn(sam_ctx, tmp_ctx, user_dn, LDB_SCOPE_BASE,
+					      msg, user_attrs, "(objectClass=*)");
+	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	}
-	talloc_steal(mem_ctx, *msgs);
+	talloc_steal(mem_ctx, *msg);
 	talloc_steal(mem_ctx, *domain_dn);
 	talloc_free(tmp_ctx);
 	
diff --git a/source4/kdc/hdb-samba4.c b/source4/kdc/hdb-samba4.c
index 5852857..28a82bc 100644
--- a/source4/kdc/hdb-samba4.c
+++ b/source4/kdc/hdb-samba4.c
@@ -921,18 +921,15 @@ static krb5_error_code LDB_lookup_principal(krb5_context context, struct ldb_con
 					    krb5_const_principal principal,
 					    enum hdb_ldb_ent_type ent_type,
 					    struct ldb_dn *realm_dn,
-					    struct ldb_message ***pmsg)
+					    struct ldb_message **pmsg)
 {
 	krb5_error_code ret;
 	int lret;
 	char *filter = NULL;
 	const char * const *princ_attrs = user_attrs;
-
 	char *short_princ;
 	char *short_princ_talloc;
 
-	struct ldb_result *res = NULL;
-
 	ret = krb5_unparse_name_flags(context, principal,  KRB5_PRINCIPAL_UNPARSE_NO_REALM, &short_princ);
 
 	if (ret != 0) {
@@ -969,19 +966,18 @@ static krb5_error_code LDB_lookup_principal(krb5_context context, struct ldb_con
 		return ENOMEM;
 	}
 
-	lret = ldb_search(ldb_ctx, mem_ctx, &res, realm_dn,
-			  LDB_SCOPE_SUBTREE, princ_attrs, "%s", filter);
-	if (lret != LDB_SUCCESS) {
-		DEBUG(3, ("Failed to search for %s: %s\n", filter, ldb_errstring(ldb_ctx)));
+	lret = gendb_search_single_extended_dn(ldb_ctx, mem_ctx, 
+					       realm_dn, LDB_SCOPE_SUBTREE,
+					       pmsg, princ_attrs, "%s", filter);
+	if (lret == LDB_ERR_NO_SUCH_OBJECT) {
+		DEBUG(3, ("Failed find a entry for %s\n", filter));
 		return HDB_ERR_NOENTRY;
-	} else if (res->count == 0 || res->count > 1) {
-		DEBUG(3, ("Failed find a single entry for %s: got %d\n", filter, res->count));
-		talloc_free(res);
+	}
+	if (lret != LDB_SUCCESS) {
+		DEBUG(3, ("Failed single search for for %s - %s\n", 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list