vfio: selftests: Avoid VLAs

Allocate VFIO ioctl requests dynamically instead of using VLAs. GCC 11.5.0
rejects initialized VLAs with:

  error: variable-sized object may not be initialized

The replaced stack u8 arrays also do not guarantee native struct alignment
for the aliased pointers.

Fixes: 19faf6fd96 ("vfio: selftests: Add a helper library for VFIO selftests")
Fixes: 20face8c75 ("vfio: selftests: Add helper to set/override a vf_token")
Assisted-by: Codex:gpt-5.5-high
Reviewed-by: Vipin Sharma <vipinsh@google.com>
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Alex Mastro <amastro@fb.com>
Link: https://lore.kernel.org/r/20260617-scratch-amastro-vfio-selftests-avoid-vlas-v4-2-b9f52f1e2c5a@fb.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
This commit is contained in:
Alex Mastro 2026-06-17 11:58:01 -07:00 committed by Alex Williamson
parent bc4be8c6fd
commit 6bc73befe1

View File

@ -30,13 +30,11 @@
static void vfio_pci_irq_set(struct vfio_pci_device *device,
u32 index, u32 vector, u32 count, int *fds)
{
u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count];
struct vfio_irq_set *irq = (void *)&buf;
int *irq_fds = (void *)&irq->data;
size_t argsz = sizeof(struct vfio_irq_set) + sizeof(int) * count;
struct vfio_irq_set *irq;
memset(buf, 0, sizeof(buf));
irq->argsz = sizeof(buf);
irq = calloc_assert(1, argsz);
irq->argsz = argsz;
irq->flags = VFIO_IRQ_SET_ACTION_TRIGGER;
irq->index = index;
irq->start = vector;
@ -44,12 +42,13 @@ static void vfio_pci_irq_set(struct vfio_pci_device *device,
if (count) {
irq->flags |= VFIO_IRQ_SET_DATA_EVENTFD;
memcpy(irq_fds, fds, sizeof(int) * count);
memcpy(irq->data, fds, sizeof(int) * count);
} else {
irq->flags |= VFIO_IRQ_SET_DATA_NONE;
}
ioctl_assert(device->fd, VFIO_DEVICE_SET_IRQS, irq);
free(irq);
}
void vfio_pci_irq_trigger(struct vfio_pci_device *device, u32 index, u32 vector)
@ -118,15 +117,20 @@ static void vfio_pci_irq_get(struct vfio_pci_device *device, u32 index,
static int vfio_device_feature_ioctl(int fd, u32 flags, void *data,
size_t data_size)
{
u8 buffer[sizeof(struct vfio_device_feature) + data_size] = {};
struct vfio_device_feature *feature = (void *)buffer;
size_t argsz = sizeof(struct vfio_device_feature) + data_size;
struct vfio_device_feature *feature;
int ret;
feature = calloc_assert(1, argsz);
memcpy(feature->data, data, data_size);
feature->argsz = sizeof(buffer);
feature->argsz = argsz;
feature->flags = flags;
return ioctl(fd, VFIO_DEVICE_FEATURE, feature);
ret = ioctl(fd, VFIO_DEVICE_FEATURE, feature);
free(feature);
return ret;
}
static void vfio_device_feature_set(int fd, u16 feature, void *data, size_t data_size)