From: "Michael S. Tsirkin" <mst@redhat.com>
To: Wang Haoran <haoranwangsec@gmail.com>
Cc: torvalds@linuxfoundation.org, jasowangio@gmail.com,
kvm@vger.kernel.org, virtualization@lists.linux.dev,
netdev@vger.kernel.org, eperezma@redhat.com
Subject: Re: [BUG] vhost/vringh: __get_user without access_ok leaks kernel memory via vDPA passthrough
Date: Tue, 20 Oct 2026 02:30:50 -0400 [thread overview]
Message-ID: <20261020021924-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <376ef9d0-b03f-4f85-aee5-46cf20eb00ae@gmail.com>
On Mon, Oct 19, 2026 at 03:14:46PM +0800, Wang Haoran wrote:
> Eugenio previously offered some additional suggestions in reply to
> my patch email. Should these also be addressed?
The following seems to work for me. Testing would be appreciated.
From: Michael S. Tsirkin <mst@redhat.com>
Subject: [PATCH v2] vringh: use get_user/put_user in the use_va path
getu16_iotlb()/putu16_iotlb() pass the address produced by
iotlb_translate() straight to __get_user()/__put_user(),
without access_ok checked anywhere. Not good.
Switch to get_user()/put_user(), which are always
correct, and safer.
But the fact is that accessing user memory like this
will sometimes (rarely) race with page being swapped
out, trigger EFAULT, and it should be retried
from a worker, and vdpa_sim currently does not do this.
Fixes: 42823a871fd4 ("vringh: support VA with iotlb")
Cc: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
Notes (changelog):
v1->v2:
Use get_user()/put_user() wrapped in pagefault_disable() instead of
access_ok() followed by __get_user()/__put_user(); the helpers are
reached from BH-disabled sections, and __get_user() is not a valid
way around that (David Laight, Linus Torvalds)
drivers/vdpa/vdpa_sim/vdpa_sim_blk.c | 2 ++
drivers/vdpa/vdpa_sim/vdpa_sim_net.c | 2 ++
drivers/vhost/vringh.c | 4 ++--
3 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
index 76dd5b0828d7..325ec8f0ab85 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim_blk.c
@@ -347,8 +347,10 @@ static void vdpasim_blk_work(struct vdpasim *vdpasim)
smp_wmb();
local_bh_disable();
+ pagefault_disable();
if (vringh_need_notify_iotlb(&vq->vring) > 0)
vringh_notify(&vq->vring);
+ pagefault_enable();
local_bh_enable();
if (++reqs > 4) {
diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
index a6514b5ccd86..964cdf422467 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim_net.c
@@ -77,8 +77,10 @@ static void vdpasim_net_complete(struct vdpasim_virtqueue *vq, size_t len)
smp_wmb();
local_bh_disable();
+ pagefault_disable();
if (vringh_need_notify_iotlb(&vq->vring) > 0)
vringh_notify(&vq->vring);
+ pagefault_enable();
local_bh_enable();
}
diff --git a/drivers/vhost/vringh.c b/drivers/vhost/vringh.c
index 9066f9f12ba1..74836eb60c7a 100644
--- a/drivers/vhost/vringh.c
+++ b/drivers/vhost/vringh.c
@@ -1213,7 +1213,7 @@ static inline int getu16_iotlb(const struct vringh *vrh,
return ret;
if (vrh->use_va) {
- ret = __get_user(tmp, (__virtio16 __user *)ivec.iov.iovec[0].iov_base);
+ ret = get_user(tmp, (__virtio16 __user *)ivec.iov.iovec[0].iov_base);
if (ret)
return ret;
} else {
@@ -1251,7 +1251,7 @@ static inline int putu16_iotlb(const struct vringh *vrh,
tmp = cpu_to_vringh16(vrh, val);
if (vrh->use_va) {
- ret = __put_user(tmp, (__virtio16 __user *)ivec.iov.iovec[0].iov_base);
+ ret = put_user(tmp, (__virtio16 __user *)ivec.iov.iovec[0].iov_base);
if (ret)
return ret;
} else {
next prev parent reply other threads:[~2026-10-20 6:30 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 7:23 [BUG] vhost/vringh: __get_user without access_ok leaks kernel memory via vDPA passthrough Haoran Wang
2026-10-15 7:42 ` Eugenio Perez Martin
2026-10-17 21:59 ` David Laight
2026-10-18 19:24 ` Michael S. Tsirkin
2026-10-18 19:48 ` David Laight
2026-10-18 21:42 ` Michael S. Tsirkin
2026-10-18 21:57 ` Michael S. Tsirkin
[not found] ` <CAHk-=wjneFJ7XmZ6ux-LsHq4apDgANcKfERztmAG9sGVY_TxAg@mail.gmail.com>
2026-10-18 22:13 ` Michael S. Tsirkin
2026-10-18 23:12 ` Linus Torvalds
2026-10-18 20:34 ` Linus Torvalds
2026-10-18 21:11 ` Linus Torvalds
2026-10-18 21:41 ` Michael S. Tsirkin
2026-10-18 21:43 ` Michael S. Tsirkin
[not found] ` <376ef9d0-b03f-4f85-aee5-46cf20eb00ae@gmail.com>
2026-10-20 6:30 ` Michael S. Tsirkin [this message]
2026-10-20 6:51 ` Linus Torvalds
2026-10-20 7:25 ` Removing __get_user / __put_user for good Linus Torvalds
2026-10-20 9:33 ` Jani Nikula
2026-10-20 9:46 ` Michael S. Tsirkin
2026-10-20 13:19 ` Ingo Molnar
2026-10-20 7:27 ` [BUG] vhost/vringh: __get_user without access_ok leaks kernel memory via vDPA passthrough Michael S. Tsirkin
2026-10-20 9:21 ` David Laight
2026-10-20 9:22 ` Eugenio Perez Martin
2026-10-20 9:41 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261020021924-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=eperezma@redhat.com \
--cc=haoranwangsec@gmail.com \
--cc=jasowangio@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=torvalds@linuxfoundation.org \
--cc=virtualization@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.