mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Miquel Raynal <miquel.raynal@bootlin.com>
To: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	<linux-kernel@vger.kernel.org>
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Michael Walle" <michael@walle.cc>,
	"Rafał Miłecki" <rafal@milecki.pl>,
	"Robert Marko" <robert.marko@sartura.hr>,
	"Luka Perkov" <luka.perkov@sartura.hr>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	"Rob Herring" <robh+dt@kernel.org>,
	"Frank Rowand" <frowand.list@gmail.com>,
	devicetree@vger.kernel.org,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Stephen Boyd" <sboyd@kernel.org>,
	"Peter Chen" <peter.chen@kernel.org>,
	"Rob Herring" <robh@kernel.org>
Subject: [PATCH v3 01/20] of: Fix modalias string generation
Date: Wed,  8 Mar 2023 16:31:41 +0100	[thread overview]
Message-ID: <20230308153200.682248-2-miquel.raynal@bootlin.com> (raw)
In-Reply-To: <20230308153200.682248-1-miquel.raynal@bootlin.com>

The helper generating an OF based modalias (of_device_get_modalias())
works fine, but due to the use of snprintf() internally it needs a
buffer one byte longer than what should be needed just for the entire
string (excluding the '\0'). Most users of this helper are sysfs hooks
providing the modalias string to users. They all provide a PAGE_SIZE
buffer which is way above the number of bytes required to fit the
modalias string and hence do not suffer from this issue.

There is another user though, of_device_request_module(), which is only
called by drivers/usb/common/ulpi.c. This request module function is
faulty, but maybe because in most cases there is an alternative, ULPI
driver users have not noticed it.

In this function, of_device_get_modalias() is called twice. The first
time without buffer just to get the number of bytes required by the
modalias string (excluding the null byte), and a second time, after
buffer allocation, to fill the buffer. The allocation asks for an
additional byte, in order to store the trailing '\0'. However, the
buffer *length* provided to of_device_get_modalias() excludes this extra
byte. The internal use of snprintf() with a length that is exactly the
number of bytes to be written has the effect of using the last available
byte to store a '\0', which then smashes the last character of the
modalias string.

Provide the actual size of the buffer to of_device_get_modalias() to fix
this issue.

Note: the "str[size - 1] = '\0';" line is not really needed as snprintf
will anyway end the string with a null byte, but there is a possibility
that this function might be called on a struct device_node without
compatible, in this case snprintf() would not be executed. So we keep it
just to avoid possible unbounded strings.

Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Peter Chen <peter.chen@kernel.org>
Fixes: 9c829c097f2f ("of: device: Support loading a module with OF based modalias")
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
---
 drivers/of/device.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/of/device.c b/drivers/of/device.c
index 955bfb3d1a83..c91bb5899256 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -297,12 +297,15 @@ int of_device_request_module(struct device *dev)
 	if (size < 0)
 		return size;
 
-	str = kmalloc(size + 1, GFP_KERNEL);
+	/* Reserve an additional byte for the trailing '\0' */
+	size++;
+
+	str = kmalloc(size, GFP_KERNEL);
 	if (!str)
 		return -ENOMEM;
 
 	of_device_get_modalias(dev, str, size);
-	str[size] = '\0';
+	str[size - 1] = '\0';
 	ret = request_module(str);
 	kfree(str);
 
-- 
2.34.1


  reply	other threads:[~2023-03-08 15:32 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-08 15:31 [PATCH v3 00/20] [PATCH v3 00/20] nvmem: Layouts support Miquel Raynal
2023-03-08 15:31 ` Miquel Raynal [this message]
2023-03-08 15:31 ` [PATCH v3 02/20] of: Update of_device_get_modalias() Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 03/20] of: Rename of_modalias_node() Miquel Raynal
2023-03-08 15:38   ` Mark Brown
2023-03-08 15:31 ` [PATCH v3 04/20] of: Move of_modalias() to module.c Miquel Raynal
2023-03-09  2:22   ` Rob Herring
2023-03-08 15:31 ` [PATCH v3 05/20] of: Move the request module helper logic " Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 06/20] usb: ulpi: Use of_request_module() Miquel Raynal
2023-03-08 15:50   ` Heikki Krogerus
2023-03-08 15:31 ` [PATCH v3 07/20] of: device: Kill of_device_request_module() Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 08/20] dt-bindings: nvmem: Fix spelling mistake "platforn" -> "platform" Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 09/20] nvmem: core: introduce NVMEM layouts Miquel Raynal
2023-03-10 10:55   ` Srinivas Kandagatla
2023-03-10 11:00     ` Rafał Miłecki
2023-03-08 15:31 ` [PATCH v3 10/20] nvmem: core: handle the absence of expected layouts Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 11/20] nvmem: core: request layout modules loading Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 12/20] nvmem: core: add per-cell post processing Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 13/20] nvmem: core: allow to modify a cell before adding it Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 14/20] nvmem: imx-ocotp: replace global post processing with layouts Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 15/20] nvmem: cell: drop global cell_post_process Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 16/20] nvmem: core: provide own priv pointer in post process callback Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 17/20] nvmem: layouts: sl28vpd: Add new layout driver Miquel Raynal
2023-03-10 11:03   ` Srinivas Kandagatla
2023-03-10 11:16     ` Miquel Raynal
2023-03-10 11:43       ` Srinivas Kandagatla
2023-03-08 15:31 ` [PATCH v3 18/20] MAINTAINERS: add myself as sl28vpd nvmem " Miquel Raynal
2023-03-08 15:31 ` [PATCH v3 19/20] nvmem: layouts: onie-tlv: Add new " Miquel Raynal
2023-03-08 15:32 ` [PATCH v3 20/20] MAINTAINERS: Add myself as ONIE tlv NVMEM layout maintainer Miquel Raynal
2023-03-14 11:28 ` [PATCH v3 00/20] [PATCH v3 00/20] nvmem: Layouts support Srinivas Kandagatla

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=20230308153200.682248-2-miquel.raynal@bootlin.com \
    --to=miquel.raynal@bootlin.com \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luka.perkov@sartura.hr \
    --cc=michael@walle.cc \
    --cc=peter.chen@kernel.org \
    --cc=rafal@milecki.pl \
    --cc=robert.marko@sartura.hr \
    --cc=robh+dt@kernel.org \
    --cc=robh@kernel.org \
    --cc=sboyd@kernel.org \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=thomas.petazzoni@bootlin.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

all inboxes | Powered by JetHome®