mfd: pm8xxx: pwm: Fix memory leak in probe function
CRs-fixed: 313701
Change-Id: I7e7634976650044dfe684ccca3ce123a8fe66ff6
Signed-off-by: Jay Chokshi <jchokshi@codeaurora.org>
diff --git a/drivers/mfd/pm8xxx-pwm.c b/drivers/mfd/pm8xxx-pwm.c
index fa4b130..5b4f7e3 100644
--- a/drivers/mfd/pm8xxx-pwm.c
+++ b/drivers/mfd/pm8xxx-pwm.c
@@ -1230,6 +1230,7 @@
struct dentry *temp;
struct pm8xxx_pwm_user *puser;
int i;
+ int rc = 0;
if (dev == NULL) {
pr_err("no parent data passed in.\n");
@@ -1246,8 +1247,8 @@
sizeof(struct pm8xxx_pwm_user), GFP_KERNEL);
if (dbgdev->user == NULL) {
pr_err("kcalloc() failed.\n");
- kfree(dbgdev);
- return -ENOMEM;
+ rc = -ENOMEM;
+ goto user_error;
}
mutex_init(&dbgdev->dbg_mutex);
@@ -1257,7 +1258,8 @@
dent = debugfs_create_dir("pm8xxx-pwm-dbg", NULL);
if (dent == NULL || IS_ERR(dent)) {
pr_err("ERR debugfs_create_dir: dent=%p\n", dent);
- return -ENOMEM;
+ rc = -ENOMEM;
+ goto dir_error;
}
dbgdev->dent = dent;
@@ -1269,6 +1271,7 @@
dent = debugfs_create_dir(pwm_ch, dbgdev->dent);
if (dent == NULL || IS_ERR(dent)) {
pr_err("ERR: pwm=%d: dir: dent=%p\n", i, dent);
+ rc = -ENOMEM;
goto debug_error;
}
@@ -1279,6 +1282,7 @@
dent, puser, &dbg_pwm_period_fops);
if (temp == NULL || IS_ERR(temp)) {
pr_err("ERR: pwm=%d: period: dent=%p\n", i, dent);
+ rc = -ENOMEM;
goto debug_error;
}
@@ -1286,6 +1290,7 @@
dent, puser, &dbg_pwm_duty_cycle_fops);
if (temp == NULL || IS_ERR(temp)) {
pr_err("ERR: pwm=%d: duty-cycle: dent=%p\n", i, dent);
+ rc = -ENOMEM;
goto debug_error;
}
@@ -1293,6 +1298,7 @@
dent, puser, &dbg_pwm_enable_fops);
if (temp == NULL || IS_ERR(temp)) {
pr_err("ERR: pwm=%d: enable: dent=%p\n", i, dent);
+ rc = -ENOMEM;
goto debug_error;
}
}
@@ -1303,7 +1309,11 @@
debug_error:
debugfs_remove_recursive(dbgdev->dent);
- return -ENOMEM;
+dir_error:
+ kfree(dbgdev->user);
+user_error:
+ kfree(dbgdev);
+ return rc;
}
static int __devexit pm8xxx_pwm_dbg_remove(void)