diff options
author | Axel Lin <axel.lin@gmail.com> | 2010-05-25 02:49:51 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-08-12 05:27:17 -0400 |
commit | d281b80c46da8bae806c4ef5682187f07e35389d (patch) | |
tree | 96ff99c6359cdf53cd2e0e6d862bc5fab9f2e159 /drivers/mfd/ab3100-otp.c | |
parent | 21f1fc38606b35bb12a4772367ef68128cd12c30 (diff) |
mfd: Fix memory leak in ab3100_otp_probe
In current implementation, there is a memory leak if ab3100_otp_read fail.
And in the case of ab3100_otp_init_debugfs fail, it does not properly remove
sysfs entries.
This patch properly handle above failure cases.
Signed-off-by: Axel Lin <axel.lin@gmail.com>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/ab3100-otp.c')
-rw-r--r-- | drivers/mfd/ab3100-otp.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/mfd/ab3100-otp.c b/drivers/mfd/ab3100-otp.c index 63d2b727ddbb..8440010eb2b8 100644 --- a/drivers/mfd/ab3100-otp.c +++ b/drivers/mfd/ab3100-otp.c | |||
@@ -199,7 +199,7 @@ static int __init ab3100_otp_probe(struct platform_device *pdev) | |||
199 | 199 | ||
200 | err = ab3100_otp_read(otp); | 200 | err = ab3100_otp_read(otp); |
201 | if (err) | 201 | if (err) |
202 | return err; | 202 | goto err_otp_read; |
203 | 203 | ||
204 | dev_info(&pdev->dev, "AB3100 OTP readout registered\n"); | 204 | dev_info(&pdev->dev, "AB3100 OTP readout registered\n"); |
205 | 205 | ||
@@ -208,21 +208,21 @@ static int __init ab3100_otp_probe(struct platform_device *pdev) | |||
208 | err = device_create_file(&pdev->dev, | 208 | err = device_create_file(&pdev->dev, |
209 | &ab3100_otp_attrs[i]); | 209 | &ab3100_otp_attrs[i]); |
210 | if (err) | 210 | if (err) |
211 | goto out_no_sysfs; | 211 | goto err_create_file; |
212 | } | 212 | } |
213 | 213 | ||
214 | /* debugfs entries */ | 214 | /* debugfs entries */ |
215 | err = ab3100_otp_init_debugfs(&pdev->dev, otp); | 215 | err = ab3100_otp_init_debugfs(&pdev->dev, otp); |
216 | if (err) | 216 | if (err) |
217 | goto out_no_debugfs; | 217 | goto err_init_debugfs; |
218 | 218 | ||
219 | return 0; | 219 | return 0; |
220 | 220 | ||
221 | out_no_sysfs: | 221 | err_init_debugfs: |
222 | for (i = 0; i < ARRAY_SIZE(ab3100_otp_attrs); i++) | 222 | err_create_file: |
223 | device_remove_file(&pdev->dev, | 223 | while (--i >= 0) |
224 | &ab3100_otp_attrs[i]); | 224 | device_remove_file(&pdev->dev, &ab3100_otp_attrs[i]); |
225 | out_no_debugfs: | 225 | err_otp_read: |
226 | kfree(otp); | 226 | kfree(otp); |
227 | return err; | 227 | return err; |
228 | } | 228 | } |