From e67767452295d17877ff991f6620cef62af1fa93 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 3 Sep 2026 08:40:32 +0900 Subject: [PATCH] resolve: use custom hash_ops for Manager.dnssd_registered_services --- src/resolve/resolved-bus.c | 17 ++++++++++------- src/resolve/resolved-dnssd.c | 10 +++++++++- src/resolve/resolved-dnssd.h | 2 ++ src/resolve/resolved-manager.c | 3 --- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index 650259a8c0..d4a0a6774f 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -2055,6 +2055,15 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata, if (r == 0) return 1; /* Polkit will call us back */ + /* First, attach the service to the manager. */ + r = hashmap_ensure_put(&m->dnssd_registered_services, &dnssd_registered_service_hash_ops, service->id, service); + if (r < 0) + return r; + + service->manager = m; + + /* Then, attach the bus track to the service. As dnssd_registered_service_on_bus_track() requires + * service->manager is set, this must be done after attaching to the manager in the above. */ r = sd_bus_track_new(sd_bus_message_get_bus(message), &bus_track, dnssd_registered_service_on_bus_track, service); if (r < 0) return r; @@ -2067,13 +2076,7 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata, * bus, hence keep the bus track object pinned for the lifetime of the service. */ service->bus_track = TAKE_PTR(bus_track); - service->manager = m; - - r = hashmap_ensure_put(&m->dnssd_registered_services, &string_hash_ops, service->id, service); - if (r < 0) - return r; - - service = NULL; + TAKE_PTR(service); manager_refresh_rrs(m); diff --git a/src/resolve/resolved-dnssd.c b/src/resolve/resolved-dnssd.c index 1d9d8f6635..11e9c0fce6 100644 --- a/src/resolve/resolved-dnssd.c +++ b/src/resolve/resolved-dnssd.c @@ -74,6 +74,14 @@ DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *se return mfree(service); } +DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + dnssd_registered_service_hash_ops, + char, + string_hash_func, + string_compare_func, + DnssdRegisteredService, + dnssd_registered_service_free); + static int dnssd_registered_service_make_goodbye( DnssdRegisteredService *service, DnsScope *scope, @@ -263,7 +271,7 @@ static int dnssd_registered_service_load(Manager *manager, const char *path) { TAKE_PTR(txt_data); } - r = hashmap_ensure_put(&manager->dnssd_registered_services, &string_hash_ops, service->id, service); + r = hashmap_ensure_put(&manager->dnssd_registered_services, &dnssd_registered_service_hash_ops, service->id, service); if (r < 0) return r; diff --git a/src/resolve/resolved-dnssd.h b/src/resolve/resolved-dnssd.h index d19024e972..740d3df0fc 100644 --- a/src/resolve/resolved-dnssd.h +++ b/src/resolve/resolved-dnssd.h @@ -50,6 +50,8 @@ typedef struct DnssdRegisteredService { uid_t originator; } DnssdRegisteredService; +extern const struct hash_ops dnssd_registered_service_hash_ops; + DnssdRegisteredService *dnssd_registered_service_free(DnssdRegisteredService *service); void dnssd_registered_service_unregister(DnssdRegisteredService *service); DnssdTxtData *dnssd_txtdata_free(DnssdTxtData *txt_data); diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index 8997ba0c35..2e95d6d9c0 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -840,7 +840,6 @@ int manager_start(Manager *m) { Manager* manager_free(Manager *m) { Link *l; - DnssdRegisteredService *s; if (!m) return NULL; @@ -914,8 +913,6 @@ Manager* manager_free(Manager *m) { free(m->llmnr_hostname); free(m->mdns_hostname); - while ((s = hashmap_first(m->dnssd_registered_services))) - dnssd_registered_service_free(s); hashmap_free(m->dnssd_registered_services); dns_trust_anchor_flush(&m->trust_anchor);