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 7649773293
("cxgb3/l2t: Fix undefined behaviour")
Link: https://lore.kernel.org/r/20200224161406.GA21454@embeddedor
Reviewed-by: Lee Duncan <lduncan@suse.com>
Reviewed-by: Satish Kharat <satishkh@cisco.com>
Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
5905d4648e
Коммит
5febf6d6ae
|
@ -442,7 +442,7 @@ struct vnic_devcmd_notify {
|
||||||
struct vnic_devcmd_provinfo {
|
struct vnic_devcmd_provinfo {
|
||||||
u8 oui[3];
|
u8 oui[3];
|
||||||
u8 type;
|
u8 type;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -451,12 +451,12 @@ struct ipr_config_table_hdr64 {
|
||||||
|
|
||||||
struct ipr_config_table {
|
struct ipr_config_table {
|
||||||
struct ipr_config_table_hdr hdr;
|
struct ipr_config_table_hdr hdr;
|
||||||
struct ipr_config_table_entry dev[0];
|
struct ipr_config_table_entry dev[];
|
||||||
}__attribute__((packed, aligned (4)));
|
}__attribute__((packed, aligned (4)));
|
||||||
|
|
||||||
struct ipr_config_table64 {
|
struct ipr_config_table64 {
|
||||||
struct ipr_config_table_hdr64 hdr64;
|
struct ipr_config_table_hdr64 hdr64;
|
||||||
struct ipr_config_table_entry64 dev[0];
|
struct ipr_config_table_entry64 dev[];
|
||||||
}__attribute__((packed, aligned (8)));
|
}__attribute__((packed, aligned (8)));
|
||||||
|
|
||||||
struct ipr_config_table_entry_wrapper {
|
struct ipr_config_table_entry_wrapper {
|
||||||
|
@ -792,7 +792,7 @@ struct ipr_mode_page28 {
|
||||||
struct ipr_mode_page_hdr hdr;
|
struct ipr_mode_page_hdr hdr;
|
||||||
u8 num_entries;
|
u8 num_entries;
|
||||||
u8 entry_length;
|
u8 entry_length;
|
||||||
struct ipr_dev_bus_entry bus[0];
|
struct ipr_dev_bus_entry bus[];
|
||||||
}__attribute__((packed));
|
}__attribute__((packed));
|
||||||
|
|
||||||
struct ipr_mode_page24 {
|
struct ipr_mode_page24 {
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct smp_req {
|
||||||
u8 func; /* byte 1 */
|
u8 func; /* byte 1 */
|
||||||
u8 alloc_resp_len; /* byte 2 */
|
u8 alloc_resp_len; /* byte 2 */
|
||||||
u8 req_len; /* byte 3 */
|
u8 req_len; /* byte 3 */
|
||||||
u8 req_data[0];
|
u8 req_data[];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -207,7 +207,7 @@ struct fw_event_work {
|
||||||
u8 ignore;
|
u8 ignore;
|
||||||
u16 event;
|
u16 event;
|
||||||
struct kref refcount;
|
struct kref refcount;
|
||||||
char event_data[0] __aligned(4);
|
char event_data[] __aligned(4);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void fw_event_work_free(struct kref *r)
|
static void fw_event_work_free(struct kref *r)
|
||||||
|
|
|
@ -394,7 +394,7 @@ struct mvs_info {
|
||||||
dma_addr_t bulk_buffer_dma1;
|
dma_addr_t bulk_buffer_dma1;
|
||||||
#define TRASH_BUCKET_SIZE 0x20000
|
#define TRASH_BUCKET_SIZE 0x20000
|
||||||
void *dma_pool;
|
void *dma_pool;
|
||||||
struct mvs_slot_info slot_info[0];
|
struct mvs_slot_info slot_info[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mvs_prv_info{
|
struct mvs_prv_info{
|
||||||
|
|
|
@ -130,7 +130,7 @@ enum {
|
||||||
struct mvumi_hotplug_event {
|
struct mvumi_hotplug_event {
|
||||||
u16 size;
|
u16 size;
|
||||||
u8 dummy[2];
|
u8 dummy[2];
|
||||||
u8 bitmap[0];
|
u8 bitmap[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mvumi_driver_event {
|
struct mvumi_driver_event {
|
||||||
|
@ -290,7 +290,7 @@ struct mvumi_rsp_frame {
|
||||||
|
|
||||||
struct mvumi_ob_data {
|
struct mvumi_ob_data {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
unsigned char data[0];
|
unsigned char data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct version_info {
|
struct version_info {
|
||||||
|
|
|
@ -623,7 +623,7 @@ struct pmcraid_aen_msg {
|
||||||
u32 hostno;
|
u32 hostno;
|
||||||
u32 length;
|
u32 length;
|
||||||
u8 reserved[8];
|
u8 reserved[8];
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Controller state event message type */
|
/* Controller state event message type */
|
||||||
|
|
|
@ -208,7 +208,7 @@ struct vnic_devcmd_notify {
|
||||||
struct vnic_devcmd_provinfo {
|
struct vnic_devcmd_provinfo {
|
||||||
u8 oui[3];
|
u8 oui[3];
|
||||||
u8 type;
|
u8 type;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -236,7 +236,7 @@ struct req_msg {
|
||||||
u8 data_dir;
|
u8 data_dir;
|
||||||
u8 payload_sz; /* payload size in 4-byte, not used */
|
u8 payload_sz; /* payload size in 4-byte, not used */
|
||||||
u8 cdb[STEX_CDB_LENGTH];
|
u8 cdb[STEX_CDB_LENGTH];
|
||||||
u32 variable[0];
|
u32 variable[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct status_msg {
|
struct status_msg {
|
||||||
|
|
|
@ -311,7 +311,7 @@ enum iscsi_param_type {
|
||||||
struct iscsi_param_info {
|
struct iscsi_param_info {
|
||||||
uint32_t len; /* Actual length of the param value */
|
uint32_t len; /* Actual length of the param value */
|
||||||
uint16_t param; /* iscsi param */
|
uint16_t param; /* iscsi param */
|
||||||
uint8_t value[0]; /* length sized value follows */
|
uint8_t value[]; /* length sized value follows */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct iscsi_iface_param_info {
|
struct iscsi_iface_param_info {
|
||||||
|
@ -320,7 +320,7 @@ struct iscsi_iface_param_info {
|
||||||
uint16_t param; /* iscsi param value */
|
uint16_t param; /* iscsi param value */
|
||||||
uint8_t iface_type; /* IPv4 or IPv6 */
|
uint8_t iface_type; /* IPv4 or IPv6 */
|
||||||
uint8_t param_type; /* iscsi_param_type */
|
uint8_t param_type; /* iscsi_param_type */
|
||||||
uint8_t value[0]; /* length sized value follows */
|
uint8_t value[]; /* length sized value follows */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -697,7 +697,7 @@ enum iscsi_flashnode_param {
|
||||||
struct iscsi_flashnode_param_info {
|
struct iscsi_flashnode_param_info {
|
||||||
uint32_t len; /* Actual length of the param */
|
uint32_t len; /* Actual length of the param */
|
||||||
uint16_t param; /* iscsi param value */
|
uint16_t param; /* iscsi param value */
|
||||||
uint8_t value[0]; /* length sized value follows */
|
uint8_t value[]; /* length sized value follows */
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
enum iscsi_discovery_parent_type {
|
enum iscsi_discovery_parent_type {
|
||||||
|
@ -815,7 +815,7 @@ struct iscsi_stats {
|
||||||
* up to ISCSI_STATS_CUSTOM_MAX
|
* up to ISCSI_STATS_CUSTOM_MAX
|
||||||
*/
|
*/
|
||||||
uint32_t custom_length;
|
uint32_t custom_length;
|
||||||
struct iscsi_stats_custom custom[0]
|
struct iscsi_stats_custom custom[]
|
||||||
__attribute__ ((aligned (sizeof(uint64_t))));
|
__attribute__ ((aligned (sizeof(uint64_t))));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -946,7 +946,7 @@ struct iscsi_offload_host_stats {
|
||||||
* up to ISCSI_HOST_STATS_CUSTOM_MAX
|
* up to ISCSI_HOST_STATS_CUSTOM_MAX
|
||||||
*/
|
*/
|
||||||
uint32_t custom_length;
|
uint32_t custom_length;
|
||||||
struct iscsi_host_stats_custom custom[0]
|
struct iscsi_host_stats_custom custom[]
|
||||||
__aligned(sizeof(uint64_t));
|
__aligned(sizeof(uint64_t));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ struct iscsi_bsg_host_vendor {
|
||||||
uint64_t vendor_id;
|
uint64_t vendor_id;
|
||||||
|
|
||||||
/* start of vendor command area */
|
/* start of vendor command area */
|
||||||
uint32_t vendor_cmd[0];
|
uint32_t vendor_cmd[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Response:
|
/* Response:
|
||||||
|
|
|
@ -230,7 +230,7 @@ struct scsi_device {
|
||||||
struct mutex state_mutex;
|
struct mutex state_mutex;
|
||||||
enum scsi_device_state sdev_state;
|
enum scsi_device_state sdev_state;
|
||||||
struct task_struct *quiesced_by;
|
struct task_struct *quiesced_by;
|
||||||
unsigned long sdev_data[0];
|
unsigned long sdev_data[];
|
||||||
} __attribute__((aligned(sizeof(unsigned long))));
|
} __attribute__((aligned(sizeof(unsigned long))));
|
||||||
|
|
||||||
#define to_scsi_device(d) \
|
#define to_scsi_device(d) \
|
||||||
|
@ -314,7 +314,7 @@ struct scsi_target {
|
||||||
char scsi_level;
|
char scsi_level;
|
||||||
enum scsi_target_state state;
|
enum scsi_target_state state;
|
||||||
void *hostdata; /* available to low-level driver */
|
void *hostdata; /* available to low-level driver */
|
||||||
unsigned long starget_data[0]; /* for the transport */
|
unsigned long starget_data[]; /* for the transport */
|
||||||
/* starget_data must be the last element!!!! */
|
/* starget_data must be the last element!!!! */
|
||||||
} __attribute__((aligned(sizeof(unsigned long))));
|
} __attribute__((aligned(sizeof(unsigned long))));
|
||||||
|
|
||||||
|
|
|
@ -683,7 +683,7 @@ struct Scsi_Host {
|
||||||
* and also because some compilers (m68k) don't automatically force
|
* and also because some compilers (m68k) don't automatically force
|
||||||
* alignment to a long boundary.
|
* alignment to a long boundary.
|
||||||
*/
|
*/
|
||||||
unsigned long hostdata[0] /* Used for storage of host specific stuff */
|
unsigned long hostdata[] /* Used for storage of host specific stuff */
|
||||||
__attribute__ ((aligned (sizeof(unsigned long))));
|
__attribute__ ((aligned (sizeof(unsigned long))));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ struct scsi_device;
|
||||||
typedef struct scsi_ioctl_command {
|
typedef struct scsi_ioctl_command {
|
||||||
unsigned int inlen;
|
unsigned int inlen;
|
||||||
unsigned int outlen;
|
unsigned int outlen;
|
||||||
unsigned char data[0];
|
unsigned char data[];
|
||||||
} Scsi_Ioctl_Command;
|
} Scsi_Ioctl_Command;
|
||||||
|
|
||||||
typedef struct scsi_idlun {
|
typedef struct scsi_idlun {
|
||||||
|
|
|
@ -109,7 +109,7 @@ struct srp_direct_buf {
|
||||||
struct srp_indirect_buf {
|
struct srp_indirect_buf {
|
||||||
struct srp_direct_buf table_desc;
|
struct srp_direct_buf table_desc;
|
||||||
__be32 len;
|
__be32 len;
|
||||||
struct srp_direct_buf desc_list[0];
|
struct srp_direct_buf desc_list[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
/* Immediate data buffer descriptor as defined in SRP2. */
|
/* Immediate data buffer descriptor as defined in SRP2. */
|
||||||
|
@ -244,7 +244,7 @@ struct srp_cmd {
|
||||||
u8 reserved4;
|
u8 reserved4;
|
||||||
u8 add_cdb_len;
|
u8 add_cdb_len;
|
||||||
u8 cdb[16];
|
u8 cdb[16];
|
||||||
u8 add_data[0];
|
u8 add_data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -274,7 +274,7 @@ struct srp_rsp {
|
||||||
__be32 data_in_res_cnt;
|
__be32 data_in_res_cnt;
|
||||||
__be32 sense_data_len;
|
__be32 sense_data_len;
|
||||||
__be32 resp_data_len;
|
__be32 resp_data_len;
|
||||||
u8 data[0];
|
u8 data[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct srp_cred_req {
|
struct srp_cred_req {
|
||||||
|
@ -306,7 +306,7 @@ struct srp_aer_req {
|
||||||
struct scsi_lun lun;
|
struct scsi_lun lun;
|
||||||
__be32 sense_data_len;
|
__be32 sense_data_len;
|
||||||
u32 reserved3;
|
u32 reserved3;
|
||||||
u8 sense_data[0];
|
u8 sense_data[];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct srp_aer_rsp {
|
struct srp_aer_rsp {
|
||||||
|
|
|
@ -209,7 +209,7 @@ struct fc_bsg_host_vendor {
|
||||||
__u64 vendor_id;
|
__u64 vendor_id;
|
||||||
|
|
||||||
/* start of vendor command area */
|
/* start of vendor command area */
|
||||||
__u32 vendor_cmd[0];
|
__u32 vendor_cmd[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Response:
|
/* Response:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче