Skip to content

Commit

Permalink
acerhdf: fix resource reclaim in error path
Browse files Browse the repository at this point in the history
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: Axel Lin <axel.lin@gmail.com>
Acked-by: Peter Feuerer <peter@piie.net>
Cc: Matthew Garrett <mjg@redhat.com>
Acked-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
  • Loading branch information
Axel Lin authored and Matthew Garrett committed Aug 3, 2010
1 parent 6a984a0 commit a0dba69
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions drivers/platform/x86/acerhdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit a0dba69

Please sign in to comment.