Skip to content

Commit d19a865

Browse files
Alex Williamsongregkh
authored andcommitted
vfio/platform: check the bounds of read/write syscalls
commit ce9ff21 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: 6e3f264 (“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>
1 parent 553df82 commit d19a865

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

drivers/vfio/platform/vfio_platform_common.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,11 @@ static ssize_t vfio_platform_read_mmio(struct vfio_platform_region *reg,
405405
{
406406
unsigned int done = 0;
407407

408+
if (off >= reg->size)
409+
return -EINVAL;
410+
411+
count = min_t(size_t, count, reg->size - off);
412+
408413
if (!reg->ioaddr) {
409414
reg->ioaddr =
410415
ioremap(reg->addr, reg->size);
@@ -482,6 +487,11 @@ static ssize_t vfio_platform_write_mmio(struct vfio_platform_region *reg,
482487
{
483488
unsigned int done = 0;
484489

490+
if (off >= reg->size)
491+
return -EINVAL;
492+
493+
count = min_t(size_t, count, reg->size - off);
494+
485495
if (!reg->ioaddr) {
486496
reg->ioaddr =
487497
ioremap(reg->addr, reg->size);

0 commit comments

Comments
 (0)