On Thu, Apr 25, 2019 at 11:55:41AM +0200, Geert Uytterhoeven wrote:
> The pinmux groups and functions arrays may contain two parts, to ease
> supporting SoCs that expose pin subsets of other related SoCs.  Both
> parts need to be declared with explicit sizes, which thus need to be
> updated when adding support for more groups and functions.
> 
> If a size is too small, the compiler will detect this at build time
> ("excess elements in array initializer").
> If a size is too large, this may go undetected (for pin groups), lead to
> pin controller registration failures (for pin functions: "pinmux ops has
> no name for functionN"), or crash the optional run-time debug code (for
> pin groups).
> 
> Extend the run-time debug code with checks to detect this, to help
> catching bugs early.
> 
> Signed-off-by: Geert Uytterhoeven <[email protected]>

Reviewed-by: Simon Horman <[email protected]>

> ---
>  drivers/pinctrl/sh-pfc/core.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c
> index 868b9551438efb0a..889e5af281022e1d 100644
> --- a/drivers/pinctrl/sh-pfc/core.c
> +++ b/drivers/pinctrl/sh-pfc/core.c
> @@ -780,9 +780,15 @@ static void __init sh_pfc_check_info(const struct 
> sh_pfc_soc_info *info)
>  
>       for (i = 0; i < info->nr_functions; i++) {
>               func = &info->functions[i];
> +             if (!func->name) {
> +                     pr_err("%s: empty function %u\n", drvname, i);
> +                     sh_pfc_errors++;

Not strictly related to this patch but did
you consider not having sh_pfc_errors global to this file?

> +                     continue;
> +             }
>               for (j = 0; j < func->nr_groups; j++) {
>                       for (k = 0; k < info->nr_groups; k++) {
> -                             if (!strcmp(func->groups[j],
> +                             if (info->groups[k].name &&
> +                                 !strcmp(func->groups[j],
>                                           info->groups[k].name)) {
>                                       refcnts[k]++;
>                                       break;
> @@ -798,6 +804,11 @@ static void __init sh_pfc_check_info(const struct 
> sh_pfc_soc_info *info)
>       }
>  
>       for (i = 0; i < info->nr_groups; i++) {
> +             if (!info->groups[i].name) {
> +                     pr_err("%s: empty group %u\n", drvname, i);
> +                     sh_pfc_errors++;
> +                     continue;
> +             }
>               if (!refcnts[i]) {
>                       pr_err("%s: orphan group %s\n", drvname,
>                              info->groups[i].name);
> -- 
> 2.17.1
> 

Reply via email to