scsi: ufs: Fix memory corruption by ufshcd_read_desc_param()

[ Upstream commit d3d9c4570285090b533b00946b72647361f0345b ]

If param_offset > buff_len then the memcpy() statement in
ufshcd_read_desc_param() corrupts memory since it copies 256 + buff_len -
param_offset bytes into a buffer with size buff_len.  Since param_offset <
256 this results in writing past the bound of the output buffer.

Link: https://lore.kernel.org/r/20210722033439.26550-2-bvanassche@acm.org
Fixes: cbe193f6f0 ("scsi: ufs: Fix potential NULL pointer access during memcpy")
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Reviewed-by: Daejun Park <daejun7.park@samsung.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Bart Van Assche
2021-07-21 20:34:22 -07:00
committed by Greg Kroah-Hartman
parent d353e093c0
commit 3b2bbcccd6

View File

@@ -3249,9 +3249,11 @@ int ufshcd_read_desc_param(struct ufs_hba *hba,
if (is_kmalloc) { if (is_kmalloc) {
/* Make sure we don't copy more data than available */ /* Make sure we don't copy more data than available */
if (param_offset + param_size > buff_len) if (param_offset >= buff_len)
param_size = buff_len - param_offset; ret = -EINVAL;
memcpy(param_read_buf, &desc_buf[param_offset], param_size); else
memcpy(param_read_buf, &desc_buf[param_offset],
min_t(u32, param_size, buff_len - param_offset));
} }
out: out:
if (is_kmalloc) if (is_kmalloc)