]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vfio: selftests: Fix VLA initialisation in vfio_pci_irq_set()
authorManish Honap <mhonap@nvidia.com>
Tue, 17 Mar 2026 05:14:02 +0000 (10:44 +0530)
committerAlex Williamson <alex@shazbot.org>
Thu, 19 Mar 2026 18:32:08 +0000 (12:32 -0600)
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>
tools/testing/selftests/vfio/lib/vfio_pci_device.c

index 4e5871f1ebc3bc36425169bea6581fb68480cbd6..fc75e04ef010cf9374b3abe22b6c804227585083 100644 (file)
 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] = {};
+       u8 buf[sizeof(struct vfio_irq_set) + sizeof(int) * count];
        struct vfio_irq_set *irq = (void *)&buf;
        int *irq_fds = (void *)&irq->data;
 
+       memset(buf, 0, sizeof(buf));
+
        irq->argsz = sizeof(buf);
        irq->flags = VFIO_IRQ_SET_ACTION_TRIGGER;
        irq->index = index;