diff options
| author | Bjorn Andersson <bjorn.andersson@oss.qualcomm.com> | 2026-02-11 21:37:14 -0600 |
|---|---|---|
| committer | Mark Brown <broonie@kernel.org> | 2026-02-12 11:55:48 +0000 |
| commit | e243cdd87b911ce9968b62e4ab2b680dfadc4341 (patch) | |
| tree | 749de9e9980a227b4919251e0f70da677ff7788b | |
| parent | 1a4b0c999101b2532723f9bd9818b70ffa7580f4 (diff) | |
regulator: core: Remove regulator supply_name length limit
When creating the regulator object, associated with a consumer device,
the supply_name is string formatted into a statically sized buffer on
the stack, then strdup()'ed onto the heap.
Not only is the dance on the stack unnecessary, but when the device's
name is long we might not fit the constructed supply_name in the fixed
64 byte buffer on the stack.
One such case can be seen on the Qualcomm Rb3Gen2 board, where we find a
PCIe controller, with a PCIe switch, with a USB controller, with a USB
hub, consuming a regulator. In this example the dev->kobj.name itself is
62 characters long.
Drop the temporary buffer on the stack and kasprintf() the string
directly on the heap, both to simplify the code, and to remove the
length limitation.
Signed-off-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Link: https://patch.msgid.link/20260211-regulator-supply-name-length-v1-1-3875541c1576@oss.qualcomm.com
Signed-off-by: Mark Brown <broonie@kernel.org>
| -rw-r--r-- | drivers/regulator/core.c | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 8c2fd20edd50..80bb95750a20 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1965,8 +1965,6 @@ static const struct file_operations constraint_flags_fops = { #endif }; -#define REG_STR_SIZE 64 - static void link_and_create_debugfs(struct regulator *regulator, struct regulator_dev *rdev, struct device *dev) { @@ -2014,15 +2012,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, lockdep_assert_held_once(&rdev->mutex.base); if (dev) { - char buf[REG_STR_SIZE]; - int size; - - size = snprintf(buf, REG_STR_SIZE, "%s-%s", - dev->kobj.name, supply_name); - if (size >= REG_STR_SIZE) - return NULL; - - supply_name = kstrdup(buf, GFP_KERNEL); + supply_name = kasprintf(GFP_KERNEL, "%s-%s", dev->kobj.name, supply_name); if (supply_name == NULL) return NULL; } else { |
