From: Lennart Poettering Date: Fri, 6 Sep 2024 20:03:01 +0000 (+0200) Subject: dm-util: get rid of flex array in middle of structure X-Git-Tag: v257-rc1~527 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=925095a6db6793d05622ed666cdc8af7d80b7ce6;p=thirdparty%2Fsystemd.git dm-util: get rid of flex array in middle of structure Fixes: #33936 --- diff --git a/src/shared/dm-util.c b/src/shared/dm-util.c index 66c1e134397..498df418dea 100644 --- a/src/shared/dm-util.c +++ b/src/shared/dm-util.c @@ -10,29 +10,37 @@ 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)