diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/winbindd/winbindd_msrpc.c | 120 |
1 files changed, 41 insertions, 79 deletions
diff --git a/source3/winbindd/winbindd_msrpc.c b/source3/winbindd/winbindd_msrpc.c index c60e24967f..433423a396 100644 --- a/source3/winbindd/winbindd_msrpc.c +++ b/source3/winbindd/winbindd_msrpc.c @@ -538,98 +538,60 @@ done: static NTSTATUS msrpc_lookup_useraliases(struct winbindd_domain *domain, TALLOC_CTX *mem_ctx, uint32 num_sids, const struct dom_sid *sids, - uint32 *num_aliases, - uint32 **alias_rids) + uint32 *pnum_aliases, + uint32 **palias_rids) { - NTSTATUS result = NT_STATUS_UNSUCCESSFUL; + struct rpc_pipe_client *samr_pipe; struct policy_handle dom_pol; - uint32 num_query_sids = 0; - int i; - struct rpc_pipe_client *cli; - struct samr_Ids alias_rids_query; - int rangesize = MAX_SAM_ENTRIES_W2K; - uint32 total_sids = 0; - int num_queries = 1; + uint32_t num_aliases = 0; + uint32_t *alias_rids = NULL; + TALLOC_CTX *tmp_ctx; + NTSTATUS status; - *num_aliases = 0; - *alias_rids = NULL; + DEBUG(3,("msrpc_lookup_useraliases\n")); - DEBUG(3,("rpc: lookup_useraliases\n")); + if (pnum_aliases) { + *pnum_aliases = 0; + } - if ( !winbindd_can_contact_domain( domain ) ) { + tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return NT_STATUS_NO_MEMORY; + } + + if (!winbindd_can_contact_domain(domain)) { DEBUG(10,("msrpc_lookup_useraliases: No incoming trust for domain %s\n", domain->name)); - return NT_STATUS_OK; + goto done; } - result = cm_connect_sam(domain, mem_ctx, &cli, &dom_pol); - if (!NT_STATUS_IS_OK(result)) - return result; - - do { - /* prepare query */ - struct lsa_SidArray sid_array; - - ZERO_STRUCT(sid_array); - - num_query_sids = MIN(num_sids - total_sids, rangesize); - - DEBUG(10,("rpc: lookup_useraliases: entering query %d for %d sids\n", - num_queries, num_query_sids)); - - if (num_query_sids) { - sid_array.sids = TALLOC_ZERO_ARRAY(mem_ctx, struct lsa_SidPtr, num_query_sids); - if (sid_array.sids == NULL) { - return NT_STATUS_NO_MEMORY; - } - } else { - sid_array.sids = NULL; - } - - for (i=0; i<num_query_sids; i++) { - sid_array.sids[i].sid = sid_dup_talloc(mem_ctx, &sids[total_sids++]); - if (!sid_array.sids[i].sid) { - TALLOC_FREE(sid_array.sids); - return NT_STATUS_NO_MEMORY; - } - } - sid_array.num_sids = num_query_sids; - - /* do request */ - result = rpccli_samr_GetAliasMembership(cli, mem_ctx, - &dom_pol, - &sid_array, - &alias_rids_query); - - if (!NT_STATUS_IS_OK(result)) { - *num_aliases = 0; - *alias_rids = NULL; - TALLOC_FREE(sid_array.sids); - goto done; - } - - /* process output */ - - for (i=0; i<alias_rids_query.count; i++) { - size_t na = *num_aliases; - if (!add_rid_to_array_unique(mem_ctx, alias_rids_query.ids[i], - alias_rids, &na)) { - return NT_STATUS_NO_MEMORY; - } - *num_aliases = na; - } - - TALLOC_FREE(sid_array.sids); + status = cm_connect_sam(domain, tmp_ctx, &samr_pipe, &dom_pol); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } - num_queries++; + status = rpc_lookup_useraliases(tmp_ctx, + samr_pipe, + &dom_pol, + num_sids, + sids, + &num_aliases, + &alias_rids); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } - } while (total_sids < num_sids); + if (pnum_aliases) { + *pnum_aliases = num_aliases; + } - done: - DEBUG(10,("rpc: lookup_useraliases: got %d aliases in %d queries " - "(rangesize: %d)\n", *num_aliases, num_queries, rangesize)); + if (palias_rids) { + *palias_rids = talloc_move(mem_ctx, &alias_rids); + } - return result; +done: + TALLOC_FREE(tmp_ctx); + return status; } |