Message ID | 6238ccf37798e36d783f5ce5e483e6837e98be79.1663865333.git.gustavoars@kernel.org (mailing list archive) |
---|---|
State | Mainlined |
Commit | c682df71996aee74c6a50d0fe491c135a7bea1e7 |
Headers | show |
Series | Replace one-element array with flexible-array member | expand |
On Thu, Sep 22, 2022 at 11:53:23AM -0500, Gustavo A. R. Silva wrote: > One-element arrays are deprecated, and we are replacing them with flexible > array members instead. So, replace one-element array with flexible-array > member in struct hpt_iop_request_scsi_command and refactor the rest of the > code, accordingly. > > The following pieces of code suggest that the one element of array sg_list > in struct hpt_iop_request_scsi_command is not taken into account when > calculating the total size for both struct hpt_iop_request_scsi_command > and the maximum number of elements sg_list will contain: > > 1047 req->header.size = cpu_to_le32( > 1048 sizeof(struct hpt_iop_request_scsi_command) > 1049 - sizeof(struct hpt_iopsg) > 1050 + sg_count * sizeof(struct hpt_iopsg)); > > 1400 req_size = sizeof(struct hpt_iop_request_scsi_command) 1401 + sizeof(struct hpt_iopsg) * (hba->max_sg_descriptors - 1); Accidentally merge line above ("1401" should start a new line). > So it's safe to replace the one-element array with a flexible-array > member and update the code above, accordingly: now we don't need to > subtract sizeof(struct hpt_iopsg) from sizeof(struct hpt_iop_request_scsi_command) > because this is implicitly done by the flex-array transformation. The only binary output change I see is from the line numbers changing from the patch, as the argument to __might_sleep() is adjusted: ... │ call d1 <hptiop_reset+0x74> │ R_X86_64_PLT32 __x86_indirect_thunk_rax-0x4 │ - mov $0x434,%esi │ + mov $0x433,%esi │ mov $0x0,%rdi │ R_X86_64_32S .rodata.str1.1 │ call e2 <hptiop_reset+0x85> │ R_X86_64_PLT32 __might_sleep-0x4 ... So this looks good! Reviewed-by: Kees Cook <keescook@chromium.org>
diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c index f18b770626e6..cfc6546e35a6 100644 --- a/drivers/scsi/hptiop.c +++ b/drivers/scsi/hptiop.c @@ -1046,7 +1046,6 @@ static int hptiop_queuecommand_lck(struct scsi_cmnd *scp) req->lun = scp->device->lun; req->header.size = cpu_to_le32( sizeof(struct hpt_iop_request_scsi_command) - - sizeof(struct hpt_iopsg) + sg_count * sizeof(struct hpt_iopsg)); memcpy(req->cdb, scp->cmnd, sizeof(req->cdb)); @@ -1398,7 +1397,7 @@ static int hptiop_probe(struct pci_dev *pcidev, const struct pci_device_id *id) host->max_cmd_len = 16; req_size = sizeof(struct hpt_iop_request_scsi_command) - + sizeof(struct hpt_iopsg) * (hba->max_sg_descriptors - 1); + + sizeof(struct hpt_iopsg) * hba->max_sg_descriptors; if ((req_size & 0x1f) != 0) req_size = (req_size + 0x1f) & ~0x1f; diff --git a/drivers/scsi/hptiop.h b/drivers/scsi/hptiop.h index 363d5a16243f..ef2f2aca598c 100644 --- a/drivers/scsi/hptiop.h +++ b/drivers/scsi/hptiop.h @@ -228,7 +228,7 @@ struct hpt_iop_request_scsi_command { u8 pad1; u8 cdb[16]; __le32 dataxfer_length; - struct hpt_iopsg sg_list[1]; + struct hpt_iopsg sg_list[]; }; struct hpt_iop_request_ioctl_command {
One-element arrays are deprecated, and we are replacing them with flexible array members instead. So, replace one-element array with flexible-array member in struct hpt_iop_request_scsi_command and refactor the rest of the code, accordingly. The following pieces of code suggest that the one element of array sg_list in struct hpt_iop_request_scsi_command is not taken into account when calculating the total size for both struct hpt_iop_request_scsi_command and the maximum number of elements sg_list will contain: 1047 req->header.size = cpu_to_le32( 1048 sizeof(struct hpt_iop_request_scsi_command) 1049 - sizeof(struct hpt_iopsg) 1050 + sg_count * sizeof(struct hpt_iopsg)); 1400 req_size = sizeof(struct hpt_iop_request_scsi_command) 1401 + sizeof(struct hpt_iopsg) * (hba->max_sg_descriptors - 1); So it's safe to replace the one-element array with a flexible-array member and update the code above, accordingly: now we don't need to subtract sizeof(struct hpt_iopsg) from sizeof(struct hpt_iop_request_scsi_command) because this is implicitly done by the flex-array transformation. Link: https://github.com/KSPP/linux/issues/79 Link: https://github.com/KSPP/linux/issues/205 Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org> --- drivers/scsi/hptiop.c | 3 +-- drivers/scsi/hptiop.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-)