diff options
author | Dan Carpenter <error27@gmail.com> | 2010-11-12 08:04:43 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-11-16 12:25:52 -0800 |
commit | ebba26f4a8d0c137a2d365b6bded2a0d7fcd1d06 (patch) | |
tree | 4ceaf840194b8e375c978b57274f83cf29db0c06 /drivers/staging | |
parent | 5fb5d38fc268b8285125b213b9b2ded9322a371c (diff) | |
download | op-kernel-dev-ebba26f4a8d0c137a2d365b6bded2a0d7fcd1d06.zip op-kernel-dev-ebba26f4a8d0c137a2d365b6bded2a0d7fcd1d06.tar.gz |
Staging: quickstart: free after input_unregister_device()
input_unregister_device() releases "quickstart_input" so the
input_free_device() is a double free. Also I noticed that there is a
memory leak if the call to input_register_device() fails.
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/quickstart/quickstart.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/staging/quickstart/quickstart.c b/drivers/staging/quickstart/quickstart.c index d746715..d83bec8 100644 --- a/drivers/staging/quickstart/quickstart.c +++ b/drivers/staging/quickstart/quickstart.c @@ -355,7 +355,6 @@ static int quickstart_acpi_remove(struct acpi_device *device, int type) static void quickstart_exit(void) { input_unregister_device(quickstart_input); - input_free_device(quickstart_input); device_remove_file(&pf_device->dev, &dev_attr_pressed_button); device_remove_file(&pf_device->dev, &dev_attr_buttons); @@ -375,6 +374,7 @@ static int __init quickstart_init_input(void) { struct quickstart_btn **ptr = &quickstart_data.btn_lst; int count; + int ret; quickstart_input = input_allocate_device(); @@ -391,7 +391,13 @@ static int __init quickstart_init_input(void) ptr = &((*ptr)->next); } - return input_register_device(quickstart_input); + ret = input_register_device(quickstart_input); + if (ret) { + input_free_device(quickstart_input); + return ret; + } + + return 0; } static int __init quickstart_init(void) |