From: Cosmin Tanislav <demonsingur@gmail.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Liam Girdwood <lgirdwood@gmail.com>,
Mark Brown <broonie@kernel.org>,
Watson Chow <watson.chow@avnet.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] regulator: max20086: fix invalid memory access
Date: Thu, 8 May 2025 12:17:47 +0300 [thread overview]
Message-ID: <e901a2f3-55fc-497a-9bcd-10d75b26990d@gmail.com> (raw)
In-Reply-To: <20250508064947.2567255-1-demonsingur@gmail.com>
On 5/8/25 9:49 AM, Cosmin Tanislav wrote:
> max20086_parse_regulators_dt() calls of_regulator_match() using an
> array of struct of_regulator_match allocated on the stack for the
> matches argument.
>
> of_regulator_match() calls devm_of_regulator_put_matches(), which calls
> devres_alloc() to allocate a struct devm_of_regulator_matches which will
> be de-allocated using devm_of_regulator_put_matches().
>
> struct devm_of_regulator_matches is populated with the stack allocated
> matches array.
>
> If the device fails to probe, devm_of_regulator_put_matches() will be
> called and will try to call of_node_put() on that stack pointer,
> generating the following dmesg entries:
>
> max20086 6-0028: Failed to read DEVICE_ID reg: -121
> kobject: '\xc0$\xa5\x03' (000000002cebcb7a): is not initialized, yet
> kobject_put() is being called.
>
> Followed by a stack trace matching the call flow described above.
>
> Switch to allocating the matches array using devm_kcalloc() to
> avoid accessing the stack pointer long after it's out of scope.
>
> This also has the advantage of allowing multiple max20086 to probe
> without overriding the data stored inside the global of_regulator_match.
>
I've made an error, the above paragraph is not relevant here, although
it is relevant for other usages of of_regulator_match() where the struct
of_regulator_match is a global array, which causes the data stored in it
to be overridden if another device using the same driver probes again,
which could cause of_node_put() to be called twice on the same of_node.
I'm sure that's not a common issue since it hasn't been fixed yet.
> Fixes: bfff546aae50 ("regulator: Add MAX20086-MAX20089 driver")
> Signed-off-by: Cosmin Tanislav <demonsingur@gmail.com>
> ---
> drivers/regulator/max20086-regulator.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c
> index 59eb23d467ec..198d45f8e884 100644
> --- a/drivers/regulator/max20086-regulator.c
> +++ b/drivers/regulator/max20086-regulator.c
> @@ -132,7 +132,7 @@ static int max20086_regulators_register(struct max20086 *chip)
>
> static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
> {
> - struct of_regulator_match matches[MAX20086_MAX_REGULATORS] = { };
> + struct of_regulator_match *matches;
> struct device_node *node;
> unsigned int i;
> int ret;
> @@ -143,6 +143,11 @@ static int max20086_parse_regulators_dt(struct max20086 *chip, bool *boot_on)
> return -ENODEV;
> }
>
> + matches = devm_kcalloc(chip->dev, chip->info->num_outputs,
> + sizeof(*matches), GFP_KERNEL);
> + if (!matches)
> + return -ENOMEM;
> +
> for (i = 0; i < chip->info->num_outputs; ++i)
> matches[i].name = max20086_output_names[i];
>
next prev parent reply other threads:[~2025-05-08 9:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-08 6:49 [PATCH] regulator: max20086: fix invalid memory access Cosmin Tanislav
2025-05-08 9:17 ` Cosmin Tanislav [this message]
2025-05-15 7:35 ` Mark Brown
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=e901a2f3-55fc-497a-9bcd-10d75b26990d@gmail.com \
--to=demonsingur@gmail.com \
--cc=broonie@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=watson.chow@avnet.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox