chiark / gitweb /
bus: update kdbus.h (ABI break)
[elogind.git] / src / libsystemd / sd-bus / bus-kernel.c
index d0cb7eec1bc448bb1f4912aa6937895a8a3971e0..907c5c5cf6458fbda0887a1c8c5eaca8bcfb4a6c 100644 (file)
@@ -679,7 +679,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                         if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
                                 size_t i, n;
                                 uid_t *u;
-                                n = (d->size - offsetof(struct kdbus_item, data64)) / sizeof(uint64_t);
+                                n = (d->size - offsetof(struct kdbus_item, data32)) / sizeof(uint32_t);
                                 u = new(uid_t, n);
                                 if (!u) {
                                         r = -ENOMEM;
@@ -687,7 +687,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                                 }
 
                                 for (i = 0; i < n; i++)
-                                        u[i] = (uid_t) d->data64[i];
+                                        u[i] = (uid_t) d->data32[i];
 
                                 m->creds.supplementary_gids = u;
                                 m->creds.n_supplementary_gids = n;
@@ -1377,6 +1377,7 @@ uint64_t attach_flags_to_kdbus(uint64_t mask) {
 int bus_kernel_create_bus(const char *name, bool world, char **s) {
         struct kdbus_cmd_make *make;
         struct kdbus_item *n;
+        size_t l;
         int fd;
 
         assert(name);
@@ -1386,19 +1387,20 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
         if (fd < 0)
                 return -errno;
 
-        make = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd_make, items) +
-                                    offsetof(struct kdbus_item, data64) + sizeof(uint64_t) +
-                                    offsetof(struct kdbus_item, str) +
-                                    DECIMAL_STR_MAX(uid_t) + 1 + strlen(name) + 1),
+        l = strlen(name);
+        make = alloca0_align(offsetof(struct kdbus_cmd_make, items) +
+                             ALIGN8(offsetof(struct kdbus_item, bloom_parameter) + sizeof(struct kdbus_bloom_parameter)) +
+                             ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
+                             ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1),
                              8);
 
         make->size = offsetof(struct kdbus_cmd_make, items);
 
+        /* Set the bloom parameters */
         n = make->items;
         n->size = offsetof(struct kdbus_item, bloom_parameter) +
                   sizeof(struct kdbus_bloom_parameter);
         n->type = KDBUS_ITEM_BLOOM_PARAMETER;
-
         n->bloom_parameter.size = DEFAULT_BLOOM_SIZE;
         n->bloom_parameter.n_hash = DEFAULT_BLOOM_N_HASH;
 
@@ -1407,6 +1409,15 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) {
 
         make->size += ALIGN8(n->size);
 
+        /* The busses we create make no restrictions on what metadata
+         * peers can read from incoming messages. */
+        n = KDBUS_ITEM_NEXT(n);
+        n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
+        n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
+        n->data64[0] = _KDBUS_ATTACH_ANY;
+        make->size += ALIGN8(n->size);
+
+        /* Set the a good name */
         n = KDBUS_ITEM_NEXT(n);
         sprintf(n->str, UID_FMT "-%s", getuid(), name);
         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
@@ -1503,20 +1514,29 @@ int bus_kernel_open_bus_fd(const char *bus, char **path) {
         int fd;
         size_t len;
 
+        assert(bus);
+
         len = strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + strlen("/bus") + 1;
 
         if (path) {
-                p = malloc(len);
+                p = new(char, len);
                 if (!p)
                         return -ENOMEM;
-                *path = p;
         } else
-                p = alloca(len);
+                p = newa(char, len);
+
         sprintf(p, "/sys/fs/kdbus/" UID_FMT "-%s/bus", getuid(), bus);
 
         fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
-        if (fd < 0)
+        if (fd < 0) {
+                if (path)
+                        free(p);
+
                 return -errno;
+        }
+
+        if (path)
+                *path = p;
 
         return fd;
 }
@@ -1633,7 +1653,7 @@ int bus_kernel_make_starter(
         if (world_policy >= 0)
                 policy_cnt++;
 
-        size = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
+        size = offsetof(struct kdbus_cmd_hello, items) +
                ALIGN8(offsetof(struct kdbus_item, str) + strlen(name) + 1) +
                policy_cnt * ALIGN8(offsetof(struct kdbus_item, policy_access) + sizeof(struct kdbus_policy_access));
 
@@ -1669,7 +1689,7 @@ int bus_kernel_make_starter(
                 (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
         hello->pool_size = KDBUS_POOL_SIZE;
         hello->attach_flags_send = _KDBUS_ATTACH_ANY;
-        hello->attach_flags_recv = _KDBUS_ATTACH_ALL;
+        hello->attach_flags_recv = _KDBUS_ATTACH_ANY;
 
         if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
                 return -errno;
@@ -1715,15 +1735,18 @@ int bus_kernel_realize_attach_flags(sd_bus *bus) {
         assert(bus);
         assert(bus->is_kernel);
 
-        update = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd_update, items) +
-                                      offsetof(struct kdbus_item, data64) + sizeof(uint64_t)), 8);
+        update = alloca0_align(offsetof(struct kdbus_cmd_update, items) +
+                               ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)),
+                               8);
 
         n = update->items;
         n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
         n->data64[0] = bus->attach_flags;
 
-        update->size = offsetof(struct kdbus_cmd_update, items) + n->size;
+        update->size =
+                offsetof(struct kdbus_cmd_update, items) +
+                ALIGN8(n->size);
 
         if (ioctl(bus->input_fd, KDBUS_CMD_CONN_UPDATE, update) < 0)
                 return -errno;