From 006a0b8788681809a896544c1af68b5e79cce121 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 2 Dec 2013 17:17:29 +0100 Subject: bus: be nice to LLVM and don't embedd a VLA in a union --- src/libsystemd-bus/bus-control.c | 108 ++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 59 deletions(-) diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c index 0f24e3c12d..4f8c623632 100644 --- a/src/libsystemd-bus/bus-control.c +++ b/src/libsystemd-bus/bus-control.c @@ -668,6 +668,7 @@ static int add_name_change_match(sd_bus *bus, } if (is_name_id <= 0) { + struct kdbus_cmd_match *m; size_t sz, l; /* If the name argument is missing or is a well-known @@ -681,85 +682,74 @@ static int add_name_change_match(sd_bus *bus, offsetof(struct kdbus_notify_name_change, name) + l+1); - { - union { - uint8_t buffer[sz]; - struct kdbus_cmd_match match; - } m; - - memzero(&m, sz); - - m.match.size = sz; - m.match.cookie = cookie; - m.match.src_id = KDBUS_SRC_ID_KERNEL; + m = alloca0(sz); + m->size = sz; + m->cookie = cookie; + m->src_id = KDBUS_SRC_ID_KERNEL; - item = m.match.items; - item->size = - offsetof(struct kdbus_item, name_change) + - offsetof(struct kdbus_notify_name_change, name) + - l+1; + item = m->items; + item->size = + offsetof(struct kdbus_item, name_change) + + offsetof(struct kdbus_notify_name_change, name) + + l+1; - item->name_change.old_id = old_owner_id; - item->name_change.new_id = new_owner_id; + item->name_change.old_id = old_owner_id; + item->name_change.new_id = new_owner_id; - if (name) - strcpy(item->name_change.name, name); + if (name) + strcpy(item->name_change.name, name); - /* If the old name is unset or empty, then - * this can match against added names */ - if (!old_owner || old_owner[0] == 0) { - item->type = KDBUS_MATCH_NAME_ADD; + /* If the old name is unset or empty, then + * this can match against added names */ + if (!old_owner || old_owner[0] == 0) { + item->type = KDBUS_MATCH_NAME_ADD; - r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); - if (r < 0) - return -errno; - } + r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); + if (r < 0) + return -errno; + } - /* If the new name is unset or empty, then - * this can match against removed names */ - if (!new_owner || new_owner[0] == 0) { - item->type = KDBUS_MATCH_NAME_REMOVE; + /* If the new name is unset or empty, then + * this can match against removed names */ + if (!new_owner || new_owner[0] == 0) { + item->type = KDBUS_MATCH_NAME_REMOVE; - r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); - if (r < 0) - return -errno; - } + r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); + if (r < 0) + return -errno; + } - /* If the neither name is explicitly set to - * the empty string, then this can match - * agains changed names */ - if (!(old_owner && old_owner[0] == 0) && - !(new_owner && new_owner[0] == 0)) { - item->type = KDBUS_MATCH_NAME_CHANGE; + /* If the neither name is explicitly set to + * the empty string, then this can match + * agains changed names */ + if (!(old_owner && old_owner[0] == 0) && + !(new_owner && new_owner[0] == 0)) { + item->type = KDBUS_MATCH_NAME_CHANGE; - r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); - if (r < 0) - return -errno; - } + r = ioctl(bus->input_fd, KDBUS_CMD_MATCH_ADD, m); + if (r < 0) + return -errno; } } if (is_name_id != 0) { - uint64_t sz = - ALIGN8(offsetof(struct kdbus_cmd_match, items) + - offsetof(struct kdbus_item, id_change) + - sizeof(struct kdbus_notify_id_change)); - union { - uint8_t buffer[sz]; - struct kdbus_cmd_match match; - } m; + struct kdbus_cmd_match *m; + uint64_t sz; /* If the name argument is missing or is a unique * name, then add KDBUS_MATCH_ID_{ADD,REMOVE} matches * for it */ - memzero(&m, sz); + sz = ALIGN8(offsetof(struct kdbus_cmd_match, items) + + offsetof(struct kdbus_item, id_change) + + sizeof(struct kdbus_notify_id_change)); - m.match.size = sz; - m.match.cookie = cookie; - m.match.src_id = KDBUS_SRC_ID_KERNEL; + m = alloca0(sz); + m->size = sz; + m->cookie = cookie; + m->src_id = KDBUS_SRC_ID_KERNEL; - item = m.match.items; + item = m->items; item->size = offsetof(struct kdbus_item, id_change) + sizeof(struct kdbus_notify_id_change); item->id_change.id = name_id; -- cgit v1.2.3-54-g00ecf