Fix rpccli_lsa_lookup_sids_noalloc.
[kai/samba.git] / source3 / rpc_client / cli_lsarpc.c
index 2759881dd3b3e7b9af3030b23f5082fbc2d3d7bd..37387a04dd89db8e73838a060b9259e22e4157d4 100644 (file)
@@ -87,7 +87,6 @@ NTSTATUS rpccli_lsa_open_policy2(struct rpc_pipe_client *cli,
 {
        struct lsa_ObjectAttribute attr;
        struct lsa_QosInfo qos;
-       char *srv_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", cli->cli->desthost);
 
        if (sec_qos) {
                init_lsa_sec_qos(&qos, 0xc, 2, 1, 0);
@@ -109,7 +108,7 @@ NTSTATUS rpccli_lsa_open_policy2(struct rpc_pipe_client *cli,
        }
 
        return rpccli_lsa_OpenPolicy2(cli, mem_ctx,
-                                     srv_name_slash,
+                                     cli->cli->srv_name_slash,
                                      &attr,
                                      des_access,
                                      pol);
@@ -204,11 +203,19 @@ static NTSTATUS rpccli_lsa_lookup_sids_noalloc(struct rpc_pipe_client *cli,
                        dom_name = ref_domains->domains[dom_idx].name.string;
                        name = lsa_names.names[i].name.string;
 
-                       (names)[i] = talloc_strdup(mem_ctx, name);
+                       if (name) {
+                               (names)[i] = talloc_strdup(mem_ctx, name);
+                               if ((names)[i] == NULL) {
+                                       DEBUG(0, ("cli_lsa_lookup_sids_noalloc(): out of memory\n"));
+                                       result = NT_STATUS_UNSUCCESSFUL;
+                                       goto done;
+                               }
+                       } else {
+                               (names)[i] = NULL;
+                       }
                        (domains)[i] = talloc_strdup(mem_ctx, dom_name);
                        (types)[i] = lsa_names.names[i].sid_type;
-
-                       if (((names)[i] == NULL) || ((domains)[i] == NULL)) {
+                       if (((domains)[i] == NULL)) {
                                DEBUG(0, ("cli_lsa_lookup_sids_noalloc(): out of memory\n"));
                                result = NT_STATUS_UNSUCCESSFUL;
                                goto done;
@@ -243,46 +250,45 @@ NTSTATUS rpccli_lsa_lookup_sids(struct rpc_pipe_client *cli,
                                POLICY_HND *pol,
                                int num_sids,
                                const DOM_SID *sids,
-                               char ***domains,
-                               char ***names,
-                               enum lsa_SidType **types)
+                               char ***pdomains,
+                               char ***pnames,
+                               enum lsa_SidType **ptypes)
 {
        NTSTATUS result = NT_STATUS_OK;
        int sids_left = 0;
        int sids_processed = 0;
        const DOM_SID *hunk_sids = sids;
-       char **hunk_domains = NULL;
-       char **hunk_names = NULL;
-       enum lsa_SidType *hunk_types = NULL;
+       char **hunk_domains;
+       char **hunk_names;
+       enum lsa_SidType *hunk_types;
+       char **domains = NULL;
+       char **names = NULL;
+       enum lsa_SidType *types = NULL;
 
        if (num_sids) {
-               if (!((*domains) = TALLOC_ARRAY(mem_ctx, char *, num_sids))) {
+               if (!(domains = TALLOC_ARRAY(mem_ctx, char *, num_sids))) {
                        DEBUG(0, ("rpccli_lsa_lookup_sids(): out of memory\n"));
                        result = NT_STATUS_NO_MEMORY;
                        goto fail;
                }
 
-               if (!((*names) = TALLOC_ARRAY(mem_ctx, char *, num_sids))) {
+               if (!(names = TALLOC_ARRAY(mem_ctx, char *, num_sids))) {
                        DEBUG(0, ("rpccli_lsa_lookup_sids(): out of memory\n"));
                        result = NT_STATUS_NO_MEMORY;
                        goto fail;
                }
 
-               if (!((*types) = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_sids))) {
+               if (!(types = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_sids))) {
                        DEBUG(0, ("rpccli_lsa_lookup_sids(): out of memory\n"));
                        result = NT_STATUS_NO_MEMORY;
                        goto fail;
                }
-       } else {
-               (*domains) = NULL;
-               (*names) = NULL;
-               (*types) = NULL;
        }
 
        sids_left = num_sids;
-       hunk_domains = *domains;
-       hunk_names = *names;
-       hunk_types = *types;
+       hunk_domains = domains;
+       hunk_names = names;
+       hunk_types = types;
 
        while (sids_left > 0) {
                int hunk_num_sids;
@@ -334,12 +340,15 @@ NTSTATUS rpccli_lsa_lookup_sids(struct rpc_pipe_client *cli,
                hunk_types += hunk_num_sids;
        }
 
+       *pdomains = domains;
+       *pnames = names;
+       *ptypes = types;
        return result;
 
 fail:
-       TALLOC_FREE(*domains);
-       TALLOC_FREE(*names);
-       TALLOC_FREE(*types);
+       TALLOC_FREE(domains);
+       TALLOC_FREE(names);
+       TALLOC_FREE(types);
        return result;
 }