From b8d6689a7f600e8d9e64898a06b0521557e114e3 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 8 May 2021 01:56:24 +0900 Subject: [PATCH] resolve: check that bus is ready before emitting signal or property change --- src/resolve/resolved-bus.c | 3 +++ src/resolve/resolved-dns-zone.c | 2 +- src/resolve/resolved-dnssd.c | 19 ++++++++++--------- src/resolve/resolved-dnssd.h | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 31c96706a21..7226200f006 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -2272,6 +2272,9 @@ int manager_connect_bus(Manager *m) { int _manager_send_changed(Manager *manager, const char *property, ...) { assert(manager); + if (sd_bus_is_ready(manager->bus) <= 0) + return 0; + char **l = strv_from_stdarg_alloca(property); int r = sd_bus_emit_properties_changed_strv( diff --git a/src/resolve/resolved-dns-zone.c b/src/resolve/resolved-dns-zone.c index 6f15c53953e..b86b3251448 100644 --- a/src/resolve/resolved-dns-zone.c +++ b/src/resolve/resolved-dns-zone.c @@ -500,7 +500,7 @@ void dns_zone_item_conflict(DnsZoneItem *i) { /* Withdraw the conflict item */ i->state = DNS_ZONE_ITEM_WITHDRAWN; - dnssd_signal_conflict(i->scope->manager, dns_resource_key_name(i->rr->key)); + (void) dnssd_signal_conflict(i->scope->manager, dns_resource_key_name(i->rr->key)); /* Maybe change the hostname */ if (manager_is_own_hostname(i->scope->manager, dns_resource_key_name(i->rr->key)) > 0) diff --git a/src/resolve/resolved-dnssd.c b/src/resolve/resolved-dnssd.c index 33d695a9ce7..aed9c5c1cdb 100644 --- a/src/resolve/resolved-dnssd.c +++ b/src/resolve/resolved-dnssd.c @@ -329,10 +329,13 @@ int dnssd_txt_item_new_from_data(const char *key, const void *data, const size_t return 0; } -void dnssd_signal_conflict(Manager *manager, const char *name) { +int dnssd_signal_conflict(Manager *manager, const char *name) { DnssdService *s; int r; + if (sd_bus_is_ready(manager->bus) <= 0) + return 0; + HASHMAP_FOREACH(s, manager->dnssd_services) { if (s->withdrawn) continue; @@ -343,22 +346,20 @@ void dnssd_signal_conflict(Manager *manager, const char *name) { s->withdrawn = true; r = sd_bus_path_encode("/org/freedesktop/resolve1/dnssd", s->name, &path); - if (r < 0) { - log_error_errno(r, "Can't get D-BUS object path: %m"); - return; - } + if (r < 0) + return log_error_errno(r, "Can't get D-BUS object path: %m"); r = sd_bus_emit_signal(manager->bus, path, "org.freedesktop.resolve1.DnssdService", "Conflicted", NULL); - if (r < 0) { - log_error_errno(r, "Cannot emit signal: %m"); - return; - } + if (r < 0) + return log_error_errno(r, "Cannot emit signal: %m"); break; } } + + return 0; } diff --git a/src/resolve/resolved-dnssd.h b/src/resolve/resolved-dnssd.h index 8fe755687e1..d020bb531cc 100644 --- a/src/resolve/resolved-dnssd.h +++ b/src/resolve/resolved-dnssd.h @@ -58,4 +58,4 @@ int dnssd_load(Manager *manager); int dnssd_txt_item_new_from_string(const char *key, const char *value, DnsTxtItem **ret_item); int dnssd_txt_item_new_from_data(const char *key, const void *value, const size_t size, DnsTxtItem **ret_item); int dnssd_update_rrs(DnssdService *s); -void dnssd_signal_conflict(Manager *manager, const char *name); +int dnssd_signal_conflict(Manager *manager, const char *name); -- 2.47.3