chiark / gitweb /
bus: use memcpy() rather than unbounded strcpy()
[elogind.git] / src / libsystemd-bus / bus-control.c
index bbee1b5b130a1e361bb182ae3d07e24406d63370..2acd20ba48eb27587ae7d504bc25a1052aa386a7 100644 (file)
@@ -387,6 +387,10 @@ static int bus_get_owner_kdbus(
 
         conn_info = (struct kdbus_conn_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
 
+        /* Non-activated names are considered not available */
+        if (conn_info->flags & KDBUS_HELLO_ACTIVATOR)
+                return name[0] == ':' ? -ENXIO : -ENOENT;
+
         c = bus_creds_new();
         if (!c)
                 return -ENOMEM;
@@ -702,6 +706,7 @@ _public_ int sd_bus_get_owner(
         assert_return(BUS_IS_OPEN(bus->state), -ENOTCONN);
         assert_return(!bus_pid_changed(bus), -ECHILD);
         assert_return(service_name_is_valid(name), -EINVAL);
+        assert_return(bus->bus_client, -ENODATA);
 
         if (bus->is_kernel)
                 return bus_get_owner_kdbus(bus, name, mask, creds);
@@ -798,7 +803,7 @@ static int add_name_change_match(sd_bus *bus,
                 item->name_change.new.id = new_owner_id;
 
                 if (name)
-                        strcpy(item->name_change.name, name);
+                        memcpy(item->name_change.name, name, l);
 
                 /* If the old name is unset or empty, then
                  * this can match against added names */
@@ -849,7 +854,9 @@ static int add_name_change_match(sd_bus *bus,
                 m->cookie = cookie;
 
                 item = m->items;
-                item->size = offsetof(struct kdbus_item, id_change) + sizeof(struct kdbus_notify_id_change);
+                item->size =
+                        offsetof(struct kdbus_item, id_change) +
+                        sizeof(struct kdbus_notify_id_change);
                 item->id_change.id = name_id;
 
                 /* If the old name is unset or empty, then this can