summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2021-06-08 18:17:44 +0200
committerLennart Poettering <lennart@poettering.net>2021-06-08 21:40:54 +0200
commita77f9dfbaed2e49269b42222da0d1c8680057fa6 (patch)
tree13f0b629b68c4614ec6d5cd0d7ed1ed282ec632b /src
parent592d419ce6e283c443901be4a69c95984821ff06 (diff)
downloadsystemd-a77f9dfbaed2e49269b42222da0d1c8680057fa6.tar.gz
resolved: fix strange function recursion
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.
Diffstat (limited to 'src')
-rw-r--r--src/resolve/resolved-dns-server.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c
index a094d472c0..3ba771726c 100644
--- a/src/resolve/resolved-dns-server.c
+++ b/src/resolve/resolved-dns-server.c
@@ -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) {