From 70671aa970b1c0702e6c52a612bf73e141b454e1 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Mon, 13 Nov 2023 13:49:22 +0000 Subject: [PATCH] import UBI dnsmasq-2.79-26.el8_8.1 --- ...dnsmasq-2.85-serv_domain-rh2186481-2.patch | 83 ++++++++++++++ .../dnsmasq-2.85-serv_domain-rh2186481.patch | 108 ++++++++++++++++++ SPECS/dnsmasq.spec | 14 ++- 3 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 SOURCES/dnsmasq-2.85-serv_domain-rh2186481-2.patch create mode 100644 SOURCES/dnsmasq-2.85-serv_domain-rh2186481.patch diff --git a/SOURCES/dnsmasq-2.85-serv_domain-rh2186481-2.patch b/SOURCES/dnsmasq-2.85-serv_domain-rh2186481-2.patch new file mode 100644 index 0000000..4a62c59 --- /dev/null +++ b/SOURCES/dnsmasq-2.85-serv_domain-rh2186481-2.patch @@ -0,0 +1,83 @@ +From 312e9f812a6b2f5ca2c2db866ffed3a0b289b945 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Wed, 10 May 2023 12:57:17 +0200 +Subject: [PATCH] fixup! Correct releasing of serv_domain + +--- + src/dnsmasq.h | 2 +- + src/network.c | 20 +++++++++++--------- + 2 files changed, 12 insertions(+), 10 deletions(-) + +diff --git a/src/dnsmasq.h b/src/dnsmasq.h +index e8a1320..711ffd3 100644 +--- a/src/dnsmasq.h ++++ b/src/dnsmasq.h +@@ -1331,7 +1331,7 @@ int label_exception(int index, int family, struct all_addr *addr); + int fix_fd(int fd); + int tcp_interface(int fd, int af); + struct server_domain *server_domain_find_domain(const char *domain); +-struct server_domain *server_domain_new(struct server *serv); ++void server_domain_new(struct server *serv); + #ifdef HAVE_IPV6 + int set_ipv6pktinfo(int fd); + #endif +diff --git a/src/network.c b/src/network.c +index b8d77fe..6faaad4 100644 +--- a/src/network.c ++++ b/src/network.c +@@ -1544,6 +1544,7 @@ void add_update_server(int flags, + serv->addr = *addr; + if (source_addr) + serv->source_addr = *source_addr; ++ server_domain_new(serv); + } + } + +@@ -1571,14 +1572,20 @@ struct server_domain *server_domain_find_domain(const char *domain) + /**< Test structure has already set domain pointer. + * + * If not, create a new record. */ +-struct server_domain *server_domain_new(struct server *serv) ++void server_domain_new(struct server *serv) + { + struct server_domain *sd; ++ const char *domain = server_get_domain(serv); + +- if ((sd = whine_malloc(sizeof(struct server_domain)))) ++ sd = server_domain_find_domain(domain); ++ if (sd) + { +- const char *domain = server_get_domain(serv); ++ serv->serv_domain = sd; ++ return; ++ } + ++ if ((sd = whine_malloc(sizeof(struct server_domain)))) ++ { + /* Ensure all serv->domain values have own record in server_domain. + * Add a new record. */ + if (domain) +@@ -1592,7 +1599,6 @@ struct server_domain *server_domain_new(struct server *serv) + serv->serv_domain = sd; + daemon->server_domains = sd; + } +- return sd; + } + + /**< Test structure has already set domain pointer. +@@ -1605,11 +1611,7 @@ static void server_domain_check(struct server *serv) + if (sd) + sd->flags &= (~SERV_MARK); /* found domain, mark active */ + else +- { +- sd = server_domain_find_domain(serv->domain); +- if (!sd) +- server_domain_new(serv); +- } ++ server_domain_new(serv); + } + + void check_servers(void) +-- +2.40.1 + diff --git a/SOURCES/dnsmasq-2.85-serv_domain-rh2186481.patch b/SOURCES/dnsmasq-2.85-serv_domain-rh2186481.patch new file mode 100644 index 0000000..db9f6d0 --- /dev/null +++ b/SOURCES/dnsmasq-2.85-serv_domain-rh2186481.patch @@ -0,0 +1,108 @@ +From c0e0202736f55195104dad9fec98c20d0d15df21 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Fri, 21 Apr 2023 17:04:53 +0200 +Subject: [PATCH] Correct releasing of serv_domain + +In case the server->serv_domain points to domain also when it is not the +last server used, ensure the reference to last_server is always reset. +Some records might reference the server_domain, but cannot ever become +last_server. Such as server=/example.com/# + +Correct detection of used server_domains for standard resolvers case. +Mark domain used even in that case, so it is not freed during +resolv.conf reading or other nameservers change. +--- + src/network.c | 40 +++++++++++++++++++++++++++++++--------- + 1 file changed, 31 insertions(+), 9 deletions(-) + +diff --git a/src/network.c b/src/network.c +index cf2f2e2..8152cac 100644 +--- a/src/network.c ++++ b/src/network.c +@@ -1511,7 +1511,18 @@ void mark_servers(int flag) + } + } + +-static void server_domains_cleanup(void) ++static void server_domains_pre_cleanup(void) ++{ ++ struct server_domain *sd; ++ ++ /* reset removed last_server. */ ++ for (sd = daemon->server_domains; sd; sd = sd->next) ++ if ((sd->flags & SERV_MARK) == 0 && sd->last_server && ++ (sd->last_server->flags & SERV_MARK) != 0) ++ sd->last_server = NULL; ++} ++ ++static void server_domains_post_cleanup(void) + { + struct server_domain *sd, *tmp, **up; + +@@ -1528,8 +1539,6 @@ static void server_domains_cleanup(void) + } + else { + up = &sd->next; +- if (sd->last_server && (sd->last_server->flags & SERV_MARK)) +- sd->last_server = NULL; + } + } + } +@@ -1538,7 +1547,7 @@ void cleanup_servers(void) + { + struct server *serv, *tmp, **up; + +- server_domains_cleanup(); ++ server_domains_pre_cleanup(); + + /* unlink and free anything still marked. */ + for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp) +@@ -1552,10 +1561,16 @@ void cleanup_servers(void) + free(serv->domain); + free(serv); + } +- else +- up = &serv->next; ++ else ++ { ++ up = &serv->next; ++ if (serv->serv_domain && (serv->serv_domain->flags & SERV_MARK) != 0) ++ serv->serv_domain = NULL; ++ } + } + ++ server_domains_post_cleanup(); ++ + #ifdef HAVE_LOOP + /* Now we have a new set of servers, test for loops. */ + loop_send_probes(); +@@ -1699,7 +1714,11 @@ static void server_domain_check(struct server *serv) + if (sd) + sd->flags &= (~SERV_MARK); /* found domain, mark active */ + else +- server_domain_new(serv); ++ { ++ sd = server_domain_find_domain(serv->domain); ++ if (!sd) ++ server_domain_new(serv); ++ } + } + + void check_servers(void) +@@ -1808,8 +1827,11 @@ void check_servers(void) + else if (strlen(serv->domain) == 0) + s1 = _("default"), s2 = ""; + else +- s1 = _("domain"), s2 = serv->domain; +- ++ { ++ s1 = _("domain"), s2 = serv->domain; ++ server_domain_check(serv); ++ } ++ + if (serv->flags & SERV_NO_ADDR) + { + count--; +-- +2.39.2 + diff --git a/SPECS/dnsmasq.spec b/SPECS/dnsmasq.spec index 3595088..0a98431 100644 --- a/SPECS/dnsmasq.spec +++ b/SPECS/dnsmasq.spec @@ -13,7 +13,7 @@ Name: dnsmasq Version: 2.79 -Release: 26%{?extraversion:.%{extraversion}}%{?dist} +Release: 26%{?extraversion:.%{extraversion}}%{?dist}.1 Summary: A lightweight DHCP/caching DNS server License: GPLv2 or GPLv3 @@ -83,6 +83,12 @@ Patch37: dnsmasq-2.81-linux-SIOCGSTAMP.patch Patch38: dnsmasq-2.79-server-domain-fixup.patch # https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;h=f8c77edbdffb8ada7753ea9fa104f0f6da70cfe3 Patch39: dnsmasq-2.81-dhcpv6-relay-link-address.patch +# Downstream only patch; https://bugzilla.redhat.com/show_bug.cgi?id=2186481 +# Fixes issue in Patch4 +Patch41: dnsmasq-2.85-serv_domain-rh2186481.patch +# Downstream only patch; https://bugzilla.redhat.com/show_bug.cgi?id=2186481 +# complements patch10 +Patch42: dnsmasq-2.85-serv_domain-rh2186481-2.patch # This is workaround to nettle bug #1549190 # https://bugzilla.redhat.com/show_bug.cgi?id=1549190 @@ -155,6 +161,8 @@ server's leases. %patch37 -p1 -b .SIOCGSTAMP %patch38 -p1 -b .rh2120357 %patch39 -p1 -b .rh2169355 +%patch41 -p1 -b .rh2186481 +%patch42 -p1 -b .rh2186481-2 # use /var/lib/dnsmasq instead of /var/lib/misc for file in dnsmasq.conf.example man/dnsmasq.8 man/es/dnsmasq.8 src/config.h; do @@ -254,6 +262,10 @@ install -Dpm 644 %{SOURCE2} %{buildroot}%{_sysusersdir}/dnsmasq.conf %{_mandir}/man1/dhcp_* %changelog +* Fri Apr 21 2023 Petr Menšík - 2.79-26.1 +- Correct possible crashes when server=/example.net/# is used (#2186481) +- Fix also dynamically set resolvers over dbus (#2186481) + * Wed Feb 15 2023 Petr Menšík - 2.79-26 - Avoid DHCPv6 relayed replies with Client Link-Layer Address (#2169355)