mtd: nand_bbt: unify/fix error handling in nand_scan_bbt()
authorBrian Norris <computersforpeace@gmail.com>
Sat, 28 Feb 2015 10:13:12 +0000 (02:13 -0800)
committerBrian Norris <computersforpeace@gmail.com>
Thu, 7 May 2015 03:02:36 +0000 (20:02 -0700)
Don't leak this->bbt, and return early if check_create() fails. It helps
to have a single error path to avoid these problems.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/nand/nand_bbt.c

index 53e17586fbedd60744bab79e15e4eed96945e02e..516db2c4524ba74a3e729dc586465c6c70e133de 100644 (file)
@@ -1077,7 +1077,7 @@ static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
 {
        struct nand_chip *this = mtd->priv;
-       int len, res = 0;
+       int len, res;
        uint8_t *buf;
        struct nand_bbt_descr *td = this->bbt_td;
        struct nand_bbt_descr *md = this->bbt_md;
@@ -1098,10 +1098,9 @@ static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        if (!td) {
                if ((res = nand_memory_bbt(mtd, bd))) {
                        pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
-                       kfree(this->bbt);
-                       this->bbt = NULL;
+                       goto err;
                }
-               return res;
+               return 0;
        }
        verify_bbt_descr(mtd, td);
        verify_bbt_descr(mtd, md);
@@ -1111,9 +1110,8 @@ static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        len += (len >> this->page_shift) * mtd->oobsize;
        buf = vmalloc(len);
        if (!buf) {
-               kfree(this->bbt);
-               this->bbt = NULL;
-               return -ENOMEM;
+               res = -ENOMEM;
+               goto err;
        }
 
        /* Is the bbt at a given page? */
@@ -1125,6 +1123,8 @@ static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
        }
 
        res = check_create(mtd, buf, bd);
+       if (res)
+               goto err;
 
        /* Prevent the bbt regions from erasing / writing */
        mark_bbt_region(mtd, td);
@@ -1132,6 +1132,11 @@ static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
                mark_bbt_region(mtd, md);
 
        vfree(buf);
+       return 0;
+
+err:
+       kfree(this->bbt);
+       this->bbt = NULL;
        return res;
 }