slub: fix leak of 'name' in sysfs_slab_add
Subsystems (2)
The failure paths of sysfs_slab_add don't release the allocation of 'name' made by create_unique_id() a few lines above the context of the diff below. Create a common exit path to make it more obvious what needs freeing.
mm/slub.c +12 -9
@@ -5197,17 +5197,13 @@ static int sysfs_slab_add(struct kmem_cache *s) s->kobj.kset = slab_kset; err =kobject_init_and_add (&s->kobj, &slab_ktype,NULL ,"%s" , name); -if (err) { -kobject_put (&s->kobj); -return err; - } +if (err) + goto err_out; err =sysfs_create_group (&s->kobj, &slab_attr_group); -if (err) { -kobject_del (&s->kobj); -kobject_put (&s->kobj); -return err; - } +if (err) + goto err_sysfs; +kobject_uevent (&s->kobj,KOBJ_ADD );if (!unmergeable) {/* Setup first alias */
@@ -5215,6 +5211,13 @@ static int sysfs_slab_add(struct kmem_cache *s)kfree (name); }return 0 ; + +err_sysfs: +kobject_del (&s->kobj); +err_out: +kobject_put (&s->kobj); +kfree (name); +return err; }static void sysfs_slab_remove (struct kmem_cache *s)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
[adding Andrew to Cc]
Quoted 35 lines · Dave Jones
The failure paths of
sysfs_slab_adddon't release the allocation of 'name' made bycreate_unique_id()a few lines above the context of the diff below. Create a common exit path to make it more obvious what needs freeing.Signed-off-by Dave Jones <[email protected]>mm/slub.c +5
-9@@ -5197,17 +5197,13 @@ static int sysfs_slab_add(struct kmem_cache *s) s->kobj.kset = slab_kset; err =kobject_init_and_add (&s->kobj, &slab_ktype,NULL ,"%s" , name); -if (err) { -kobject_put (&s->kobj); -return err; - } +if (err) + goto err_out; err =sysfs_create_group (&s->kobj, &slab_attr_group); -if (err) { -kobject_del (&s->kobj); -kobject_put (&s->kobj); -return err; - } +if (err) + goto err_sysfs; +kobject_uevent (&s->kobj,KOBJ_ADD );if (!unmergeable) {/* Setup first alias */ @@ -5215,6 +5211,13 @@ static int sysfs_slab_add(struct kmem_cache *s)kfree (name);
mm/slub.c static int sysfs_slab_add(struct kmem_cache *s) · line 5221
Quoted 10 lines
mm/slub.c +7
-0}return 0 ; + +err_sysfs: +kobject_del (&s->kobj); +err_out: +kobject_put (&s->kobj); +kfree (name); +return err; }
We should free the name only if !unmergeable, because:
sysfs_slab_add():
if (unmergeable) {
/*
* Slabcache can never be merged so we can use the name proper.
* This is typically the case for debug situations. In that
* case we can catch duplicate names easily.
*/
sysfs_remove_link(&slab_kset->kobj, s->name);
name = s->name;
} else {
/*
* Create a unique name for the slab as a target
* for the symlinks.
*/
name = create_unique_id(s);
}Since this function was modified in the mmotm tree, I would propose something like this on top of mmotm to avoid further merge conflicts:
mm/slub.c +15 -14
@@ -5214,25 +5214,19 @@ static int sysfs_slab_add(struct kmem_cache *s) s->kobj.kset =cache_kset (s); err =kobject_init_and_add (&s->kobj, &slab_ktype,NULL ,"%s" , name); -if (err) { -kobject_put (&s->kobj); -return err; - } +if (err) + goto out_put_kobj; err =sysfs_create_group (&s->kobj, &slab_attr_group); -if (err) { -kobject_del (&s->kobj); -kobject_put (&s->kobj); -return err; - } +if (err) + goto out_del_kobj;#ifdef CONFIG_MEMCG_KMEM if (is_root_cache (s)) { s->memcg_kset =kset_create_and_add ("cgroup" ,NULL , &s->kobj);if (!s->memcg_kset) { -kobject_del (&s->kobj); -kobject_put (&s->kobj); -return -ENOMEM ; + err = -ENOMEM ; + goto out_del_kobj; } }#endif
@@ -5241,9 +5235,16 @@ static int sysfs_slab_add(struct kmem_cache *s)if (!unmergeable) {/* Setup first alias */ sysfs_slab_alias (s, s->name); -kfree (name); } -return 0 ; +out: +if (!unmergeable) +kfree (name); +return err; +out_del_kobj: +kobject_del (&s->kobj); +out_put_kobj: +kobject_put (&s->kobj); + goto out; }static void sysfs_slab_remove (struct kmem_cache *s)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 7 lines · Vladimir Davydov
[adding Andrew to Cc]
Quoted 4 lines · Dave Jones
The failure paths of
sysfs_slab_adddon't release the allocation of 'name' made bycreate_unique_id()a few lines above the context of the diff below. Create a common exit path to make it more obvious what needs freeing.
Quoted 5 lines
Quoted 2 lines
Signed-off-by Dave Jones <[email protected]>Since this function was modified in the mmotm tree, I would propose something like this on top of mmotm to avoid further merge conflicts:
Looks good to me.
thanks,
Dave
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Christoph Lameter
Acked-byQuoted 4 lines · Dave Jones
Quoted 2 lines
Since this function was modified in the mmotm tree, I would propose something like this on top of mmotm to avoid further merge conflicts:
Looks good to me.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>