mtd: rawnand: Fix a memory leak bug
authorWenwen Wang <wenwen@cs.uga.edu>
Mon, 19 Aug 2019 02:46:04 +0000 (21:46 -0500)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Sat, 24 Aug 2019 11:13:41 +0000 (13:13 +0200)
In nand_scan_bbt(), a temporary buffer 'buf' is allocated through
vmalloc(). However, if check_create() fails, 'buf' is not deallocated,
leading to a memory leak bug. To fix this issue, free 'buf' before
returning the error.

Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/nand_bbt.c

index 2ef15ef..96045d6 100644 (file)
@@ -1232,7 +1232,7 @@ static int nand_scan_bbt(struct nand_chip *this, struct nand_bbt_descr *bd)
        if (!td) {
                if ((res = nand_memory_bbt(this, bd))) {
                        pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
-                       goto err;
+                       goto err_free_bbt;
                }
                return 0;
        }
@@ -1245,7 +1245,7 @@ static int nand_scan_bbt(struct nand_chip *this, struct nand_bbt_descr *bd)
        buf = vmalloc(len);
        if (!buf) {
                res = -ENOMEM;
-               goto err;
+               goto err_free_bbt;
        }
 
        /* Is the bbt at a given page? */
@@ -1258,7 +1258,7 @@ static int nand_scan_bbt(struct nand_chip *this, struct nand_bbt_descr *bd)
 
        res = check_create(this, buf, bd);
        if (res)
-               goto err;
+               goto err_free_buf;
 
        /* Prevent the bbt regions from erasing / writing */
        mark_bbt_region(this, td);
@@ -1268,7 +1268,9 @@ static int nand_scan_bbt(struct nand_chip *this, struct nand_bbt_descr *bd)
        vfree(buf);
        return 0;
 
-err:
+err_free_buf:
+       vfree(buf);
+err_free_bbt:
        kfree(this->bbt);
        this->bbt = NULL;
        return res;