diff options
Diffstat (limited to 'source3/nsswitch/winbindd_passdb.c')
-rw-r--r-- | source3/nsswitch/winbindd_passdb.c | 64 |
1 files changed, 55 insertions, 9 deletions
diff --git a/source3/nsswitch/winbindd_passdb.c b/source3/nsswitch/winbindd_passdb.c index b949ea0808..d73917ef83 100644 --- a/source3/nsswitch/winbindd_passdb.c +++ b/source3/nsswitch/winbindd_passdb.c @@ -286,6 +286,18 @@ static NTSTATUS sid_to_name(struct winbindd_domain *domain, return NT_STATUS_OK; } +static NTSTATUS rids_to_names(struct winbindd_domain *domain, + TALLOC_CTX *mem_ctx, + const DOM_SID *sid, + uint32 *rids, + size_t num_rids, + char **domain_name, + char ***names, + enum SID_NAME_USE **types) +{ + return NT_STATUS_UNSUCCESSFUL; +} + /* Lookup user information from a rid or username. */ static NTSTATUS query_user(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, @@ -353,15 +365,21 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, const DOM_SID **sids; struct lsa_dom_info *lsa_domains; struct lsa_name_info *lsa_names; + TALLOC_CTX *tmp_ctx; if (!sid_check_is_in_our_domain(group_sid)) { /* There's no groups, only aliases in BUILTIN */ return NT_STATUS_NO_SUCH_GROUP; } - result = pdb_enum_group_members(mem_ctx, group_sid, &rids, + if (!(tmp_ctx = talloc_init("lookup_groupmem"))) { + return NT_STATUS_NO_MEMORY; + } + + result = pdb_enum_group_members(tmp_ctx, group_sid, &rids, &num_members); if (!NT_STATUS_IS_OK(result)) { + TALLOC_FREE(tmp_ctx); return result; } @@ -370,29 +388,39 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, *sid_mem = NULL; *names = NULL; *name_types = NULL; + TALLOC_FREE(tmp_ctx); return NT_STATUS_OK; } *sid_mem = TALLOC_ARRAY(mem_ctx, DOM_SID, num_members); *names = TALLOC_ARRAY(mem_ctx, char *, num_members); *name_types = TALLOC_ARRAY(mem_ctx, uint32, num_members); - sids = TALLOC_ARRAY(mem_ctx, const DOM_SID *, num_members); + sids = TALLOC_ARRAY(tmp_ctx, const DOM_SID *, num_members); if (((*sid_mem) == NULL) || ((*names) == NULL) || ((*name_types) == NULL) || (sids == NULL)) { + TALLOC_FREE(tmp_ctx); return NT_STATUS_NO_MEMORY; } + /* + * Prepare an array of sid pointers for the lookup_sids calling + * convention. + */ + for (i=0; i<num_members; i++) { DOM_SID *sid = &((*sid_mem)[i]); - sid_copy(sid, &domain->sid); - sid_append_rid(sid, rids[i]); + if (!sid_compose(sid, &domain->sid, rids[i])) { + TALLOC_FREE(tmp_ctx); + return NT_STATUS_INTERNAL_ERROR; + } sids[i] = sid; } - result = lookup_sids(mem_ctx, num_members, sids, 1, + result = lookup_sids(tmp_ctx, num_members, sids, 1, &lsa_domains, &lsa_names); if (!NT_STATUS_IS_OK(result)) { + TALLOC_FREE(tmp_ctx); return result; } @@ -403,8 +431,12 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, sid_type_lookup(lsa_names[i].type))); continue; } - (*names)[i] = talloc_steal((*names), - lsa_names[i].name); + if (!((*names)[i] = talloc_strdup((*names), + lsa_names[i].name))) { + TALLOC_FREE(tmp_ctx); + return NT_STATUS_NO_MEMORY; + } + (*name_types)[i] = lsa_names[i].type; num_mapped += 1; @@ -412,6 +444,7 @@ static NTSTATUS lookup_groupmem(struct winbindd_domain *domain, *num_names = num_mapped; + TALLOC_FREE(tmp_ctx); return NT_STATUS_OK; } @@ -497,15 +530,21 @@ static NTSTATUS trusted_domains(struct winbindd_domain *domain, NTSTATUS nt_status; struct trustdom_info **domains; int i; + TALLOC_CTX *tmp_ctx; *num_domains = 0; *names = NULL; *alt_names = NULL; *dom_sids = NULL; - nt_status = secrets_trusted_domains(mem_ctx, num_domains, + if (!(tmp_ctx = talloc_init("trusted_domains"))) { + return NT_STATUS_NO_MEMORY; + } + + nt_status = secrets_trusted_domains(tmp_ctx, num_domains, &domains); if (!NT_STATUS_IS_OK(nt_status)) { + TALLOC_FREE(tmp_ctx); return nt_status; } @@ -514,15 +553,21 @@ static NTSTATUS trusted_domains(struct winbindd_domain *domain, *dom_sids = TALLOC_ARRAY(mem_ctx, DOM_SID, *num_domains); if ((*alt_names == NULL) || (*names == NULL) || (*dom_sids == NULL)) { + TALLOC_FREE(tmp_ctx); return NT_STATUS_NO_MEMORY; } for (i=0; i<*num_domains; i++) { (*alt_names)[i] = NULL; - (*names)[i] = talloc_steal((*names), domains[i]->name); + if (!((*names)[i] = talloc_strdup((*names), + domains[i]->name))) { + TALLOC_FREE(tmp_ctx); + return NT_STATUS_NO_MEMORY; + } sid_copy(&(*dom_sids)[i], &domains[i]->sid); } + TALLOC_FREE(tmp_ctx); return NT_STATUS_OK; } @@ -534,6 +579,7 @@ struct winbindd_methods passdb_methods = { enum_local_groups, name_to_sid, sid_to_name, + rids_to_names, query_user, lookup_usergroups, lookup_useraliases, |