[PATCH v10 02/10] clk: nuvoton: ma35d1: Avoid possible error pointer dereferencing
From: Miquel Raynal
Date: Thu Oct 15 2026 - 12:25:37 EST
MA35D1 registration helpers store their parent_hw argument straight into
the parent data, without checking it first. In case of registration
failure an error pointer will be stored in the table, which is then
forwarded to the clk core, which treats any non-NULL parent as valid
handles.
Bail out early when the parent is an error pointer, instead of building
the parent data.
This issue is mostly theoretical in practice, since reaching such an
error would involve a very early -ENOMEM.
Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx>
---
drivers/clk/nuvoton/clk-ma35d1-divider.c | 3 +++
drivers/clk/nuvoton/clk-ma35d1-pll.c | 3 +++
drivers/clk/nuvoton/clk-ma35d1.c | 13 +++++++++++--
3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/nuvoton/clk-ma35d1-divider.c b/drivers/clk/nuvoton/clk-ma35d1-divider.c
index e992e7c30341..57a7b4ed3b5e 100644
--- a/drivers/clk/nuvoton/clk-ma35d1-divider.c
+++ b/drivers/clk/nuvoton/clk-ma35d1-divider.c
@@ -90,6 +90,9 @@ struct clk_hw *ma35d1_reg_adc_clkdiv(struct device *dev, const char *name,
int ret;
int i;
+ if (IS_ERR(parent_hw))
+ return parent_hw;
+
div = devm_kzalloc(dev, sizeof(*div), GFP_KERNEL);
if (!div)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/clk/nuvoton/clk-ma35d1-pll.c b/drivers/clk/nuvoton/clk-ma35d1-pll.c
index c7c0dc91a012..92424e9c669d 100644
--- a/drivers/clk/nuvoton/clk-ma35d1-pll.c
+++ b/drivers/clk/nuvoton/clk-ma35d1-pll.c
@@ -336,6 +336,9 @@ struct clk_hw *ma35d1_reg_clk_pll(struct device *dev, u32 id, u8 u8mode, const c
struct clk_hw *hw;
int ret;
+ if (IS_ERR(parent_hw))
+ return parent_hw;
+
pll = devm_kzalloc(dev, sizeof(*pll), GFP_KERNEL);
if (!pll)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/clk/nuvoton/clk-ma35d1.c b/drivers/clk/nuvoton/clk-ma35d1.c
index ba3550c083ac..00d635cdb604 100644
--- a/drivers/clk/nuvoton/clk-ma35d1.c
+++ b/drivers/clk/nuvoton/clk-ma35d1.c
@@ -130,10 +130,19 @@ static struct clk_hw *ma35d1_clk_mux(struct device *dev, const char *name,
const int *parent_idx, int num_parents)
{
const struct clk_hw *parent_hws[MA35D1_MUX_MAX_PARENTS] = {};
+ struct clk_hw *parent;
int i;
- for (i = 0; i < num_parents; i++)
- parent_hws[i] = (parent_idx[i] >= 0) ? hws[parent_idx[i]] : NULL;
+ for (i = 0; i < num_parents; i++) {
+ if (parent_idx[i] < 0)
+ continue;
+
+ parent = hws[parent_idx[i]];
+ if (IS_ERR(parent))
+ return parent;
+
+ parent_hws[i] = parent;
+ }
return devm_clk_hw_register_mux_parent_hws(dev, name, parent_hws, num_parents,
CLK_SET_RATE_NO_REPARENT, reg, shift,
--
2.55.0