diff options
author | Atsushi Nemoto <anemo@mba.ocn.ne.jp> | 2009-06-09 09:31:15 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2009-06-09 09:31:15 -0400 |
commit | 272023df26da2668ecc3937f8eeb48c8683b64fa (patch) | |
tree | f81ad995768fa5b52d30ddc37b60c0db58771ba0 /drivers/mtd/nand/txx9ndfmc.c | |
parent | bfee1a4311702c9fdecd8264ffd1126fd0ce92fb (diff) |
mtd: nand: Fix memory leak on txx9ndfmc probe failure.
Commit 81933046ef2a615031c46171013bde2c5225ee69 ('mtd: Fix handling of
mtdname in txx9ndfmc.c') introduced a potential memory leak. The
'mtdname' member of the private data structure is now allocated
separately, but was not freed on certain error paths.
Fix that, and make things simpler by _always_ allocating it separately
so that we don't need 'if (mtdname != dev_name()) kfree(mtdname);'...
which gets ugly now that we're doing it more than once, and more likely
that we'll get it wrong some time.
Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/nand/txx9ndfmc.c')
-rw-r--r-- | drivers/mtd/nand/txx9ndfmc.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/mtd/nand/txx9ndfmc.c b/drivers/mtd/nand/txx9ndfmc.c index 5f919e63b29b..488088eff2ca 100644 --- a/drivers/mtd/nand/txx9ndfmc.c +++ b/drivers/mtd/nand/txx9ndfmc.c | |||
@@ -336,20 +336,21 @@ static int __init txx9ndfmc_probe(struct platform_device *dev) | |||
336 | txx9_priv->cs = i; | 336 | txx9_priv->cs = i; |
337 | txx9_priv->mtdname = kasprintf(GFP_KERNEL, "%s.%u", | 337 | txx9_priv->mtdname = kasprintf(GFP_KERNEL, "%s.%u", |
338 | dev_name(&dev->dev), i); | 338 | dev_name(&dev->dev), i); |
339 | if (!txx9_priv->mtdname) { | ||
340 | kfree(txx9_priv); | ||
341 | dev_err(&dev->dev, | ||
342 | "Unable to allocate TXx9 NDFMC MTD device name.\n"); | ||
343 | continue; | ||
344 | } | ||
345 | } else { | 339 | } else { |
346 | txx9_priv->cs = -1; | 340 | txx9_priv->cs = -1; |
347 | txx9_priv->mtdname = dev_name(&dev->dev); | 341 | txx9_priv->mtdname = kstrdup(dev_name(&dev->dev), |
342 | GFP_KERNEL); | ||
343 | } | ||
344 | if (!txx9_priv->mtdname) { | ||
345 | kfree(txx9_priv); | ||
346 | dev_err(&dev->dev, "Unable to allocate MTD name.\n"); | ||
347 | continue; | ||
348 | } | 348 | } |
349 | if (plat->wide_mask & (1 << i)) | 349 | if (plat->wide_mask & (1 << i)) |
350 | chip->options |= NAND_BUSWIDTH_16; | 350 | chip->options |= NAND_BUSWIDTH_16; |
351 | 351 | ||
352 | if (nand_scan(mtd, 1)) { | 352 | if (nand_scan(mtd, 1)) { |
353 | kfree(txx9_priv->mtdname); | ||
353 | kfree(txx9_priv); | 354 | kfree(txx9_priv); |
354 | continue; | 355 | continue; |
355 | } | 356 | } |
@@ -391,8 +392,7 @@ static int __exit txx9ndfmc_remove(struct platform_device *dev) | |||
391 | kfree(drvdata->parts[i]); | 392 | kfree(drvdata->parts[i]); |
392 | #endif | 393 | #endif |
393 | del_mtd_device(mtd); | 394 | del_mtd_device(mtd); |
394 | if (txx9_priv->mtdname != dev_name(&dev->dev)) | 395 | kfree(txx9_priv->mtdname); |
395 | kfree(txx9_priv->mtdname); | ||
396 | kfree(txx9_priv); | 396 | kfree(txx9_priv); |
397 | } | 397 | } |
398 | return 0; | 398 | return 0; |