[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-234-g46bcb10

Volker Lendecke vlendec at samba.org
Sat Mar 7 16:51:55 GMT 2009


The branch, master has been updated
       via  46bcb10b5abb21758cf234764b64220ede1b7ab5 (commit)
      from  e58ade4136b40d82c24f3556845e7412a3330992 (commit)

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


- Log -----------------------------------------------------------------
commit 46bcb10b5abb21758cf234764b64220ede1b7ab5
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Feb 12 17:48:52 2009 +0100

    Shape up pdb_search a bit by making it a talloc ctx with a destructor

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

Summary of changes:
 source3/include/passdb.h           |    1 -
 source3/include/proto.h            |   10 ++--
 source3/passdb/pdb_interface.c     |   63 +++++++++++-------------
 source3/passdb/pdb_ldap.c          |   20 ++++----
 source3/passdb/pdb_smbpasswd.c     |    9 ++--
 source3/passdb/pdb_tdb.c           |   11 ++---
 source3/rpc_server/srv_samr_nt.c   |   94 +++++++++++++++++------------------
 source3/utils/net.c                |    9 ++--
 source3/utils/net_sam.c            |   16 ++++--
 source3/utils/pdbedit.c            |   20 ++++----
 source3/winbindd/winbindd_passdb.c |   12 ++--
 11 files changed, 128 insertions(+), 137 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/passdb.h b/source3/include/passdb.h
index 93c1e3f..9cbc6bd 100644
--- a/source3/include/passdb.h
+++ b/source3/include/passdb.h
@@ -186,7 +186,6 @@ enum pdb_search_type {
 };
 
 struct pdb_search {
-	TALLOC_CTX *mem_ctx;
 	enum pdb_search_type type;
 	struct samr_displayentry *cache;
 	uint32 num_entries;
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 5cd4e45..b6ddacc 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4617,14 +4617,14 @@ bool pdb_sid_to_id(const DOM_SID *sid, union unid_t *id,
 bool pdb_rid_algorithm(void);
 bool pdb_new_rid(uint32 *rid);
 bool initialize_password_db(bool reload, struct event_context *event_ctx);
-struct pdb_search *pdb_search_init(enum pdb_search_type type);
-struct pdb_search *pdb_search_users(uint32 acct_flags);
-struct pdb_search *pdb_search_groups(void);
-struct pdb_search *pdb_search_aliases(const DOM_SID *sid);
+struct pdb_search *pdb_search_init(TALLOC_CTX *mem_ctx,
+				   enum pdb_search_type type);
+struct pdb_search *pdb_search_users(TALLOC_CTX *mem_ctx, uint32 acct_flags);
+struct pdb_search *pdb_search_groups(TALLOC_CTX *mem_ctx);
+struct pdb_search *pdb_search_aliases(TALLOC_CTX *mem_ctx, const DOM_SID *sid);
 uint32 pdb_search_entries(struct pdb_search *search,
 			  uint32 start_idx, uint32 max_entries,
 			  struct samr_displayentry **result);
-void pdb_search_destroy(struct pdb_search *search);
 bool pdb_get_trusteddom_pw(const char *domain, char** pwd, DOM_SID *sid, 
 			   time_t *pass_last_set_time);
 bool pdb_set_trusteddom_pw(const char* domain, const char* pwd,
diff --git a/source3/passdb/pdb_interface.c b/source3/passdb/pdb_interface.c
index e618b42..1909bd0 100644
--- a/source3/passdb/pdb_interface.c
+++ b/source3/passdb/pdb_interface.c
@@ -1709,24 +1709,25 @@ static NTSTATUS pdb_default_lookup_names(struct pdb_methods *methods,
 }
 #endif
 
-struct pdb_search *pdb_search_init(enum pdb_search_type type)
+static int pdb_search_destructor(struct pdb_search *search)
 {
-	TALLOC_CTX *mem_ctx;
-	struct pdb_search *result;
-
-	mem_ctx = talloc_init("pdb_search");
-	if (mem_ctx == NULL) {
-		DEBUG(0, ("talloc_init failed\n"));
-		return NULL;
+	if (!search->search_ended) {
+		search->search_end(search);
 	}
+	return 0;
+}
 
-	result = TALLOC_P(mem_ctx, struct pdb_search);
+struct pdb_search *pdb_search_init(TALLOC_CTX *mem_ctx,
+				   enum pdb_search_type type)
+{
+	struct pdb_search *result;
+
+	result = talloc(mem_ctx, struct pdb_search);
 	if (result == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return NULL;
 	}
 
-	result->mem_ctx = mem_ctx;
 	result->type = type;
 	result->cache = NULL;
 	result->num_entries = 0;
@@ -1737,6 +1738,8 @@ struct pdb_search *pdb_search_init(enum pdb_search_type type)
 	result->next_entry = NULL;
 	result->search_end = NULL;
 
+	talloc_set_destructor(result, pdb_search_destructor);
+
 	return result;
 }
 
@@ -1783,8 +1786,7 @@ static bool next_entry_groups(struct pdb_search *s,
 
 	sid_peek_rid(&map->sid, &rid);
 
-	fill_displayentry(s->mem_ctx, rid, 0, map->nt_name, NULL, map->comment,
-			  entry);
+	fill_displayentry(s, rid, 0, map->nt_name, NULL, map->comment, entry);
 
 	state->current_group += 1;
 	return True;
@@ -1802,7 +1804,7 @@ static bool pdb_search_grouptype(struct pdb_search *search,
 {
 	struct group_search *state;
 
-	state = TALLOC_P(search->mem_ctx, struct group_search);
+	state = talloc(search, struct group_search);
 	if (state == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return False;
@@ -1853,7 +1855,7 @@ static struct samr_displayentry *pdb_search_getentry(struct pdb_search *search,
 			break;
 		}
 
-		ADD_TO_LARGE_ARRAY(search->mem_ctx, struct samr_displayentry,
+		ADD_TO_LARGE_ARRAY(search, struct samr_displayentry,
 				   entry, &search->cache, &search->num_entries,
 				   &search->cache_size);
 	}
@@ -1861,52 +1863,54 @@ static struct samr_displayentry *pdb_search_getentry(struct pdb_search *search,
 	return (search->num_entries > idx) ? &search->cache[idx] : NULL;
 }
 
-struct pdb_search *pdb_search_users(uint32 acct_flags)
+struct pdb_search *pdb_search_users(TALLOC_CTX *mem_ctx, uint32 acct_flags)
 {
 	struct pdb_methods *pdb = pdb_get_methods();
 	struct pdb_search *result;
 
-	result = pdb_search_init(PDB_USER_SEARCH);
+	result = pdb_search_init(mem_ctx, PDB_USER_SEARCH);
 	if (result == NULL) {
 		return NULL;
 	}
 
 	if (!pdb->search_users(pdb, result, acct_flags)) {
-		talloc_destroy(result->mem_ctx);
+		TALLOC_FREE(result);
 		return NULL;
 	}
 	return result;
 }
 
-struct pdb_search *pdb_search_groups(void)
+struct pdb_search *pdb_search_groups(TALLOC_CTX *mem_ctx)
 {
 	struct pdb_methods *pdb = pdb_get_methods();
 	struct pdb_search *result;
 
-	result = pdb_search_init(PDB_GROUP_SEARCH);
+	result = pdb_search_init(mem_ctx, PDB_GROUP_SEARCH);
 	if (result == NULL) {
 		 return NULL;
 	}
 
 	if (!pdb->search_groups(pdb, result)) {
-		talloc_destroy(result->mem_ctx);
+		TALLOC_FREE(result);
 		return NULL;
 	}
 	return result;
 }
 
-struct pdb_search *pdb_search_aliases(const DOM_SID *sid)
+struct pdb_search *pdb_search_aliases(TALLOC_CTX *mem_ctx, const DOM_SID *sid)
 {
 	struct pdb_methods *pdb = pdb_get_methods();
 	struct pdb_search *result;
 
 	if (pdb == NULL) return NULL;
 
-	result = pdb_search_init(PDB_ALIAS_SEARCH);
-	if (result == NULL) return NULL;
+	result = pdb_search_init(mem_ctx, PDB_ALIAS_SEARCH);
+	if (result == NULL) {
+		return NULL;
+	}
 
 	if (!pdb->search_aliases(pdb, result, sid)) {
-		talloc_destroy(result->mem_ctx);
+		TALLOC_FREE(result);
 		return NULL;
 	}
 	return result;
@@ -1935,17 +1939,6 @@ uint32 pdb_search_entries(struct pdb_search *search,
 	return search->num_entries - start_idx;
 }
 
-void pdb_search_destroy(struct pdb_search *search)
-{
-	if (search == NULL)
-		return;
-
-	if (!search->search_ended)
-		search->search_end(search);
-
-	talloc_destroy(search->mem_ctx);
-}
-
 /*******************************************************************
  trustdom methods
  *******************************************************************/
diff --git a/source3/passdb/pdb_ldap.c b/source3/passdb/pdb_ldap.c
index 70a1c62..77b19e3 100644
--- a/source3/passdb/pdb_ldap.c
+++ b/source3/passdb/pdb_ldap.c
@@ -4349,7 +4349,8 @@ static bool ldapsam_search_next_entry(struct pdb_search *search,
 	    !ldapsam_search_nextpage(search))
 		    return False;
 
-	result = state->ldap2displayentry(state, search->mem_ctx, state->connection->ldap_struct,
+	result = state->ldap2displayentry(state, search,
+					  state->connection->ldap_struct,
 					  state->current_entry, entry);
 
 	if (!result) {
@@ -4508,7 +4509,7 @@ static bool ldapsam_search_users(struct pdb_methods *methods,
 		(struct ldapsam_privates *)methods->private_data;
 	struct ldap_search_state *state;
 
-	state = TALLOC_P(search->mem_ctx, struct ldap_search_state);
+	state = talloc(search, struct ldap_search_state);
 	if (state == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return False;
@@ -4525,10 +4526,10 @@ static bool ldapsam_search_users(struct pdb_methods *methods,
 		state->base = lp_ldap_suffix();
 
 	state->acct_flags = acct_flags;
-	state->base = talloc_strdup(search->mem_ctx, state->base);
+	state->base = talloc_strdup(search, state->base);
 	state->scope = LDAP_SCOPE_SUBTREE;
-	state->filter = get_ldap_filter(search->mem_ctx, "*");
-	state->attrs = talloc_attrs(search->mem_ctx, "uid", "sambaSid",
+	state->filter = get_ldap_filter(search, "*");
+	state->attrs = talloc_attrs(search, "uid", "sambaSid",
 				    "displayName", "description",
 				    "sambaAcctFlags", NULL);
 	state->attrsonly = 0;
@@ -4682,7 +4683,7 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
 	struct ldap_search_state *state;
 	fstring tmp;
 
-	state = TALLOC_P(search->mem_ctx, struct ldap_search_state);
+	state = talloc(search, struct ldap_search_state);
 	if (state == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return False;
@@ -4690,15 +4691,14 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
 
 	state->connection = ldap_state->smbldap_state;
 
-	state->base = talloc_strdup(search->mem_ctx, lp_ldap_group_suffix());
+	state->base = talloc_strdup(search, lp_ldap_group_suffix());
 	state->connection = ldap_state->smbldap_state;
 	state->scope = LDAP_SCOPE_SUBTREE;
-	state->filter =	talloc_asprintf(search->mem_ctx,
-					"(&(objectclass=%s)"
+	state->filter =	talloc_asprintf(search, "(&(objectclass=%s)"
 					"(sambaGroupType=%d)(sambaSID=%s*))",
 					 LDAP_OBJ_GROUPMAP,
 					 type, sid_to_fstring(tmp, sid));
-	state->attrs = talloc_attrs(search->mem_ctx, "cn", "sambaSid",
+	state->attrs = talloc_attrs(search, "cn", "sambaSid",
 				    "displayName", "description",
 				    "sambaGroupType", NULL);
 	state->attrsonly = 0;
diff --git a/source3/passdb/pdb_smbpasswd.c b/source3/passdb/pdb_smbpasswd.c
index b72e0f2..d663c7f 100644
--- a/source3/passdb/pdb_smbpasswd.c
+++ b/source3/passdb/pdb_smbpasswd.c
@@ -1566,11 +1566,11 @@ static bool smbpasswd_search_next_entry(struct pdb_search *search,
 	entry->acct_flags = state->entries[state->current].acct_flags;
 
 	entry->account_name = talloc_strdup(
-		search->mem_ctx, state->entries[state->current].account_name);
+		search, state->entries[state->current].account_name);
 	entry->fullname = talloc_strdup(
-		search->mem_ctx, state->entries[state->current].fullname);
+		search, state->entries[state->current].fullname);
 	entry->description = talloc_strdup(
-		search->mem_ctx, state->entries[state->current].description);
+		search, state->entries[state->current].description);
 
 	if ((entry->account_name == NULL) || (entry->fullname == NULL)
 	    || (entry->description == NULL)) {
@@ -1593,8 +1593,7 @@ static bool smbpasswd_search_users(struct pdb_methods *methods,
 	struct smb_passwd *pwd;
 	FILE *fp;
 
-	search_state = TALLOC_ZERO_P(search->mem_ctx,
-				     struct smbpasswd_search_state);
+	search_state = talloc_zero(search, struct smbpasswd_search_state);
 	if (search_state == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return false;
diff --git a/source3/passdb/pdb_tdb.c b/source3/passdb/pdb_tdb.c
index 143a2e2..3442561 100644
--- a/source3/passdb/pdb_tdb.c
+++ b/source3/passdb/pdb_tdb.c
@@ -882,12 +882,9 @@ static bool tdbsam_search_next_entry(struct pdb_search *search,
 
 	entry->acct_flags = pdb_get_acct_ctrl(user);
 	entry->rid = rid;
-	entry->account_name = talloc_strdup(
-		search->mem_ctx, pdb_get_username(user));
-	entry->fullname = talloc_strdup(
-		search->mem_ctx, pdb_get_fullname(user));
-	entry->description = talloc_strdup(
-		search->mem_ctx, pdb_get_acct_desc(user));
+	entry->account_name = talloc_strdup(search, pdb_get_username(user));
+	entry->fullname = talloc_strdup(search, pdb_get_fullname(user));
+	entry->description = talloc_strdup(search, pdb_get_acct_desc(user));
 
 	TALLOC_FREE(user);
 
@@ -912,7 +909,7 @@ static bool tdbsam_search_users(struct pdb_methods *methods,
 		return false;
 	}
 
-	state = TALLOC_ZERO_P(search->mem_ctx, struct tdbsam_search_state);
+	state = talloc_zero(search, struct tdbsam_search_state);
 	if (state == NULL) {
 		DEBUG(0, ("talloc failed\n"));
 		return false;
diff --git a/source3/rpc_server/srv_samr_nt.c b/source3/rpc_server/srv_samr_nt.c
index 0b8cb35..1128a85 100644
--- a/source3/rpc_server/srv_samr_nt.c
+++ b/source3/rpc_server/srv_samr_nt.c
@@ -319,8 +319,8 @@ static DISP_INFO *get_samr_dispinfo_by_sid(DOM_SID *psid)
 	 * enumerate stuff, so just cache 2 entries.
 	 */
 
-	static struct disp_info builtin_dispinfo;
-	static struct disp_info domain_dispinfo;
+	static struct disp_info *builtin_dispinfo;
+	static struct disp_info *domain_dispinfo;
 
 	/* There are two cases to consider here:
 	   1) The SID is a domain SID and we look for an equality match, or
@@ -335,18 +335,32 @@ static DISP_INFO *get_samr_dispinfo_by_sid(DOM_SID *psid)
 		/*
 		 * Necessary only once, but it does not really hurt.
 		 */
-		sid_copy(&builtin_dispinfo.sid, &global_sid_Builtin);
+		if (builtin_dispinfo == NULL) {
+			builtin_dispinfo = talloc_zero(
+				talloc_autofree_context(), struct disp_info);
+			if (builtin_dispinfo == NULL) {
+				return NULL;
+			}
+		}
+		sid_copy(&builtin_dispinfo->sid, &global_sid_Builtin);
 
-		return &builtin_dispinfo;
+		return builtin_dispinfo;
 	}
 
 	if (sid_check_is_domain(psid) || sid_check_is_in_our_domain(psid)) {
 		/*
 		 * Necessary only once, but it does not really hurt.
 		 */
-		sid_copy(&domain_dispinfo.sid, get_global_sam_sid());
+		if (domain_dispinfo == NULL) {
+			domain_dispinfo = talloc_zero(
+				talloc_autofree_context(), struct disp_info);
+			if (domain_dispinfo == NULL) {
+				return NULL;
+			}
+		}
+		sid_copy(&domain_dispinfo->sid, get_global_sam_sid());
 
-		return &domain_dispinfo;
+		return domain_dispinfo;
 	}
 
 	return NULL;
@@ -403,32 +417,11 @@ static void free_samr_cache(DISP_INFO *disp_info)
 
 	become_root();
 
-	if (disp_info->users) {
-		DEBUG(10,("free_samr_cache: deleting users cache\n"));
-		pdb_search_destroy(disp_info->users);
-		disp_info->users = NULL;
-	}
-	if (disp_info->machines) {
-		DEBUG(10,("free_samr_cache: deleting machines cache\n"));
-		pdb_search_destroy(disp_info->machines);
-		disp_info->machines = NULL;
-	}
-	if (disp_info->groups) {
-		DEBUG(10,("free_samr_cache: deleting groups cache\n"));
-		pdb_search_destroy(disp_info->groups);
-		disp_info->groups = NULL;
-	}
-	if (disp_info->aliases) {
-		DEBUG(10,("free_samr_cache: deleting aliases cache\n"));
-		pdb_search_destroy(disp_info->aliases);
-		disp_info->aliases = NULL;
-	}
-	if (disp_info->enum_users) {
-		DEBUG(10,("free_samr_cache: deleting enum_users cache\n"));
-		pdb_search_destroy(disp_info->enum_users);
-		disp_info->enum_users = NULL;
-	}
-	disp_info->enum_acb_mask = 0;
+	TALLOC_FREE(disp_info->users);
+	TALLOC_FREE(disp_info->machines);
+	TALLOC_FREE(disp_info->groups);
+	TALLOC_FREE(disp_info->aliases);
+	TALLOC_FREE(disp_info->enum_users);
 
 	unbecome_root();
 }
@@ -524,7 +517,7 @@ static uint32 count_sam_users(struct disp_info *info, uint32 acct_flags)
 	}
 
 	if (info->users == NULL) {
-		info->users = pdb_search_users(acct_flags);
+		info->users = pdb_search_users(info, acct_flags);
 		if (info->users == NULL) {
 			return 0;
 		}
@@ -548,7 +541,7 @@ static uint32 count_sam_groups(struct disp_info *info)
 	}
 
 	if (info->groups == NULL) {
-		info->groups = pdb_search_groups();
+		info->groups = pdb_search_groups(info);
 		if (info->groups == NULL) {
 			return 0;
 		}
@@ -567,7 +560,7 @@ static uint32 count_sam_aliases(struct disp_info *info)
 	struct samr_displayentry *entry;
 
 	if (info->aliases == NULL) {
-		info->aliases = pdb_search_aliases(&info->sid);
+		info->aliases = pdb_search_aliases(info, &info->sid);
 		if (info->aliases == NULL) {
 			return 0;
 		}
@@ -1012,12 +1005,12 @@ NTSTATUS _samr_EnumDomainUsers(pipes_struct *p,
 
 	if ((info->disp_info->enum_users != NULL) &&
 	    (info->disp_info->enum_acb_mask != r->in.acct_flags)) {
-		pdb_search_destroy(info->disp_info->enum_users);
-		info->disp_info->enum_users = NULL;
+		TALLOC_FREE(info->disp_info->enum_users);
 	}
 
 	if (info->disp_info->enum_users == NULL) {
-		info->disp_info->enum_users = pdb_search_users(r->in.acct_flags);
+		info->disp_info->enum_users = pdb_search_users(
+			info->disp_info, r->in.acct_flags);
 		info->disp_info->enum_acb_mask = r->in.acct_flags;
 	}
 
@@ -1149,7 +1142,7 @@ NTSTATUS _samr_EnumDomainGroups(pipes_struct *p,
 	become_root();
 
 	if (info->disp_info->groups == NULL) {
-		info->disp_info->groups = pdb_search_groups();
+		info->disp_info->groups = pdb_search_groups(info->disp_info);
 
 		if (info->disp_info->groups == NULL) {
 			unbecome_root();
@@ -1216,7 +1209,8 @@ NTSTATUS _samr_EnumDomainAliases(pipes_struct *p,
 	become_root();
 
 	if (info->disp_info->aliases == NULL) {
-		info->disp_info->aliases = pdb_search_aliases(&info->sid);
+		info->disp_info->aliases = pdb_search_aliases(
+			info->disp_info, &info->sid);
 		if (info->disp_info->aliases == NULL) {
 			unbecome_root();
 			return NT_STATUS_ACCESS_DENIED;
@@ -1547,7 +1541,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 	case 0x1:
 	case 0x4:
 		if (info->disp_info->users == NULL) {
-			info->disp_info->users = pdb_search_users(ACB_NORMAL);
+			info->disp_info->users = pdb_search_users(
+				info->disp_info, ACB_NORMAL);
 			if (info->disp_info->users == NULL) {
 				unbecome_root();
 				return NT_STATUS_ACCESS_DENIED;
@@ -1565,8 +1560,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 		break;
 	case 0x2:
 		if (info->disp_info->machines == NULL) {
-			info->disp_info->machines =
-				pdb_search_users(ACB_WSTRUST|ACB_SVRTRUST);
+			info->disp_info->machines = pdb_search_users(
+				info->disp_info, ACB_WSTRUST|ACB_SVRTRUST);
 			if (info->disp_info->machines == NULL) {
 				unbecome_root();
 				return NT_STATUS_ACCESS_DENIED;
@@ -1585,7 +1580,8 @@ NTSTATUS _samr_QueryDisplayInfo(pipes_struct *p,
 	case 0x3:
 	case 0x5:
 		if (info->disp_info->groups == NULL) {
-			info->disp_info->groups = pdb_search_groups();
+			info->disp_info->groups = pdb_search_groups(
+				info->disp_info);
 			if (info->disp_info->groups == NULL) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list