diff --git a/dnsmasq-2.85-domain-blocklist-speedup.patch b/dnsmasq-2.85-domain-blocklist-speedup.patch new file mode 100644 index 0000000..fa0404e --- /dev/null +++ b/dnsmasq-2.85-domain-blocklist-speedup.patch @@ -0,0 +1,106 @@ +From 4cab3d930f9236408b838adfdaaeb6508a928bbf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= +Date: Fri, 9 Jun 2023 22:11:01 +0200 +Subject: [PATCH] Use serv_domain only for regular servers + +Do not try to use it for --local=/x/ or --address=/x/#. Some users use +quite long list of blocks, which slows down walking trough domain list +considerably. But searching by server_domain_find_domain is needed only +for normal servers, which may store there last used server and number +of recent forwarded queries. Local addresses overrides store there no +useful information, avoid searching and adding new domains for such +records. + +Would also speed up searching servers when blocklists are used, because +only domains of servers are tested. + +Resolves: rhbz#2209031 +--- + src/forward.c | 4 ++-- + src/option.c | 13 ++++++++----- + 2 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/src/forward.c b/src/forward.c +index d8e845a..989fb61 100644 +--- a/src/forward.c ++++ b/src/forward.c +@@ -234,8 +234,8 @@ static unsigned int search_servers(time_t now, struct all_addr **addrpp, unsigne + *type = 0; /* use normal servers for this domain */ + *domain = NULL; + } +- if (serv_domain && !*serv_domain) +- *serv_domain = server_domain_find_domain(*domain); ++ if (serv_domain && !*serv_domain && (*type & SERV_HAS_DOMAIN)==0) ++ *serv_domain = server_domain_find_domain(NULL); + return flags; + } + +diff --git a/src/option.c b/src/option.c +index 1382c55..b22fc90 100644 +--- a/src/option.c ++++ b/src/option.c +@@ -906,7 +906,7 @@ static struct server *add_rev4(struct in_addr addr, int msize) + p += sprintf(p, "in-addr.arpa"); + + serv->flags = SERV_HAS_DOMAIN; +- server_domain_new(serv); ++ serv->serv_domain = NULL; + serv->next = daemon->servers; + daemon->servers = serv; + +@@ -931,7 +931,7 @@ static struct server *add_rev6(struct in6_addr *addr, int msize) + p += sprintf(p, "ip6.arpa"); + + serv->flags = SERV_HAS_DOMAIN; +- server_domain_new(serv); ++ serv->serv_domain = NULL; + serv->next = daemon->servers; + daemon->servers = serv; + +@@ -2246,7 +2246,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + memset(serv, 0, sizeof(struct server)); + serv->domain = d; + serv->flags = SERV_HAS_DOMAIN | SERV_NO_ADDR; +- server_domain_new(serv); ++ serv->serv_domain = NULL; + serv->next = daemon->servers; + daemon->servers = serv; + } +@@ -2291,7 +2291,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + memset(serv, 0, sizeof(struct server)); + serv->domain = d; + serv->flags = SERV_HAS_DOMAIN | SERV_NO_ADDR; +- server_domain_new(serv); ++ serv->serv_domain = NULL; + serv->next = daemon->servers; + daemon->servers = serv; + } +@@ -2542,7 +2542,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + newlist = serv; + serv->domain = domain; + serv->flags = domain ? SERV_HAS_DOMAIN : SERV_FOR_NODOTS; +- server_domain_new(serv); ++ serv->serv_domain = NULL; + arg = end; + if (rebind) + break; +@@ -2594,6 +2594,8 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + server_list_free(newlist); + ret_err(err); + } ++ if ((newlist->flags & SERV_LITERAL_ADDRESS)==0) ++ server_domain_new(newlist); + } + + serv = newlist; +@@ -2637,6 +2639,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma + else + ret_err(gen_err); + ++ server_domain_new(serv); + string = parse_server(comma, &serv->addr, &serv->source_addr, serv->interface, &serv->flags); + + if (string) +-- +2.41.0 + diff --git a/dnsmasq.spec b/dnsmasq.spec index 1229f95..3c75ec1 100644 --- a/dnsmasq.spec +++ b/dnsmasq.spec @@ -13,7 +13,7 @@ Name: dnsmasq Version: 2.79 -Release: 30%{?extraversion:.%{extraversion}}%{?dist} +Release: 31%{?extraversion:.%{extraversion}}%{?dist} Summary: A lightweight DHCP/caching DNS server License: GPLv2 or GPLv3 @@ -93,6 +93,9 @@ Patch41: dnsmasq-2.85-serv_domain-rh2186481.patch Patch42: dnsmasq-2.85-serv_domain-rh2186481-2.patch # http://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commit;h=1f8f78a49b8fd6b2862a3882053b1c6e6e111e5c Patch43: dnsmasq-2.87-log-root-writeable.patch +# Downstream only patch; https://bugzilla.redhat.com/show_bug.cgi?id=2209031 +# complements patch42 +Patch44: dnsmasq-2.85-domain-blocklist-speedup.patch # This is workaround to nettle bug #1549190 # https://bugzilla.redhat.com/show_bug.cgi?id=1549190 @@ -169,6 +172,7 @@ server's leases. %patch41 -p1 -b .rh2186481 %patch42 -p1 -b .rh2186481-2 %patch43 -p1 -b .rh2156789 +%patch44 -p1 -b .rh2209031 # 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 @@ -268,6 +272,9 @@ install -Dpm 644 %{SOURCE2} %{buildroot}%{_sysusersdir}/dnsmasq.conf %{_mandir}/man1/dhcp_* %changelog +* Wed Jun 14 2023 Petr Menšík - 2.79-31 +- Do not create and search --local and --address=/x/# domains (#2233542) + * Wed Jun 14 2023 Petr Menšík - 2.79-30 - Make create logfile writeable by root (#2156789)