From fa7796e97b96160a4d78f72d113573770cec18f2 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 26 Nov 2014 02:50:49 +0100 Subject: [PATCH] sd-bus: set per-bus attach flag requirement mask to ANY On the system and user busses we create it's the receiver that chooses which metadata is attched, not the sender, hence set the requirement mask to ANY, to allow any current of future credential bit to be attached. --- src/libsystemd/sd-bus/bus-kernel.c | 32 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index d0cb7eec1..aa4b4240d 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -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; @@ -1633,7 +1644,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)); @@ -1715,15 +1726,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; -- 2.30.2