s4:rpc_server/lsa: expect prepared [ref] pointers in dcesrv_lsa_LookupNames_common()
authorStefan Metzmacher <metze@samba.org>
Mon, 20 Mar 2017 11:56:00 +0000 (12:56 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 27 Feb 2018 15:00:11 +0000 (16:00 +0100)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=13286

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit 3339a1c57266181570d5ca5e389719951f26b41d)

source4/rpc_server/lsa/lsa_lookup.c

index c2931c182c4aa428e7c1e8ff201c91da8e420ca8..8c100144cd0ebb928190cd61bcdc3e74acaae7ef 100644 (file)
@@ -853,26 +853,22 @@ static NTSTATUS dcesrv_lsa_LookupNames_common(struct dcesrv_call_state *dce_call
        struct lsa_RefDomainList *domains;
        uint32_t i;
 
+       *r->out.domains = NULL;
+       r->out.sids->count = 0;
+       r->out.sids->sids = NULL;
+       *r->out.count = 0;
+
        if (r->in.level < LSA_LOOKUP_NAMES_ALL ||
            r->in.level > LSA_LOOKUP_NAMES_RODC_REFERRAL_TO_FULL_DC) {
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       *r->out.domains = NULL;
-
-       domains = talloc_zero(mem_ctx,  struct lsa_RefDomainList);
+       domains = talloc_zero(r->out.domains, struct lsa_RefDomainList);
        if (domains == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
        *r->out.domains = domains;
 
-       r->out.sids = talloc_zero(mem_ctx,  struct lsa_TransSidArray3);
-       if (r->out.sids == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       *r->out.count = 0;
-
        r->out.sids->sids = talloc_array(r->out.sids, struct lsa_TranslatedSid3, 
                                           r->in.num_names);
        if (r->out.sids->sids == NULL) {
@@ -979,6 +975,11 @@ NTSTATUS dcesrv_lsa_LookupNames4(struct dcesrv_call_state *dce_call, TALLOC_CTX
                DCESRV_FAULT(DCERPC_FAULT_ACCESS_DENIED);
        }
 
+       *r->out.domains = NULL;
+       r->out.sids->count = 0;
+       r->out.sids->sids = NULL;
+       *r->out.count = 0;
+
        status = dcesrv_lsa_get_policy_state(dce_call, mem_ctx,
                                             0, /* we skip access checks */
                                             &policy_state);