Commit 5febf6d6 authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva Committed by Martin K. Petersen
Browse files

scsi: Replace zero-length array with flexible-array member

The current codebase makes use of the zero-length array language extension
to the C90 standard, but the preferred mechanism to declare variable-length
types such as these ones is a flexible array member[1][2], introduced in
C99:

struct foo {
        int stuff;
        struct boo array[];
};

By making use of the mechanism above, we will get a compiler warning in
case the flexible array does not occur last in the structure, which will
help us prevent some kind of undefined behavior bugs from being
inadvertently introduced[3] to the codebase from now on.

Also, notice that, dynamic memory allocations won't be affected by this
change:

"Flexible array members have incomplete type, and so the sizeof operator
may not be applied. As a quirk of the original implementation of
zero-length arrays, sizeof evaluates to zero."[1]

This issue was found with the help of Coccinelle.

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732 ("cxgb3/l2t: Fix undefined behaviour")

Link: https://lore.kernel.org/r/20200224161406.GA21454@embeddedor


Reviewed-by: default avatarLee Duncan <lduncan@suse.com>
Reviewed-by: default avatarSatish Kharat <satishkh@cisco.com>
Signed-off-by: default avatarGustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5905d464
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -442,7 +442,7 @@ struct vnic_devcmd_notify {
struct vnic_devcmd_provinfo {
	u8 oui[3];
	u8 type;
	u8 data[0];
	u8 data[];
};

/*
+3 −3
Original line number Diff line number Diff line
@@ -451,12 +451,12 @@ struct ipr_config_table_hdr64 {

struct ipr_config_table {
	struct ipr_config_table_hdr hdr;
	struct ipr_config_table_entry dev[0];
	struct ipr_config_table_entry dev[];
}__attribute__((packed, aligned (4)));

struct ipr_config_table64 {
	struct ipr_config_table_hdr64 hdr64;
	struct ipr_config_table_entry64 dev[0];
	struct ipr_config_table_entry64 dev[];
}__attribute__((packed, aligned (8)));

struct ipr_config_table_entry_wrapper {
@@ -792,7 +792,7 @@ struct ipr_mode_page28 {
	struct ipr_mode_page_hdr hdr;
	u8 num_entries;
	u8 entry_length;
	struct ipr_dev_bus_entry bus[0];
	struct ipr_dev_bus_entry bus[];
}__attribute__((packed));

struct ipr_mode_page24 {
+1 −1
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ struct smp_req {
	u8 func;		/* byte 1 */
	u8 alloc_resp_len;	/* byte 2 */
	u8 req_len;		/* byte 3 */
	u8 req_data[0];
	u8 req_data[];
}  __packed;

/*
+1 −1
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ struct fw_event_work {
	u8			ignore;
	u16			event;
	struct kref		refcount;
	char			event_data[0] __aligned(4);
	char			event_data[] __aligned(4);
};

static void fw_event_work_free(struct kref *r)
+1 −1
Original line number Diff line number Diff line
@@ -394,7 +394,7 @@ struct mvs_info {
	dma_addr_t bulk_buffer_dma1;
#define TRASH_BUCKET_SIZE    	0x20000
	void *dma_pool;
	struct mvs_slot_info slot_info[0];
	struct mvs_slot_info slot_info[];
};

struct mvs_prv_info{
Loading