summaryrefslogtreecommitdiff
path: root/src/libsystemd/sd-bus
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-01-22 16:16:04 +0100
committerLennart Poettering <lennart@poettering.net>2014-01-22 16:16:04 +0100
commit8d1db1d154c1134c9bf92b202ef198cc79979ea8 (patch)
treeddc1b05640cb58ddcf2c2c0abac2225c1206403f /src/libsystemd/sd-bus
parent5972fe953ec56c77936a1e612ca87d8a0e6c0c64 (diff)
bus: when allocating a memfd for usage in a bus connection, name the memfd after the bus connection
Diffstat (limited to 'src/libsystemd/sd-bus')
-rw-r--r--src/libsystemd/sd-bus/bus-kernel.c29
-rw-r--r--src/libsystemd/sd-bus/sd-memfd.c2
2 files changed, 26 insertions, 5 deletions
diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c
index 78a6c1062a..833ea5574d 100644
--- a/src/libsystemd/sd-bus/bus-kernel.c
+++ b/src/libsystemd/sd-bus/bus-kernel.c
@@ -1085,21 +1085,40 @@ int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *al
assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
if (bus->n_memfd_cache <= 0) {
- struct kdbus_cmd_memfd_make cmd = {
- .size = sizeof(struct kdbus_cmd_memfd_make),
- };
+ _cleanup_free_ char *g = NULL;
+ struct kdbus_cmd_memfd_make *cmd;
+ struct kdbus_item *item;
+ size_t l, sz;
int r;
assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
- r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, &cmd);
+ assert(bus->connection_name);
+
+ g = sd_bus_label_escape(bus->connection_name);
+ if (!g)
+ return -ENOMEM;
+
+ l = strlen(g);
+ sz = ALIGN8(offsetof(struct kdbus_cmd_memfd_make, items)) +
+ ALIGN8(offsetof(struct kdbus_item, str)) +
+ l + 1;
+ cmd = alloca0(sz);
+ cmd->size = sz;
+
+ item = cmd->items;
+ item->size = ALIGN8(offsetof(struct kdbus_item, str)) + l + 1;
+ item->type = KDBUS_ITEM_MEMFD_NAME;
+ memcpy(item->str, g, l + 1);
+
+ r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, cmd);
if (r < 0)
return -errno;
*address = NULL;
*mapped = 0;
*allocated = 0;
- return cmd.fd;
+ return cmd->fd;
}
c = &bus->memfd_cache[--bus->n_memfd_cache];
diff --git a/src/libsystemd/sd-bus/sd-memfd.c b/src/libsystemd/sd-bus/sd-memfd.c
index 913be2086a..b78ea6a313 100644
--- a/src/libsystemd/sd-bus/sd-memfd.c
+++ b/src/libsystemd/sd-bus/sd-memfd.c
@@ -92,8 +92,10 @@ _public_ int sd_memfd_new(const char *name, sd_memfd **m) {
sz = ALIGN8(offsetof(struct kdbus_cmd_memfd_make, items)) +
ALIGN8(offsetof(struct kdbus_item, str)) +
l + 1;
+
cmd = alloca0(sz);
cmd->size = sz;
+
item = cmd->items;
item->size = ALIGN8(offsetof(struct kdbus_item, str)) + l + 1;
item->type = KDBUS_ITEM_MEMFD_NAME;