From 6206e15b4de0ba67d713124c2be353dabf3878c8 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 26 Apr 2023 17:19:29 +0200 Subject: winbind: Fix "wbinfo -u" on a Samba AD DC with >1000 users BUG: https://bugzilla.samba.org/show_bug.cgi?id=15366 Signed-off-by: Volker Lendecke Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Tue May 9 02:58:45 UTC 2023 on atb-devel-224 --- source3/winbindd/winbindd_samr.c | 102 ++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 40 deletions(-) (limited to 'source3/winbindd') diff --git a/source3/winbindd/winbindd_samr.c b/source3/winbindd/winbindd_samr.c index ebf9c24b9e4..92dd1851abd 100644 --- a/source3/winbindd/winbindd_samr.c +++ b/source3/winbindd/winbindd_samr.c @@ -914,8 +914,6 @@ static NTSTATUS sam_rids_to_names(struct winbindd_domain *domain, struct rpc_pipe_client *samr_pipe = NULL; struct dcerpc_binding_handle *h = NULL; struct policy_handle dom_pol = { .handle_type = 0, }; - struct lsa_Strings lsa_names = { .count = 0, }; - struct samr_Ids samr_types = { .count = 0, }; enum lsa_SidType *types = NULL; char **names = NULL; const char *domain_name = NULL; @@ -997,49 +995,73 @@ again: } h = samr_pipe->binding_handle; - status = dcerpc_samr_LookupRids( - h, - tmp_ctx, - &dom_pol, - num_rids, - rids, - &lsa_names, - &samr_types, - &result); - - if (!retry && reset_connection_on_error(domain, samr_pipe, status)) { - retry = true; - goto again; - } + /* + * Magic number 1000 comes from samr.idl + */ - if (!NT_STATUS_IS_OK(status)) { - DBG_DEBUG("dcerpc_samr_LookupRids failed: %s\n", - nt_errstr(status)); - goto fail; - } - if (!NT_STATUS_IS_OK(result) && - !NT_STATUS_EQUAL(result, STATUS_SOME_UNMAPPED)) { - DBG_DEBUG("dcerpc_samr_LookupRids resulted in %s\n", - nt_errstr(result)); - status = result; - goto fail; - } + for (i = 0; i < num_rids; i += 1000) { + uint32_t num_lookup_rids = MIN(num_rids - i, 1000); + struct lsa_Strings lsa_names = { + .count = 0, + }; + struct samr_Ids samr_types = { + .count = 0, + }; + uint32_t j; + + status = dcerpc_samr_LookupRids(h, + tmp_ctx, + &dom_pol, + num_lookup_rids, + &rids[i], + &lsa_names, + &samr_types, + &result); + + if (!retry && + reset_connection_on_error(domain, samr_pipe, status)) { + retry = true; + goto again; + } - for (i=0; i