summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-02 17:17:29 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-02 17:17:29 +0100
commit006a0b8788681809a896544c1af68b5e79cce121 (patch)
tree6c29f54408beb633050c6854ef508449bba9fe27
parent6717d473506800363af9d2bafbf263ee054e856d (diff)
bus: be nice to LLVM and don't embedd a VLA in a union
-rw-r--r--src/libsystemd-bus/bus-control.c108
1 files 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;