mmc: core: Fix possbile memory leak
Fix possible memory leak detected by kmemleak:
unreferenced object 0xc0f80f00 (size 64):
comm "swapper/0", pid 1, jiffies 4294937508 (age 82.980s)
hex dump (first 32 bytes):
6d 6d 63 30 5f 64 65 74 65 63 74 00 72 79 2e 68 mmc0_detect.ry.h
00 07 00 00 68 77 63 61 70 2e 68 00 02 00 00 70 ....hwcap.h....p
backtrace:
[<c010a1fc>] __kmalloc+0x164/0x220
[<c01e1630>] kvasprintf+0x38/0x58
[<c01e1668>] kasprintf+0x18/0x24
[<c02fcf60>] mmc_alloc_host+0x114/0x1b4
[<c0311c84>] msmsdcc_probe+0xc14/0x1fd8
[<c022b40c>] platform_drv_probe+0x14/0x18
[<c022a144>] driver_probe_device+0x144/0x334
[<c022a394>] __driver_attach+0x60/0x84
[<c022884c>] bus_for_each_dev+0x4c/0x78
[<c0229720>] bus_add_driver+0xd0/0x250
[<c022a884>] driver_register+0x9c/0x128
[<c00086bc>] do_one_initcall+0x90/0x160
[<c06d1904>] kernel_init+0xe8/0x1a4
[<c000ee4c>] kernel_thread_exit+0x0/0x8
[<ffffffff>] 0xffffffff
Change-Id: I3b29d71463af849a072cabbe56637adf6db6d0da
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index 751ba75..0cfddc4 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -33,6 +33,7 @@
static void mmc_host_classdev_release(struct device *dev)
{
struct mmc_host *host = cls_dev_to_mmc_host(dev);
+ kfree(host->wlock_name);
kfree(host);
}
@@ -337,8 +338,10 @@
spin_lock_init(&host->lock);
init_waitqueue_head(&host->wq);
+ host->wlock_name = kasprintf(GFP_KERNEL,
+ "%s_detect", mmc_hostname(host));
wake_lock_init(&host->detect_wake_lock, WAKE_LOCK_SUSPEND,
- kasprintf(GFP_KERNEL, "%s_detect", mmc_hostname(host)));
+ host->wlock_name);
INIT_DELAYED_WORK(&host->detect, mmc_rescan);
#ifdef CONFIG_PM
host->pm_notify.notifier_call = mmc_pm_notify;
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 6982c45..f9e0627 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -315,6 +315,7 @@
struct delayed_work detect;
struct wake_lock detect_wake_lock;
+ const char *wlock_name;
int detect_change; /* card detect flag */
struct mmc_hotplug hotplug;