From cab5b05903096e1c9cf5575ccc73f89d15c8db69 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 18 May 2015 23:23:17 +0200 Subject: resolved: fix crash when shutting down MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported by Cristian Rodríguez http://lists.freedesktop.org/archives/systemd-devel/2015-May/031626.html --- src/resolve/resolved-dns-cache.c | 7 ++----- src/resolve/resolved-dns-server.c | 15 ++++++++------- src/resolve/resolved-link.c | 6 +++--- src/resolve/resolved-manager.c | 4 ++-- 4 files changed, 15 insertions(+), 17 deletions(-) (limited to 'src/resolve') diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 33ca4d1a45..be52891681 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -91,11 +91,8 @@ void dns_cache_flush(DnsCache *c) { assert(hashmap_size(c->by_key) == 0); assert(prioq_size(c->by_expiry) == 0); - hashmap_free(c->by_key); - c->by_key = NULL; - - prioq_free(c->by_expiry); - c->by_expiry = NULL; + c->by_key = hashmap_free(c->by_key); + c->by_expiry = prioq_free(c->by_expiry); } static void dns_cache_remove(DnsCache *c, DnsResourceKey *key) { diff --git a/src/resolve/resolved-dns-server.c b/src/resolve/resolved-dns-server.c index caf06fe450..9a62a63258 100644 --- a/src/resolve/resolved-dns-server.c +++ b/src/resolve/resolved-dns-server.c @@ -78,23 +78,24 @@ DnsServer* dns_server_free(DnsServer *s) { if (!s) return NULL; - if (s->manager) { + if (s->link) { if (s->type == DNS_SERVER_LINK) LIST_REMOVE(servers, s->link->dns_servers, s); - else if (s->type == DNS_SERVER_SYSTEM) + + if (s->link->current_dns_server == s) + link_set_dns_server(s->link, NULL); + } + + if (s->manager) { + if (s->type == DNS_SERVER_SYSTEM) LIST_REMOVE(servers, s->manager->dns_servers, s); else if (s->type == DNS_SERVER_FALLBACK) LIST_REMOVE(servers, s->manager->fallback_dns_servers, s); - else - assert_not_reached("Unknown server type"); if (s->manager->current_dns_server == s) manager_set_dns_server(s->manager, NULL); } - if (s->link && s->link->current_dns_server == s) - link_set_dns_server(s->link, NULL); - free(s); return NULL; diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c index f94e4bb6f0..27d9129e00 100644 --- a/src/resolve/resolved-link.c +++ b/src/resolve/resolved-link.c @@ -68,13 +68,13 @@ Link *link_free(Link *l) { if (l->manager) hashmap_remove(l->manager->links, INT_TO_PTR(l->ifindex)); + while (l->dns_servers) + dns_server_free(l->dns_servers); + dns_scope_free(l->unicast_scope); dns_scope_free(l->llmnr_ipv4_scope); dns_scope_free(l->llmnr_ipv6_scope); - while (l->dns_servers) - dns_server_free(l->dns_servers); - free(l); return NULL; } diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index dab737d3e4..52695376f0 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -534,11 +534,11 @@ Manager *manager_free(Manager *m) { while (m->dns_queries) dns_query_free(m->dns_queries); - dns_scope_free(m->unicast_scope); - manager_flush_dns_servers(m, DNS_SERVER_SYSTEM); manager_flush_dns_servers(m, DNS_SERVER_FALLBACK); + dns_scope_free(m->unicast_scope); + hashmap_free(m->links); hashmap_free(m->dns_transactions); -- cgit v1.2.3-54-g00ecf