Patch "vfio/pci: Fix integer overflows, bitmask check" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
vfio/pci: Fix integer overflows, bitmask check
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
vfio-pci-fix-integer-overflows-bitmask-check.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
05692d7005a364add85c6e25a6c4447ce08f913aMon Sep 17 00:00:00 2001
From: Vlad Tsyrklevich <[email protected]>
Date: Wed, 12 Oct 2016 18:51:24 +0200
Subject: vfio/pci: Fix integer overflows, bitmask check
From: Vlad Tsyrklevich <[email protected]>
commit 05692d7005a364add85c6e25a6c4447ce08f913a upstream.
The VFIO_DEVICE_SET_IRQS ioctl did not sufficiently sanitize user-supplied integers, potentially allowing memory corruption. This patch adds appropriate integer overflow checks, checks the range bounds for VFIO_IRQ_SET_DATA_NONE, and also verifies that only single element in the VFIO_IRQ_SET_DATA_TYPE_MASK bitmask is set. VFIO_IRQ_SET_ACTION_TYPE_MASK is already correctly checked later in vfio_pci_set_irqs_ioctl().
Furthermore, a kzalloc is changed to a kcalloc because the use of a kzalloc with an integer multiplication allowed an integer overflow condition to be reached without this patch. kcalloc checks for overflow and should prevent a similar occurrence.
--- drivers/vfio/pci/vfio_pci.c | 35 ++++++++++++++++++++++------------- drivers/vfio/pci/vfio_pci_intrs.c | 2 +- 2 files changed, 23 insertions(+), 14 deletions(-)
drivers/vfio/pci/vfio_pci.c +22 -13
@@ -562,8 +562,9 @@ static long vfio_pci_ioctl(void *device_ }else if (cmd ==VFIO_DEVICE_SET_IRQS ) {struct vfio_irq_set hdr; +size_t size;u8 *data =NULL ; -int ret =0 ; +int max, ret =0 ; minsz = offsetofend(struct vfio_irq_set, count);
@@ -571,23 +572,31 @@ static long vfio_pci_ioctl(void *device_return -EFAULT ;if (hdr.argsz < minsz || hdr.index >=VFIO_PCI_NUM_IRQS || + hdr.count >= (U32_MAX - hdr.start) || hdr.flags & ~(VFIO_IRQ_SET_DATA_TYPE_MASK |VFIO_IRQ_SET_ACTION_TYPE_MASK ))return -EINVAL ; -if (!(hdr.flags &VFIO_IRQ_SET_DATA_NONE )) { -size_t size; -int max =vfio_pci_get_irq_count (vdev, hdr.index); - -if (hdr.flags &VFIO_IRQ_SET_DATA_BOOL ) - size =sizeof (uint8_t ); -else if (hdr.flags &VFIO_IRQ_SET_DATA_EVENTFD ) - size =sizeof (int32_t ); -else -return -EINVAL ; + max =vfio_pci_get_irq_count (vdev, hdr.index); +if (hdr.start >= max || hdr.start + hdr.count > max) +return -EINVAL ; + +switch (hdr.flags &VFIO_IRQ_SET_DATA_TYPE_MASK ) { +case VFIO_IRQ_SET_DATA_NONE : + size =0 ; +break ; +case VFIO_IRQ_SET_DATA_BOOL : + size =sizeof (uint8_t ); +break ; +case VFIO_IRQ_SET_DATA_EVENTFD : + size =sizeof (int32_t ); +break ; +default : +return -EINVAL ; + } -if (hdr.argsz - minsz < hdr.count * size || - hdr.start >= max || hdr.start + hdr.count > max) +if (size) { +if (hdr.argsz - minsz < hdr.count * size)return -EINVAL ; data = memdup_user((void __user *)(arg + minsz),
drivers/vfio/pci/vfio_pci_intrs.c +1 -1
@@ -255,7 +255,7 @@ static int vfio_msi_enable(struct vfio_pif (!is_irq_none (vdev))return -EINVAL ; - vdev->ctx =kzalloc (nvec *sizeof (struct vfio_pci_irq_ctx ),GFP_KERNEL ); + vdev->ctx =kcalloc (nvec,sizeof (struct vfio_pci_irq_ctx ),GFP_KERNEL );if (!vdev->ctx)return -ENOMEM ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/vfio-pci-fix-integer-overflows-bitmask-check.patch