Package: release.debian.org Severity: normal Tags: bookworm X-Debbugs-Cc: sa...@packages.debian.org, pkg-samba-de...@lists.alioth.debian.org Control: affects -1 + src:samba User: release.debian....@packages.debian.org Usertags: pu
[ Reason ] With Jul-08 update, Microsoft changed some security settings in Windows Active Directory services, which broke samba as AD member server, in some configurations, - samba assumed some calls to AD can be done without auth, but it isn't true anymore. Samba upstream had to make out-of-order releases for the supported series, and one of them (4.22.3) is being pushed to trixie. The required changes were back-ported to previous samba versions. For more information, see samba 4.22.3 release announcement at https://www.samba.org/samba/history/samba-4.22.3.html . There were a few other bug fixes also backported from later releases. And finally, there's one change in packaging, fixing a wrong versioned dependency between arch and indep packages built from the same source - thankfully we had no samba bin-NMUs in bookworm, or else it wont work due to this wrong dependency. [ Impact ] In some configurations (when using idmap backend = ad), samba wont be able to function as AD domain member server anymore. [ Tests ] There aren't much testing done for this particular update. I verified basic functionality of the resulting samba, including basic domain functionality. At the same time, all changes are verified for later samba versions, and are part of upstream stable series too. [ Risks ] (Discussion of the risks involved. E.g. code is trivial or complex, alternatives available.) [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] Each newly included patch has a link to samba bugzilla entry, which has all the information about the issue it is fixing. [ Other info ] The bulk of the work for this update has been done by Salvatore Bonaccorso, I'm grateful for his help. Since Microsoft already released updates for Windows which prevents samba from working, it would be great if this update is pushed to stable-updates before the next bookworm point release. Debdiff is below. Thanks, /mjt diff -Nru samba-4.17.12+dfsg/debian/changelog samba-4.17.12+dfsg/debian/changelog --- samba-4.17.12+dfsg/debian/changelog 2023-10-10 18:17:19.000000000 +0300 +++ samba-4.17.12+dfsg/debian/changelog 2025-07-11 11:21:51.000000000 +0300 @@ -1,3 +1,28 @@ +samba (2:4.17.12+dfsg-0+deb12u2) bookworm; urgency=medium + + [ Salvatore Bonaccorso ] + * several patches from upstream: + - s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch: + s3:libsmb/dsgetdcname: use NETLOGON_NT_VERSION_AVOID_NT4EMUL + - s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch: + s3:libsmb: allow store_cldap_reply() to work with a ipv6 response + - s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch: + s3:libsmb: let discover_dc_netbios() return DOMAIN_CONTROLLER_NOT_FOUND + - s3-winbindd-use-better-debug-messages-than-talloc_st.patch: + s3:winbindd: use better debug messages than 'talloc_strdup failed' + - s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch: + s3:winbindd: avoid using any netlogon call to get a dc name + s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch: + s3-winbindd: Fix internal winbind dsgetdcname calls w.r.t. domain name + (Closes: #1108904) + + [ Michael Tokarev ] + * d/control: fix versioned dependency on samba for samba-ad-dc + samba-ad-dc is arch-all package. We need samba >= ${source:Version}~ + (note the tilde at the end), not ${binary:Version} (without tilde) + + -- Michael Tokarev <m...@tls.msk.ru> Fri, 11 Jul 2025 11:21:51 +0300 + samba (2:4.17.12+dfsg-0+deb12u1) bookworm-security; urgency=medium * new stable security bugfix release: diff -Nru samba-4.17.12+dfsg/debian/control samba-4.17.12+dfsg/debian/control --- samba-4.17.12+dfsg/debian/control 2023-10-10 18:15:43.000000000 +0300 +++ samba-4.17.12+dfsg/debian/control 2025-07-10 16:02:07.000000000 +0300 @@ -190,7 +190,7 @@ Architecture: all Multi-Arch: foreign Pre-Depends: ${misc:Pre-Depends} -Depends: samba (>= ${binary:Version}), samba-dsdb-modules, samba-vfs-modules, +Depends: samba (>= ${source:Version}~), samba-dsdb-modules, samba-vfs-modules, winbind, krb5-kdc (>> 1.19.0) <pkg.samba.mitkrb5>, ${misc:Depends} diff -Nru samba-4.17.12+dfsg/debian/patches/s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch samba-4.17.12+dfsg/debian/patches/s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch --- samba-4.17.12+dfsg/debian/patches/s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,55 @@ +From: Stefan Metzmacher <me...@samba.org> +Date: Tue, 7 May 2024 14:53:24 +0000 +Subject: s3:libsmb: allow store_cldap_reply() to work with a ipv6 response +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/712ffbffc03c7dcd551c1e22815ebe7c0b9b45d2 + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=15642 + +Signed-off-by: Stefan Metzmacher <me...@samba.org> +Reviewed-by: Andrew Bartlett <abart...@samba.org> + +Autobuild-User(master): Andrew Bartlett <abart...@samba.org> +Autobuild-Date(master): Fri May 10 01:35:18 UTC 2024 on atb-devel-224 +--- + source3/libsmb/dsgetdcname.c | 24 +++++++++++++++++++++++- + 1 file changed, 23 insertions(+), 1 deletion(-) + +diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c +index 0fcf23a280ee..654893c172c6 100644 +--- a/source3/libsmb/dsgetdcname.c ++++ b/source3/libsmb/dsgetdcname.c +@@ -196,7 +196,29 @@ static NTSTATUS store_cldap_reply(TALLOC_CTX *mem_ctx, + /* FIXME */ + r->sockaddr_size = 0x10; /* the w32 winsock addr size */ + r->sockaddr.sockaddr_family = 2; /* AF_INET */ +- r->sockaddr.pdc_ip = talloc_strdup(mem_ctx, addr); ++ if (is_ipaddress_v4(addr)) { ++ r->sockaddr.pdc_ip = talloc_strdup(mem_ctx, addr); ++ if (r->sockaddr.pdc_ip == NULL) { ++ return NT_STATUS_NO_MEMORY; ++ } ++ } else { ++ /* ++ * ndr_push_NETLOGON_SAM_LOGON_RESPONSE_EX will ++ * fail with an ipv6 address. ++ * ++ * This matches windows behaviour in the CLDAP ++ * response when NETLOGON_NT_VERSION_5EX_WITH_IP ++ * is used. ++ * ++ * Windows returns the ipv4 address of the ipv6 ++ * server interface and falls back to 127.0.0.1 ++ * if there's no ipv4 address. ++ */ ++ r->sockaddr.pdc_ip = talloc_strdup(mem_ctx, "127.0.0.1"); ++ if (r->sockaddr.pdc_ip == NULL) { ++ return NT_STATUS_NO_MEMORY; ++ } ++ } + + ndr_err = ndr_push_struct_blob(&blob, mem_ctx, r, + (ndr_push_flags_fn_t)ndr_push_NETLOGON_SAM_LOGON_RESPONSE_EX); +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch samba-4.17.12+dfsg/debian/patches/s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch --- samba-4.17.12+dfsg/debian/patches/s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,35 @@ +From: Stefan Metzmacher <me...@samba.org> +Date: Thu, 15 Feb 2024 17:29:46 +0100 +Subject: s3:libsmb/dsgetdcname: use NETLOGON_NT_VERSION_AVOID_NT4EMUL +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/2b66663c75cdb3bc1b6bc5b1736dd9d35b094b42 + +In 2024 we always want an active directory response... + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=15620 + +Signed-off-by: Stefan Metzmacher <me...@samba.org> +Reviewed-by: Andrew Bartlett <abart...@samba.org> +--- + source3/libsmb/dsgetdcname.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c +index 09a6e6648b42..0fcf23a280ee 100644 +--- a/source3/libsmb/dsgetdcname.c ++++ b/source3/libsmb/dsgetdcname.c +@@ -930,6 +930,11 @@ static NTSTATUS process_dc_netbios(TALLOC_CTX *mem_ctx, + name_type = NBT_NAME_PDC; + } + ++ /* ++ * It's 2024 we always want an AD style response! ++ */ ++ nt_version |= NETLOGON_NT_VERSION_AVOID_NT4EMUL; ++ + nt_version |= map_ds_flags_to_nt_version(flags); + + snprintf(my_acct_name, +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch samba-4.17.12+dfsg/debian/patches/s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch --- samba-4.17.12+dfsg/debian/patches/s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,44 @@ +From: Stefan Metzmacher <me...@samba.org> +Date: Fri, 11 Oct 2024 13:32:22 +0000 +Subject: s3:libsmb: let discover_dc_netbios() return DOMAIN_CONTROLLER_NOT_FOUND +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/e47ce1d10b13d8ef165c70984e6e490f4c2a64c2 + +We may get NT_STATUS_NOT_FOUND when the name can't be resolved +and NT_STATUS_INVALID_ADDRESS if the system doesn't have ipv4 +addresses... + +Signed-off-by: Stefan Metzmacher <me...@samba.org> +Reviewed-by: Andreas Schneider <a...@samba.org> +--- + source3/libsmb/dsgetdcname.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/source3/libsmb/dsgetdcname.c b/source3/libsmb/dsgetdcname.c +index 9053ee5c8b05..6bbe4e0b4ad1 100644 +--- a/source3/libsmb/dsgetdcname.c ++++ b/source3/libsmb/dsgetdcname.c +@@ -435,7 +435,19 @@ static NTSTATUS discover_dc_netbios(TALLOC_CTX *mem_ctx, + &count, + resolve_order); + if (!NT_STATUS_IS_OK(status)) { +- DEBUG(10,("discover_dc_netbios: failed to find DC\n")); ++ NTSTATUS raw_status = status; ++ ++ if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) { ++ status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; ++ } ++ if (NT_STATUS_EQUAL(status, NT_STATUS_INVALID_ADDRESS)) { ++ status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; ++ } ++ ++ DBG_DEBUG("failed to find DC for %s: %s => %s\n", ++ domain_name, ++ nt_errstr(raw_status), ++ nt_errstr(status)); + return status; + } + +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch samba-4.17.12+dfsg/debian/patches/s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch --- samba-4.17.12+dfsg/debian/patches/s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,182 @@ +From: =?UTF-8?q?G=C3=BCnther=20Deschner?= <g...@samba.org> +Date: Wed, 2 Jul 2025 21:59:48 +0200 +Subject: s3-winbindd: Fix internal winbind dsgetdcname calls w.r.t. domain name +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/2560c9b3224816ffd371a62103f65b3aca301ad5 +Bug-Debian: https://bugs.debian.org/1108904 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +when winbind calls to dsgetdcname internally, make sure to +prefer the DNS domain name if we have it. Makes DNS lookups much more +likely to succeed. + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=15876 + +Guenther + +Signed-off-by: Guenther Deschner <g...@samba.org> +Reviewed-by: Andreas Schneider <a...@samba.org> +Reviewed-by: Ralph Boehme <s...@samba.org> + +Autobuild-User(master): Ralph Böhme <s...@samba.org> +Autobuild-Date(master): Mon Jul 7 10:44:37 UTC 2025 on atb-devel-224 +--- + source3/winbindd/wb_queryuser.c | 17 +++++++++++++---- + source3/winbindd/wb_sids2xids.c | 17 +++++++++++++---- + source3/winbindd/wb_xids2sids.c | 12 +++++++++--- + source3/winbindd/winbindd_dual.c | 6 +++++- + source3/winbindd/winbindd_proto.h | 1 + + source3/winbindd/winbindd_util.c | 19 +++++++++++++++++++ + 6 files changed, 60 insertions(+), 12 deletions(-) + +diff --git a/source3/winbindd/wb_queryuser.c b/source3/winbindd/wb_queryuser.c +index c2758f1b76ac..db8e946ba717 100644 +--- a/source3/winbindd/wb_queryuser.c ++++ b/source3/winbindd/wb_queryuser.c +@@ -289,10 +289,19 @@ static void wb_queryuser_done(struct tevent_req *subreq) + + if (NT_STATUS_EQUAL(result, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND) && + !state->tried_dclookup) { +- D_DEBUG("GetNssInfo got DOMAIN_CONTROLLER_NOT_FOUND, calling wb_dsgetdcname_send()\n"); +- subreq = wb_dsgetdcname_send( +- state, state->ev, state->info->domain_name, NULL, NULL, +- DS_RETURN_DNS_NAME); ++ const char *domain_name = find_dns_domain_name( ++ state->info->domain_name); ++ ++ D_DEBUG("GetNssInfo got DOMAIN_CONTROLLER_NOT_FOUND, calling " ++ "wb_dsgetdcname_send(%s)\n", ++ domain_name); ++ ++ subreq = wb_dsgetdcname_send(state, ++ state->ev, ++ domain_name, ++ NULL, ++ NULL, ++ DS_RETURN_DNS_NAME); + if (tevent_req_nomem(subreq, req)) { + return; + } +diff --git a/source3/winbindd/wb_sids2xids.c b/source3/winbindd/wb_sids2xids.c +index f0f6c23fc20b..03e5e7e02581 100644 +--- a/source3/winbindd/wb_sids2xids.c ++++ b/source3/winbindd/wb_sids2xids.c +@@ -612,13 +612,22 @@ static void wb_sids2xids_done(struct tevent_req *subreq) + !state->tried_dclookup) { + + struct lsa_DomainInfo *d; ++ const char *domain_name = NULL; + +- D_DEBUG("Domain controller not found. Calling wb_dsgetdcname_send() to get it.\n"); + d = &state->idmap_doms.domains[state->dom_index]; + +- subreq = wb_dsgetdcname_send( +- state, state->ev, d->name.string, NULL, NULL, +- DS_RETURN_DNS_NAME); ++ domain_name = find_dns_domain_name(d->name.string); ++ ++ D_DEBUG("Domain controller not found. Calling " ++ "wb_dsgetdcname_send(%s) to get it.\n", ++ domain_name); ++ ++ subreq = wb_dsgetdcname_send(state, ++ state->ev, ++ domain_name, ++ NULL, ++ NULL, ++ DS_RETURN_DNS_NAME); + if (tevent_req_nomem(subreq, req)) { + return; + } +diff --git a/source3/winbindd/wb_xids2sids.c b/source3/winbindd/wb_xids2sids.c +index 86bd7f9deab6..6fcf524d94fd 100644 +--- a/source3/winbindd/wb_xids2sids.c ++++ b/source3/winbindd/wb_xids2sids.c +@@ -143,9 +143,15 @@ static void wb_xids2sids_dom_done(struct tevent_req *subreq) + if (NT_STATUS_EQUAL(result, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND) && + !state->tried_dclookup) { + +- subreq = wb_dsgetdcname_send( +- state, state->ev, state->dom_map->name, NULL, NULL, +- DS_RETURN_DNS_NAME); ++ const char *domain_name = find_dns_domain_name( ++ state->dom_map->name); ++ ++ subreq = wb_dsgetdcname_send(state, ++ state->ev, ++ domain_name, ++ NULL, ++ NULL, ++ DS_RETURN_DNS_NAME); + if (tevent_req_nomem(subreq, req)) { + return; + } +diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c +index 57e768844165..ccea44acf185 100644 +--- a/source3/winbindd/winbindd_dual.c ++++ b/source3/winbindd/winbindd_dual.c +@@ -548,6 +548,7 @@ static void wb_domain_request_trigger(struct tevent_req *req, + struct wb_domain_request_state *state = tevent_req_data( + req, struct wb_domain_request_state); + struct winbindd_domain *domain = state->domain; ++ const char *domain_name = NULL; + struct tevent_req *subreq = NULL; + size_t shortest_queue_length; + +@@ -623,8 +624,11 @@ static void wb_domain_request_trigger(struct tevent_req *req, + * which is indicated by DS_RETURN_DNS_NAME. + * For NT4 domains we still get the netbios name. + */ ++ ++ domain_name = find_dns_domain_name(state->domain->name); ++ + subreq = wb_dsgetdcname_send(state, state->ev, +- state->domain->name, ++ domain_name, + NULL, /* domain_guid */ + NULL, /* site_name */ + DS_RETURN_DNS_NAME); /* flags */ +diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h +index 6d11a41d8156..3734ab490864 100644 +--- a/source3/winbindd/winbindd_proto.h ++++ b/source3/winbindd/winbindd_proto.h +@@ -608,6 +608,7 @@ bool parse_sidlist(TALLOC_CTX *mem_ctx, const char *sidstr, + struct dom_sid **sids, uint32_t *num_sids); + bool parse_xidlist(TALLOC_CTX *mem_ctx, const char *xidstr, + struct unixid **pxids, uint32_t *pnum_xids); ++const char *find_dns_domain_name(const char *domain_name); + + /* The following definitions come from winbindd/winbindd_wins.c */ + +diff --git a/source3/winbindd/winbindd_util.c b/source3/winbindd/winbindd_util.c +index 054661776003..954d01928b2d 100644 +--- a/source3/winbindd/winbindd_util.c ++++ b/source3/winbindd/winbindd_util.c +@@ -2673,3 +2673,22 @@ fail: + TALLOC_FREE(xids); + return false; + } ++ ++/** ++ * Helper to extract the DNS Domain Name from a struct winbindd_domain ++ */ ++const char *find_dns_domain_name(const char *domain_name) ++{ ++ struct winbindd_domain *wbdom = NULL; ++ ++ wbdom = find_domain_from_name(domain_name); ++ if (wbdom == NULL) { ++ return domain_name; ++ } ++ ++ if (wbdom->active_directory && wbdom->alt_name != NULL) { ++ return wbdom->alt_name; ++ } ++ ++ return wbdom->name; ++} +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch samba-4.17.12+dfsg/debian/patches/s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch --- samba-4.17.12+dfsg/debian/patches/s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,307 @@ +From: Stefan Metzmacher <me...@samba.org> +Date: Fri, 9 May 2025 09:38:41 +0200 +Subject: s3:winbindd: avoid using any netlogon call to get a dc name +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/f86a4bf6848ade2db7229d182576db3320c3ece7 +Bug-Debian: https://bugs.debian.org/1108904 + +BUG: https://bugzilla.samba.org/show_bug.cgi?id=15876 + +Signed-off-by: Stefan Metzmacher <me...@samba.org> +Reviewed-by: Guenther Deschner <g...@samba.org> +Reviewed-by: Andreas Schneider <a...@samba.org> +Reviewed-by: Ralph Boehme <s...@samba.org> +--- + source3/winbindd/winbindd_cm.c | 150 --------------------------- + source3/winbindd/winbindd_dual_srv.c | 105 +------------------ + 2 files changed, 5 insertions(+), 250 deletions(-) + +diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c +index cc0b47b0600c..15a2f60c5321 100644 +--- a/source3/winbindd/winbindd_cm.c ++++ b/source3/winbindd/winbindd_cm.c +@@ -477,140 +477,6 @@ static bool cm_is_ipc_credentials(struct cli_credentials *creds) + return ret; + } + +-static bool get_dc_name_via_netlogon(struct winbindd_domain *domain, +- fstring dcname, +- struct sockaddr_storage *dc_ss, +- uint32_t request_flags) +-{ +- struct winbindd_domain *our_domain = NULL; +- struct rpc_pipe_client *netlogon_pipe = NULL; +- NTSTATUS result; +- WERROR werr; +- TALLOC_CTX *mem_ctx; +- unsigned int orig_timeout; +- const char *tmp = NULL; +- const char *p; +- struct dcerpc_binding_handle *b; +- +- /* Hmmmm. We can only open one connection to the NETLOGON pipe at the +- * moment.... */ +- +- if (IS_DC) { +- return False; +- } +- +- if (domain->primary) { +- return False; +- } +- +- our_domain = find_our_domain(); +- +- if ((mem_ctx = talloc_init("get_dc_name_via_netlogon")) == NULL) { +- return False; +- } +- +- result = cm_connect_netlogon(our_domain, &netlogon_pipe); +- if (!NT_STATUS_IS_OK(result)) { +- talloc_destroy(mem_ctx); +- return False; +- } +- +- b = netlogon_pipe->binding_handle; +- +- /* This call can take a long time - allow the server to time out. +- 35 seconds should do it. */ +- +- orig_timeout = rpccli_set_timeout(netlogon_pipe, 35000); +- +- if (our_domain->active_directory) { +- struct netr_DsRGetDCNameInfo *domain_info = NULL; +- +- /* +- * TODO request flags are not respected in the server +- * (and in some cases, like REQUIRE_PDC, causes an error) +- */ +- result = dcerpc_netr_DsRGetDCName(b, +- mem_ctx, +- our_domain->dcname, +- domain->name, +- NULL, +- NULL, +- request_flags|DS_RETURN_DNS_NAME, +- &domain_info, +- &werr); +- if (NT_STATUS_IS_OK(result) && W_ERROR_IS_OK(werr)) { +- tmp = talloc_strdup( +- mem_ctx, domain_info->dc_unc); +- if (tmp == NULL) { +- DBG_ERR("talloc_strdup failed for dc_unc[%s]\n", +- domain_info->dc_unc); +- talloc_destroy(mem_ctx); +- return false; +- } +- if (domain->alt_name == NULL) { +- domain->alt_name = talloc_strdup(domain, +- domain_info->domain_name); +- if (domain->alt_name == NULL) { +- DBG_ERR("talloc_strdup failed for " +- "domain_info->domain_name[%s]\n", +- domain_info->domain_name); +- talloc_destroy(mem_ctx); +- return false; +- } +- } +- if (domain->forest_name == NULL) { +- domain->forest_name = talloc_strdup(domain, +- domain_info->forest_name); +- if (domain->forest_name == NULL) { +- DBG_ERR("talloc_strdup failed for " +- "domain_info->forest_name[%s]\n", +- domain_info->forest_name); +- talloc_destroy(mem_ctx); +- return false; +- } +- } +- } +- } else { +- result = dcerpc_netr_GetAnyDCName(b, mem_ctx, +- our_domain->dcname, +- domain->name, +- &tmp, +- &werr); +- } +- +- /* And restore our original timeout. */ +- rpccli_set_timeout(netlogon_pipe, orig_timeout); +- +- if (!NT_STATUS_IS_OK(result)) { +- DEBUG(10,("dcerpc_netr_GetAnyDCName failed: %s\n", +- nt_errstr(result))); +- talloc_destroy(mem_ctx); +- return false; +- } +- +- if (!W_ERROR_IS_OK(werr)) { +- DEBUG(10,("dcerpc_netr_GetAnyDCName failed: %s\n", +- win_errstr(werr))); +- talloc_destroy(mem_ctx); +- return false; +- } +- +- /* dcerpc_netr_GetAnyDCName gives us a name with \\ */ +- p = strip_hostname(tmp); +- +- fstrcpy(dcname, p); +- +- talloc_destroy(mem_ctx); +- +- DEBUG(10,("dcerpc_netr_GetAnyDCName returned %s\n", dcname)); +- +- if (!resolve_name(dcname, dc_ss, 0x20, true)) { +- return False; +- } +- +- return True; +-} +- + /** + * Helper function to assemble trust password and account name + */ +@@ -1297,24 +1163,8 @@ static bool get_dcs(TALLOC_CTX *mem_ctx, struct winbindd_domain *domain, + struct samba_sockaddr *sa_list = NULL; + size_t salist_size = 0; + size_t i; +- bool is_our_domain; + enum security_types sec = (enum security_types)lp_security(); + +- is_our_domain = strequal(domain->name, lp_workgroup()); +- +- /* If not our domain, get the preferred DC, by asking our primary DC */ +- if ( !is_our_domain +- && get_dc_name_via_netlogon(domain, dcname, &ss, request_flags) +- && add_one_dc_unique(mem_ctx, domain->name, dcname, &ss, dcs, +- num_dcs) ) +- { +- char addr[INET6_ADDRSTRLEN]; +- print_sockaddr(addr, sizeof(addr), &ss); +- DEBUG(10, ("Retrieved DC %s at %s via netlogon\n", +- dcname, addr)); +- return True; +- } +- + if ((sec == SEC_ADS) && (domain->alt_name != NULL)) { + char *sitename = NULL; + +diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c +index b1809809b13e..c48ca15dd2b2 100644 +--- a/source3/winbindd/winbindd_dual_srv.c ++++ b/source3/winbindd/winbindd_dual_srv.c +@@ -661,106 +661,11 @@ NTSTATUS _wbint_QueryUserRidList(struct pipes_struct *p, + + NTSTATUS _wbint_DsGetDcName(struct pipes_struct *p, struct wbint_DsGetDcName *r) + { +- struct winbindd_domain *domain = wb_child_domain(); +- struct rpc_pipe_client *netlogon_pipe; +- struct netr_DsRGetDCNameInfo *dc_info; +- NTSTATUS status; +- WERROR werr; +- unsigned int orig_timeout; +- struct dcerpc_binding_handle *b; +- bool retry = false; +- bool try_dsrgetdcname = false; +- +- if (domain == NULL) { +- return dsgetdcname(p->mem_ctx, global_messaging_context(), +- r->in.domain_name, r->in.domain_guid, +- r->in.site_name ? r->in.site_name : "", +- r->in.flags, +- r->out.dc_info); +- } +- +- if (domain->active_directory) { +- try_dsrgetdcname = true; +- } +- +-reconnect: +- status = cm_connect_netlogon(domain, &netlogon_pipe); +- +- reset_cm_connection_on_error(domain, NULL, status); +- if (!NT_STATUS_IS_OK(status)) { +- DEBUG(10, ("Can't contact the NETLOGON pipe\n")); +- return status; +- } +- +- b = netlogon_pipe->binding_handle; +- +- /* This call can take a long time - allow the server to time out. +- 35 seconds should do it. */ +- +- orig_timeout = rpccli_set_timeout(netlogon_pipe, 35000); +- +- if (try_dsrgetdcname) { +- status = dcerpc_netr_DsRGetDCName(b, +- p->mem_ctx, domain->dcname, +- r->in.domain_name, NULL, r->in.domain_guid, +- r->in.flags, r->out.dc_info, &werr); +- if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(werr)) { +- goto done; +- } +- if (!retry && +- reset_cm_connection_on_error(domain, NULL, status)) +- { +- retry = true; +- goto reconnect; +- } +- try_dsrgetdcname = false; +- retry = false; +- } +- +- /* +- * Fallback to less capable methods +- */ +- +- dc_info = talloc_zero(r->out.dc_info, struct netr_DsRGetDCNameInfo); +- if (dc_info == NULL) { +- status = NT_STATUS_NO_MEMORY; +- goto done; +- } +- +- if (r->in.flags & DS_PDC_REQUIRED) { +- status = dcerpc_netr_GetDcName(b, +- p->mem_ctx, domain->dcname, +- r->in.domain_name, &dc_info->dc_unc, &werr); +- } else { +- status = dcerpc_netr_GetAnyDCName(b, +- p->mem_ctx, domain->dcname, +- r->in.domain_name, &dc_info->dc_unc, &werr); +- } +- +- if (!retry && reset_cm_connection_on_error(domain, b, status)) { +- retry = true; +- goto reconnect; +- } +- if (!NT_STATUS_IS_OK(status)) { +- DEBUG(10, ("dcerpc_netr_Get[Any]DCName failed: %s\n", +- nt_errstr(status))); +- goto done; +- } +- if (!W_ERROR_IS_OK(werr)) { +- DEBUG(10, ("dcerpc_netr_Get[Any]DCName failed: %s\n", +- win_errstr(werr))); +- status = werror_to_ntstatus(werr); +- goto done; +- } +- +- *r->out.dc_info = dc_info; +- status = NT_STATUS_OK; +- +-done: +- /* And restore our original timeout. */ +- rpccli_set_timeout(netlogon_pipe, orig_timeout); +- +- return status; ++ return dsgetdcname(p->mem_ctx, global_messaging_context(), ++ r->in.domain_name, r->in.domain_guid, ++ r->in.site_name ? r->in.site_name : "", ++ r->in.flags, ++ r->out.dc_info); + } + + NTSTATUS _wbint_LookupRids(struct pipes_struct *p, struct wbint_LookupRids *r) +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/s3-winbindd-use-better-debug-messages-than-talloc_st.patch samba-4.17.12+dfsg/debian/patches/s3-winbindd-use-better-debug-messages-than-talloc_st.patch --- samba-4.17.12+dfsg/debian/patches/s3-winbindd-use-better-debug-messages-than-talloc_st.patch 1970-01-01 03:00:00.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/s3-winbindd-use-better-debug-messages-than-talloc_st.patch 2025-07-10 16:02:07.000000000 +0300 @@ -0,0 +1,54 @@ +From: Stefan Metzmacher <me...@samba.org> +Date: Fri, 26 Jan 2024 09:25:11 +0100 +Subject: s3:winbindd: use better debug messages than 'talloc_strdup failed' +Forwarded: not-needed +Origin: upstream, https://gitlab.com/samba-team/samba/-/commit/814ae222ca15ff7093a71639cdcc97b9937670ce + +Signed-off-by: Stefan Metzmacher <me...@samba.org> +Reviewed-by: Andrew Bartlett <abart...@samba.org> + +Autobuild-User(master): Stefan Metzmacher <me...@samba.org> +Autobuild-Date(master): Fri Apr 5 13:28:42 UTC 2024 on atb-devel-224 +--- + source3/winbindd/winbindd_cm.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c +index 1685edbabaa2..aebb4561ae8b 100644 +--- a/source3/winbindd/winbindd_cm.c ++++ b/source3/winbindd/winbindd_cm.c +@@ -540,7 +540,8 @@ static bool get_dc_name_via_netlogon(struct winbindd_domain *domain, + tmp = talloc_strdup( + mem_ctx, domain_info->dc_unc); + if (tmp == NULL) { +- DEBUG(0, ("talloc_strdup failed\n")); ++ DBG_ERR("talloc_strdup failed for dc_unc[%s]\n", ++ domain_info->dc_unc); + talloc_destroy(mem_ctx); + return false; + } +@@ -548,7 +549,9 @@ static bool get_dc_name_via_netlogon(struct winbindd_domain *domain, + domain->alt_name = talloc_strdup(domain, + domain_info->domain_name); + if (domain->alt_name == NULL) { +- DEBUG(0, ("talloc_strdup failed\n")); ++ DBG_ERR("talloc_strdup failed for " ++ "domain_info->domain_name[%s]\n", ++ domain_info->domain_name); + talloc_destroy(mem_ctx); + return false; + } +@@ -557,7 +560,9 @@ static bool get_dc_name_via_netlogon(struct winbindd_domain *domain, + domain->forest_name = talloc_strdup(domain, + domain_info->forest_name); + if (domain->forest_name == NULL) { +- DEBUG(0, ("talloc_strdup failed\n")); ++ DBG_ERR("talloc_strdup failed for " ++ "domain_info->forest_name[%s]\n", ++ domain_info->forest_name); + talloc_destroy(mem_ctx); + return false; + } +-- +2.50.0 + diff -Nru samba-4.17.12+dfsg/debian/patches/series samba-4.17.12+dfsg/debian/patches/series --- samba-4.17.12+dfsg/debian/patches/series 2023-10-10 18:15:43.000000000 +0300 +++ samba-4.17.12+dfsg/debian/patches/series 2025-07-10 16:02:07.000000000 +0300 @@ -24,3 +24,9 @@ meaningful-error-if-no-python3-markdown.patch ctdb-use-run-instead-of-var-run.patch heimdal-to-support-KEYRING-ccache.patch +s3-libsmb-dsgetdcname-use-NETLOGON_NT_VERSION_AVOID_.patch +s3-libsmb-allow-store_cldap_reply-to-work-with-a-ipv.patch +s3-libsmb-let-discover_dc_netbios-return-DOMAIN_CONT.patch +s3-winbindd-use-better-debug-messages-than-talloc_st.patch +s3-winbindd-avoid-using-any-netlogon-call-to-get-a-d.patch +s3-winbindd-Fix-internal-winbind-dsgetdcname-calls-w.patch