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)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 3 Aug 2021 01:43:57 +0000 (21:43 -0400)
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>
drivers/scsi/ufs/ufshcd.c

index 40d371f6e147c7ef9c7b1c6701767e9daea985d1..5829b25f5999cf5a4a06cec826414464d088c5cb 100644 (file)
@@ -3426,9 +3426,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)