Skip to content

Commit

Permalink
staging: speakup: fix failure handling
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
williamh authored and gregkh committed Jan 10, 2011
1 parent 7571f08 commit 7959d55
Showing 2 changed files with 27 additions and 15 deletions.
9 changes: 6 additions & 3 deletions drivers/staging/speakup/kobjects.c
Original file line number Diff line number Diff line change
@@ -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,14 +1004,15 @@ int speakup_kobj_init(void)
if (retval)
goto err_group;

return 0;
goto out;

err_group:
sysfs_remove_group(speakup_kobj, &main_attr_group);
err_speakup:
kobject_put(speakup_kobj);
err_acc:
kobject_put(accessibility_kobj);
out:
return retval;
}

33 changes: 21 additions & 12 deletions drivers/staging/speakup/main.c
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 7959d55

Please sign in to comment.