r20207: Fix a couple more places where extra_data was
[ira/wip.git] / source3 / nsswitch / winbindd_group.c
index 612147043e6d49ad47846284c64c444c8c1d485b..1b21352c860d6c807e63a2e97698e5275de34c9c 100644 (file)
@@ -1217,7 +1217,7 @@ static void getgroups_sid2gid_recv(void *private_data, BOOL success, gid_t gid)
                (struct getgroups_state *)private_data;
 
        if (success) {
-               if (!add_gid_to_array_unique(NULL, gid,
+               if (!add_gid_to_array_unique(s->state->mem_ctx, gid,
                                        &s->token_gids,
                                        &s->num_token_gids)) {
                        return;
@@ -1239,7 +1239,8 @@ static void getgroups_sid2gid_recv(void *private_data, BOOL success, gid_t gid)
        }
 
        s->state->response.data.num_entries = s->num_token_gids;
-       s->state->response.extra_data.data = s->token_gids;
+       /* s->token_gids are talloced */
+       s->state->response.extra_data.data = smb_xmemdup(s->token_gids, s->num_token_gids * sizeof(gid_t));
        s->state->response.length += s->num_token_gids * sizeof(gid_t);
        request_ok(s->state);
 }
@@ -1383,12 +1384,15 @@ enum winbindd_result winbindd_dual_getuserdomgroups(struct winbindd_domain *doma
                return WINBINDD_OK;
        }
 
-       if (!print_sidlist(NULL, groups, num_groups, &sidstring, &len)) {
-               DEBUG(0, ("malloc failed\n"));
+       if (!print_sidlist(state->mem_ctx, groups, num_groups, &sidstring, &len)) {
+               DEBUG(0, ("talloc failed\n"));
                return WINBINDD_ERROR;
        }
 
-       state->response.extra_data.data = sidstring;
+       state->response.extra_data.data = SMB_STRDUP(sidstring);
+       if (!state->response.extra_data.data) {
+               return WINBINDD_ERROR;
+       }
        state->response.length += len+1;
        state->response.data.num_entries = num_groups;