summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSujit Reddy Thumma <sthumma@codeaurora.org>2013-01-04 10:42:38 +0400
committerDmitry Shmidt <dimitrysh@google.com>2017-03-04 01:26:08 +0300
commit0bd88c5bb77fc515ab2017c4fbf75594d05c927b (patch)
tree91b8e5f81b59c6db100cea5d9f20851f38c9d96d
parent68538686f132647d8a86862cb3141e551c7017fb (diff)
downloadlinux-sunxi-0bd88c5bb77fc515ab2017c4fbf75594d05c927b.tar.xz
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>
-rw-r--r--drivers/mmc/core/host.c6
-rw-r--r--include/linux/mmc/host.h1
2 files changed, 5 insertions, 2 deletions
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index dd7b1203e867..b7cf16fb9474 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -329,8 +329,10 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
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;
@@ -431,7 +433,7 @@ void mmc_free_host(struct mmc_host *host)
idr_remove(&mmc_host_idr, host->index);
spin_unlock(&mmc_host_lock);
wake_lock_destroy(&host->detect_wake_lock);
-
+ kfree(host->wlock_name);
put_device(&host->class_dev);
}
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 5674504e30d9..bd21e00b05fd 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -291,6 +291,7 @@ struct mmc_host {
struct delayed_work detect;
struct wake_lock detect_wake_lock;
+ const char *wlock_name;
int detect_change; /* card detect flag */
struct mmc_hotplug hotplug;