mfd: pmic: Fix memory leak in debug probe
Free the debug device allocated before an
unsuccessful exit, both in pmic8058 and
pmic8901.
CRs-fixed: 308192
Signed-off-by: Jay Chokshi <jchokshi@codeaurora.org>
diff --git a/drivers/mfd/pmic8901.c b/drivers/mfd/pmic8901.c
index da46656..390de33 100644
--- a/drivers/mfd/pmic8901.c
+++ b/drivers/mfd/pmic8901.c
@@ -679,6 +679,7 @@
struct pm8901_dbg_device *dbgdev;
struct dentry *dent;
struct dentry *temp;
+ int rc;
if (chip == NULL) {
pr_err("%s: no parent data passed in.\n", __func__);
@@ -691,8 +692,6 @@
return -ENOMEM;
}
- mutex_init(&dbgdev->dbg_mutex);
-
dbgdev->pm_chip = chip;
dbgdev->addr = -1;
@@ -700,7 +699,8 @@
if (dent == NULL || IS_ERR(dent)) {
pr_err("%s: ERR debugfs_create_dir: dent=0x%X\n",
__func__, (unsigned)dent);
- return -ENOMEM;
+ rc = PTR_ERR(dent);
+ goto dir_error;
}
temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, dent,
@@ -708,6 +708,7 @@
if (temp == NULL || IS_ERR(temp)) {
pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
__func__, (unsigned)temp);
+ rc = PTR_ERR(temp);
goto debug_error;
}
@@ -716,9 +717,12 @@
if (temp == NULL || IS_ERR(temp)) {
pr_err("%s: ERR debugfs_create_file: dent=0x%X\n",
__func__, (unsigned)temp);
+ rc = PTR_ERR(temp);
goto debug_error;
}
+ mutex_init(&dbgdev->dbg_mutex);
+
dbgdev->dent = dent;
pmic_dbg_device = dbgdev;
@@ -727,13 +731,17 @@
debug_error:
debugfs_remove_recursive(dent);
- return -ENOMEM;
+dir_error:
+ kfree(dbgdev);
+
+ return rc;
}
static int __devexit pmic8901_dbg_remove(void)
{
if (pmic_dbg_device) {
debugfs_remove_recursive(pmic_dbg_device->dent);
+ mutex_destroy(&pmic_dbg_device->dbg_mutex);
kfree(pmic_dbg_device);
}
return 0;