clk: at91: Fix use of unsigned loop index
authorAndrew Goodbody <andrew.goodbody@linaro.org>
Wed, 23 Jul 2025 14:13:49 +0000 (15:13 +0100)
committerEugen Hristev <eugen.hristev@linaro.org>
Wed, 13 Aug 2025 09:59:36 +0000 (12:59 +0300)
The use of the unsigned variable 'i' as a loop index leads to the test
for i being non-negative always being true. Instead declare 'i' as an
int so that the for loop will terminate as expected.
If the original for loop completes 'i' will be 1 past the end of the
array so decrement it in the subsequent error path to prevent an out of
bounds access occurring.

This issue was found by Smatch.

Signed-off-by: Andrew Goodbody <andrew.goodbody@linaro.org>
drivers/clk/at91/sckc.c

index 6d6f125..3fde8ea 100644 (file)
@@ -74,8 +74,8 @@ static struct clk *at91_sam9x60_clk_register_td_slck(struct sam9x60_sckc *sckc,
                int num_parents)
 {
        struct clk *clk;
-       int ret = -ENOMEM;
-       u32 val, i;
+       int ret = -ENOMEM, i;
+       u32 val;
 
        if (!sckc || !name || !parent_names || num_parents != 2)
                return ERR_PTR(-EINVAL);
@@ -99,8 +99,10 @@ static struct clk *at91_sam9x60_clk_register_td_slck(struct sam9x60_sckc *sckc,
        clk = &sckc->clk;
        ret = clk_register(clk, UBOOT_DM_CLK_AT91_SAM9X60_TD_SLCK, name,
                           parent_names[val]);
-       if (ret)
+       if (ret) {
+               i--;
                goto free;
+       }
 
        return clk;