<div dir="ltr"><div>Hi</div><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Fri, Aug 1, 2025 at 12:39 PM Andrew Goodbody <<a href="mailto:andrew.goodbody@linaro.org">andrew.goodbody@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Add kfree calls on error paths for memory that was allocated. This will<br>
prevent memory leaks.<br>
<br>
This issue found by Smatch.<br>
<br>
Signed-off-by: Andrew Goodbody <<a href="mailto:andrew.goodbody@linaro.org" target="_blank">andrew.goodbody@linaro.org</a>><br>
---<br>
 drivers/mtd/nand/raw/sunxi_nand.c | 17 +++++++++++++++--<br>
 1 file changed, 15 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c<br>
index 34197bb09a1..1ce09b56b80 100644<br>
--- a/drivers/mtd/nand/raw/sunxi_nand.c<br>
+++ b/drivers/mtd/nand/raw/sunxi_nand.c<br>
@@ -1403,8 +1403,10 @@ static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,<br>
        if (!data)<br>
                return -ENOMEM;<br>
<br>
-       if (ecc->size != 512 && ecc->size != 1024)<br>
+       if (ecc->size != 512 && ecc->size != 1024) {<br>
+               kfree(data);<br>
                return -EINVAL;<br>
+       }<br>
<br>
        /* Prefer 1k ECC chunk over 512 ones */<br>
        if (ecc->size == 512 && mtd->writesize > 512) {<br>
@@ -1641,17 +1643,20 @@ static int sunxi_nand_chip_init(struct udevice *dev, struct sunxi_nfc *nfc,<br>
                if (ret) {<br>
                        dev_err(dev, "could not retrieve reg property: %d\n",<br>
                                ret);<br>
+                       kfree(chip);<br>
                        return ret;<br>
                }<br>
<br>
                if (tmp > NFC_MAX_CS) {<br>
                        dev_err(dev,<br>
                                "invalid reg value: %u (max CS = 7)\n", tmp);<br>
+                       kfree(chip);<br>
                        return -EINVAL;<br>
                }<br>
<br>
                if (test_and_set_bit(tmp, &nfc->assigned_cs)) {<br>
                        dev_err(dev, "CS %d already assigned\n", tmp);<br>
+                       kfree(chip);<br>
                        return -EINVAL;<br>
                }<br>
<br>
@@ -1678,12 +1683,14 @@ static int sunxi_nand_chip_init(struct udevice *dev, struct sunxi_nfc *nfc,<br>
                dev_err(dev,<br>
                        "could not retrieve timings for ONFI mode 0: %d\n",<br>
                        ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br>
<br>
        ret = sunxi_nand_chip_set_timings(nfc, chip, timings);<br>
        if (ret) {<br>
                dev_err(dev, "could not configure chip timings: %d\n", ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br>
<br>
@@ -1705,8 +1712,10 @@ static int sunxi_nand_chip_init(struct udevice *dev, struct sunxi_nfc *nfc,<br>
<br>
        mtd = nand_to_mtd(nand);<br>
        ret = nand_scan_ident(mtd, nsels, NULL);<br>
-       if (ret)<br>
+       if (ret) {<br>
+               kfree(chip);<br>
                return ret;<br>
+       }<br>
<br>
        if (nand->bbt_options & NAND_BBT_USE_FLASH)<br>
                nand->bbt_options |= NAND_BBT_NO_OOB;<br>
@@ -1719,24 +1728,28 @@ static int sunxi_nand_chip_init(struct udevice *dev, struct sunxi_nfc *nfc,<br>
        ret = sunxi_nand_chip_init_timings(nfc, chip);<br>
        if (ret) {<br>
                dev_err(dev, "could not configure chip timings: %d\n", ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br>
<br>
        ret = sunxi_nand_ecc_init(mtd, &nand->ecc);<br>
        if (ret) {<br>
                dev_err(dev, "ECC init failed: %d\n", ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br>
<br>
        ret = nand_scan_tail(mtd);<br>
        if (ret) {<br>
                dev_err(dev, "nand_scan_tail failed: %d\n", ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br>
<br>
        ret = nand_register(devnum, mtd);<br>
        if (ret) {<br>
                dev_err(dev, "failed to register mtd device: %d\n", ret);<br>
+               kfree(chip);<br>
                return ret;<br>
        }<br></blockquote><div><br></div><div>Reviewed-By: Michael Trimarchi <<a href="mailto:michael@amarulasolutions.com">michael@amarulasolutions.com</a>></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
-- <br>
2.39.5<br>
<br>
</blockquote></div><div><br clear="all"></div><div><br></div><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr">Michael Nazzareno Trimarchi<br>Co-Founder & Chief Executive Officer<br>M. +39 347 913 2170<br><a href="mailto:michael@amarulasolutions.com" target="_blank">michael@amarulasolutions.com</a><br>__________________________________<br><div><br></div><div>Amarula Solutions BV</div>Joop Geesinkweg 125, 1114 AB, Amsterdam, NL<br>T. +31 (0)85 111 9172<br><a href="mailto:info@amarulasolutions.com" target="_blank">info@amarulasolutions.com</a><br><a href="http://www.amarulasolutions.com" target="_blank">www.amarulasolutions.com</a><br></div></div></div>