From: Volker Lendecke Date: Sun, 3 May 2026 07:56:11 +0000 (+0200) Subject: lib/addns: Prepare for multiple IPs per NS record X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7a5b8abb6e3a5c22019c13c159fe37470b60719;p=thirdparty%2Fsamba.git lib/addns: Prepare for multiple IPs per NS record struct dns_rr_srv for SRV records already supports multiple IPs. Prepare for the same with NS records. No changes in the callers required, nobody looks at that yet. Signed-off-by: Volker Lendecke Reviewed-by: Stefan Metzmacher --- diff --git a/lib/addns/dnsquery.c b/lib/addns/dnsquery.c index 55ba5a68d39..b0c7b40275b 100644 --- a/lib/addns/dnsquery.c +++ b/lib/addns/dnsquery.c @@ -231,6 +231,40 @@ fail: return status; } +static bool ads_dns_add_ns_ip(struct dns_rr_ns *nss, + size_t num_nss, + const char *hostname, + const struct samba_sockaddr *addr) +{ + size_t i; + + for (i = 0; i < num_nss; i++) { + struct dns_rr_ns *ns = &nss[i]; + size_t num_ips = talloc_array_length(ns->ss_s); + struct samba_sockaddr *tmp = NULL; + + if (!strequal(ns->hostname, hostname)) { + continue; + } + + if (num_ips == SIZE_MAX) { + continue; + } + + tmp = talloc_realloc(nss, + ns->ss_s, + struct samba_sockaddr, + num_ips + 1); + if (tmp == NULL) { + return false; + } + ns->ss_s = tmp; + ns->ss_s[num_ips] = *addr; + } + + return true; +} + struct ads_dns_lookup_ns_state { struct dns_rr_ns *nss; size_t num_nss; @@ -308,19 +342,19 @@ static void ads_dns_lookup_ns_done(struct tevent_req *subreq) struct dns_res_rec *ar = &reply->additional[i]; struct samba_sockaddr addr = {}; bool ok; - size_t j; ok = dns_res_rec_get_sockaddr(ar, &addr); if (!ok) { continue; } - for (j=0; jnum_nss; j++) { - struct dns_rr_ns *ns = &state->nss[j]; - - if (strequal(ns->hostname, ar->name)) { - ns->ss = addr.u.ss; - } + ok = ads_dns_add_ns_ip(state->nss, + state->num_nss, + ar->name, + &addr); + if (!ok) { + tevent_req_oom(req); + return; } } diff --git a/libcli/dns/dns.h b/libcli/dns/dns.h index 6e5b888d657..e2f25be4976 100644 --- a/libcli/dns/dns.h +++ b/libcli/dns/dns.h @@ -58,7 +58,7 @@ struct dns_rr_srv { struct dns_rr_ns { const char *hostname; - struct sockaddr_storage ss; + struct samba_sockaddr *ss_s; /* support multi-homed hosts */ }; #endif