]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mtd: rawnand: cortina_nand: Fix -ENOMEM detection
authorAndrew Goodbody <andrew.goodbody@linaro.org>
Fri, 1 Aug 2025 09:54:04 +0000 (10:54 +0100)
committerMichael Trimarchi <michael@amarulasolutions.com>
Sun, 3 Aug 2025 08:22:04 +0000 (10:22 +0200)
In init_nand_dma there was code to detect failure to allocate memory but
it had two problems. Firstly the 2nd clause when info->tx_desc was NULL
attempted to free info->tx_desc when it should be freeing info->rx_desc.
Secondly there was no detection of both allocations failing, arguably
the more likely scenario. Refactor the code to simplify it and just fail
as soon as either allocation fails.

This issue was found by Smatch.

Signed-off-by: Andrew Goodbody <andrew.goodbody@linaro.org>
Reviewed-by: Michael Trimarchi <michael@amarulasolutions.com>
drivers/mtd/nand/raw/cortina_nand.c

index 06918a46e93ffed0eacc0313ff3decd3b451c1aa..a27a6994f5623a92891afca69e33324277f5bc9e 100644 (file)
@@ -186,14 +186,13 @@ int init_nand_dma(struct nand_chip *nand)
 
        info->tx_desc = malloc_cache_aligned((sizeof(struct tx_descriptor_t) *
                                              CA_DMA_DESC_NUM));
-       info->rx_desc = malloc_cache_aligned((sizeof(struct rx_descriptor_t) *
-                                             CA_DMA_DESC_NUM));
-
-       if (!info->rx_desc && info->tx_desc) {
+       if (!info->tx_desc) {
                printf("Fail to alloc DMA descript!\n");
-               kfree(info->tx_desc);
                return -ENOMEM;
-       } else if (info->rx_desc && !info->tx_desc) {
+       }
+       info->rx_desc = malloc_cache_aligned((sizeof(struct rx_descriptor_t) *
+                                             CA_DMA_DESC_NUM));
+       if (!info->rx_desc) {
                printf("Fail to alloc DMA descript!\n");
                kfree(info->tx_desc);
                return -ENOMEM;