Commit a0dba697 authored by Axel Lin's avatar Axel Lin Committed by Matthew Garrett

acerhdf: fix resource reclaim in error path

Fix resource reclaim in below cases:

1. acerhdf_register_platform() does not properly handle
   platform_device_alloc() failure and platform_device_add() failure This
   patch adds error handing for acerhdf_register_platform().

2. acerhdf_register_platform() return err with acerhdf_dev == NULL.
   as a result, acerhdf_unregister_platform() does not do resource reclaim
   in acerhdf_init() error path.  This patch adds error handing for
   acerhdf_register_platform(), thus correct the error handing path in
   acerhdf_init().  goto out_err instead of err_unreg if
   acerhdf_register_platform() fail.

3. platform_device_del() should only used in error handling.  Current
   implementation missed a platform_device_put() in acerhdf_exit.  This
   patch fixes it by using platform_device_unregister() instead of
   platform_device_del() in acerhdf_unregister_platform.
Signed-off-by: default avatarAxel Lin <axel.lin@gmail.com>
Acked-by: default avatarPeter Feuerer <peter@piie.net>
Cc: Matthew Garrett <mjg@redhat.com>
Acked-by: default avatarBorislav Petkov <bp@alien8.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
parent 6a984a06
......@@ -615,17 +615,26 @@ static int acerhdf_register_platform(void)
return err;
acerhdf_dev = platform_device_alloc("acerhdf", -1);
platform_device_add(acerhdf_dev);
if (!acerhdf_dev) {
err = -ENOMEM;
goto err_device_alloc;
}
err = platform_device_add(acerhdf_dev);
if (err)
goto err_device_add;
return 0;
err_device_add:
platform_device_put(acerhdf_dev);
err_device_alloc:
platform_driver_unregister(&acerhdf_driver);
return err;
}
static void acerhdf_unregister_platform(void)
{
if (!acerhdf_dev)
return;
platform_device_del(acerhdf_dev);
platform_device_unregister(acerhdf_dev);
platform_driver_unregister(&acerhdf_driver);
}
......@@ -669,7 +678,7 @@ static int __init acerhdf_init(void)
err = acerhdf_register_platform();
if (err)
goto err_unreg;
goto out_err;
err = acerhdf_register_thermal();
if (err)
......@@ -682,7 +691,7 @@ static int __init acerhdf_init(void)
acerhdf_unregister_platform();
out_err:
return -ENODEV;
return err;
}
static void __exit acerhdf_exit(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment