pinctrl: dynamically alloc temp array when parsing dt pinconf options

Allocating the temorary array in pinconf_generic_parse_dt_config on stack
might cause problems later on, when the number of options grows over time.
Therefore also allocate this array dynamically to be on the safe side.

Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
Git-commit: 6abab2d4bec982bcefbe99201ddee5f2522
Change-Id: Ie63b66e4d02fc11e9156e6a8608c21e17b71594a
Signed-off-by: Hanumant Singh <hanumant@codeaurora.org>
This commit is contained in:
Heiko Stübner
2013-07-02 14:15:25 -07:00
committed by Hanumant Singh
parent 829a05d5ed
commit 162e808f19
+18 -6
View File
@@ -168,7 +168,7 @@ int pinconf_generic_parse_dt_config(struct device_node *np,
unsigned long **configs,
unsigned int *nconfigs)
{
unsigned long cfg[ARRAY_SIZE(dt_params)];
unsigned long *cfg;
unsigned int ncfg = 0;
int ret;
int i;
@@ -177,6 +177,11 @@ int pinconf_generic_parse_dt_config(struct device_node *np,
if (!np)
return -EINVAL;
/* allocate a temporary array big enough to hold one of each option */
cfg = kzalloc(sizeof(*cfg) * ARRAY_SIZE(dt_params), GFP_KERNEL);
if (!cfg)
return -ENOMEM;
for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
struct pinconf_generic_dt_params *par = &dt_params[i];
ret = of_property_read_u32(np, par->property, &val);
@@ -194,11 +199,13 @@ int pinconf_generic_parse_dt_config(struct device_node *np,
ncfg++;
}
ret = 0;
/* no configs found at all */
if (ncfg == 0) {
*configs = NULL;
*nconfigs = 0;
return 0;
goto out;
}
/*
@@ -206,11 +213,16 @@ int pinconf_generic_parse_dt_config(struct device_node *np,
* found properties.
*/
*configs = kzalloc(ncfg * sizeof(unsigned long), GFP_KERNEL);
if (!*configs)
return -ENOMEM;
if (!*configs) {
ret = -ENOMEM;
goto out;
}
memcpy(*configs, &cfg, ncfg * sizeof(unsigned long));
memcpy(*configs, cfg, ncfg * sizeof(unsigned long));
*nconfigs = ncfg;
return 0;
out:
kfree(cfg);
return ret;
}
#endif