The branch, master has been updated via 0f2ffb5 winbind: Use EnumDomainUsers in rpc_query_user_list from b5226ac fix spelling of 'unchangeable'
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0f2ffb545ee5285263551643bf651a8f04280ffe Author: Volker Lendecke <v...@samba.org> Date: Sat Feb 11 09:34:17 2017 +0100 winbind: Use EnumDomainUsers in rpc_query_user_list We changed the parent->child enumusers call so that we only return the users' RIDs. QueryDisplayInfo tends to return a lot more info which we throw away. This also aligns the code with the other rpc enumerating functions. Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Thu Feb 23 03:17:41 CET 2017 on sn-devel-144 ----------------------------------------------------------------------- Summary of changes: source3/winbindd/winbindd_rpc.c | 61 ++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/winbindd/winbindd_rpc.c b/source3/winbindd/winbindd_rpc.c index fcc6366..261906f 100644 --- a/source3/winbindd/winbindd_rpc.c +++ b/source3/winbindd/winbindd_rpc.c @@ -40,66 +40,53 @@ NTSTATUS rpc_query_user_list(TALLOC_CTX *mem_ctx, const struct dom_sid *domain_sid, uint32_t **prids) { + struct dcerpc_binding_handle *b = samr_pipe->binding_handle; uint32_t *rids = NULL; uint32_t num_rids = 0; - uint32_t loop_count = 0; - uint32_t start_idx = 0; uint32_t i = 0; - NTSTATUS status, result; - struct dcerpc_binding_handle *b = samr_pipe->binding_handle; + uint32_t resume_handle = 0; + NTSTATUS result; *prids = NULL; do { - uint32_t j; - uint32_t num_dom_users; - uint32_t max_entries, max_size; - uint32_t total_size, returned_size; - union samr_DispInfo disp_info; - - dcerpc_get_query_dispinfo_params(loop_count, - &max_entries, - &max_size); + struct samr_SamArray *sam_array = NULL; + uint32_t count = 0; + NTSTATUS status; + uint32_t *tmp; - status = dcerpc_samr_QueryDisplayInfo(b, - mem_ctx, - samr_policy, - 1, /* level */ - start_idx, - max_entries, - max_size, - &total_size, - &returned_size, - &disp_info, - &result); + status = dcerpc_samr_EnumDomainUsers( + b, mem_ctx, samr_policy, &resume_handle, + ACB_NORMAL, &sam_array, 0xffff, &count, &result); if (!NT_STATUS_IS_OK(status)) { return status; } if (!NT_STATUS_IS_OK(result)) { if (!NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) { + DBG_WARNING("EnumDomainUsers failed: %s\n", + nt_errstr(result)); TALLOC_FREE(rids); + TALLOC_FREE(sam_array); return result; } } - /* increment required start query values */ - start_idx += disp_info.info1.count; - loop_count++; - num_dom_users = disp_info.info1.count; - - num_rids += num_dom_users; - /* If there are no user to enumerate we're done */ - if (num_rids == 0) { - return NT_STATUS_OK; + if (num_rids + count < num_rids) { + TALLOC_FREE(sam_array); + TALLOC_FREE(rids); + return NT_STATUS_INTEGER_OVERFLOW; } - rids = talloc_realloc(mem_ctx, rids, uint32_t, num_rids); - if (rids == NULL) { + tmp = talloc_realloc(mem_ctx, rids, uint32_t, num_rids+count); + if (tmp == NULL) { + TALLOC_FREE(sam_array); + TALLOC_FREE(rids); return NT_STATUS_NO_MEMORY; } + rids = tmp; - for (j = 0; j < num_dom_users; j++) { - rids[i++] = disp_info.info1.entries[j].rid; + for (i=0; i<count; i++) { + rids[num_rids++] = sam_array->entries[i].idx; } } while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); -- Samba Shared Repository