s390/pci: fix out of bounds access during irq setup
authorSebastian Ott <sebott@linux.ibm.com>
Mon, 13 Aug 2018 09:26:46 +0000 (11:26 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Sep 2018 07:26:40 +0000 (09:26 +0200)
commit 866f3576a72b2233a76dffb80290f8086dc49e17 upstream.

During interrupt setup we allocate interrupt vectors, walk the list of msi
descriptors, and fill in the message data. Requesting more interrupts than
supported on s390 can lead to an out of bounds access.

When we restrict the number of interrupts we should also stop walking the
msi list after all supported interrupts are handled.

Cc: stable@vger.kernel.org
Signed-off-by: Sebastian Ott <sebott@linux.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/pci/pci.c

index 0fe649c0d5423a2ed51fcff4dc7d011204fdf4e9..960c4a362d8cdeb525bf020729cd8007bfa836ec 100644 (file)
@@ -420,6 +420,8 @@ int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        hwirq = 0;
        for_each_pci_msi_entry(msi, pdev) {
                rc = -EIO;
+               if (hwirq >= msi_vecs)
+                       break;
                irq = irq_alloc_desc(0);        /* Alloc irq on node 0 */
                if (irq < 0)
                        return -ENOMEM;