]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: fix strange function recursion
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 8 Jun 2021 16:17:44 +0000 (18:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 8 Jun 2021 19:40:54 +0000 (21:40 +0200)
In dns_server_unlink_marked() and dns_server_mark_all() we done recursively.
People might have dozens of servers defined, and it's better to avoid recursion
when a simple loop suffices.

dns_server_unlink_marked() would only unmark the first marked server.

Fixes #19651.

src/resolve/resolved-dns-server.c

index a094d472c0755f9d63fe7520e35288daa3679f29..3ba771726cb54f4e47ee69e222b5c9c3ac741abc 100644 (file)
@@ -805,30 +805,30 @@ void dns_server_unlink_all(DnsServer *first) {
         dns_server_unlink_all(next);
 }
 
-bool dns_server_unlink_marked(DnsServer *first) {
-        DnsServer *next;
-        bool changed;
+bool dns_server_unlink_marked(DnsServer *server) {
+        bool changed = false;
 
-        if (!first)
-                return false;
+        while (server) {
+                DnsServer *next;
 
-        next = first->servers_next;
+                next = server->servers_next;
 
-        if (first->marked) {
-                changed = true;
-                dns_server_unlink(first);
-        } else
-                changed = false;
+                if (server->marked) {
+                        dns_server_unlink(server);
+                        changed = true;
+                }
 
-        return changed || dns_server_unlink_marked(next);
-}
+                server = next;
+        }
 
-void dns_server_mark_all(DnsServer *first) {
-        if (!first)
-                return;
+        return changed;
+}
 
-        first->marked = true;
-        dns_server_mark_all(first->servers_next);
+void dns_server_mark_all(DnsServer *server) {
+        while (server) {
+                server->marked = true;
+                server = server->servers_next;
+        }
 }
 
 DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, uint16_t port, int ifindex, const char *name) {