Re: [PATCH 2/3] scsi: megaraid_sas: check user-provided offsets
From: Arnd Bergmann <arnd@kernel.org>
Date: 2021-01-03 18:50:53
Also in:
linux-scsi, lkml
On Sun, Jan 3, 2021 at 6:00 PM James Bottomley [off-list ref] wrote:
On Sun, 2021-01-03 at 17:26 +0100, Arnd Bergmann wrote: [...]quoted
@@ -8209,7 +8208,7 @@ megasas_mgmt_fw_ioctl(struct megasas_instance*instance, if (instance->consistent_mask_64bit) put_unaligned_le64(sense_handle, sense_ptr); else - put_unaligned_le32(sense_handle, sense_ptr); + put_unaligned_le64(sense_handle, sense_ptr); }This hunk can't be right. It effectively means removing the if.
I'm just trying to restore the state before the regression introduced
in my 381d34e376e3 ("scsi: megaraid_sas: Check user-provided offsets").
The old code always stored 'sizeof(long)' bytes into sense_ptr,
regardless of instance->consistent_mask_64bit, but it would truncate
the address to 32 bit if that was cleared. This was clearly bogus
and I tried to make it do something more meaningful, only storing
8 bytes into the structure if it was configured for 64-bit DMA, regardless
of the capabilities of the kernel.
However, the if is needed because sense_handle is a dma_addr_t which can be either 32 or 64 bit. What about changing the if to if (sizeof(dma_addr_t) == 8) instead?
That would not be useful either, the device surely does not care
if the kernel supports 64-bit DMA. What we'd really need here is
someone with access to the interface specifications to see how
many bytes should be stored in the structure. I suspect always
storing 64 bits (as my patch does) is correct, and would send a
proper patch to remove the if() if Phil confirms that my test
patch fixes the regression.
Arnd