* [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd()
@ 2025-10-30 17:12 Raghavendra Rao Ananta
2025-10-30 18:31 ` Jason Gunthorpe
2025-10-31 1:34 ` liulongfang
0 siblings, 2 replies; 6+ messages in thread
From: Raghavendra Rao Ananta @ 2025-10-30 17:12 UTC (permalink / raw)
To: Jason Gunthorpe, Alex Williamson, David Matlack
Cc: Josh Hilke, kvm, linux-kernel, Raghavendra Rao Ananta
For the cases where user includes a non-zero value in 'token_uuid_ptr'
field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user()
in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed,
copy_struct_from_user() expects the newly introduced field to be zero-ed,
which would be incorrect in this case.
Fix this by passing the actual size of the kernel struct. If working
with a newer userspace, copy_struct_from_user() would copy the
'token_uuid_ptr' field, and if working with an old userspace, it would
zero out this field, thus still retaining backward compatibility.
Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD")
Signed-off-by: Raghavendra Rao Ananta <rananta@google.com>
---
drivers/vfio/device_cdev.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/vfio/device_cdev.c b/drivers/vfio/device_cdev.c
index 480cac3a0c274..8ceca24ac136c 100644
--- a/drivers/vfio/device_cdev.c
+++ b/drivers/vfio/device_cdev.c
@@ -99,7 +99,7 @@ long vfio_df_ioctl_bind_iommufd(struct vfio_device_file *df,
return ret;
if (user_size < minsz)
return -EINVAL;
- ret = copy_struct_from_user(&bind, minsz, arg, user_size);
+ ret = copy_struct_from_user(&bind, sizeof(bind), arg, user_size);
if (ret)
return ret;
base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
--
2.51.1.930.gacf6e81ea2-goog
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() 2025-10-30 17:12 [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() Raghavendra Rao Ananta @ 2025-10-30 18:31 ` Jason Gunthorpe 2025-10-30 19:07 ` Raghavendra Rao Ananta 2025-10-31 1:34 ` liulongfang 1 sibling, 1 reply; 6+ messages in thread From: Jason Gunthorpe @ 2025-10-30 18:31 UTC (permalink / raw) To: Raghavendra Rao Ananta Cc: Alex Williamson, David Matlack, Josh Hilke, kvm, linux-kernel On Thu, Oct 30, 2025 at 05:12:38PM +0000, Raghavendra Rao Ananta wrote: > For the cases where user includes a non-zero value in 'token_uuid_ptr' > field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user() > in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed, > copy_struct_from_user() expects the newly introduced field to be zero-ed, > which would be incorrect in this case. > > Fix this by passing the actual size of the kernel struct. If working > with a newer userspace, copy_struct_from_user() would copy the > 'token_uuid_ptr' field, and if working with an old userspace, it would > zero out this field, thus still retaining backward compatibility. > > Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD") > Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> > --- > drivers/vfio/device_cdev.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Cc: stable@vger.kernel.org Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Though I feel this was copied from some other spot in vfio so I wonder if we have a larger set of things that are a little off.. Jason ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() 2025-10-30 18:31 ` Jason Gunthorpe @ 2025-10-30 19:07 ` Raghavendra Rao Ananta 0 siblings, 0 replies; 6+ messages in thread From: Raghavendra Rao Ananta @ 2025-10-30 19:07 UTC (permalink / raw) To: Jason Gunthorpe Cc: Alex Williamson, David Matlack, Josh Hilke, kvm, linux-kernel On Thu, Oct 30, 2025 at 11:31 AM Jason Gunthorpe <jgg@ziepe.ca> wrote: > > On Thu, Oct 30, 2025 at 05:12:38PM +0000, Raghavendra Rao Ananta wrote: > > For the cases where user includes a non-zero value in 'token_uuid_ptr' > > field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user() > > in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed, > > copy_struct_from_user() expects the newly introduced field to be zero-ed, > > which would be incorrect in this case. > > > > Fix this by passing the actual size of the kernel struct. If working > > with a newer userspace, copy_struct_from_user() would copy the > > 'token_uuid_ptr' field, and if working with an old userspace, it would > > zero out this field, thus still retaining backward compatibility. > > > > Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD") > > Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> > > --- > > drivers/vfio/device_cdev.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > Cc: stable@vger.kernel.org > Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> > > Though I feel this was copied from some other spot in vfio so I wonder > if we have a larger set of things that are a little off.. > I could only find vfio_df_ioctl_bind_iommufd() in vfio referencing copy_struct_from_user(). The other closest would be in drivers/iommu/iommufd/main.c::iommufd_fops_ioctl(), which seems to be doing the right thing. Thank you. Raghavendra ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() 2025-10-30 17:12 [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() Raghavendra Rao Ananta 2025-10-30 18:31 ` Jason Gunthorpe @ 2025-10-31 1:34 ` liulongfang 2025-10-31 17:09 ` Raghavendra Rao Ananta 1 sibling, 1 reply; 6+ messages in thread From: liulongfang @ 2025-10-31 1:34 UTC (permalink / raw) To: Raghavendra Rao Ananta, Jason Gunthorpe, Alex Williamson, David Matlack Cc: Josh Hilke, kvm, linux-kernel On 2025/10/31 1:12, Raghavendra Rao Ananta wrote: > For the cases where user includes a non-zero value in 'token_uuid_ptr' > field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user() > in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed, > copy_struct_from_user() expects the newly introduced field to be zero-ed, > which would be incorrect in this case. > > Fix this by passing the actual size of the kernel struct. If working > with a newer userspace, copy_struct_from_user() would copy the > 'token_uuid_ptr' field, and if working with an old userspace, it would > zero out this field, thus still retaining backward compatibility. > > Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD") Hi Ananta, This patch also has another bug: in the hisi_acc_vfio_pci.c driver, It have two "struct vfio_device_ops" Only one of them, "hisi_acc_vfio_pci_ops" has match_token_uuid added, while the other one, "hisi_acc_vfio_pci_migrn_ops", is missing it. This will cause a QEMU crash (call trace) when QEMU tries to start the device. Could you please help include this fix in your patchset as well? --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -1637,6 +1637,7 @@ static const struct vfio_device_ops hisi_acc_vfio_pci_migrn_ops = { .mmap = hisi_acc_vfio_pci_mmap, .request = vfio_pci_core_request, .match = vfio_pci_core_match, + .match_token_uuid = vfio_pci_core_match_token_uuid, .bind_iommufd = vfio_iommufd_physical_bind, .unbind_iommufd = vfio_iommufd_physical_unbind, .attach_ioas = vfio_iommufd_physical_attach_ioas, Thanks. Longfang. > Signed-off-by: Raghavendra Rao Ananta <rananta@google.com> > --- > drivers/vfio/device_cdev.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/vfio/device_cdev.c b/drivers/vfio/device_cdev.c > index 480cac3a0c274..8ceca24ac136c 100644 > --- a/drivers/vfio/device_cdev.c > +++ b/drivers/vfio/device_cdev.c > @@ -99,7 +99,7 @@ long vfio_df_ioctl_bind_iommufd(struct vfio_device_file *df, > return ret; > if (user_size < minsz) > return -EINVAL; > - ret = copy_struct_from_user(&bind, minsz, arg, user_size); > + ret = copy_struct_from_user(&bind, sizeof(bind), arg, user_size); > if (ret) > return ret; > > > base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() 2025-10-31 1:34 ` liulongfang @ 2025-10-31 17:09 ` Raghavendra Rao Ananta 2025-11-03 1:11 ` liulongfang 0 siblings, 1 reply; 6+ messages in thread From: Raghavendra Rao Ananta @ 2025-10-31 17:09 UTC (permalink / raw) To: liulongfang Cc: Jason Gunthorpe, David Matlack, Josh Hilke, kvm, linux-kernel, alex On Thu, Oct 30, 2025 at 6:34 PM liulongfang <liulongfang@huawei.com> wrote: > > On 2025/10/31 1:12, Raghavendra Rao Ananta wrote: > > For the cases where user includes a non-zero value in 'token_uuid_ptr' > > field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user() > > in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed, > > copy_struct_from_user() expects the newly introduced field to be zero-ed, > > which would be incorrect in this case. > > > > Fix this by passing the actual size of the kernel struct. If working > > with a newer userspace, copy_struct_from_user() would copy the > > 'token_uuid_ptr' field, and if working with an old userspace, it would > > zero out this field, thus still retaining backward compatibility. > > > > Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD") > > Hi Ananta, > > This patch also has another bug: in the hisi_acc_vfio_pci.c driver, It have two "struct vfio_device_ops" > Only one of them, "hisi_acc_vfio_pci_ops" has match_token_uuid added, > while the other one, "hisi_acc_vfio_pci_migrn_ops", is missing it. > This will cause a QEMU crash (call trace) when QEMU tries to start the device. > > Could you please help include this fix in your patchset as well? > > --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c > +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c > @@ -1637,6 +1637,7 @@ static const struct vfio_device_ops hisi_acc_vfio_pci_migrn_ops = { > .mmap = hisi_acc_vfio_pci_mmap, > .request = vfio_pci_core_request, > .match = vfio_pci_core_match, > + .match_token_uuid = vfio_pci_core_match_token_uuid, > .bind_iommufd = vfio_iommufd_physical_bind, > .unbind_iommufd = vfio_iommufd_physical_unbind, > .attach_ioas = vfio_iommufd_physical_attach_ioas, > Sent as a separate patch in v2: https://lore.kernel.org/all/20251031170603.2260022-3-rananta@google.com/ (untested). Thank you. Raghavendra ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() 2025-10-31 17:09 ` Raghavendra Rao Ananta @ 2025-11-03 1:11 ` liulongfang 0 siblings, 0 replies; 6+ messages in thread From: liulongfang @ 2025-11-03 1:11 UTC (permalink / raw) To: Raghavendra Rao Ananta Cc: Jason Gunthorpe, David Matlack, Josh Hilke, kvm, linux-kernel, alex On 2025/11/1 1:09, Raghavendra Rao Ananta wrote: > On Thu, Oct 30, 2025 at 6:34 PM liulongfang <liulongfang@huawei.com> wrote: >> >> On 2025/10/31 1:12, Raghavendra Rao Ananta wrote: >>> For the cases where user includes a non-zero value in 'token_uuid_ptr' >>> field of 'struct vfio_device_bind_iommufd', the copy_struct_from_user() >>> in vfio_df_ioctl_bind_iommufd() fails with -E2BIG. For the 'minsz' passed, >>> copy_struct_from_user() expects the newly introduced field to be zero-ed, >>> which would be incorrect in this case. >>> >>> Fix this by passing the actual size of the kernel struct. If working >>> with a newer userspace, copy_struct_from_user() would copy the >>> 'token_uuid_ptr' field, and if working with an old userspace, it would >>> zero out this field, thus still retaining backward compatibility. >>> >>> Fixes: 86624ba3b522 ("vfio/pci: Do vf_token checks for VFIO_DEVICE_BIND_IOMMUFD") >> >> Hi Ananta, >> >> This patch also has another bug: in the hisi_acc_vfio_pci.c driver, It have two "struct vfio_device_ops" >> Only one of them, "hisi_acc_vfio_pci_ops" has match_token_uuid added, >> while the other one, "hisi_acc_vfio_pci_migrn_ops", is missing it. >> This will cause a QEMU crash (call trace) when QEMU tries to start the device. >> >> Could you please help include this fix in your patchset as well? >> >> --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c >> +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c >> @@ -1637,6 +1637,7 @@ static const struct vfio_device_ops hisi_acc_vfio_pci_migrn_ops = { >> .mmap = hisi_acc_vfio_pci_mmap, >> .request = vfio_pci_core_request, >> .match = vfio_pci_core_match, >> + .match_token_uuid = vfio_pci_core_match_token_uuid, >> .bind_iommufd = vfio_iommufd_physical_bind, >> .unbind_iommufd = vfio_iommufd_physical_unbind, >> .attach_ioas = vfio_iommufd_physical_attach_ioas, >> > Sent as a separate patch in v2: > https://lore.kernel.org/all/20251031170603.2260022-3-rananta@google.com/ > (untested). > I've tested this patch locally, and after applying it, QEMU no longer fails to start and the functionality works as expected. Thanks. Longfang. > Thank you. > Raghavendra > . > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-11-03 1:11 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-10-30 17:12 [PATCH] vfio: Fix ksize arg while copying user struct in vfio_df_ioctl_bind_iommufd() Raghavendra Rao Ananta 2025-10-30 18:31 ` Jason Gunthorpe 2025-10-30 19:07 ` Raghavendra Rao Ananta 2025-10-31 1:34 ` liulongfang 2025-10-31 17:09 ` Raghavendra Rao Ananta 2025-11-03 1:11 ` liulongfang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox