diff mbox series

vfio/pci: Fix OpRegion read

Message ID 20211119081435.3237699-1-zhenyuw@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series vfio/pci: Fix OpRegion read | expand

Commit Message

Zhenyu Wang Nov. 19, 2021, 8:14 a.m. UTC
This is to fix incorrect pointer arithmetic which caused wrong
OpRegion version returned, then VM driver got error to get wanted
VBT block. We need to be safe to return correct data, so force
pointer type for byte access.

Fixes: 49ba1a2976c8 ("vfio/pci: Add OpRegion 2.0+ Extended VBT support.")
Cc: Colin Xu <colin.xu@gmail.com>
Cc: Dmitry Torokhov <dtor@chromium.org>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
---
 drivers/vfio/pci/vfio_pci_igd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Colin Xu Nov. 21, 2021, 2:01 p.m. UTC | #1
Thanks for the fix.
The implicit ptr cast will incorrectly advance the pointer. Cast to
byte is the correct step.

Best Regards,
Colin

On Fri, Nov 19, 2021 at 4:14 PM Zhenyu Wang <zhenyuw@linux.intel.com> wrote:
>
> This is to fix incorrect pointer arithmetic which caused wrong
> OpRegion version returned, then VM driver got error to get wanted
> VBT block. We need to be safe to return correct data, so force
> pointer type for byte access.
>
> Fixes: 49ba1a2976c8 ("vfio/pci: Add OpRegion 2.0+ Extended VBT support.")
> Cc: Colin Xu <colin.xu@gmail.com>
> Cc: Dmitry Torokhov <dtor@chromium.org>
> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
> ---
>  drivers/vfio/pci/vfio_pci_igd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_igd.c b/drivers/vfio/pci/vfio_pci_igd.c
> index 56cd551e0e04..dad6eeed5e80 100644
> --- a/drivers/vfio/pci/vfio_pci_igd.c
> +++ b/drivers/vfio/pci/vfio_pci_igd.c
> @@ -98,7 +98,7 @@ static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
>                         version = cpu_to_le16(0x0201);
>
>                 if (igd_opregion_shift_copy(buf, &off,
> -                                           &version + (pos - OPREGION_VERSION),
> +                                           (u8 *)&version + (pos - OPREGION_VERSION),
>                                             &pos, &remaining, bytes))
>                         return -EFAULT;
>         }
> @@ -121,7 +121,7 @@ static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
>                                           OPREGION_SIZE : 0);
>
>                 if (igd_opregion_shift_copy(buf, &off,
> -                                           &rvda + (pos - OPREGION_RVDA),
> +                                           (u8 *)&rvda + (pos - OPREGION_RVDA),
>                                             &pos, &remaining, bytes))
>                         return -EFAULT;
>         }
> --
> 2.33.1
>
Colin Xu Nov. 24, 2021, 12:56 a.m. UTC | #2
Thanks and appreciated for the fix.

Acked-by: Colin Xu <colin.xu@gmail.com>

On Fri, Nov 19, 2021 at 4:14 PM Zhenyu Wang <zhenyuw@linux.intel.com> wrote:
>
> This is to fix incorrect pointer arithmetic which caused wrong
> OpRegion version returned, then VM driver got error to get wanted
> VBT block. We need to be safe to return correct data, so force
> pointer type for byte access.
>
> Fixes: 49ba1a2976c8 ("vfio/pci: Add OpRegion 2.0+ Extended VBT support.")
> Cc: Colin Xu <colin.xu@gmail.com>
> Cc: Dmitry Torokhov <dtor@chromium.org>
> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
> ---
>  drivers/vfio/pci/vfio_pci_igd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_igd.c b/drivers/vfio/pci/vfio_pci_igd.c
> index 56cd551e0e04..dad6eeed5e80 100644
> --- a/drivers/vfio/pci/vfio_pci_igd.c
> +++ b/drivers/vfio/pci/vfio_pci_igd.c
> @@ -98,7 +98,7 @@ static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
>                         version = cpu_to_le16(0x0201);
>
>                 if (igd_opregion_shift_copy(buf, &off,
> -                                           &version + (pos - OPREGION_VERSION),
> +                                           (u8 *)&version + (pos - OPREGION_VERSION),
>                                             &pos, &remaining, bytes))
>                         return -EFAULT;
>         }
> @@ -121,7 +121,7 @@ static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
>                                           OPREGION_SIZE : 0);
>
>                 if (igd_opregion_shift_copy(buf, &off,
> -                                           &rvda + (pos - OPREGION_RVDA),
> +                                           (u8 *)&rvda + (pos - OPREGION_RVDA),
>                                             &pos, &remaining, bytes))
>                         return -EFAULT;
>         }
> --
> 2.33.1
>
diff mbox series

Patch

diff --git a/drivers/vfio/pci/vfio_pci_igd.c b/drivers/vfio/pci/vfio_pci_igd.c
index 56cd551e0e04..dad6eeed5e80 100644
--- a/drivers/vfio/pci/vfio_pci_igd.c
+++ b/drivers/vfio/pci/vfio_pci_igd.c
@@ -98,7 +98,7 @@  static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
 			version = cpu_to_le16(0x0201);
 
 		if (igd_opregion_shift_copy(buf, &off,
-					    &version + (pos - OPREGION_VERSION),
+					    (u8 *)&version + (pos - OPREGION_VERSION),
 					    &pos, &remaining, bytes))
 			return -EFAULT;
 	}
@@ -121,7 +121,7 @@  static ssize_t vfio_pci_igd_rw(struct vfio_pci_core_device *vdev,
 					  OPREGION_SIZE : 0);
 
 		if (igd_opregion_shift_copy(buf, &off,
-					    &rvda + (pos - OPREGION_RVDA),
+					    (u8 *)&rvda + (pos - OPREGION_RVDA),
 					    &pos, &remaining, bytes))
 			return -EFAULT;
 	}