From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753313AbbGSKvV (ORCPT ); Sun, 19 Jul 2015 06:51:21 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:37324 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751496AbbGSKvT (ORCPT ); Sun, 19 Jul 2015 06:51:19 -0400 Date: Sun, 19 Jul 2015 13:53:19 +0300 From: Dan Carpenter To: Andrew Morton , Vladimir Zapolskiy Cc: Catalin Marinas , Laura Abbott , Olof Johansson , Rasmus Villemoes , Jan Kara , Toshi Kikuchi , linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org Subject: [patch] genalloc: freeing const data pointers Message-ID: <20150719105319.GC8410@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Source-IP: userv0021.oracle.com [156.151.31.71] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org "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 diff --git a/lib/genalloc.c b/lib/genalloc.c index 794804b..c729113 100644 --- a/lib/genalloc.c +++ b/lib/genalloc.c @@ -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);