From 6a56486716d54d2c16c46cde6a5cf10062cd6719 Mon Sep 17 00:00:00 2001 From: Vasiliy Kulikov Date: Sun, 17 Oct 2010 18:51:53 +0400 Subject: staging: speakup: fix leaks of sysfs groups speakup_kobj_init() and speakup_kobj_exit() didn't remove i18n_attr_group and main_attr_group sysfs groups. Signed-off-by: Vasiliy Kulikov Signed-off-by: Greg Kroah-Hartman --- drivers/staging/speakup/kobjects.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'drivers/staging/speakup/kobjects.c') diff --git a/drivers/staging/speakup/kobjects.c b/drivers/staging/speakup/kobjects.c index e12b0e7..cc79f9e 100644 --- a/drivers/staging/speakup/kobjects.c +++ b/drivers/staging/speakup/kobjects.c @@ -989,24 +989,34 @@ int speakup_kobj_init(void) speakup_kobj = kobject_create_and_add("speakup", accessibility_kobj); if (!speakup_kobj) { - kobject_put(accessibility_kobj); - return -ENOMEM; + retval = -ENOMEM; + goto err_acc; } /* Create the files associated with this kobject */ retval = sysfs_create_group(speakup_kobj, &main_attr_group); if (retval) - speakup_kobj_exit(); + goto err_speakup; retval = sysfs_create_group(speakup_kobj, &i18n_attr_group); if (retval) - speakup_kobj_exit(); + goto err_group; + + return 0; +err_group: + sysfs_remove_group(speakup_kobj, &main_attr_group); +err_speakup: + kobject_put(speakup_kobj); +err_acc: + kobject_put(accessibility_kobj); return retval; } void speakup_kobj_exit(void) { + sysfs_remove_group(speakup_kobj, &i18n_attr_group); + sysfs_remove_group(speakup_kobj, &main_attr_group); kobject_put(speakup_kobj); kobject_put(accessibility_kobj); } -- cgit v1.1