scsi: smartpqi: Replace one-element arrays with flexible-array members
authorGustavo A. R. Silva <gustavoars@kernel.org>
Wed, 21 Jun 2023 20:27:20 +0000 (14:27 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 22 Jun 2023 01:15:08 +0000 (21:15 -0400)
One-element arrays are deprecated, and we are replacing them with flexible
array members instead. So, replace one-element arrays with flexible-array
members in a couple of structures, and refactor the rest of the code,
accordingly.

This helps with the ongoing efforts to tighten the FORTIFY_SOURCE routines
on memcpy().

This results in no differences in binary output.

Link: https://github.com/KSPP/linux/issues/79
Link: https://github.com/KSPP/linux/issues/204
Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Link: https://lore.kernel.org/r/ZJNdKDkuRbFZpASS@work
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi.h
drivers/scsi/smartpqi/smartpqi_init.c

index f960b50..e392eaf 100644 (file)
@@ -982,12 +982,12 @@ struct report_phys_lun_16byte_wwid {
 
 struct report_phys_lun_8byte_wwid_list {
        struct report_lun_header header;
 
 struct report_phys_lun_8byte_wwid_list {
        struct report_lun_header header;
-       struct report_phys_lun_8byte_wwid lun_entries[1];
+       struct report_phys_lun_8byte_wwid lun_entries[];
 };
 
 struct report_phys_lun_16byte_wwid_list {
        struct report_lun_header header;
 };
 
 struct report_phys_lun_16byte_wwid_list {
        struct report_lun_header header;
-       struct report_phys_lun_16byte_wwid lun_entries[1];
+       struct report_phys_lun_16byte_wwid lun_entries[];
 };
 
 struct raid_map_disk_data {
 };
 
 struct raid_map_disk_data {
index 772346f..188866f 100644 (file)
@@ -1203,7 +1203,6 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
        unsigned int i;
        u8 rpl_response_format;
        u32 num_physicals;
        unsigned int i;
        u8 rpl_response_format;
        u32 num_physicals;
-       size_t rpl_16byte_wwid_list_length;
        void *rpl_list;
        struct report_lun_header *rpl_header;
        struct report_phys_lun_8byte_wwid_list *rpl_8byte_wwid_list;
        void *rpl_list;
        struct report_lun_header *rpl_header;
        struct report_phys_lun_8byte_wwid_list *rpl_8byte_wwid_list;
@@ -1232,9 +1231,9 @@ static inline int pqi_report_phys_luns(struct pqi_ctrl_info *ctrl_info, void **b
 
        rpl_8byte_wwid_list = rpl_list;
        num_physicals = get_unaligned_be32(&rpl_8byte_wwid_list->header.list_length) / sizeof(rpl_8byte_wwid_list->lun_entries[0]);
 
        rpl_8byte_wwid_list = rpl_list;
        num_physicals = get_unaligned_be32(&rpl_8byte_wwid_list->header.list_length) / sizeof(rpl_8byte_wwid_list->lun_entries[0]);
-       rpl_16byte_wwid_list_length = sizeof(struct report_lun_header) + (num_physicals * sizeof(struct report_phys_lun_16byte_wwid));
 
 
-       rpl_16byte_wwid_list = kmalloc(rpl_16byte_wwid_list_length, GFP_KERNEL);
+       rpl_16byte_wwid_list = kmalloc(struct_size(rpl_16byte_wwid_list, lun_entries,
+                                                  num_physicals), GFP_KERNEL);
        if (!rpl_16byte_wwid_list)
                return -ENOMEM;
 
        if (!rpl_16byte_wwid_list)
                return -ENOMEM;