xhci: fix potential array out of bounds with several interrupters
authorMathias Nyman <mathias.nyman@linux.intel.com>
Tue, 6 Apr 2021 07:02:07 +0000 (10:02 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Apr 2021 09:16:56 +0000 (11:16 +0200)
The Max Interrupters supported by the controller is given in a 10bit
wide bitfield, but the driver uses a fixed 128 size array to index these
interrupters.

Klockwork reports a possible array out of bounds case which in theory
is possible. In practice this hasn't been hit as a common number of Max
Interrupters for new controllers is 8, not even close to 128.

This needs to be fixed anyway

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20210406070208.3406266-4-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci.c

index f961471..ca9385d 100644 (file)
@@ -227,6 +227,7 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
        struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
        int err, i;
        u64 val;
+       u32 intrs;
 
        /*
         * Some Renesas controllers get into a weird state if they are
@@ -265,7 +266,10 @@ static void xhci_zero_64b_regs(struct xhci_hcd *xhci)
        if (upper_32_bits(val))
                xhci_write_64(xhci, 0, &xhci->op_regs->cmd_ring);
 
-       for (i = 0; i < HCS_MAX_INTRS(xhci->hcs_params1); i++) {
+       intrs = min_t(u32, HCS_MAX_INTRS(xhci->hcs_params1),
+                     ARRAY_SIZE(xhci->run_regs->ir_set));
+
+       for (i = 0; i < intrs; i++) {
                struct xhci_intr_reg __iomem *ir;
 
                ir = &xhci->run_regs->ir_set[i];