Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

vfio: selftests: Fix VLA initialisation in vfio_pci_irq_set()

C does not permit an initialiser expression on a variable-length array
(C99 Section 6.7.9 constraint: "The type of the entity to be initialized
shall not be a variable length array type").

vfio_pci_irq_set() declared:

u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count] = {};

where `count` is a runtime function parameter, making `buf` a VLA.

GCC rejects this with (tried with GCC-9.4.0):

error: variable-sized object may not be initialized

Fix by removing the `= {}` initialiser and inserting an explicit
memset() immediately after the declaration. memset() on a VLA is
perfectly legal and achieves the same zero-initialisation on all
conforming C implementations.

Fixes: 19faf6fd969c ("vfio: selftests: Add a helper library for VFIO selftests")
Cc: stable@vger.kernel.org
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: David Matlack <dmatlack@google.com>
Signed-off-by: Manish Honap <mhonap@nvidia.com>
Link: https://lore.kernel.org/r/20260317051402.3725670-1-mhonap@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>

authored by

Manish Honap and committed by
Alex Williamson
4f42d716 02256acf

+3 -1
+3 -1
tools/testing/selftests/vfio/lib/vfio_pci_device.c
··· 30 30 static void vfio_pci_irq_set(struct vfio_pci_device *device, 31 31 u32 index, u32 vector, u32 count, int *fds) 32 32 { 33 - u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count] = {}; 33 + u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count]; 34 34 struct vfio_irq_set *irq = (void *)&buf; 35 35 int *irq_fds = (void *)&irq->data; 36 + 37 + memset(buf, 0, sizeof(buf)); 36 38 37 39 irq->argsz = sizeof(buf); 38 40 irq->flags = VFIO_IRQ_SET_ACTION_TRIGGER;