[Pkg-samba-maint] Bug#1108970: unblock: samba/2:4.22.3+dfsg-1

Michael Tokarev mjt at tls.msk.ru
Tue Jul 8 19:38:51 BST 2025


Package: release.debian.org
Severity: normal
X-Debbugs-Cc: samba at packages.debian.org, pkg-samba-maint at lists.alioth.debian.org
Control: affects -1 + src:samba
User: release.debian.org at packages.debian.org
Usertags: unblock

Please unblock package samba

[ Reason ]
This is an upstream stable/bugfix release, with usual-for-samba
carefully picked up bugfixes.  This time, there are just a few
bugfixes, and a change which is needed for upcoming (Jul-08)
update of Microsoft Active Directory Domain Controller security
improvements.  When samba acts as a member of MS AD, in some
configurations, it wont function anymore after the windows update.
See #1108904 (https://bugzilla.samba.org/show_bug.cgi?id=15876)
for more information about this issue.

Additionally there's a tiny change in debian packaging, - I replaced
FSF postal address with a gnu.org URL.

[ Tests ]
This release passes usual samba testsuite.  Additionally, I verified
basic functionality in our internal AD domain, there's no obvious
regressions (and some improvements).

[ Risks ]
Usually samba stable updates are of low risk.  This one seems to be
of the same category.

