]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dm-util: get rid of flex array in middle of structure
authorLennart Poettering <lennart@poettering.net>
Fri, 6 Sep 2024 20:03:01 +0000 (22:03 +0200)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Sep 2024 22:34:43 +0000 (07:34 +0900)
Fixes: #33936
src/shared/dm-util.c

index 66c1e134397c43e8bca6aad6bf6e38dc3a6cc48e..498df418dea30b8df71922017609e0a735f2442e 100644 (file)
 
 int dm_deferred_remove_cancel(const char *name) {
         _cleanup_close_ int fd = -EBADF;
-        struct message {
+
+        struct combined {
                 struct dm_ioctl dm_ioctl;
                 struct dm_target_msg dm_target_msg;
-                char msg_text[STRLEN("@cancel_deferred_remove") + 1];
-        } _packed_ message = {
-                .dm_ioctl = {
+        } _packed_;
+
+        union message {
+                struct combined combined;
+                struct {
+                        uint8_t space[offsetof(struct combined, dm_target_msg.message)];
+                        char text[STRLEN("@cancel_deferred_remove") + 1];
+                } _packed_;
+        } message = {
+                .combined.dm_ioctl = {
                         .version = {
                                 DM_VERSION_MAJOR,
                                 DM_VERSION_MINOR,
                                 DM_VERSION_PATCHLEVEL
                         },
-                        .data_size = sizeof(struct message),
-                        .data_start = sizeof(struct dm_ioctl),
+                        .data_size = sizeof(union message),
+                        .data_start = offsetof(union message, combined.dm_target_msg),
                 },
-                .msg_text = "@cancel_deferred_remove",
         };
 
         assert(name);
 
-        if (strlen(name) >= sizeof(message.dm_ioctl.name))
+        if (strlen(name) >= sizeof(message.combined.dm_ioctl.name))
                 return -ENODEV; /* A device with a name longer than this cannot possibly exist */
 
-        strncpy_exact(message.dm_ioctl.name, name, sizeof(message.dm_ioctl.name));
+        strncpy_exact(message.combined.dm_ioctl.name, name, sizeof(message.combined.dm_ioctl.name));
+        strncpy_exact(message.text, "@cancel_deferred_remove", sizeof(message.text));
 
         fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
         if (fd < 0)