chiark / gitweb /
bus: be nice to LLVM and don't embedd a VLA in a union
[elogind.git] / src / libsystemd-bus / bus-control.c
index 9e815a6c94f513096537e52da7f04ac9eb82eef8..4f8c6236329510bf5da099e2408f1a015947bcd3 100644 (file)
@@ -403,7 +403,6 @@ static int bus_get_owner_kdbus(
                 uint64_t mask,
                 sd_bus_creds **creds) {
 
-        _cleanup_bus_message_unref_ sd_bus_message *reply = NULL;
         _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
         struct kdbus_cmd_name_info *cmd;
         struct kdbus_name_info *name_info;
@@ -426,11 +425,6 @@ static int bus_get_owner_kdbus(
         }
 
         cmd->size = size;
-
-        r = kdbus_translate_attach_flags(mask, (uint64_t*) &cmd->attach_flags);
-        if (r < 0)
-                return r;
-
         r = ioctl(bus->input_fd, KDBUS_CMD_NAME_INFO, cmd);
         if (r < 0)
                 return -errno;
@@ -674,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
@@ -687,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;