diff mbox series

vfio/qat: fix overflow check in qat_vf_resume_write()

Message ID 20241021123843.42979-1-giovanni.cabiddu@intel.com (mailing list archive)
State New
Headers show
Series vfio/qat: fix overflow check in qat_vf_resume_write() | expand

Commit Message

Cabiddu, Giovanni Oct. 21, 2024, 12:37 p.m. UTC
The unsigned variable `size_t len` is cast to the signed type `loff_t`
when passed to the function check_add_overflow(). This function considers
the type of the destination, which is of type loff_t (signed),
potentially leading to an overflow. This issue is similar to the one
described in the link below.

Remove the cast.

Note that even if check_add_overflow() is bypassed, by setting `len` to
a value that is greater than LONG_MAX (which is considered as a negative
value after the cast), the function copy_from_user(), invoked a few lines
later, will not perform any copy and return `len` as (len > INT_MAX)
causing qat_vf_resume_write() to fail with -EFAULT.

Fixes: bb208810b1ab ("vfio/qat: Add vfio_pci driver for Intel QAT SR-IOV VF devices")
CC: stable@vger.kernel.org # 6.10+
Link: https://lore.kernel.org/all/138bd2e2-ede8-4bcc-aa7b-f3d9de167a37@moroto.mountain
Reported-by: Zijie Zhao <zzjas98@gmail.com>
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Reviewed-by: Xin Zeng <xin.zeng@intel.com>
---
 drivers/vfio/pci/qat/main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Alex Williamson Nov. 1, 2024, 2:38 p.m. UTC | #1
On Mon, 21 Oct 2024 13:37:53 +0100
Giovanni Cabiddu <giovanni.cabiddu@intel.com> wrote:

> The unsigned variable `size_t len` is cast to the signed type `loff_t`
> when passed to the function check_add_overflow(). This function considers
> the type of the destination, which is of type loff_t (signed),
> potentially leading to an overflow. This issue is similar to the one
> described in the link below.
> 
> Remove the cast.
> 
> Note that even if check_add_overflow() is bypassed, by setting `len` to
> a value that is greater than LONG_MAX (which is considered as a negative
> value after the cast), the function copy_from_user(), invoked a few lines
> later, will not perform any copy and return `len` as (len > INT_MAX)
> causing qat_vf_resume_write() to fail with -EFAULT.
> 
> Fixes: bb208810b1ab ("vfio/qat: Add vfio_pci driver for Intel QAT SR-IOV VF devices")
> CC: stable@vger.kernel.org # 6.10+
> Link: https://lore.kernel.org/all/138bd2e2-ede8-4bcc-aa7b-f3d9de167a37@moroto.mountain
> Reported-by: Zijie Zhao <zzjas98@gmail.com>
> Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
> Reviewed-by: Xin Zeng <xin.zeng@intel.com>
> ---
>  drivers/vfio/pci/qat/main.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/vfio/pci/qat/main.c b/drivers/vfio/pci/qat/main.c
> index e36740a282e7..1e3563fe7cab 100644
> --- a/drivers/vfio/pci/qat/main.c
> +++ b/drivers/vfio/pci/qat/main.c
> @@ -305,7 +305,7 @@ static ssize_t qat_vf_resume_write(struct file *filp, const char __user *buf,
>  	offs = &filp->f_pos;
>  
>  	if (*offs < 0 ||
> -	    check_add_overflow((loff_t)len, *offs, &end))
> +	    check_add_overflow(len, *offs, &end))
>  		return -EOVERFLOW;
>  
>  	if (end > mig_dev->state_size)

Applied to vfio next branch for v6.13.  Thanks,

Alex
diff mbox series

Patch

diff --git a/drivers/vfio/pci/qat/main.c b/drivers/vfio/pci/qat/main.c
index e36740a282e7..1e3563fe7cab 100644
--- a/drivers/vfio/pci/qat/main.c
+++ b/drivers/vfio/pci/qat/main.c
@@ -305,7 +305,7 @@  static ssize_t qat_vf_resume_write(struct file *filp, const char __user *buf,
 	offs = &filp->f_pos;
 
 	if (*offs < 0 ||
-	    check_add_overflow((loff_t)len, *offs, &end))
+	    check_add_overflow(len, *offs, &end))
 		return -EOVERFLOW;
 
 	if (end > mig_dev->state_size)