]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolve/dnssd: make dnssd_render_instance_name() take Manager
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 15 May 2022 01:23:25 +0000 (10:23 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 15 May 2022 01:23:33 +0000 (10:23 +0900)
As DnssdService object passed to dnssd_render_instance_name() may
not owned by Manager.

Fixes #23381.

src/resolve/resolved-bus.c
src/resolve/resolved-dnssd.c
src/resolve/resolved-dnssd.h

index 4425a2f320883d62d43c4a32003e32bd3928a6b6..ba525e30f2624fd2750f0370a39bdcdede958951 100644 (file)
@@ -1900,7 +1900,6 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
         _cleanup_(dnssd_service_freep) DnssdService *service = NULL;
         _cleanup_(sd_bus_track_unrefp) sd_bus_track *bus_track = NULL;
         _cleanup_free_ char *path = NULL;
-        _cleanup_free_ char *instance_name = NULL;
         Manager *m = userdata;
         DnssdService *s = NULL;
         const char *name;
@@ -1953,7 +1952,7 @@ static int bus_method_register_service(sd_bus_message *message, void *userdata,
         if (!service->type)
                 return log_oom();
 
-        r = dnssd_render_instance_name(service, &instance_name);
+        r = dnssd_render_instance_name(m, service, NULL);
         if (r < 0)
                 return r;
 
index 443760ab7078fcf95adf290c6ff0aab34ca0e8bf..6ed55035b82f1c7a66956b7e2a8757aa8e6d63d0 100644 (file)
@@ -136,14 +136,12 @@ static int dnssd_service_load(Manager *manager, const char *filename) {
 }
 
 static int specifier_dnssd_hostname(char specifier, const void *data, const char *root, const void *userdata, char **ret) {
-        DnssdService *s  = (DnssdService *) userdata;
+        const Manager *m = ASSERT_PTR(userdata);
         char *n;
 
-        assert(s);
-        assert(s->manager);
-        assert(s->manager->llmnr_hostname);
+        assert(m->llmnr_hostname);
 
-        n = strdup(s->manager->llmnr_hostname);
+        n = strdup(m->llmnr_hostname);
         if (!n)
                 return -ENOMEM;
 
@@ -151,7 +149,7 @@ static int specifier_dnssd_hostname(char specifier, const void *data, const char
         return 0;
 }
 
-int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
+int dnssd_render_instance_name(Manager *m, DnssdService *s, char **ret) {
         static const Specifier specifier_table[] = {
                 { 'a', specifier_architecture,   NULL },
                 { 'b', specifier_boot_id,        NULL },
@@ -167,10 +165,11 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
         _cleanup_free_ char *name = NULL;
         int r;
 
+        assert(m);
         assert(s);
         assert(s->name_template);
 
-        r = specifier_printf(s->name_template, DNS_LABEL_MAX, specifier_table, NULL, s, &name);
+        r = specifier_printf(s->name_template, DNS_LABEL_MAX, specifier_table, NULL, m, &name);
         if (r < 0)
                 return log_debug_errno(r, "Failed to replace specifiers: %m");
 
@@ -179,7 +178,8 @@ int dnssd_render_instance_name(DnssdService *s, char **ret_name) {
                                        "Service instance name '%s' is invalid.",
                                        name);
 
-        *ret_name = TAKE_PTR(name);
+        if (ret)
+                *ret = TAKE_PTR(name);
 
         return 0;
 }
@@ -221,7 +221,7 @@ int dnssd_update_rrs(DnssdService *s) {
         LIST_FOREACH(items, txt_data, s->txt_data_items)
                 txt_data->rr = dns_resource_record_unref(txt_data->rr);
 
-        r = dnssd_render_instance_name(s, &n);
+        r = dnssd_render_instance_name(s->manager, s, &n);
         if (r < 0)
                 return r;
 
index d020bb531cc09365eab22d057f17abd067acb895..219c0ddfea281e75cccfa12cc8faf1058f867607 100644 (file)
@@ -53,7 +53,7 @@ DnssdTxtData *dnssd_txtdata_free_all(DnssdTxtData *txt_data);
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdService*, dnssd_service_free);
 DEFINE_TRIVIAL_CLEANUP_FUNC(DnssdTxtData*, dnssd_txtdata_free);
 
-int dnssd_render_instance_name(DnssdService *s, char **ret_name);
+int dnssd_render_instance_name(Manager *m, DnssdService *s, char **ret);
 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);