aboutsummaryrefslogtreecommitdiffstats
path: root/main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch')
-rw-r--r--main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch238
1 files changed, 0 insertions, 238 deletions
diff --git a/main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch b/main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch
deleted file mode 100644
index 1c2ae0deff9..00000000000
--- a/main/dnsmasq/0024-Fix-massive-confusion-on-server-reload.patch
+++ /dev/null
@@ -1,238 +0,0 @@
-Patch-Source: https://thekelleys.org.uk/gitweb/?p=dnsmasq.git;a=commitdiff;h=553c4c99cca173e9964d0edbd0676ed96c30f62b (modified)
---
-From 553c4c99cca173e9964d0edbd0676ed96c30f62b Mon Sep 17 00:00:00 2001
-From: Simon Kelley <simon@thekelleys.org.uk>
-Date: Mon, 3 Jan 2022 23:32:30 +0000
-Subject: [PATCH 1/1] Fix massive confusion on server reload.
-
-The 2.86 upstream server rewrite severely broke re-reading
-of server configuration. It would get everyting right the first
-time, but on re-reading /etc/resolv.conf or --servers-file
-or setting things with DBUS, the results were just wrong.
-
-This should put things right again.
----
- src/domain-match.c | 157 +++++++++++++++++++++++++--------------------
- 1 file changed, 88 insertions(+), 69 deletions(-)
-
-diff --git a/src/domain-match.c b/src/domain-match.c
-index b457f5b..4e01092 100644
---- a/src/domain-match.c
-+++ b/src/domain-match.c
-@@ -543,22 +542,39 @@ static int order_qsort(const void *a, const void *b)
- return rc;
- }
-
-+/* Must be called before add_update_server() to set daemon->servers_tail */
- void mark_servers(int flag)
- {
-- struct server *serv;
-+ struct server *serv, **up;
-
-+ daemon->servers_tail = NULL;
-+
- /* mark everything with argument flag */
- for (serv = daemon->servers; serv; serv = serv->next)
-- if (serv->flags & flag)
-- serv->flags |= SERV_MARK;
-- else
-- serv->flags &= ~SERV_MARK;
-+ {
-+ if (serv->flags & flag)
-+ serv->flags |= SERV_MARK;
-+ else
-+ serv->flags &= ~SERV_MARK;
-
-- for (serv = daemon->local_domains; serv; serv = serv->next)
-- if (serv->flags & flag)
-- serv->flags |= SERV_MARK;
-- else
-- serv->flags &= ~SERV_MARK;
-+ daemon->servers_tail = serv;
-+ }
-+
-+ /* --address etc is different: since they are expected to be
-+ 1) numerous and 2) not reloaded often. We just delete
-+ and recreate. */
-+ if (flag)
-+ for (serv = daemon->local_domains, up = &daemon->local_domains; serv; serv = serv->next)
-+ {
-+ if (serv->flags & flag)
-+ {
-+ *up = serv->next;
-+ free(serv->domain);
-+ free(serv);
-+ }
-+ else
-+ up = &serv->next;
-+ }
- }
-
- void cleanup_servers(void)
-@@ -566,7 +583,7 @@ void cleanup_servers(void)
- struct server *serv, *tmp, **up;
-
- /* unlink and free anything still marked. */
-- for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp)
-+ for (serv = daemon->servers, up = &daemon->servers, daemon->servers_tail = NULL; serv; serv = tmp)
- {
- tmp = serv->next;
- if (serv->flags & SERV_MARK)
-@@ -582,19 +599,6 @@ void cleanup_servers(void)
- daemon->servers_tail = serv;
- }
- }
--
-- for (serv = daemon->local_domains, up = &daemon->local_domains; serv; serv = tmp)
-- {
-- tmp = serv->next;
-- if (serv->flags & SERV_MARK)
-- {
-- *up = serv->next;
-- free(serv->domain);
-- free(serv);
-- }
-- else
-- up = &serv->next;
-- }
-
- /* If we're delaying things, we don't call check_servers(), but
- reload_servers() may have deleted some servers, rendering the server_array
-@@ -634,35 +640,16 @@ int add_update_server(int flags,
- if (!alloc_domain)
- return 0;
-
-- /* See if there is a suitable candidate, and unmark
-- only do this for forwarding servers, not
-- address or local, to avoid delays on large numbers. */
- if (flags & SERV_IS_LOCAL)
-- for (serv = daemon->servers; serv; serv = serv->next)
-- if ((serv->flags & SERV_MARK) &&
-- hostname_isequal(alloc_domain, serv->domain))
-- break;
--
-- if (serv)
- {
-- free(alloc_domain);
-- alloc_domain = serv->domain;
-- }
-- else
-- {
- size_t size;
--
-- if (flags & SERV_IS_LOCAL)
-- {
-- if (flags & SERV_6ADDR)
-- size = sizeof(struct serv_addr6);
-- else if (flags & SERV_4ADDR)
-- size = sizeof(struct serv_addr4);
-- else
-- size = sizeof(struct serv_local);
-- }
-+
-+ if (flags & SERV_6ADDR)
-+ size = sizeof(struct serv_addr6);
-+ else if (flags & SERV_4ADDR)
-+ size = sizeof(struct serv_addr4);
- else
-- size = sizeof(struct server);
-+ size = sizeof(struct serv_local);
-
- if (!(serv = whine_malloc(size)))
- {
-@@ -670,19 +655,53 @@ int add_update_server(int flags,
- return 0;
- }
-
-- if (flags & SERV_IS_LOCAL)
-+ serv->next = daemon->local_domains;
-+ daemon->local_domains = serv;
-+
-+ if (flags & SERV_4ADDR)
-+ ((struct serv_addr4*)serv)->addr = local_addr->addr4;
-+
-+ if (flags & SERV_6ADDR)
-+ ((struct serv_addr6*)serv)->addr = local_addr->addr6;
-+ }
-+ else
-+ {
-+ /* Upstream servers. See if there is a suitable candidate, if so unmark
-+ and move to the end of the list, for order. The entry found may already
-+ be at the end. */
-+ struct server **up, *tmp;
-+
-+ for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp)
- {
-- serv->next = daemon->local_domains;
-- daemon->local_domains = serv;
-+ tmp = serv->next;
-+ if ((serv->flags & SERV_MARK) &&
-+ hostname_isequal(alloc_domain, serv->domain))
-+ {
-+ /* Need to move down? */
-+ if (serv->next)
-+ {
-+ *up = serv->next;
-+ daemon->servers_tail->next = serv;
-+ daemon->servers_tail = serv;
-+ serv->next = NULL;
-+ }
-+ break;
-+ }
-+ }
-
-- if (flags & SERV_4ADDR)
-- ((struct serv_addr4*)serv)->addr = local_addr->addr4;
--
-- if (flags & SERV_6ADDR)
-- ((struct serv_addr6*)serv)->addr = local_addr->addr6;
-+ if (serv)
-+ {
-+ free(alloc_domain);
-+ alloc_domain = serv->domain;
- }
- else
- {
-+ if (!(serv = whine_malloc(sizeof(struct server))))
-+ {
-+ free(alloc_domain);
-+ return 0;
-+ }
-+
- memset(serv, 0, sizeof(struct server));
-
- /* Add to the end of the chain, for order */
-@@ -691,20 +710,20 @@ int add_update_server(int flags,
- else
- daemon->servers = serv;
- daemon->servers_tail = serv;
--
-+ }
-+
- #ifdef HAVE_LOOP
-- serv->uid = rand32();
-+ serv->uid = rand32();
- #endif
-
-- if (interface)
-- safe_strncpy(serv->interface, interface, sizeof(serv->interface));
-- if (addr)
-- serv->addr = *addr;
-- if (source_addr)
-- serv->source_addr = *source_addr;
-- }
-+ if (interface)
-+ safe_strncpy(serv->interface, interface, sizeof(serv->interface));
-+ if (addr)
-+ serv->addr = *addr;
-+ if (source_addr)
-+ serv->source_addr = *source_addr;
- }
--
-+
- serv->flags = flags;
- serv->domain = alloc_domain;
- serv->domain_len = strlen(alloc_domain);
---
-2.20.1
-