genalloc: freeing const data pointers
Subsystems (2)
PATCH 1/1 genalloc: freeing const data pointers
"pool->name" can be kmalloc()ed or const so we need to free it with kfree_const().
I also cleaned up the error path in devm_gen_pool_create() a bit. With the current code you have to change the kfree() in multiple places which is bug prone (my first draft of this patch had a bug).
Fixes e89a70fd54f2 ('genalloc: add support of multiple gen_pools per device')
Signed-off-by Dan Carpenter <[email protected]>
lib/genalloc.c +16 -14
@@ -253,7 +253,7 @@ void gen_pool_destroy(struct gen_pool *pool)kfree (chunk); } -kfree (pool->name); +kfree_const (pool->name);kfree (pool); }EXPORT_SYMBOL (gen_pool_destroy);
@@ -631,23 +631,25 @@ struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order, } ptr =devres_alloc (devm_gen_pool_release,sizeof (*ptr),GFP_KERNEL ); -if (!ptr) { -kfree (pool_name); -return ERR_PTR (-ENOMEM ); - } +if (!ptr) + goto free_pool_name; pool =gen_pool_create (min_alloc_order, nid); -if (pool) { - *ptr = pool; - pool->name = pool_name; -devres_add (dev, ptr); - }else { -devres_free (ptr); -kfree (pool_name); -return ERR_PTR (-ENOMEM ); - } +if (!pool) + goto free_devres; + + *ptr = pool; + pool->name = pool_name; +devres_add (dev, ptr);return pool; + +free_devres: +devres_free (ptr); +free_pool_name: +kfree_const (pool_name); + +return ERR_PTR (-ENOMEM ); }EXPORT_SYMBOL (devm_gen_pool_create);