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 <[email protected]>
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

Reply via email to