ioat: ioat_alloc_ring() failure handling.
authorAlexander.Barabash@dell.com <Alexander.Barabash@dell.com>
Wed, 25 Dec 2019 17:55:30 +0000 (17:55 +0000)
committerVinod Koul <vkoul@kernel.org>
Fri, 27 Dec 2019 06:36:06 +0000 (12:06 +0530)
If dma_alloc_coherent() returns NULL in ioat_alloc_ring(), ring
allocation must not proceed.

Until now, if the first call to dma_alloc_coherent() in
ioat_alloc_ring() returned NULL, the processing could proceed, failing
with NULL-pointer dereferencing further down the line.

Signed-off-by: Alexander Barabash <alexander.barabash@dell.com>
Acked-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/75e9c0e84c3345d693c606c64f8b9ab5@x13pwhopdag1307.AMER.DELL.COM
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ioat/dma.c

index 1a422a8b43cfb29806026b0be2996dc1dee4aaa5..18c011e57592ebc838a30d118b7465d8c8a09a46 100644 (file)
@@ -377,10 +377,11 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
 
                descs->virt = dma_alloc_coherent(to_dev(ioat_chan),
                                                 SZ_2M, &descs->hw, flags);
-               if (!descs->virt && (i > 0)) {
+               if (!descs->virt) {
                        int idx;
 
                        for (idx = 0; idx < i; idx++) {
+                               descs = &ioat_chan->descs[idx];
                                dma_free_coherent(to_dev(ioat_chan), SZ_2M,
                                                  descs->virt, descs->hw);
                                descs->virt = NULL;