Blame SOURCES/dnsmasq-2.79-server-domain-fixup.patch

7cd286
From 4c5cbdfb82e668268a5f3713fe119fb077667c8e Mon Sep 17 00:00:00 2001
7cd286
From: rpm-build <rpm-build>
7cd286
Date: Mon, 22 Aug 2022 21:59:42 +0200
7cd286
Subject: [PATCH] Ensure also server_domains_cleanup is called always
7cd286
7cd286
Fixes issue in patch dnsmasq-2.79-server-domain-rh1919894.patch.
7cd286
7cd286
When /etc/resolv.conf is changed, dnsmasq reloads used servers. But it
7cd286
does not call cleanup of server domains in this case. It might cause
7cd286
serv_domain->last_server to become non-null, but pointing released
7cd286
server. Ensure it is checked before any cleanup_servers() action always
7cd286
and from all other places, like dbus setting.
7cd286
7cd286
Caused unending loop in forward_query function, rhbz#2106361.
7cd286
---
7cd286
 src/network.c | 49 +++++++++++++++++++++++++------------------------
7cd286
 1 file changed, 25 insertions(+), 24 deletions(-)
7cd286
7cd286
diff --git a/src/network.c b/src/network.c
7cd286
index 4d140bb..96668fb 100644
7cd286
--- a/src/network.c
7cd286
+++ b/src/network.c
7cd286
@@ -1402,10 +1402,35 @@ void mark_servers(int flag)
7cd286
     }
7cd286
 }
7cd286
 
7cd286
+static void server_domains_cleanup(void)
7cd286
+{
7cd286
+  struct server_domain *sd, *tmp, **up;
7cd286
+
7cd286
+  /* unlink and free anything still marked. */
7cd286
+  for (up = &daemon->server_domains, sd=*up; sd; sd = tmp)
7cd286
+    {
7cd286
+      tmp = sd->next;
7cd286
+      if (sd->flags & SERV_MARK)
7cd286
+       {
7cd286
+         *up = sd->next;
7cd286
+         if (sd->domain)
7cd286
+	   free(sd->domain);
7cd286
+	 free(sd);
7cd286
+       }
7cd286
+      else {
7cd286
+        up = &sd->next;
7cd286
+        if (sd->last_server && (sd->last_server->flags & SERV_MARK))
7cd286
+	  sd->last_server = NULL;
7cd286
+      }
7cd286
+    }
7cd286
+}
7cd286
+
7cd286
 void cleanup_servers(void)
7cd286
 {
7cd286
   struct server *serv, *tmp, **up;
7cd286
 
7cd286
+  server_domains_cleanup();
7cd286
+
7cd286
   /* unlink and free anything still marked. */
7cd286
   for (serv = daemon->servers, up = &daemon->servers; serv; serv = tmp) 
7cd286
     {
7cd286
@@ -1428,29 +1453,6 @@ void cleanup_servers(void)
7cd286
 #endif
7cd286
 }
7cd286
 
7cd286
-void server_domains_cleanup(void)
7cd286
-{
7cd286
-  struct server_domain *sd, *tmp, **up;
7cd286
-
7cd286
-  /* unlink and free anything still marked. */
7cd286
-  for (up = &daemon->server_domains, sd=*up; sd; sd = tmp)
7cd286
-    {
7cd286
-      tmp = sd->next;
7cd286
-      if (sd->flags & SERV_MARK)
7cd286
-       {
7cd286
-         *up = sd->next;
7cd286
-         if (sd->domain)
7cd286
-	   free(sd->domain);
7cd286
-	 free(sd);
7cd286
-       }
7cd286
-      else {
7cd286
-        up = &sd->next;
7cd286
-        if (sd->last_server && (sd->last_server->flags & SERV_MARK))
7cd286
-	  sd->last_server = NULL;
7cd286
-      }
7cd286
-    }
7cd286
-}
7cd286
-
7cd286
 void add_update_server(int flags,
7cd286
 		       union mysockaddr *addr,
7cd286
 		       union mysockaddr *source_addr,
7cd286
@@ -1739,7 +1741,6 @@ void check_servers(void)
7cd286
 	up = &sfd->next;
7cd286
     }
7cd286
   
7cd286
-  server_domains_cleanup();
7cd286
   cleanup_servers();
7cd286
 }
7cd286
 
7cd286
-- 
7cd286
2.37.2
7cd286