From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Vlad Tsyrklevich <vlad@tsyrklevich.net>,
Alex Williamson <alex.williamson@redhat.com>,
Ben Hutchings <ben.hutchings@codethink.co.uk>
Subject: [PATCH 4.4 14/17] vfio/pci: Fix integer overflows, bitmask check
Date: Fri, 28 Apr 2017 10:30:27 +0200 [thread overview]
Message-ID: <20170428082912.345400906@linuxfoundation.org> (raw)
In-Reply-To: <20170428082910.160564394@linuxfoundation.org>
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vlad Tsyrklevich <vlad@tsyrklevich.net>
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.
Signed-off-by: Vlad Tsyrklevich <vlad@tsyrklevich.net>
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/vfio/pci/vfio_pci.c | 35 ++++++++++++++++++++++-------------
drivers/vfio/pci/vfio_pci_intrs.c | 2 +-
2 files changed, 23 insertions(+), 14 deletions(-)
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -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),
--- a/drivers/vfio/pci/vfio_pci_intrs.c
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
@@ -255,7 +255,7 @@ static int vfio_msi_enable(struct vfio_p
if (!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;
next prev parent reply other threads:[~2017-04-28 8:31 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-28 8:30 [PATCH 4.4 00/17] 4.4.65-stable review Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 01/17] tipc: make sure IPv6 header fits in skb headroom Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 02/17] tipc: make dist queue pernet Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 03/17] tipc: re-enable compensation for socket receive buffer double counting Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 04/17] tipc: correct error in node fsm Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 05/17] tty: nozomi: avoid a harmless gcc warning Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 06/17] hostap: avoid uninitialized variable use in hfa384x_get_rid Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 07/17] gfs2: avoid uninitialized variable warning Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 08/17] tipc: fix random link resets while adding a second bearer Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 09/17] tipc: fix socket timer deadlock Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 10/17] mnt: Add a per mount namespace limit on the number of mounts Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 11/17] [media] xc2028: avoid use after free Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 12/17] netfilter: nfnetlink: correctly validate length of batch messages Greg Kroah-Hartman
2017-04-28 8:30 ` Greg Kroah-Hartman [this message]
2017-04-28 8:30 ` [PATCH 4.4 15/17] staging/android/ion : fix a race condition in the ion driver Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 16/17] ping: implement proper locking Greg Kroah-Hartman
2017-04-28 8:30 ` [PATCH 4.4 17/17] perf/core: Fix concurrent sys_perf_event_open() vs. move_group race Greg Kroah-Hartman
2017-04-28 18:46 ` [PATCH 4.4 00/17] 4.4.65-stable review Guenter Roeck
2017-04-29 7:41 ` Greg Kroah-Hartman
2017-04-28 19:18 ` Shuah Khan
2017-04-29 7:41 ` Greg Kroah-Hartman
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=20170428082912.345400906@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=alex.williamson@redhat.com \
--cc=ben.hutchings@codethink.co.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=vlad@tsyrklevich.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).