summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/winbindd/winbindd_samr.c81
1 files changed, 20 insertions, 61 deletions
diff --git a/source3/winbindd/winbindd_samr.c b/source3/winbindd/winbindd_samr.c
index 12298e1829..35d4c00181 100644
--- a/source3/winbindd/winbindd_samr.c
+++ b/source3/winbindd/winbindd_samr.c
@@ -325,18 +325,21 @@ done:
/* get a list of trusted domains - builtin domain */
static NTSTATUS sam_trusted_domains(struct winbindd_domain *domain,
TALLOC_CTX *mem_ctx,
- struct netr_DomainTrustList *trusts)
+ struct netr_DomainTrustList *ptrust_list)
{
struct rpc_pipe_client *lsa_pipe;
- struct netr_DomainTrust *array = NULL;
struct policy_handle lsa_policy;
- uint32_t enum_ctx = 0;
- uint32_t count = 0;
+ struct netr_DomainTrust *trusts = NULL;
+ uint32_t num_trusts = 0;
TALLOC_CTX *tmp_ctx;
NTSTATUS status;
DEBUG(3,("samr: trusted domains\n"));
+ if (ptrust_list) {
+ ZERO_STRUCTP(ptrust_list);
+ }
+
tmp_ctx = talloc_stackframe();
if (tmp_ctx == NULL) {
return NT_STATUS_NO_MEMORY;
@@ -344,68 +347,24 @@ static NTSTATUS sam_trusted_domains(struct winbindd_domain *domain,
status = open_internal_lsa_conn(tmp_ctx, &lsa_pipe, &lsa_policy);
if (!NT_STATUS_IS_OK(status)) {
- goto error;
+ goto done;
}
- do {
- struct lsa_DomainList dom_list;
- uint32_t start_idx;
- uint32_t i;
-
- /*
- * We don't run into deadlocks here, cause winbind_off() is
- * called in the main function.
- */
- status = rpccli_lsa_EnumTrustDom(lsa_pipe,
- tmp_ctx,
- &lsa_policy,
- &enum_ctx,
- &dom_list,
- (uint32_t) -1);
- if (!NT_STATUS_IS_OK(status)) {
- if (!NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
- goto error;
- }
- }
-
- start_idx = trusts->count;
- count += dom_list.count;
-
- array = talloc_realloc(tmp_ctx,
- array,
- struct netr_DomainTrust,
- count);
- if (array == NULL) {
- status = NT_STATUS_NO_MEMORY;
- goto error;
- }
-
- for (i = 0; i < dom_list.count; i++) {
- struct netr_DomainTrust *trust = &array[i];
- struct dom_sid *sid;
-
- ZERO_STRUCTP(trust);
-
- trust->netbios_name = talloc_move(array,
- &dom_list.domains[i].name.string);
- trust->dns_name = NULL;
-
- sid = talloc(array, struct dom_sid);
- if (sid == NULL) {
- status = NT_STATUS_NO_MEMORY;
- goto error;
- }
- sid_copy(sid, dom_list.domains[i].sid);
- trust->sid = sid;
- }
- } while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES));
+ status = rpc_trusted_domains(tmp_ctx,
+ lsa_pipe,
+ &lsa_policy,
+ &num_trusts,
+ &trusts);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto done;
+ }
- if (trusts) {
- trusts->count = count;
- trusts->array = talloc_move(mem_ctx, &array);
+ if (ptrust_list) {
+ ptrust_list->count = num_trusts;
+ ptrust_list->array = talloc_move(mem_ctx, &trusts);
}
-error:
+done:
TALLOC_FREE(tmp_ctx);
return status;
}