1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-03 13:47:25 +03:00

s3:winbindd: Use a stackframe for memory management in _wbint_QueryGroupList

Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
This commit is contained in:
Andreas Schneider 2017-12-06 18:48:47 +01:00 committed by Jeremy Allison
parent 18307f8711
commit ad0d2756da

View File

@ -380,6 +380,7 @@ NTSTATUS _wbint_LookupGroupMembers(struct pipes_struct *p,
NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p,
struct wbint_QueryGroupList *r)
{
TALLOC_CTX *frame = NULL;
struct winbindd_domain *domain = wb_child_domain();
uint32_t i;
uint32_t num_local_groups = 0;
@ -389,13 +390,15 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p,
uint32_t ti = 0;
uint64_t num_total = 0;
struct wbint_Principal *result;
NTSTATUS status;
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
bool include_local_groups = false;
if (domain == NULL) {
return NT_STATUS_REQUEST_NOT_ACCEPTED;
}
frame = talloc_stackframe();
switch (lp_server_role()) {
case ROLE_ACTIVE_DIRECTORY_DC:
if (domain->internal) {
@ -416,32 +419,33 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p,
}
if (include_local_groups) {
status = wb_cache_enum_local_groups(domain, talloc_tos(),
status = wb_cache_enum_local_groups(domain, frame,
&num_local_groups,
&local_groups);
reset_cm_connection_on_error(domain, status);
if (!NT_STATUS_IS_OK(status)) {
return status;
goto out;
}
}
status = wb_cache_enum_dom_groups(domain, talloc_tos(),
status = wb_cache_enum_dom_groups(domain, frame,
&num_dom_groups,
&dom_groups);
reset_cm_connection_on_error(domain, status);
if (!NT_STATUS_IS_OK(status)) {
return status;
goto out;
}
num_total = num_local_groups + num_dom_groups;
if (num_total > UINT32_MAX) {
return NT_STATUS_INTERNAL_ERROR;
status = NT_STATUS_INTERNAL_ERROR;
goto out;
}
result = talloc_array(r->out.groups, struct wbint_Principal,
num_total);
result = talloc_array(frame, struct wbint_Principal, num_total);
if (result == NULL) {
return NT_STATUS_NO_MEMORY;
status = NT_STATUS_NO_MEMORY;
goto out;
}
for (i = 0; i < num_local_groups; i++) {
@ -452,14 +456,11 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p,
rg->type = SID_NAME_ALIAS;
rg->name = talloc_strdup(result, lg->acct_name);
if (rg->name == NULL) {
TALLOC_FREE(result);
TALLOC_FREE(dom_groups);
TALLOC_FREE(local_groups);
return NT_STATUS_NO_MEMORY;
status = NT_STATUS_NO_MEMORY;
goto out;
}
}
num_local_groups = 0;
TALLOC_FREE(local_groups);
for (i = 0; i < num_dom_groups; i++) {
struct wb_acct_info *dg = &dom_groups[i];
@ -469,19 +470,19 @@ NTSTATUS _wbint_QueryGroupList(struct pipes_struct *p,
rg->type = SID_NAME_DOM_GRP;
rg->name = talloc_strdup(result, dg->acct_name);
if (rg->name == NULL) {
TALLOC_FREE(result);
TALLOC_FREE(dom_groups);
TALLOC_FREE(local_groups);
return NT_STATUS_NO_MEMORY;
status = NT_STATUS_NO_MEMORY;
goto out;
}
}
num_dom_groups = 0;
TALLOC_FREE(dom_groups);
r->out.groups->num_principals = ti;
r->out.groups->principals = result;
r->out.groups->principals = talloc_move(r->out.groups, &result);
return NT_STATUS_OK;
status = NT_STATUS_OK;
out:
TALLOC_FREE(frame);
return status;
}
NTSTATUS _wbint_QueryUserRidList(struct pipes_struct *p,