]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
vfio/platform: check the bounds of read/write syscalls
authorAlex Williamson <alex.williamson@redhat.com>
Wed, 22 Jan 2025 17:38:30 +0000 (10:38 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 12:49:50 +0000 (13:49 +0100)
commit ce9ff21ea89d191e477a02ad7eabf4f996b80a69 upstream.

count and offset are passed from user space and not checked, only
offset is capped to 40 bits, which can be used to read/write out of
bounds of the device.

Fixes: 6e3f26456009 (“vfio/platform: read and write support for the device fd”)
Cc: stable@vger.kernel.org
Reported-by: Mostafa Saleh <smostafa@google.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Mostafa Saleh <smostafa@google.com>
Tested-by: Mostafa Saleh <smostafa@google.com>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/vfio/platform/vfio_platform_common.c

index af432b5b11ef397d7c50af2fe278d912283230f1..1820ed0f9e01061ed55a021552887ecef5e540ab 100644 (file)
@@ -396,6 +396,11 @@ static ssize_t vfio_platform_read_mmio(struct vfio_platform_region *reg,
 
        count = min_t(size_t, count, reg->size - off);
 
+       if (off >= reg->size)
+               return -EINVAL;
+
+       count = min_t(size_t, count, reg->size - off);
+
        if (!reg->ioaddr) {
                reg->ioaddr =
                        ioremap(reg->addr, reg->size);
@@ -480,6 +485,11 @@ static ssize_t vfio_platform_write_mmio(struct vfio_platform_region *reg,
 
        count = min_t(size_t, count, reg->size - off);
 
+       if (off >= reg->size)
+               return -EINVAL;
+
+       count = min_t(size_t, count, reg->size - off);
+
        if (!reg->ioaddr) {
                reg->ioaddr =
                        ioremap(reg->addr, reg->size);