[ 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 testing

[ Other info ]
there's a set of logical commits between samba 4.22.2 and 4.22.3 releases,
see https://salsa.debian.org/samba-team/samba/-/commits/upstream_4.22
(all commits between samba-4.22.2 and samba-4.22.3 tags).  This is the
difference in the debdiff.

Debdiff is below.

unblock samba/2:4.22.3+dfsg-1

Thanks,

/mjt
diff -Nru samba-4.22.2+dfsg/VERSION samba-4.22.3+dfsg/VERSION
--- samba-4.22.2+dfsg/VERSION	2025-06-05 18:38:33.686580400 +0300
+++ samba-4.22.3+dfsg/VERSION	2025-07-07 19:18:35.329030000 +0300
@@ -27,7 +27,7 @@
 ########################################################
 SAMBA_VERSION_MAJOR=4
 SAMBA_VERSION_MINOR=22
-SAMBA_VERSION_RELEASE=2
+SAMBA_VERSION_RELEASE=3
 
 ########################################################
 # If a official release has a serious bug              #
diff -Nru samba-4.22.2+dfsg/WHATSNEW.txt samba-4.22.3+dfsg/WHATSNEW.txt
--- samba-4.22.2+dfsg/WHATSNEW.txt	2025-06-05 18:38:33.686580400 +0300
+++ samba-4.22.3+dfsg/WHATSNEW.txt	2025-07-07 19:18:35.329030000 +0300
@@ -1,4 +1,89 @@
                    ==============================
+                   Release Notes for Samba 4.22.3
+                           July 07, 2025
+                   ==============================
+
+
+This is the latest stable release of the Samba 4.22 release series.
+
+
+Important Change in Upcoming Microsoft Update
+---------------------------------------------
+
+On 8th of July, Microsoft will release an important security update for
+Active Directory Domain Controllers for Windows Server versions prior to
+2025.
+
+This update includes a change to the Microsoft RPC Netlogon protocol,
+which improves security by tightening access checks for a set of RPC
+requests. Samba running as domain members in these environments will be
+impacted by this change if a specific configuration is used, see below
+for which configuration is affected.
+
+Windows Server version 2025 is already equipped with these specific
+security hardenings, and Microsoft is now planning to deploy them to all
+supported Windows Server versions down to Windows Server 2008.
+
+
+Who is affected?
+
+Samba installations acting as member servers in Windows AD domains will
+be affected if they are configured to use the 'ad' idmapping backend.
+Samba servers not using this configuration will not be affected by the
+change – at least to our current knowledge and understanding of the
+change – and no further action is required.
+
+Current versions of Samba with the affected configuration will no longer
+function correctly once the Microsoft update has been applied. Users
+will not be able to connect to the SMB service provided by Samba for any
+domain configured to use the 'ad' idmapping backend.
+
+See https://bugzilla.samba.org/show_bug.cgi?id=15876.
+
+
+Changes since 4.22.2
+--------------------
+
+o  Douglas Bagnall <douglas.bagnall at catalyst.net.nz>
+   * BUG 15854: samba-tool cannot add user to group whose name is exactly 16
+     characters long.
+
+o  Günther Deschner <gd at samba.org>
+   * BUG 15876: Windows security hardening locks out schannel'ed netlogon dc
+     calls like netr_DsRGetDCName.
+
+o  Stefan Metzmacher <metze at samba.org>
+   * BUG 15876: Windows security hardening locks out schannel'ed netlogon dc
+     calls like netr_DsRGetDCName.
+
+o  Andreas Schneider <asn at samba.org>
+   * BUG 15869: Startup messages of rpc deamons fills /var/log/messages.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored.  All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
+                   ==============================
                    Release Notes for Samba 4.22.2
                            June 05, 2025
                    ==============================
@@ -80,8 +165,7 @@
 ======================================================================
 
 
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
                    ==============================
                    Release Notes for Samba 4.22.1
                            April 17, 2025
diff -Nru samba-4.22.2+dfsg/debian/changelog samba-4.22.3+dfsg/debian/changelog
--- samba-4.22.2+dfsg/debian/changelog	2025-06-05 19:12:34.000000000 +0300
+++ samba-4.22.3+dfsg/debian/changelog	2025-07-07 23:16:23.000000000 +0300
@@ -1,3 +1,21 @@
+samba (2:4.22.3+dfsg-1) unstable; urgency=medium
+
+  * new upstream stable/bugfix release, mostly targetting the Jul-08 update
+    for Active Directory Domain Controllers
+    (https://bugzilla.samba.org/show_bug.cgi?id=15876, Closes: #1108904):
+   - https://bugzilla.samba.org/show_bug.cgi?id=15854:
+     samba-tool cannot add user to group whose name
+     is exactly 16 characters long
+   - https://bugzilla.samba.org/show_bug.cgi?id=15869:
+     Startup messages of rpc daemons fills /var/log/messages
+   - https://bugzilla.samba.org/show_bug.cgi?id=15876:
+     Windows security hardening locks out schannel'ed netlogon
+     dc calls like netr_DsRGetDCName
+  * update d/copyright to point to https://www.gnu.org/licenses/
+    instead of FSF postal address
+
+ -- Michael Tokarev <mjt at tls.msk.ru>  Mon, 07 Jul 2025 23:16:23 +0300
+
 samba (2:4.22.2+dfsg-1) unstable; urgency=medium
 
   * new upstream stable/bugfix release:
diff -Nru samba-4.22.2+dfsg/debian/control samba-4.22.3+dfsg/debian/control
--- samba-4.22.2+dfsg/debian/control	2025-06-05 18:53:51.000000000 +0300
+++ samba-4.22.3+dfsg/debian/control	2025-07-07 23:16:23.000000000 +0300
@@ -84,7 +84,7 @@
 Pre-Depends: ${misc:Pre-Depends}
 Depends: passwd,
          procps,
-         samba-common (= ${source:Version}),
+         samba-common,
          samba-common-bin (=${binary:Version}),
          ${misc:Depends},
          ${python3:Depends},
@@ -176,7 +176,7 @@
 
 Package: samba-common-bin
 Architecture: any
-Depends: samba-common (= ${source:Version}),
+Depends: samba-common,
          ${misc:Depends},
          ${python3:Depends},
          ${shlibs:Depends}
@@ -258,7 +258,7 @@
 
 Package: smbclient
 Architecture: any
-Depends: samba-common (= ${source:Version}),
+Depends: samba-common,
          samba-libs (= ${binary:Version}),
          ${misc:Depends},
          ${shlibs:Depends}
@@ -476,7 +476,7 @@
 Pre-Depends: ${misc:Pre-Depends}
 Architecture: any
 Multi-Arch: allowed
-Depends: samba-common (= ${source:Version}),
+Depends: samba-common,
          samba-common-bin (=${binary:Version}),
 # wbinfo (linked with libwbclient) which should use the same protocol
          libwbclient0 (=${binary:Version}),
diff -Nru samba-4.22.2+dfsg/debian/copyright samba-4.22.3+dfsg/debian/copyright
--- samba-4.22.2+dfsg/debian/copyright	2025-06-05 18:53:51.000000000 +0300
+++ samba-4.22.3+dfsg/debian/copyright	2025-07-07 23:16:23.000000000 +0300
@@ -90,8 +90,7 @@
  GNU General Public License for more details.
  .
  You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ along with this program; If not, see https://www.gnu.org/licenses/.
  .
  On Debian systems, the full text of the GPL v3 can be found in
  /usr/share/common-licenses/GPL-3
diff -Nru samba-4.22.2+dfsg/lib/util/debug.c samba-4.22.3+dfsg/lib/util/debug.c
--- samba-4.22.2+dfsg/lib/util/debug.c	2025-02-06 13:31:54.176146500 +0300
+++ samba-4.22.3+dfsg/lib/util/debug.c	2025-07-07 19:18:35.393030600 +0300
@@ -95,6 +95,7 @@
 	bool reopening_logs;
 	bool schedule_reopen_logs;
 	int forced_log_priority;
+	bool disable_syslog;
 
 	struct debug_settings settings;
 	debug_callback_fn callback;
@@ -302,6 +303,10 @@
 {
 	int priority;
 
+	if (state.disable_syslog) {
+		return;
+	}
+
 	priority = debug_level_to_priority(msg_level);
 
 	/*
@@ -1124,6 +1129,16 @@
 	state.forced_log_priority = forced_log_priority;
 }
 
+void debug_disable_syslog(void)
+{
+	state.disable_syslog = true;
+}
+
+void debug_enable_syslog(void)
+{
+	state.disable_syslog = false;
+}
+
 /**
  * Ensure debug logs are initialised.
  *
diff -Nru samba-4.22.2+dfsg/lib/util/debug.h samba-4.22.3+dfsg/lib/util/debug.h
--- samba-4.22.2+dfsg/lib/util/debug.h	2025-02-06 13:31:54.176146500 +0300
+++ samba-4.22.3+dfsg/lib/util/debug.h	2025-07-07 19:18:35.393030600 +0300
@@ -276,9 +276,16 @@
 #define DBGLVL_INFO	 5	/* informational message */
 #define DBGLVL_DEBUG	10	/* debug-level message */
 
+/*
+ * Logging to syslog will be disabled as messages on debug level 0 are always
+ * reported to syslog too. We don't want to clutter the syslog with startup
+ * messages from rpc on demand daemons.
+ */
 #define DBG_STARTUP_NOTICE(...) do { \
 	debug_set_forced_log_priority(DBGLVL_NOTICE); \
+	debug_disable_syslog(); \
 	D_ERR(__VA_ARGS__); \
+	debug_enable_syslog(); \
 	debug_set_forced_log_priority(-1); \
 } while(0)
 
@@ -362,6 +369,8 @@
 			int syslog_level, bool syslog_only);
 void debug_set_hostname(const char *name);
 void debug_set_forced_log_priority(int forced_log_priority);
+void debug_disable_syslog(void);
+void debug_enable_syslog(void);
 bool reopen_logs_internal( void );
 void force_check_log_size( void );
 bool need_to_check_log_size( void );
diff -Nru samba-4.22.2+dfsg/python/samba/samdb.py samba-4.22.3+dfsg/python/samba/samdb.py
--- samba-4.22.2+dfsg/python/samba/samdb.py	2025-02-06 13:31:54.316147300 +0300
+++ samba-4.22.3+dfsg/python/samba/samdb.py	2025-07-07 19:18:35.393030600 +0300
@@ -35,6 +35,7 @@
 from samba.common import get_bytes, cmp
 from samba.dcerpc import security
 from samba import is_ad_dc_built
+from samba import string_is_guid
 from samba import NTSTATUSError, ntstatus
 import binascii
 
@@ -388,6 +389,13 @@
 
         partial_groupfilter = None
 
+        # If <group> looks like a SID, GUID, or DN, we use it
+        # accordingly, otherwise as a name.
+        #
+        # Because misc.GUID() will read any 16 byte sequence as a
+        # binary guid, we need to be careful not to read 16 character
+        # names as GUIDs.
+
         group_sid = None
         try:
             group_sid = security.dom_sid(group)
@@ -397,7 +405,7 @@
             partial_groupfilter = "(objectClass=*)"
 
         group_guid = None
-        if partial_groupfilter is None:
+        if partial_groupfilter is None and string_is_guid(group):
             try:
                 group_guid = misc.GUID(group)
             except NTSTATUSError as e:
diff -Nru samba-4.22.2+dfsg/python/samba/tests/samba_tool/group.py samba-4.22.3+dfsg/python/samba/tests/samba_tool/group.py
--- samba-4.22.2+dfsg/python/samba/tests/samba_tool/group.py	2025-02-06 13:31:54.360147700 +0300
+++ samba-4.22.3+dfsg/python/samba/tests/samba_tool/group.py	2025-07-07 19:18:35.397030600 +0300
@@ -38,7 +38,8 @@
         self.groups.append(self._randomGroup({"name": "testgroup1"}))
         self.groups.append(self._randomGroup({"name": "testgroup2"}))
         self.groups.append(self._randomGroup({"name": "testgroup3"}))
-        self.groups.append(self._randomGroup({"name": "testgroup4"}))
+        self.groups.append(self._randomGroup(
+            {"name": "16 character name for bug 15854"[:16]}))
         self.groups.append(self._randomGroup({"name": "testgroup5 (with brackets)"}))
         self.groups.append(self._randomPosixGroup({"name": "posixgroup1"}))
         self.groups.append(self._randomPosixGroup({"name": "posixgroup2"}))
@@ -334,6 +335,20 @@
             name = str(groupobj.get("dn", idx=0))
             self.assertMatch(out, name, "group '%s' not found" % name)
 
+    def test_addmember(self):
+        groups = [g['name'] for g in self.groups]
+        for parent, child in zip(groups, groups[1:]):
+            (result, out, err) = self.runsubcmd(
+                "group", "addmembers", parent, child)
+            self.assertCmdSuccess(result, out, err)
+
+        (result, out, err) = self.runsubcmd(
+            "group", "addmembers", groups[-1], ','.join(groups[:-1]))
+        self.assertCmdSuccess(result, out, err)
+
+        (result, out, err) = self.runsubcmd(
+            "group", "addmembers", groups[0], "alice,bob")
+        self.assertCmdSuccess(result, out, err)
 
     def test_move(self):
         full_ou_dn = str(self.samdb.normalize_dn_in_domain("OU=movetest_grp"))
diff -Nru samba-4.22.2+dfsg/source3/winbindd/wb_queryuser.c samba-4.22.3+dfsg/source3/winbindd/wb_queryuser.c
--- samba-4.22.2+dfsg/source3/winbindd/wb_queryuser.c	2025-02-06 13:31:54.616149200 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/wb_queryuser.c	2025-07-07 19:18:35.397030600 +0300
@@ -289,10 +289,19 @@
 
 	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 -Nru samba-4.22.2+dfsg/source3/winbindd/wb_sids2xids.c samba-4.22.3+dfsg/source3/winbindd/wb_sids2xids.c
--- samba-4.22.2+dfsg/source3/winbindd/wb_sids2xids.c	2025-02-06 13:31:54.616149200 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/wb_sids2xids.c	2025-07-07 19:18:35.397030600 +0300
@@ -612,13 +612,22 @@
 	    !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 -Nru samba-4.22.2+dfsg/source3/winbindd/wb_xids2sids.c samba-4.22.3+dfsg/source3/winbindd/wb_xids2sids.c
--- samba-4.22.2+dfsg/source3/winbindd/wb_xids2sids.c	2025-02-06 13:31:54.616149200 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/wb_xids2sids.c	2025-07-07 19:18:35.397030600 +0300
@@ -143,9 +143,15 @@
 	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 -Nru samba-4.22.2+dfsg/source3/winbindd/winbindd_cm.c samba-4.22.3+dfsg/source3/winbindd/winbindd_cm.c
--- samba-4.22.2+dfsg/source3/winbindd/winbindd_cm.c	2025-02-20 15:58:50.541505000 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/winbindd_cm.c	2025-07-07 19:18:35.401030500 +0300
@@ -475,140 +475,6 @@
 	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
  */
@@ -1307,24 +1173,8 @@
 	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 -Nru samba-4.22.2+dfsg/source3/winbindd/winbindd_dual.c samba-4.22.3+dfsg/source3/winbindd/winbindd_dual.c
--- samba-4.22.2+dfsg/source3/winbindd/winbindd_dual.c	2025-02-06 13:31:54.620149100 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/winbindd_dual.c	2025-07-07 19:18:35.405030700 +0300
@@ -532,6 +532,7 @@
 	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;
 
@@ -604,8 +605,11 @@
 	 * 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 -Nru samba-4.22.2+dfsg/source3/winbindd/winbindd_dual_srv.c samba-4.22.3+dfsg/source3/winbindd/winbindd_dual_srv.c
--- samba-4.22.2+dfsg/source3/winbindd/winbindd_dual_srv.c	2025-02-06 13:31:54.620149100 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/winbindd_dual_srv.c	2025-07-07 19:18:35.405030700 +0300
@@ -660,106 +660,11 @@
 
 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)
diff -Nru samba-4.22.2+dfsg/source3/winbindd/winbindd_proto.h samba-4.22.3+dfsg/source3/winbindd/winbindd_proto.h
--- samba-4.22.2+dfsg/source3/winbindd/winbindd_proto.h	2025-02-06 13:31:54.624149000 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/winbindd_proto.h	2025-07-07 19:18:35.405030700 +0300
@@ -608,6 +608,7 @@
 		   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 -Nru samba-4.22.2+dfsg/source3/winbindd/winbindd_util.c samba-4.22.3+dfsg/source3/winbindd/winbindd_util.c
--- samba-4.22.2+dfsg/source3/winbindd/winbindd_util.c	2025-02-06 13:31:54.624149000 +0300
+++ samba-4.22.3+dfsg/source3/winbindd/winbindd_util.c	2025-07-07 19:18:35.409030700 +0300
@@ -2230,3 +2230,22 @@
 	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;
+}


More information about the Pkg-samba-maint mailing list