aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Jones <davej@fedoraproject.org>2014-04-07 15:39:32 -0700
committerMoyster <oysterized@gmail.com>2016-09-28 15:14:06 +0200
commitf0eaf96c524b819915997d6fafb9976183251fa4 (patch)
tree9d86236ec5f2a7e13a905d3c3facd1f817174544
parent69bb55d73640d7e6d64a75065dbfb06ade4b4352 (diff)
slub: fix leak of 'name' in sysfs_slab_add
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. [vdavydov@parallels.com: free the name only if !unmergeable] Signed-off-by: Dave Jones <davej@fedoraproject.org> Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Cc: Pekka Enberg <penberg@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: W4TCH0UT <ateekujjawal@gmail.com>
-rw-r--r--mm/slub.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/mm/slub.c b/mm/slub.c
index d20225cae..43b5370df 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5422,25 +5422,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
@@ -5449,9 +5443,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)