clk: vc5: check memory returned by kasprintf()
authorClaudiu Beznea <claudiu.beznea@microchip.com>
Tue, 30 May 2023 09:39:06 +0000 (12:39 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Jul 2023 14:21:32 +0000 (16:21 +0200)
[ Upstream commit 144601f6228de5598f03e693822b60a95c367a17 ]

kasprintf() returns a pointer to dynamically allocated memory.
Pointer could be NULL in case allocation fails. Check pointer validity.
Identified with coccinelle (kmerr.cocci script).

Fixes: f491276a5168 ("clk: vc5: Allow Versaclock driver to support multiple instances")
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Link: https://lore.kernel.org/r/20230530093913.1656095-2-claudiu.beznea@microchip.com
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/clk/clk-versaclock5.c

index 5f2c909..ef50ab7 100644 (file)
@@ -1027,6 +1027,11 @@ static int vc5_probe(struct i2c_client *client)
        }
 
        init.name = kasprintf(GFP_KERNEL, "%pOFn.mux", client->dev.of_node);
+       if (!init.name) {
+               ret = -ENOMEM;
+               goto err_clk;
+       }
+
        init.ops = &vc5_mux_ops;
        init.flags = 0;
        init.parent_names = parent_names;
@@ -1041,6 +1046,10 @@ static int vc5_probe(struct i2c_client *client)
                memset(&init, 0, sizeof(init));
                init.name = kasprintf(GFP_KERNEL, "%pOFn.dbl",
                                      client->dev.of_node);
+               if (!init.name) {
+                       ret = -ENOMEM;
+                       goto err_clk;
+               }
                init.ops = &vc5_dbl_ops;
                init.flags = CLK_SET_RATE_PARENT;
                init.parent_names = parent_names;
@@ -1056,6 +1065,10 @@ static int vc5_probe(struct i2c_client *client)
        /* Register PFD */
        memset(&init, 0, sizeof(init));
        init.name = kasprintf(GFP_KERNEL, "%pOFn.pfd", client->dev.of_node);
+       if (!init.name) {
+               ret = -ENOMEM;
+               goto err_clk;
+       }
        init.ops = &vc5_pfd_ops;
        init.flags = CLK_SET_RATE_PARENT;
        init.parent_names = parent_names;
@@ -1073,6 +1086,10 @@ static int vc5_probe(struct i2c_client *client)
        /* Register PLL */
        memset(&init, 0, sizeof(init));
        init.name = kasprintf(GFP_KERNEL, "%pOFn.pll", client->dev.of_node);
+       if (!init.name) {
+               ret = -ENOMEM;
+               goto err_clk;
+       }
        init.ops = &vc5_pll_ops;
        init.flags = CLK_SET_RATE_PARENT;
        init.parent_names = parent_names;
@@ -1092,6 +1109,10 @@ static int vc5_probe(struct i2c_client *client)
                memset(&init, 0, sizeof(init));
                init.name = kasprintf(GFP_KERNEL, "%pOFn.fod%d",
                                      client->dev.of_node, idx);
+               if (!init.name) {
+                       ret = -ENOMEM;
+                       goto err_clk;
+               }
                init.ops = &vc5_fod_ops;
                init.flags = CLK_SET_RATE_PARENT;
                init.parent_names = parent_names;
@@ -1110,6 +1131,10 @@ static int vc5_probe(struct i2c_client *client)
        memset(&init, 0, sizeof(init));
        init.name = kasprintf(GFP_KERNEL, "%pOFn.out0_sel_i2cb",
                              client->dev.of_node);
+       if (!init.name) {
+               ret = -ENOMEM;
+               goto err_clk;
+       }
        init.ops = &vc5_clk_out_ops;
        init.flags = CLK_SET_RATE_PARENT;
        init.parent_names = parent_names;
@@ -1136,6 +1161,10 @@ static int vc5_probe(struct i2c_client *client)
                memset(&init, 0, sizeof(init));
                init.name = kasprintf(GFP_KERNEL, "%pOFn.out%d",
                                      client->dev.of_node, idx + 1);
+               if (!init.name) {
+                       ret = -ENOMEM;
+                       goto err_clk;
+               }
                init.ops = &vc5_clk_out_ops;
                init.flags = CLK_SET_RATE_PARENT;
                init.parent_names = parent_names;