]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mtd: rawnand: rockchip: Add missing check after DMA map
authorThomas Fourier <fourier.thomas@gmail.com>
Mon, 7 Jul 2025 07:15:50 +0000 (09:15 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Wed, 30 Jul 2025 09:27:30 +0000 (11:27 +0200)
The DMA map functions can fail and should be tested for errors.

Fixes: 058e0e847d54 ("mtd: rawnand: rockchip: NFC driver for RK3308, RK2928 and others")
Signed-off-by: Thomas Fourier <fourier.thomas@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/rockchip-nand-controller.c

index 63e7b9e39a5ab0ef2dc2605db4ddfb63779c040b..c5d7cd8a6cab411a4f7564b9ede1489335a38c42 100644 (file)
@@ -656,9 +656,16 @@ static int rk_nfc_write_page_hwecc(struct nand_chip *chip, const u8 *buf,
 
        dma_data = dma_map_single(nfc->dev, (void *)nfc->page_buf,
                                  mtd->writesize, DMA_TO_DEVICE);
+       if (dma_mapping_error(nfc->dev, dma_data))
+               return -ENOMEM;
+
        dma_oob = dma_map_single(nfc->dev, nfc->oob_buf,
                                 ecc->steps * oob_step,
                                 DMA_TO_DEVICE);
+       if (dma_mapping_error(nfc->dev, dma_oob)) {
+               dma_unmap_single(nfc->dev, dma_data, mtd->writesize, DMA_TO_DEVICE);
+               return -ENOMEM;
+       }
 
        reinit_completion(&nfc->done);
        writel(INT_DMA, nfc->regs + nfc->cfg->int_en_off);
@@ -772,9 +779,17 @@ static int rk_nfc_read_page_hwecc(struct nand_chip *chip, u8 *buf, int oob_on,
        dma_data = dma_map_single(nfc->dev, nfc->page_buf,
                                  mtd->writesize,
                                  DMA_FROM_DEVICE);
+       if (dma_mapping_error(nfc->dev, dma_data))
+               return -ENOMEM;
+
        dma_oob = dma_map_single(nfc->dev, nfc->oob_buf,
                                 ecc->steps * oob_step,
                                 DMA_FROM_DEVICE);
+       if (dma_mapping_error(nfc->dev, dma_oob)) {
+               dma_unmap_single(nfc->dev, dma_data, mtd->writesize,
+                                DMA_FROM_DEVICE);
+               return -ENOMEM;
+       }
 
        /*
         * The first blocks (4, 8 or 16 depending on the device)