diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-06-08 18:17:44 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2021-06-08 21:40:54 +0200 |
commit | a77f9dfbaed2e49269b42222da0d1c8680057fa6 (patch) | |
tree | 13f0b629b68c4614ec6d5cd0d7ed1ed282ec632b /src/resolve/resolved-dns-server.c | |
parent | 592d419ce6e283c443901be4a69c95984821ff06 (diff) | |
download | systemd-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/resolve/resolved-dns-server.c')
-rw-r--r-- | src/resolve/resolved-dns-server.c | 36 |
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) { |