scsi: ufs: Fix memory corruption by ufshcd_read_desc_param()
authorBart Van Assche <bvanassche@acm.org>
Thu, 22 Jul 2021 03:34:22 +0000 (20:34 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 18 Sep 2021 11:40:12 +0000 (13:40 +0200)
[ 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: cbe193f6f093 ("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>
drivers/scsi/ufs/ufshcd.c

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