From b8eab512bf9d253f96b0333ee0f1bffa1afc3170 Mon Sep 17 00:00:00 2001 From: Yann Gautier Date: Tue, 29 Mar 2022 09:51:21 +0200 Subject: [PATCH] fix(st-clock): check _clk_stm32_get_parent return This issue was found by Coverity (CID 376885). The _clk_stm32_get_parent() return shouldn't be negative. Return the error in this case. Signed-off-by: Yann Gautier Change-Id: I91eff7e99fcdac9a258100b163fd9b040a9bd2c0 --- drivers/st/clk/clk-stm32-core.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/st/clk/clk-stm32-core.c b/drivers/st/clk/clk-stm32-core.c index 355c9dab2..458df9365 100644 --- a/drivers/st/clk/clk-stm32-core.c +++ b/drivers/st/clk/clk-stm32-core.c @@ -327,6 +327,9 @@ int _clk_stm32_set_parent(struct stm32_clk_priv *priv, int clk, int clkp) } old_parent = _clk_stm32_get_parent(priv, clk); + if (old_parent < 0) { + return old_parent; + } if (old_parent == clkp) { return 0; } @@ -415,7 +418,7 @@ int _clk_stm32_get_parent(struct stm32_clk_priv *priv, int clk_id) sel = clk_mux_get_parent(priv, mux_id); } - if (sel < parent->num_parents) { + if ((sel >= 0) && (sel < parent->num_parents)) { return parent->id_parents[sel]; } @@ -488,6 +491,9 @@ unsigned long _clk_stm32_get_rate(struct stm32_clk_priv *priv, int id) } parent = _clk_stm32_get_parent(priv, id); + if (parent < 0) { + return 0UL; + } if (clk->ops->recalc_rate != NULL) { unsigned long prate = 0UL; @@ -517,6 +523,10 @@ unsigned long _clk_stm32_get_parent_rate(struct stm32_clk_priv *priv, int id) { int parent_id = _clk_stm32_get_parent(priv, id); + if (parent_id < 0) { + return 0UL; + } + return _clk_stm32_get_rate(priv, parent_id); } @@ -552,6 +562,9 @@ static int _clk_stm32_enable_core(struct stm32_clk_priv *priv, int id) if (priv->gate_refcounts[id] == 0U) { parent = _clk_stm32_get_parent(priv, id); + if (parent < 0) { + return parent; + } if (parent != CLK_IS_ROOT) { ret = _clk_stm32_enable_core(priv, parent); if (ret) { @@ -616,7 +629,7 @@ static void _clk_stm32_disable_core(struct stm32_clk_priv *priv, int id) clk_stm32_disable_call_ops(priv, id); parent = _clk_stm32_get_parent(priv, id); - if (parent != CLK_IS_ROOT) { + if ((parent >= 0) && (parent != CLK_IS_ROOT)) { _clk_stm32_disable_core(priv, parent); } }