If clk_set_parent(clk, parent) is called when 'clk' is a root clock or
'clk' has a single parent different from 'parent' clock, a vain
attempt to find 'parent' index is still performed, which causes
either an allocation of 0-byte size lookup array or never used
sizeof(struct clk*) array.

Like in case of invalid clk_set_parent() of a multi-parent clock,
return -EINVAL in the cases described above without trying to allocate
a lookup table.

Signed-off-by: Vladimir Zapolskiy <v...@mleia.com>
---
 drivers/clk/clk.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index b4db67a..129ac0a 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -1794,8 +1794,13 @@ static int clk_core_set_parent(struct clk_core *core, 
struct clk_core *parent)
        if (core->parent == parent)
                goto out;
 
+       if (core->num_parents <= 1) {
+               ret = -EINVAL;
+               goto out;
+       }
+
        /* verify ops for for multi-parent clks */
-       if ((core->num_parents > 1) && (!core->ops->set_parent)) {
+       if (!core->ops->set_parent) {
                ret = -ENOSYS;
                goto out;
        }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-clk" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to