[Pkg-samba-maint] Bug#1023606: samba: IPv6 only samba-tool gpo listall does not work, can't find DC

Matthew Grant matt at mattgrant.net.nz
Mon Nov 7 14:30:34 GMT 2022


Package: samba
Version: 4.16.5
Severity: important
Tags: patch upstream ipv6
X-Debbugs-Cc: matt at mattgrant.net.nz

This is reported upstream as Samba bug https://bugzilla.samba.org/show_bug.cgi?id=15226

Bug in central Samba DNS resolution code in IPv6 only environment.  This one probably also
affects domain sign up and join code, as well as samba-tool gpo
funcionality.

finddcs() does not resolve SRV records when there are only AAAA records in the DNS for the AD DC servers.

Patch attached.  Please merge with Debian Samba packages.




-- System Information:
Debian Release: 11.5
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 5.15.75-amd64-mag-lts (SMP w/4 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE
Locale: LANG=en_NZ.UTF-8, LC_CTYPE=en_NZ.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages samba depends on:
ii  adduser              3.118
ii  dpkg                 1.20.12
ii  init-system-helpers  1.60
ii  libbsd0              0.11.3-1
ii  libc6                2.31-13+deb11u5
ii  libcups2             2.3.3op2-3+deb11u2
ii  libgnutls30          3.7.1-5+deb11u2
ii  libldap-2.4-2        2.4.57+dfsg-3+deb11u1
hi  libldb2              2:2.4.1+mag-1
ii  libpam-modules       1.4.0-9+deb11u1
ii  libpam-runtime       1.4.0-9+deb11u1
ii  libpopt0             1.18-2
pn  libpython3.7         <none>
ii  libpython3.9         3.9.2-1
ii  libtalloc2           2.3.3+mag-1~0mag0
ii  libtasn1-6           4.16.0-2
ii  libtdb1              1.4.6+mag-1
ii  libtevent0           0.11.0+mag-1~0mag0
ii  libwbclient0         2:4.16.5+mag-2
ii  lsb-base             11.1.0
ii  procps               2:3.3.17-5
ii  python3              3.9.2-3
ii  python3-dnspython    2.0.0-1
pn  python3-samba        <none>
pn  samba-common         <none>
pn  samba-common-bin     <none>
pn  samba-libs           <none>
ii  tdb-tools            1.4.6+mag-1

Versions of packages samba recommends:
ii  attr                1:2.4.48-6
ii  logrotate           3.18.0-2+deb11u1
ii  python3-markdown    3.3.4-1
pn  samba-dsdb-modules  <none>
pn  samba-vfs-modules   <none>

Versions of packages samba suggests:
pn  bind9                     <none>
ii  bind9-utils [bind9utils]  1:9.16.33-1~deb11u1
ii  bind9utils                1:9.16.33-1~deb11u1
ii  chrony                    4.0-8+deb11u2
pn  ctdb                      <none>
ii  ldb-tools                 2:2.5.2+samba4.16.5+mag-2
ii  smbldap-tools             0.9.11-2
pn  ufw                       <none>
pn  winbind                   <none>
-------------- next part --------------
diff --git a/source4/libcli/resolve/dns_ex.c b/source4/libcli/resolve/dns_ex.c
index 0bb3ba02287..0525d0d019a 100644
--- a/source4/libcli/resolve/dns_ex.c
+++ b/source4/libcli/resolve/dns_ex.c
@@ -81,7 +81,7 @@ struct dns_records_container {
 	uint32_t count;
 };
 
-static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *a_num,
+static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *addr_num,
 			  char ***cur_addrs, uint32_t total,
 			  struct dns_request *reply, int port)
 {
@@ -151,8 +151,8 @@ static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *a_num,
 						rr->name->pLabelList->label);
 		if (addrs[total]) {
 			total++;
-			if (rr->type == QTYPE_A) {
-				(*a_num)++;
+			if (rr->type == QTYPE_A || rr->type == QTYPE_AAAA) {
+				(*addr_num)++;
 			}
 		}
 	}
@@ -211,7 +211,7 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 	struct dns_request *reply;
 	struct dns_records_container ret;
 	char **addrs = NULL;
-	uint32_t a_num, total;
+	uint32_t addr_num, total;
 	uint16_t qtype;
 	TALLOC_CTX *tmp_ctx;
 	DNS_ERROR err;
@@ -236,12 +236,13 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 		}
 	}
 
-	a_num = total = 0;
-	total = reply_to_addrs(tmp_ctx, &a_num, &addrs, total, reply, port);
+	addr_num = total = 0;
+	total = reply_to_addrs(tmp_ctx, &addr_num, &addrs, total, reply, port);
 
-	if (qtype == QTYPE_AAAA && a_num == 0) {
+	if (qtype == QTYPE_AAAA && addr_num == 0) {
 		/*
-		* DNS server didn't returned A when asked for AAAA records.
+		* DNS server didn't returned A when asked for AAAA records,
+		* and no AAAA record returned either
 		* Most of the server do it, let's ask for A specificaly.
 		*/
 		err = dns_lookup(tmp_ctx, name, QTYPE_A, &reply);
@@ -249,7 +250,7 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 			goto done;
 		}
 
-		total = reply_to_addrs(tmp_ctx, &a_num, &addrs, total,
+		total = reply_to_addrs(tmp_ctx, &addr_num, &addrs, total,
 					reply, port);
 
 	}
-------------- next part --------------
diff --git a/source4/libcli/resolve/dns_ex.c b/source4/libcli/resolve/dns_ex.c
index 0bb3ba02287..0525d0d019a 100644
--- a/source4/libcli/resolve/dns_ex.c
+++ b/source4/libcli/resolve/dns_ex.c
@@ -81,7 +81,7 @@ struct dns_records_container {
 	uint32_t count;
 };
 
-static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *a_num,
+static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *addr_num,
 			  char ***cur_addrs, uint32_t total,
 			  struct dns_request *reply, int port)
 {
@@ -151,8 +151,8 @@ static int reply_to_addrs(TALLOC_CTX *mem_ctx, uint32_t *a_num,
 						rr->name->pLabelList->label);
 		if (addrs[total]) {
 			total++;
-			if (rr->type == QTYPE_A) {
-				(*a_num)++;
+			if (rr->type == QTYPE_A || rr->type == QTYPE_AAAA) {
+				(*addr_num)++;
 			}
 		}
 	}
@@ -211,7 +211,7 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 	struct dns_request *reply;
 	struct dns_records_container ret;
 	char **addrs = NULL;
-	uint32_t a_num, total;
+	uint32_t addr_num, total;
 	uint16_t qtype;
 	TALLOC_CTX *tmp_ctx;
 	DNS_ERROR err;
@@ -236,12 +236,13 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 		}
 	}
 
-	a_num = total = 0;
-	total = reply_to_addrs(tmp_ctx, &a_num, &addrs, total, reply, port);
+	addr_num = total = 0;
+	total = reply_to_addrs(tmp_ctx, &addr_num, &addrs, total, reply, port);
 
-	if (qtype == QTYPE_AAAA && a_num == 0) {
+	if (qtype == QTYPE_AAAA && addr_num == 0) {
 		/*
-		* DNS server didn't returned A when asked for AAAA records.
+		* DNS server didn't returned A when asked for AAAA records,
+		* and no AAAA record returned either
 		* Most of the server do it, let's ask for A specificaly.
 		*/
 		err = dns_lookup(tmp_ctx, name, QTYPE_A, &reply);
@@ -249,7 +250,7 @@ static struct dns_records_container get_a_aaaa_records(TALLOC_CTX *mem_ctx,
 			goto done;
 		}
 
-		total = reply_to_addrs(tmp_ctx, &a_num, &addrs, total,
+		total = reply_to_addrs(tmp_ctx, &addr_num, &addrs, total,
 					reply, port);
 
 	}


More information about the Pkg-samba-maint mailing list