xhci: mem: Carefully calculate size for memory allocations
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 17 Mar 2023 15:47:02 +0000 (17:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Mar 2023 16:25:22 +0000 (17:25 +0100)
Carefully calculate size for memory allocations, i.e. with help
of size_mul() macro from overflow.h.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20230317154715.535523-2-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-mem.c

index d0a9467aa5fc400d41fd7f1761d49142f5925563..c385513ad00b63916c4a04f88bc2b6634657c1d7 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <linux/usb.h>
+#include <linux/overflow.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/dmapool.h>
@@ -568,7 +569,7 @@ static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci,
                gfp_t mem_flags)
 {
        struct device *dev = xhci_to_hcd(xhci)->self.sysdev;
-       size_t size = sizeof(struct xhci_stream_ctx) * num_stream_ctxs;
+       size_t size = size_mul(sizeof(struct xhci_stream_ctx), num_stream_ctxs);
 
        if (size > MEDIUM_STREAM_ARRAY_SIZE)
                return dma_alloc_coherent(dev, size,
@@ -1660,7 +1661,7 @@ static int scratchpad_alloc(struct xhci_hcd *xhci, gfp_t flags)
                goto fail_sp;
 
        xhci->scratchpad->sp_array = dma_alloc_coherent(dev,
-                                    num_sp * sizeof(u64),
+                                    size_mul(sizeof(u64), num_sp),
                                     &xhci->scratchpad->sp_dma, flags);
        if (!xhci->scratchpad->sp_array)
                goto fail_sp2;
@@ -1799,7 +1800,7 @@ int xhci_alloc_erst(struct xhci_hcd *xhci,
        struct xhci_segment *seg;
        struct xhci_erst_entry *entry;
 
-       size = sizeof(struct xhci_erst_entry) * evt_ring->num_segs;
+       size = size_mul(sizeof(struct xhci_erst_entry), evt_ring->num_segs);
        erst->entries = dma_alloc_coherent(xhci_to_hcd(xhci)->self.sysdev,
                                           size, &erst->erst_dma_addr, flags);
        if (!erst->entries)
@@ -1830,7 +1831,7 @@ xhci_free_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir)
        if (!ir)
                return;
 
-       erst_size = sizeof(struct xhci_erst_entry) * (ir->erst.num_entries);
+       erst_size = sizeof(struct xhci_erst_entry) * ir->erst.num_entries;
        if (ir->erst.entries)
                dma_free_coherent(dev, erst_size,
                                  ir->erst.entries,