fix the failure handling in kobjects and the main function so that we release the virtual keyboard if we exit due to another failure. Signed-off-by: William Hubbs <w.d.hubbs at gmail.com> --- drivers/staging/speakup/kobjects.c | 9 ++++++--- drivers/staging/speakup/main.c | 33 +++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c index cc79f9e..408bb9b 100644 --- a/drivers/staging/speakup/kobjects.c +++ b/drivers/staging/speakup/kobjects.c @@ -984,8 +984,10 @@ int speakup_kobj_init(void) * not known ahead of time. */ accessibility_kobj = kobject_create_and_add("accessibility", NULL); - if (!accessibility_kobj) - return -ENOMEM; + if (!accessibility_kobj) { + retval = -ENOMEM; + goto out; + } speakup_kobj = kobject_create_and_add("speakup", accessibility_kobj); if (!speakup_kobj) { @@ -1002,7 +1004,7 @@ int speakup_kobj_init(void) if (retval) goto err_group; - return 0; + goto out; err_group: sysfs_remove_group(speakup_kobj, &main_attr_group); @@ -1010,6 +1012,7 @@ err_speakup: kobject_put(speakup_kobj); err_acc: kobject_put(accessibility_kobj); +out: return retval; } diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c index 4b7a9c2..3cd0039 100644 --- a/drivers/staging/speakup/main.c +++ b/drivers/staging/speakup/main.c @@ -2253,17 +2253,17 @@ static int __init speakup_init(void) err = speakup_add_virtual_keyboard(); if (err) - return err; + goto out; initialize_msgs(); /* Initialize arrays for i18n. */ first_console = kzalloc(sizeof(*first_console), GFP_KERNEL); - if (!first_console) - return -ENOMEM; - err = speakup_kobj_init(); - if (err) { - kfree(first_console); - return err; + if (!first_console) { + err = -ENOMEM; + goto err_cons; } + err = speakup_kobj_init(); + if (err) + goto err_kobject; reset_default_chars(); reset_default_chartab(); @@ -2299,11 +2299,20 @@ static int __init speakup_init(void) speakup_task = kthread_create(speakup_thread, NULL, "speakup"); set_user_nice(speakup_task, 10); - if (!IS_ERR(speakup_task)) - wake_up_process(speakup_task); - else - return -ENOMEM; - return 0; + if (IS_ERR(speakup_task)) { + err = -ENOMEM; + goto err_kobject; + } + wake_up_process(speakup_task); + goto out; + +err_kobject: +speakup_kobj_exit(); + kfree(first_console); +err_cons: + speakup_remove_virtual_keyboard(); +out: + return err; } module_init(speakup_init); -- 1.7.2.2