diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-11-26 02:50:49 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-11-26 03:06:50 +0100 |
commit | fa7796e97b96160a4d78f72d113573770cec18f2 (patch) | |
tree | 95058a63c5b54daf565dc2a3e3269a452847ee8a /src/libsystemd/sd-bus/bus-kernel.c | |
parent | update TODO (diff) | |
download | systemd-fa7796e97b96160a4d78f72d113573770cec18f2.tar.xz systemd-fa7796e97b96160a4d78f72d113573770cec18f2.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | src/libsystemd/sd-bus/bus-kernel.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index d0cb7eec1b..aa4b4240dc 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; |