All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Jason Cooper <jason@lakedaemon.net>,
	linux-kernel@vger.kernel.org
Subject: Re: memory leak and other oddness in pinctrl-mvebu.c
Date: Sat, 09 Mar 2013 19:02:05 +0000	[thread overview]
Message-ID: <1362855725.3690.92.camel@shinybook.infradead.org> (raw)
In-Reply-To: <513AF783.6050906@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3098 bytes --]

On Sat, 2013-03-09 at 09:49 +0100, Sebastian Hesselbarth wrote:
> I don't have a strong opinion on that, but I prefer not to have the list
> statically in the SoC specific drivers. I think counting the number of
> unique functions for each SoC specific driver once and verify the above
> heuristic (fewer unique functions than pins) is still valid. Then drop
> the krealloc and leave the array the way it is allocated on devm_kzalloc.

Yeah. If you stick a check in the loop and make it warn if it *would*
have run over the end of the array, that sounds like it ought to be
fine. Something like this, perhaps? Still untested but otherwise
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

diff --git a/drivers/pinctrl/mvebu/pinctrl-mvebu.c b/drivers/pinctrl/mvebu/pinctrl-mvebu.c
index c689c04..55d55d5 100644
--- a/drivers/pinctrl/mvebu/pinctrl-mvebu.c
+++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c
@@ -478,7 +478,8 @@ static struct pinctrl_ops mvebu_pinctrl_ops = {
 	.dt_free_map = mvebu_pinctrl_dt_free_map,
 };
 
-static int _add_function(struct mvebu_pinctrl_function *funcs, const char *name)
+static int _add_function(struct mvebu_pinctrl_function *funcs, int nr_funcs,
+			 const char *name)
 {
 	while (funcs->num_groups) {
 		/* function already there */
@@ -487,7 +488,11 @@ static int _add_function(struct mvebu_pinctrl_function *funcs, const char *name)
 			return -EEXIST;
 		}
 		funcs++;
+		nr_funcs--;
 	}
+	if (!nr_funcs)
+		return -EOVERFLOW;
+
 	funcs->name = name;
 	funcs->num_groups = 1;
 	return 0;
@@ -501,7 +506,7 @@ static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
 	int n, s;
 
 	/* we allocate functions for number of pins and hope
-	 * there are less unique functions than pins available */
+	 * there are fewer unique functions than pins available */
 	funcs = devm_kzalloc(&pdev->dev, pctl->desc.npins *
 			     sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
 	if (!funcs)
@@ -510,26 +515,27 @@ static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
 	for (n = 0; n < pctl->num_groups; n++) {
 		struct mvebu_pinctrl_group *grp = &pctl->groups[n];
 		for (s = 0; s < grp->num_settings; s++) {
+			int ret;
+
 			/* skip unsupported settings on this variant */
 			if (pctl->variant &&
 			    !(pctl->variant & grp->settings[s].variant))
 				continue;
 
 			/* check for unique functions and count groups */
-			if (_add_function(funcs, grp->settings[s].name))
+			ret = _add_function(funcs, pctl->desc.npins,
+					    grp->settings[s].name);
+			if (ret == -EOVERFLOW)
+				dev_err(&pdev->dev,
+					"More functions than pins(%d)\n",
+					pctl->desc.npins);
+			if (ret)
 				continue;
 
 			num++;
 		}
 	}
 
-	/* with the number of unique functions and it's groups known,
-	   reallocate functions and assign group names */
-	funcs = krealloc(funcs, num * sizeof(struct mvebu_pinctrl_function),
-			 GFP_KERNEL);
-	if (!funcs)
-		return -ENOMEM;
-
 	pctl->num_functions = num;
 	pctl->functions = funcs;
 


-- 
dwmw2


[-- Attachment #2: smime.p7s --]
[-- Type: application/x-pkcs7-signature, Size: 6171 bytes --]

  reply	other threads:[~2013-03-09 19:02 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-08 15:58 memory leak and other oddness in pinctrl-mvebu.c David Woodhouse
2013-03-09  8:49 ` Sebastian Hesselbarth
2013-03-09 19:02   ` David Woodhouse [this message]
2013-03-09 19:46     ` Sebastian Hesselbarth
2013-03-09 22:53     ` Jason Cooper
2013-03-09 23:39       ` David Woodhouse
2013-03-10  0:06         ` Jason Cooper
2013-03-10  0:06           ` Jason Cooper
2013-03-13 16:59           ` Linus Walleij
2013-03-13 16:59             ` Linus Walleij
2013-03-13 17:35         ` [PATCH] pinctrl: mvebu: prevent walking off the end of group array Jason Cooper
2013-03-13 17:35           ` Jason Cooper
2013-03-13 17:47           ` Linus Walleij
2013-03-13 17:47             ` Linus Walleij
2013-03-13 17:50             ` Jason Cooper
2013-03-13 17:50               ` Jason Cooper
2013-03-13 18:40               ` Linus Walleij
2013-03-13 18:40                 ` Linus Walleij
2013-03-13 17:48           ` Sebastian Hesselbarth
2013-03-13 17:48             ` Sebastian Hesselbarth
2013-03-13 17:48         ` [PATCH V2] " Jason Cooper
2013-03-13 17:48           ` Jason Cooper
2013-03-14 10:29           ` David Woodhouse
2013-03-14 10:29             ` David Woodhouse
2013-03-16 11:44           ` [PATCH v3] " Sebastian Hesselbarth
2013-03-16 11:44             ` Sebastian Hesselbarth
2013-03-22 16:39             ` Jason Cooper
2013-03-22 16:39               ` Jason Cooper
2013-03-27 22:06             ` Linus Walleij
2013-03-27 22:06               ` Linus Walleij
2013-03-27 22:11               ` Woodhouse, David
2013-03-27 22:11                 ` Woodhouse, David
2013-03-27 22:34                 ` Linus Walleij
2013-03-27 22:34                   ` Linus Walleij
2013-03-28 11:08                   ` Jason Cooper
2013-03-28 11:08                     ` Jason Cooper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1362855725.3690.92.camel@shinybook.infradead.org \
    --to=dwmw2@infradead.org \
    --cc=jason@lakedaemon.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sebastian.hesselbarth@gmail.com \
    --cc=swarren@wwwdotorg.org \
    --cc=thomas.petazzoni@free-electrons.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.