From 8a2a7d987c18aecc60c0757b6e47200ba89f3940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= Date: Fri, 9 Jun 2023 22:54:41 +0200 Subject: [PATCH] Do not create server_domain for non-server records --local=/example/ and --address=/example/# create records, which contain no address or just NULL address. Some people generate quite large blocklists, which then can take quite long to walk through. Because it uses linear algorithm, it gets quite slow. Similar to upstream in 2.86, avoid walking through literal addresses or local blocks. Speeds up significantly loading of 50k or more records. Fixed regression caused by commit 73f4c86bcc76beb33d681c1d2c8a9f2840f6e284 Resolves: rhbz#2233542 (cherry picked from commit 418de6681f80261f4762d0f8109a8577a2b1dd22) --- dnsmasq-2.85-domain-blocklist-speedup.patch | 106 ++++++++++++++++++++ dnsmasq.spec | 9 +- 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 dnsmasq-2.85-domain-blocklist-speedup.patch 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)