Re: [PATCH 1/6] scsi: mpt3sas: Use flexible arrays when obviously possible

Kees Cook
2023-07-28T22:01:54Z

On Tue, Jul 25, 2023 at 09:13:26AM -0700, James Seo wrote:
> These old-style 1-length variable arrays can be directly converted
> into C99 flexible array members without any binary changes.
>
> In most cases, they belong to unused structs, or to structs used only
> by unused code. The remaining few coincidentally have their sizes
> calculated in roundabout ways that do not depend on the sizeof()
> their structs.
>
> Signed-off-by: James Seo <james@equiv.tech>

Thanks for tackling these fixes!

Doing before/after build testing[1] shows no binary differences with that patch.

Reviewed-by: Kees Cook <keescook@chromium.org>

-Kees

[1] https://outflux.net/blog/archives/2022/06/24/finding-binary-differences/

> ---
> drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h | 181 ++++++++------------------
> drivers/scsi/mpt3sas/mpi/mpi2_image.h | 32 ++---
> drivers/scsi/mpt3sas/mpi/mpi2_ioc.h | 27 ++--
> 3 files changed, 75 insertions(+), 165 deletions(-)
>
> diff --git a/drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h b/drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h
> index 4d0be5ab98c1..42d820159c44 100644
> --- a/drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h
> +++ b/drivers/scsi/mpt3sas/mpi/mpi2_cnfg.h
> @@ -643,18 +643,14 @@ typedef struct _MPI2_CHIP_REVISION_ID {
> /*Manufacturing Page 2 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check Header.PageLength at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check Header.PageLength at
> + *runtime before using HwSettings[].
> */
> -#ifndef MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS
> -#define MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_MAN_2 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> MPI2_CHIP_REVISION_ID ChipId; /*0x04 */
> - U32
> - HwSettings[MPI2_MAN_PAGE_2_HW_SETTINGS_WORDS];/*0x08 */
> + U32 HwSettings[]; /*0x08 */
> } MPI2_CONFIG_PAGE_MAN_2,
> *PTR_MPI2_CONFIG_PAGE_MAN_2,
> Mpi2ManufacturingPage2_t,
> @@ -666,18 +662,14 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_2 {
> /*Manufacturing Page 3 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check Header.PageLength at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check Header.PageLength at
> + *runtime before using Info[].
> */
> -#ifndef MPI2_MAN_PAGE_3_INFO_WORDS
> -#define MPI2_MAN_PAGE_3_INFO_WORDS (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_MAN_3 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> MPI2_CHIP_REVISION_ID ChipId; /*0x04 */
> - U32
> - Info[MPI2_MAN_PAGE_3_INFO_WORDS];/*0x08 */
> + U32 Info[]; /*0x08 */
> } MPI2_CONFIG_PAGE_MAN_3,
> *PTR_MPI2_CONFIG_PAGE_MAN_3,
> Mpi2ManufacturingPage3_t,
> @@ -765,12 +757,9 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_4 {
> /*Manufacturing Page 5 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhys at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhys at runtime before using Phy[].
> */
> -#ifndef MPI2_MAN_PAGE_5_PHY_ENTRIES
> -#define MPI2_MAN_PAGE_5_PHY_ENTRIES (1)
> -#endif
>
> typedef struct _MPI2_MANUFACTURING5_ENTRY {
> U64 WWID; /*0x00 */
> @@ -787,8 +776,7 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_5 {
> U16 Reserved2; /*0x06 */
> U32 Reserved3; /*0x08 */
> U32 Reserved4; /*0x0C */
> - MPI2_MANUFACTURING5_ENTRY
> - Phy[MPI2_MAN_PAGE_5_PHY_ENTRIES];/*0x08 */
> + MPI2_MANUFACTURING5_ENTRY Phy[]; /*0x10 */
> } MPI2_CONFIG_PAGE_MAN_5,
> *PTR_MPI2_CONFIG_PAGE_MAN_5,
> Mpi2ManufacturingPage5_t,
> @@ -864,12 +852,9 @@ typedef struct _MPI2_MANPAGE7_CONNECTOR_INFO {
> #define MPI2_MANPAGE7_SLOT_UNKNOWN (0xFFFF)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhys at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhys at runtime before using ConnectorInfo[].
> */
> -#ifndef MPI2_MANPAGE7_CONNECTOR_INFO_MAX
> -#define MPI2_MANPAGE7_CONNECTOR_INFO_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_MAN_7 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> @@ -880,8 +865,7 @@ typedef struct _MPI2_CONFIG_PAGE_MAN_7 {
> U8 NumPhys; /*0x20 */
> U8 Reserved3; /*0x21 */
> U16 Reserved4; /*0x22 */
> - MPI2_MANPAGE7_CONNECTOR_INFO
> - ConnectorInfo[MPI2_MANPAGE7_CONNECTOR_INFO_MAX]; /*0x24 */
> + MPI2_MANPAGE7_CONNECTOR_INFO ConnectorInfo[]; /*0x24 */
> } MPI2_CONFIG_PAGE_MAN_7,
> *PTR_MPI2_CONFIG_PAGE_MAN_7,
> Mpi2ManufacturingPage7_t,
> @@ -1019,12 +1003,9 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_3 {
> /*IO Unit Page 5 */
>
> /*
> - *Upper layer code (drivers, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumDmaEngines at runtime.
> + *Upper layer code (drivers, utilities, etc.) should check the value returned
> + *for NumDmaEngines at runtime before using DmaEngineCapabilities[].
> */
> -#ifndef MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES
> -#define MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_5 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> @@ -1042,7 +1023,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_5 {
> U32 Reserved2; /*0x24 */
> U32 Reserved3; /*0x28 */
> U32
> - DmaEngineCapabilities[MPI2_IOUNITPAGE5_DMAENGINE_ENTRIES]; /*0x2C */
> + DmaEngineCapabilities[]; /*0x2C */
> } MPI2_CONFIG_PAGE_IO_UNIT_5,
> *PTR_MPI2_CONFIG_PAGE_IO_UNIT_5,
> Mpi2IOUnitPage5_t, *pMpi2IOUnitPage5_t;
> @@ -1259,12 +1240,9 @@ typedef struct _MPI2_IOUNIT9_SENSOR {
> #define MPI2_IOUNIT9_SENSOR_FLAGS_TEMP_VALID (0x01)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumSensors at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumSensors at runtime before using Sensor[].
> */
> -#ifndef MPI2_IOUNITPAGE9_SENSOR_ENTRIES
> -#define MPI2_IOUNITPAGE9_SENSOR_ENTRIES (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_9 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> @@ -1273,8 +1251,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_9 {
> U8 NumSensors; /*0x0C */
> U8 Reserved4; /*0x0D */
> U16 Reserved3; /*0x0E */
> - MPI2_IOUNIT9_SENSOR
> - Sensor[MPI2_IOUNITPAGE9_SENSOR_ENTRIES];/*0x10 */
> + MPI2_IOUNIT9_SENSOR Sensor[]; /*0x10 */
> } MPI2_CONFIG_PAGE_IO_UNIT_9,
> *PTR_MPI2_CONFIG_PAGE_IO_UNIT_9,
> Mpi2IOUnitPage9_t, *pMpi2IOUnitPage9_t;
> @@ -1294,12 +1271,9 @@ typedef struct _MPI2_IOUNIT10_FUNCTION {
> *pMpi2IOUnit10Function_t;
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumFunctions at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumFunctions at runtime before using Function[].
> */
> -#ifndef MPI2_IOUNITPAGE10_FUNCTION_ENTRIES
> -#define MPI2_IOUNITPAGE10_FUNCTION_ENTRIES (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_10 {
> MPI2_CONFIG_PAGE_HEADER Header; /*0x00 */
> @@ -1308,8 +1282,7 @@ typedef struct _MPI2_CONFIG_PAGE_IO_UNIT_10 {
> U16 Reserved2; /*0x06 */
> U32 Reserved3; /*0x08 */
> U32 Reserved4; /*0x0C */
> - MPI2_IOUNIT10_FUNCTION
> - Function[MPI2_IOUNITPAGE10_FUNCTION_ENTRIES];/*0x10 */
> + MPI2_IOUNIT10_FUNCTION Function[]; /*0x10 */
> } MPI2_CONFIG_PAGE_IO_UNIT_10,
> *PTR_MPI2_CONFIG_PAGE_IO_UNIT_10,
> Mpi2IOUnitPage10_t, *pMpi2IOUnitPage10_t;
> @@ -1764,12 +1737,9 @@ typedef struct _MPI2_CONFIG_PAGE_BIOS_3 {
> /*BIOS Page 4 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhys at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhys at runtime before using Phy[].
> */
> -#ifndef MPI2_BIOS_PAGE_4_PHY_ENTRIES
> -#define MPI2_BIOS_PAGE_4_PHY_ENTRIES (1)
> -#endif
>
> typedef struct _MPI2_BIOS4_ENTRY {
> U64 ReassignmentWWID; /*0x00 */
> @@ -1782,8 +1752,7 @@ typedef struct _MPI2_CONFIG_PAGE_BIOS_4 {
> U8 NumPhys; /*0x04 */
> U8 Reserved1; /*0x05 */
> U16 Reserved2; /*0x06 */
> - MPI2_BIOS4_ENTRY
> - Phy[MPI2_BIOS_PAGE_4_PHY_ENTRIES]; /*0x08 */
> + MPI2_BIOS4_ENTRY Phy[]; /*0x08 */
> } MPI2_CONFIG_PAGE_BIOS_4, *PTR_MPI2_CONFIG_PAGE_BIOS_4,
> Mpi2BiosPage4_t, *pMpi2BiosPage4_t;
>
> @@ -2045,12 +2014,9 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_0 {
> /*RAID Physical Disk Page 1 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhysDiskPaths at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhysDiskPaths at runtime before using PhysicalDiskPath[].
> */
> -#ifndef MPI2_RAID_PHYS_DISK1_PATH_MAX
> -#define MPI2_RAID_PHYS_DISK1_PATH_MAX (1)
> -#endif
>
> typedef struct _MPI2_RAIDPHYSDISK1_PATH {
> U16 DevHandle; /*0x00 */
> @@ -2075,8 +2041,7 @@ typedef struct _MPI2_CONFIG_PAGE_RD_PDISK_1 {
> U8 PhysDiskNum; /*0x05 */
> U16 Reserved1; /*0x06 */
> U32 Reserved2; /*0x08 */
> - MPI2_RAIDPHYSDISK1_PATH
> - PhysicalDiskPath[MPI2_RAID_PHYS_DISK1_PATH_MAX];/*0x0C */
> + MPI2_RAIDPHYSDISK1_PATH PhysicalDiskPath[]; /*0x0C */
> } MPI2_CONFIG_PAGE_RD_PDISK_1,
> *PTR_MPI2_CONFIG_PAGE_RD_PDISK_1,
> Mpi2RaidPhysDiskPage1_t,
> @@ -2502,12 +2467,9 @@ typedef struct _MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS {
> #define MPI2_SASIOUNIT5_ITE_ONE_MICROSECOND (0)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhys at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhys at runtime before using SASPhyPowerManagementSettings[].
> */
> -#ifndef MPI2_SAS_IOUNIT5_PHY_MAX
> -#define MPI2_SAS_IOUNIT5_PHY_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_5 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -2516,7 +2478,7 @@ typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_5 {
> U16 Reserved2;/*0x0A */
> U32 Reserved3;/*0x0C */
> MPI2_SAS_IO_UNIT5_PHY_PM_SETTINGS
> - SASPhyPowerManagementSettings[MPI2_SAS_IOUNIT5_PHY_MAX];/*0x10 */
> + SASPhyPowerManagementSettings[]; /*0x10 */
> } MPI2_CONFIG_PAGE_SASIOUNIT_5,
> *PTR_MPI2_CONFIG_PAGE_SASIOUNIT_5,
> Mpi2SasIOUnitPage5_t, *pMpi2SasIOUnitPage5_t;
> @@ -2554,12 +2516,9 @@ typedef struct _MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS {
> #define MPI2_SASIOUNIT6_MODULATION_100_PERCENT (0x03)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumGroups at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumGroups at runtime before using PortWidthModulationGroupStatus[].
> */
> -#ifndef MPI2_SAS_IOUNIT6_GROUP_MAX
> -#define MPI2_SAS_IOUNIT6_GROUP_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_6 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -2569,7 +2528,7 @@ typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_6 {
> U8 Reserved3; /*0x11 */
> U16 Reserved4; /*0x12 */
> MPI2_SAS_IO_UNIT6_PORT_WIDTH_MOD_GROUP_STATUS
> - PortWidthModulationGroupStatus[MPI2_SAS_IOUNIT6_GROUP_MAX]; /*0x14 */
> + PortWidthModulationGroupStatus[]; /*0x14 */
> } MPI2_CONFIG_PAGE_SASIOUNIT_6,
> *PTR_MPI2_CONFIG_PAGE_SASIOUNIT_6,
> Mpi2SasIOUnitPage6_t, *pMpi2SasIOUnitPage6_t;
> @@ -2597,12 +2556,9 @@ typedef struct _MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS {
>
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumGroups at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumGroups at runtime before using PortWidthModulationGroupSettings[].
> */
> -#ifndef MPI2_SAS_IOUNIT7_GROUP_MAX
> -#define MPI2_SAS_IOUNIT7_GROUP_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_7 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -2615,7 +2571,7 @@ typedef struct _MPI2_CONFIG_PAGE_SASIOUNIT_7 {
> U8 Reserved4; /*0x15 */
> U16 Reserved5; /*0x16 */
> MPI2_SAS_IO_UNIT7_PORT_WIDTH_MOD_GROUP_SETTINGS
> - PortWidthModulationGroupSettings[MPI2_SAS_IOUNIT7_GROUP_MAX];/*0x18 */
> + PortWidthModulationGroupSettings[]; /*0x18 */
> } MPI2_CONFIG_PAGE_SASIOUNIT_7,
> *PTR_MPI2_CONFIG_PAGE_SASIOUNIT_7,
> Mpi2SasIOUnitPage7_t, *pMpi2SasIOUnitPage7_t;
> @@ -3086,12 +3042,9 @@ typedef struct _MPI2_SASPHY2_PHY_EVENT {
>
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhyEvents at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhyEvents at runtime before using PhyEvent[].
> */
> -#ifndef MPI2_SASPHY2_PHY_EVENT_MAX
> -#define MPI2_SASPHY2_PHY_EVENT_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_2 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER
> @@ -3105,7 +3058,7 @@ typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_2 {
> U16
> Reserved3; /*0x0E */
> MPI2_SASPHY2_PHY_EVENT
> - PhyEvent[MPI2_SASPHY2_PHY_EVENT_MAX]; /*0x10 */
> + PhyEvent[]; /*0x10 */
> } MPI2_CONFIG_PAGE_SAS_PHY_2,
> *PTR_MPI2_CONFIG_PAGE_SAS_PHY_2,
> Mpi2SasPhyPage2_t,
> @@ -3200,12 +3153,9 @@ typedef struct _MPI2_SASPHY3_PHY_EVENT_CONFIG {
> #define MPI2_SASPHY3_TFLAGS_EVENT_NOTIFY (0x0001)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhyEvents at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhyEvents at runtime before using PhyEventConfig[].
> */
> -#ifndef MPI2_SASPHY3_PHY_EVENT_MAX
> -#define MPI2_SASPHY3_PHY_EVENT_MAX (1)
> -#endif
>
> typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_3 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER
> @@ -3219,7 +3169,7 @@ typedef struct _MPI2_CONFIG_PAGE_SAS_PHY_3 {
> U16
> Reserved3; /*0x0E */
> MPI2_SASPHY3_PHY_EVENT_CONFIG
> - PhyEventConfig[MPI2_SASPHY3_PHY_EVENT_MAX]; /*0x10 */
> + PhyEventConfig[]; /*0x10 */
> } MPI2_CONFIG_PAGE_SAS_PHY_3,
> *PTR_MPI2_CONFIG_PAGE_SAS_PHY_3,
> Mpi2SasPhyPage3_t, *pMpi2SasPhyPage3_t;
> @@ -3358,12 +3308,9 @@ typedef struct _MPI2_CONFIG_PAGE_SAS_ENCLOSURE_0 {
> /*Log Page 0 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumLogEntries at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumLogEntries at runtime before using LogEntry[].
> */
> -#ifndef MPI2_LOG_0_NUM_LOG_ENTRIES
> -#define MPI2_LOG_0_NUM_LOG_ENTRIES (1)
> -#endif
>
> #define MPI2_LOG_0_LOG_DATA_LENGTH (0x1C)
>
> @@ -3393,8 +3340,7 @@ typedef struct _MPI2_CONFIG_PAGE_LOG_0 {
> U32 Reserved2; /*0x0C */
> U16 NumLogEntries;/*0x10 */
> U16 Reserved3; /*0x12 */
> - MPI2_LOG_0_ENTRY
> - LogEntry[MPI2_LOG_0_NUM_LOG_ENTRIES]; /*0x14 */
> + MPI2_LOG_0_ENTRY LogEntry[]; /*0x14 */
> } MPI2_CONFIG_PAGE_LOG_0, *PTR_MPI2_CONFIG_PAGE_LOG_0,
> Mpi2LogPage0_t, *pMpi2LogPage0_t;
>
> @@ -3408,12 +3354,9 @@ typedef struct _MPI2_CONFIG_PAGE_LOG_0 {
> /*RAID Page 0 */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumElements at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumElements at runtime before using ConfigElement[].
> */
> -#ifndef MPI2_RAIDCONFIG0_MAX_ELEMENTS
> -#define MPI2_RAIDCONFIG0_MAX_ELEMENTS (1)
> -#endif
>
> typedef struct _MPI2_RAIDCONFIG0_CONFIG_ELEMENT {
> U16 ElementFlags; /*0x00 */
> @@ -3446,8 +3389,7 @@ typedef struct _MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0 {
> U8 NumElements; /*0x2C */
> U8 Reserved2; /*0x2D */
> U16 Reserved3; /*0x2E */
> - MPI2_RAIDCONFIG0_CONFIG_ELEMENT
> - ConfigElement[MPI2_RAIDCONFIG0_MAX_ELEMENTS]; /*0x30 */
> + MPI2_RAIDCONFIG0_CONFIG_ELEMENT ConfigElement[];/*0x30 */
> } MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0,
> *PTR_MPI2_CONFIG_PAGE_RAID_CONFIGURATION_0,
> Mpi2RaidConfigurationPage0_t,
> @@ -3687,12 +3629,9 @@ typedef struct _MPI26_PCIE_IO_UNIT0_PHY_DATA {
> Mpi26PCIeIOUnit0PhyData_t, *pMpi26PCIeIOUnit0PhyData_t;
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumPhys at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumPhys at runtime before using PhyData[].
> */
> -#ifndef MPI26_PCIE_IOUNIT0_PHY_MAX
> -#define MPI26_PCIE_IOUNIT0_PHY_MAX (1)
> -#endif
>
> typedef struct _MPI26_CONFIG_PAGE_PIOUNIT_0 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -3701,7 +3640,7 @@ typedef struct _MPI26_CONFIG_PAGE_PIOUNIT_0 {
> U8 InitStatus; /*0x0D */
> U16 Reserved3; /*0x0E */
> MPI26_PCIE_IO_UNIT0_PHY_DATA
> - PhyData[MPI26_PCIE_IOUNIT0_PHY_MAX]; /*0x10 */
> + PhyData[]; /*0x10 */
> } MPI26_CONFIG_PAGE_PIOUNIT_0,
> *PTR_MPI26_CONFIG_PAGE_PIOUNIT_0,
> Mpi26PCIeIOUnitPage0_t, *pMpi26PCIeIOUnitPage0_t;
> @@ -3993,12 +3932,9 @@ typedef struct _MPI26_PCIELINK2_LINK_EVENT {
>
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumLinkEvents at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumLinkEvents at runtime before using LinkEvent[].
> */
> -#ifndef MPI26_PCIELINK2_LINK_EVENT_MAX
> -#define MPI26_PCIELINK2_LINK_EVENT_MAX (1)
> -#endif
>
> typedef struct _MPI26_CONFIG_PAGE_PCIELINK_2 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -4009,7 +3945,7 @@ typedef struct _MPI26_CONFIG_PAGE_PCIELINK_2 {
> U8 Reserved3; /*0x0D */
> U16 Reserved4; /*0x0E */
> MPI26_PCIELINK2_LINK_EVENT
> - LinkEvent[MPI26_PCIELINK2_LINK_EVENT_MAX]; /*0x10 */
> + LinkEvent[]; /*0x10 */
> } MPI26_CONFIG_PAGE_PCIELINK_2, *PTR_MPI26_CONFIG_PAGE_PCIELINK_2,
> Mpi26PcieLinkPage2_t, *pMpi26PcieLinkPage2_t;
>
> @@ -4067,12 +4003,9 @@ typedef struct _MPI26_PCIELINK3_LINK_EVENT_CONFIG {
> #define MPI26_PCIELINK3_TFLAGS_EVENT_NOTIFY (0x0001)
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check the value returned for NumLinkEvents at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check the value returned
> + *for NumLinkEvents at runtime before using LinkEventConfig[].
> */
> -#ifndef MPI26_PCIELINK3_LINK_EVENT_MAX
> -#define MPI26_PCIELINK3_LINK_EVENT_MAX (1)
> -#endif
>
> typedef struct _MPI26_CONFIG_PAGE_PCIELINK_3 {
> MPI2_CONFIG_EXTENDED_PAGE_HEADER Header; /*0x00 */
> @@ -4083,7 +4016,7 @@ typedef struct _MPI26_CONFIG_PAGE_PCIELINK_3 {
> U8 Reserved3; /*0x0D */
> U16 Reserved4; /*0x0E */
> MPI26_PCIELINK3_LINK_EVENT_CONFIG
> - LinkEventConfig[MPI26_PCIELINK3_LINK_EVENT_MAX]; /*0x10 */
> + LinkEventConfig[]; /*0x10 */
> } MPI26_CONFIG_PAGE_PCIELINK_3, *PTR_MPI26_CONFIG_PAGE_PCIELINK_3,
> Mpi26PcieLinkPage3_t, *pMpi26PcieLinkPage3_t;
>
> diff --git a/drivers/scsi/mpt3sas/mpi/mpi2_image.h b/drivers/scsi/mpt3sas/mpi/mpi2_image.h
> index 33b9c3a6fd40..798ab6e33eb9 100644
> --- a/drivers/scsi/mpt3sas/mpi/mpi2_image.h
> +++ b/drivers/scsi/mpt3sas/mpi/mpi2_image.h
> @@ -295,20 +295,9 @@ typedef struct _MPI2_EXT_IMAGE_HEADER {
> /*FLASH Layout Extended Image Data */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check RegionsPerLayout at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check NumberOfLayouts and
> + *RegionsPerLayout at runtime before using Layout[] and Region[].
> */
> -#ifndef MPI2_FLASH_NUMBER_OF_REGIONS
> -#define MPI2_FLASH_NUMBER_OF_REGIONS (1)
> -#endif
> -
> -/*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check NumberOfLayouts at runtime.
> - */
> -#ifndef MPI2_FLASH_NUMBER_OF_LAYOUTS
> -#define MPI2_FLASH_NUMBER_OF_LAYOUTS (1)
> -#endif
>
> typedef struct _MPI2_FLASH_REGION {
> U8 RegionType; /*0x00 */
> @@ -325,7 +314,7 @@ typedef struct _MPI2_FLASH_LAYOUT {
> U32 Reserved1; /*0x04 */
> U32 Reserved2; /*0x08 */
> U32 Reserved3; /*0x0C */
> - MPI2_FLASH_REGION Region[MPI2_FLASH_NUMBER_OF_REGIONS]; /*0x10 */
> + MPI2_FLASH_REGION Region[]; /*0x10 */
> } MPI2_FLASH_LAYOUT, *PTR_MPI2_FLASH_LAYOUT,
> Mpi2FlashLayout_t, *pMpi2FlashLayout_t;
>
> @@ -339,7 +328,7 @@ typedef struct _MPI2_FLASH_LAYOUT_DATA {
> U16 MinimumSectorAlignment; /*0x08 */
> U16 Reserved3; /*0x0A */
> U32 Reserved4; /*0x0C */
> - MPI2_FLASH_LAYOUT Layout[MPI2_FLASH_NUMBER_OF_LAYOUTS]; /*0x10 */
> + MPI2_FLASH_LAYOUT Layout[]; /*0x10 */
> } MPI2_FLASH_LAYOUT_DATA, *PTR_MPI2_FLASH_LAYOUT_DATA,
> Mpi2FlashLayoutData_t, *pMpi2FlashLayoutData_t;
>
> @@ -373,12 +362,9 @@ typedef struct _MPI2_FLASH_LAYOUT_DATA {
> /*Supported Devices Extended Image Data */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check NumberOfDevices at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check NumberOfDevices at
> + *runtime before using SupportedDevice[].
> */
> -#ifndef MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES
> -#define MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES (1)
> -#endif
>
> typedef struct _MPI2_SUPPORTED_DEVICE {
> U16 DeviceID; /*0x00 */
> @@ -399,7 +385,7 @@ typedef struct _MPI2_SUPPORTED_DEVICES_DATA {
> U8 Reserved2; /*0x03 */
> U32 Reserved3; /*0x04 */
> MPI2_SUPPORTED_DEVICE
> - SupportedDevice[MPI2_SUPPORTED_DEVICES_IMAGE_NUM_DEVICES];/*0x08 */
> + SupportedDevice[]; /*0x08 */
> } MPI2_SUPPORTED_DEVICES_DATA, *PTR_MPI2_SUPPORTED_DEVICES_DATA,
> Mpi2SupportedDevicesData_t, *pMpi2SupportedDevicesData_t;
>
> @@ -464,7 +450,7 @@ typedef struct _MPI25_ENCRYPTED_HASH_ENTRY {
> U8 EncryptionAlgorithm; /*0x02 */
> U8 Reserved1; /*0x03 */
> U32 Reserved2; /*0x04 */
> - U32 EncryptedHash[1]; /*0x08 */ /* variable length */
> + U32 EncryptedHash[]; /*0x08 */
> } MPI25_ENCRYPTED_HASH_ENTRY, *PTR_MPI25_ENCRYPTED_HASH_ENTRY,
> Mpi25EncryptedHashEntry_t, *pMpi25EncryptedHashEntry_t;
>
> @@ -508,7 +494,7 @@ typedef struct _MPI25_ENCRYPTED_HASH_DATA {
> U8 NumHash; /*0x01 */
> U16 Reserved1; /*0x02 */
> U32 Reserved2; /*0x04 */
> - MPI25_ENCRYPTED_HASH_ENTRY EncryptedHashEntry[1]; /*0x08 */
> + MPI25_ENCRYPTED_HASH_ENTRY EncryptedHashEntry[]; /*0x08 */
> } MPI25_ENCRYPTED_HASH_DATA, *PTR_MPI25_ENCRYPTED_HASH_DATA,
> Mpi25EncryptedHashData_t, *pMpi25EncryptedHashData_t;
>
> diff --git a/drivers/scsi/mpt3sas/mpi/mpi2_ioc.h b/drivers/scsi/mpt3sas/mpi/mpi2_ioc.h
> index 2c57115172cf..d92852591134 100644
> --- a/drivers/scsi/mpt3sas/mpi/mpi2_ioc.h
> +++ b/drivers/scsi/mpt3sas/mpi/mpi2_ioc.h
> @@ -808,12 +808,9 @@ typedef struct _MPI2_EVENT_DATA_IR_PHYSICAL_DISK {
> /*Integrated RAID Configuration Change List Event data */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check NumElements at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check NumElements at
> + *runtime before using ConfigElement[].
> */
> -#ifndef MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT
> -#define MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT (1)
> -#endif
>
> typedef struct _MPI2_EVENT_IR_CONFIG_ELEMENT {
> U16 ElementFlags; /*0x00 */
> @@ -848,7 +845,7 @@ typedef struct _MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST {
> U8 ConfigNum; /*0x03 */
> U32 Flags; /*0x04 */
> MPI2_EVENT_IR_CONFIG_ELEMENT
> - ConfigElement[MPI2_EVENT_IR_CONFIG_ELEMENT_COUNT];/*0x08 */
> + ConfigElement[];/*0x08 */
> } MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST,
> *PTR_MPI2_EVENT_DATA_IR_CONFIG_CHANGE_LIST,
> Mpi2EventDataIrConfigChangeList_t,
> @@ -969,12 +966,9 @@ typedef struct _MPI2_EVENT_DATA_SAS_INIT_TABLE_OVERFLOW {
> /*SAS Topology Change List Event data */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check NumEntries at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check NumEntries at
> + *runtime before using PHY[].
> */
> -#ifndef MPI2_EVENT_SAS_TOPO_PHY_COUNT
> -#define MPI2_EVENT_SAS_TOPO_PHY_COUNT (1)
> -#endif
>
> typedef struct _MPI2_EVENT_SAS_TOPO_PHY_ENTRY {
> U16 AttachedDevHandle; /*0x00 */
> @@ -994,7 +988,7 @@ typedef struct _MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST {
> U8 ExpStatus; /*0x0A */
> U8 PhysicalPort; /*0x0B */
> MPI2_EVENT_SAS_TOPO_PHY_ENTRY
> - PHY[MPI2_EVENT_SAS_TOPO_PHY_COUNT]; /*0x0C */
> + PHY[]; /*0x0C */
> } MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST,
> *PTR_MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST,
> Mpi2EventDataSasTopologyChangeList_t,
> @@ -1229,12 +1223,9 @@ typedef struct _MPI26_EVENT_DATA_PCIE_ENUMERATION {
> /*PCIe Topology Change List Event data (MPI v2.6 and later) */
>
> /*
> - *Host code (drivers, BIOS, utilities, etc.) should leave this define set to
> - *one and check NumEntries at runtime.
> + *Host code (drivers, BIOS, utilities, etc.) should check NumEntries at
> + *runtime before using PortEntry[].
> */
> -#ifndef MPI26_EVENT_PCIE_TOPO_PORT_COUNT
> -#define MPI26_EVENT_PCIE_TOPO_PORT_COUNT (1)
> -#endif
>
> typedef struct _MPI26_EVENT_PCIE_TOPO_PORT_ENTRY {
> U16 AttachedDevHandle; /*0x00 */
> @@ -1286,7 +1277,7 @@ typedef struct _MPI26_EVENT_DATA_PCIE_TOPOLOGY_CHANGE_LIST {
> U8 SwitchStatus; /*0x0A */
> U8 PhysicalPort; /*0x0B */
> MPI26_EVENT_PCIE_TOPO_PORT_ENTRY
> - PortEntry[MPI26_EVENT_PCIE_TOPO_PORT_COUNT]; /*0x0C */
> + PortEntry[]; /*0x0C */
> } MPI26_EVENT_DATA_PCIE_TOPOLOGY_CHANGE_LIST,
> *PTR_MPI26_EVENT_DATA_PCIE_TOPOLOGY_CHANGE_LIST,
> Mpi26EventDataPCIeTopologyChangeList_t,
> --
> 2.39.2
>

--
Kees Cook