regmap: potentially duplicate the name string stored in regmap
Subsystems (2)
PATCH v2 1/1 regmap: potentially duplicate the name string stored in regmap
Currently we just copy over the pointer passed to regmap_init() in the regmap config struct. To be on the safe side: duplicate the string with kstrdup_const() so that if an unaware user passes an address to a stack-allocated buffer, we won't crash.
Signed-off-by Bartosz Golaszewski <[email protected]>
---
v1 -> v2:
- drop the patches that were either applied or done by Mark
- fix an error path
- use kstrdup_const() instead of kstrdup() to avoid unnecessary memory allocations
drivers/base/regmap/regmap.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/base/regmap/regmap.c +12 -2
@@ -672,6 +672,14 @@ struct regmap *__regmap_init(struct device *dev, goto err; } +if (config->name) { + map->name =kstrdup_const (config->name,GFP_KERNEL ); +if (!map->name) { + ret = -ENOMEM ; + goto err_map; + } + } +if (config->disable_locking) { map->lock = map->unlock = regmap_lock_unlock_none; }else if (config->lock && config->unlock) {
@@ -682,7 +690,7 @@ struct regmap *__regmap_init(struct device *dev, map->hwlock =hwspin_lock_request_specific (config->hwlock_id);if (!map->hwlock) { ret = -ENXIO ; - goto err_map; + goto err_name; }switch (config->hwlock_mode) {
@@ -762,7 +770,6 @@ struct regmap *__regmap_init(struct device *dev, map->volatile_reg = config->volatile_reg; map->precious_reg = config->precious_reg; map->cache_type = config->cache_type; - map->name = config->name;spin_lock_init (&map->async_lock);INIT_LIST_HEAD (&map->async_list);
@@ -1118,6 +1125,8 @@ struct regmap *__regmap_init(struct device *dev, err_hwlock:if (map->hwlock)hwspin_lock_free (map->hwlock); +err_name: +kfree_const (map->name); err_map:kfree (map); err:
@@ -1307,6 +1316,7 @@ void regmap_exit(struct regmap *map) }if (map->hwlock)hwspin_lock_free (map->hwlock); +kfree_const (map->name);kfree (map); }EXPORT_SYMBOL_GPL (regmap_exit);
Signature · 1 line
2.15.1