chiark / gitweb /
sd-bus: unify logic how we patch the message source of driver messages
[elogind.git] / src / libsystemd / sd-bus / bus-kernel.c
index ef157d69f2eb6bea061450ee8ee0b1cc7591139a..3a3ed200a0782c0a48f8c8846b96329f47eb5137 100644 (file)
@@ -348,6 +348,15 @@ fail:
         return r;
 }
 
+static void bus_message_set_sender_driver(sd_bus *bus, sd_bus_message *m) {
+        assert(bus);
+        assert(m);
+
+        m->sender = m->creds.unique_name = (char*) "org.freedesktop.DBus";
+        m->creds.well_known_names_driver = true;
+        m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
+}
+
 static void unset_memfds(struct sd_bus_message *m) {
         struct bus_body_part *part;
         unsigned i;
@@ -660,9 +669,23 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                         }
 
                         if (bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
-                                r = strv_extend(&m->creds.well_known_names, d->name.name);
-                                if (r < 0)
+                                char **wkn;
+                                size_t n;
+
+                                /* We just extend the array here, but
+                                 * do not allocate the strings inside
+                                 * of it, instead we just point to our
+                                 * buffer directly. */
+                                n = strv_length(m->creds.well_known_names);
+                                wkn = realloc(m->creds.well_known_names, (n + 2) * sizeof(char*));
+                                if (!wkn) {
+                                        r = -ENOMEM;
                                         goto fail;
+                                }
+
+                                wkn[n] = d->name.name;
+                                wkn[n+1] = NULL;
+                                m->creds.well_known_names = wkn;
 
                                 m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
                         }
@@ -724,7 +747,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
 
         /* Override information from the user header with data from the kernel */
         if (k->src_id == KDBUS_SRC_ID_KERNEL)
-                m->sender = m->creds.unique_name = (char*) "org.freedesktop.DBus";
+                bus_message_set_sender_driver(bus, m);
         else {
                 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
                 m->sender = m->creds.unique_name = m->sender_buffer;
@@ -1059,7 +1082,7 @@ static int push_name_owner_changed(sd_bus *bus, const char *name, const char *ol
         if (r < 0)
                 return r;
 
-        m->sender = "org.freedesktop.DBus";
+        bus_message_set_sender_driver(bus, m);
 
         r = bus_seal_synthetic_message(bus, m);
         if (r < 0)
@@ -1128,7 +1151,7 @@ static int translate_reply(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *
         if (r < 0)
                 return r;
 
-        m->sender = "org.freedesktop.DBus";
+        bus_message_set_sender_driver(bus, m);
 
         r = bus_seal_synthetic_message(bus, m);
         if (r < 0)