pinctrl: sunxi: Fix a memory leak in 'sunxi_pinctrl_build_state()'
[sfrench/cifs-2.6.git] / drivers / pinctrl / sunxi / pinctrl-sunxi.c
index 4d9bf9b3e9f3e45d8e7d1eeeeedf4cb88181b46f..34e17376ef99ecd9e533d9346ca7145392d6b1c2 100644 (file)
@@ -332,15 +332,15 @@ static int sunxi_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
 
        function = sunxi_pctrl_parse_function_prop(node);
        if (!function) {
-               dev_err(pctl->dev, "missing function property in node %s\n",
-                       node->name);
+               dev_err(pctl->dev, "missing function property in node %pOFn\n",
+                       node);
                return -EINVAL;
        }
 
        pin_prop = sunxi_pctrl_find_pins_prop(node, &npins);
        if (!pin_prop) {
-               dev_err(pctl->dev, "missing pins property in node %s\n",
-                       node->name);
+               dev_err(pctl->dev, "missing pins property in node %pOFn\n",
+                       node);
                return -EINVAL;
        }
 
@@ -1042,6 +1042,7 @@ static int sunxi_pinctrl_add_function(struct sunxi_pinctrl *pctl,
 static int sunxi_pinctrl_build_state(struct platform_device *pdev)
 {
        struct sunxi_pinctrl *pctl = platform_get_drvdata(pdev);
+       void *ptr;
        int i;
 
        /*
@@ -1079,10 +1080,9 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
         * We suppose that we won't have any more functions than pins,
         * we'll reallocate that later anyway
         */
-       pctl->functions = devm_kcalloc(&pdev->dev,
-                                      pctl->ngroups,
-                                      sizeof(*pctl->functions),
-                                      GFP_KERNEL);
+       pctl->functions = kcalloc(pctl->ngroups,
+                                 sizeof(*pctl->functions),
+                                 GFP_KERNEL);
        if (!pctl->functions)
                return -ENOMEM;
 
@@ -1109,13 +1109,15 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
        }
 
        /* And now allocated and fill the array for real */
-       pctl->functions = krealloc(pctl->functions,
-                                  pctl->nfunctions * sizeof(*pctl->functions),
-                                  GFP_KERNEL);
-       if (!pctl->functions) {
+       ptr = krealloc(pctl->functions,
+                      pctl->nfunctions * sizeof(*pctl->functions),
+                      GFP_KERNEL);
+       if (!ptr) {
                kfree(pctl->functions);
+               pctl->functions = NULL;
                return -ENOMEM;
        }
+       pctl->functions = ptr;
 
        for (i = 0; i < pctl->desc->npins; i++) {
                const struct sunxi_desc_pin *pin = pctl->desc->pins + i;
@@ -1133,8 +1135,10 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
 
                        func_item = sunxi_pinctrl_find_function_by_name(pctl,
                                                                        func->name);
-                       if (!func_item)
+                       if (!func_item) {
+                               kfree(pctl->functions);
                                return -EINVAL;
+                       }
 
                        if (!func_item->groups) {
                                func_item->groups =
@@ -1142,8 +1146,10 @@ static int sunxi_pinctrl_build_state(struct platform_device *pdev)
                                                     func_item->ngroups,
                                                     sizeof(*func_item->groups),
                                                     GFP_KERNEL);
-                               if (!func_item->groups)
+                               if (!func_item->groups) {
+                                       kfree(pctl->functions);
                                        return -ENOMEM;
+                               }
                        }
 
                        func_grp = func_item->groups;