mfd: Fix memory leak in ab3100_otp_probe
authorAxel Lin <axel.lin@gmail.com>
Tue, 25 May 2010 06:49:51 +0000 (14:49 +0800)
committerSamuel Ortiz <sameo@linux.intel.com>
Thu, 12 Aug 2010 09:27:17 +0000 (11:27 +0200)
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>
drivers/mfd/ab3100-otp.c

index 63d2b727ddbbb82e7a98bf935b7f054d528822f4..8440010eb2b87b64f261d3dc87db955bebc737ea 100644 (file)
@@ -199,7 +199,7 @@ static int __init ab3100_otp_probe(struct platform_device *pdev)
 
        err = ab3100_otp_read(otp);
        if (err)
-               return err;
+               goto err_otp_read;
 
        dev_info(&pdev->dev, "AB3100 OTP readout registered\n");
 
@@ -208,21 +208,21 @@ static int __init ab3100_otp_probe(struct platform_device *pdev)
                err = device_create_file(&pdev->dev,
                                         &ab3100_otp_attrs[i]);
                if (err)
-                       goto out_no_sysfs;
+                       goto err_create_file;
        }
 
        /* debugfs entries */
        err = ab3100_otp_init_debugfs(&pdev->dev, otp);
        if (err)
-               goto out_no_debugfs;
+               goto err_init_debugfs;
 
        return 0;
 
-out_no_sysfs:
-       for (i = 0; i < ARRAY_SIZE(ab3100_otp_attrs); i++)
-               device_remove_file(&pdev->dev,
-                                  &ab3100_otp_attrs[i]);
-out_no_debugfs:
+err_init_debugfs:
+err_create_file:
+       while (--i >= 0)
+               device_remove_file(&pdev->dev, &ab3100_otp_attrs[i]);
+err_otp_read:
        kfree(otp);
        return err;
 }