Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: cfi_cmdset_0001: fixing memory leak and handling failed kmalloc

kmalloc needs to be handled when failing in memory pressure.
Also, it has memory leak in error routine.

Signed-off-by: Insu Yun <wuninsu@gmail.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>

authored by

Insu Yun and committed by
Brian Norris
33853ebd 32321e95

+7 -1
+7 -1
drivers/mtd/chips/cfi_cmdset_0001.c
··· 596 596 mtd->size = devsize * cfi->numchips; 597 597 598 598 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips; 599 - mtd->eraseregions = kmalloc(sizeof(struct mtd_erase_region_info) 599 + mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info) 600 600 * mtd->numeraseregions, GFP_KERNEL); 601 601 if (!mtd->eraseregions) 602 602 goto setup_err; ··· 614 614 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize; 615 615 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum; 616 616 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap = kmalloc(ernum / 8 + 1, GFP_KERNEL); 617 + if (!mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap) 618 + goto setup_err; 617 619 } 618 620 offset += (ersize * ernum); 619 621 } ··· 652 650 return mtd; 653 651 654 652 setup_err: 653 + if (mtd->eraseregions) 654 + for (i=0; i<cfi->cfiq->NumEraseRegions; i++) 655 + for (j=0; j<cfi->numchips; j++) 656 + kfree(mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap); 655 657 kfree(mtd->eraseregions); 656 658 kfree(mtd); 657 659 kfree(cfi->cmdset_priv);