clk: Check for allocation errors in of_clk_init()
authorStephen Boyd <sboyd@codeaurora.org>
Mon, 6 Jul 2015 23:48:19 +0000 (16:48 -0700)
committerStephen Boyd <sboyd@codeaurora.org>
Wed, 8 Jul 2015 00:20:03 +0000 (17:20 -0700)
Dan Carpenter reports that we don't check the allocation here for
failure. Add a failure check and free any previously allocated
providers from the clk_provider_list.

Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
drivers/clk/clk.c

index ddb4b541016fe986860a95a4a482d2f6c6713a3e..705156828a7a1f6a6edd3e1f89e22e344a0db340 100644 (file)
@@ -3112,8 +3112,17 @@ void __init of_clk_init(const struct of_device_id *matches)
 
        /* First prepare the list of the clocks providers */
        for_each_matching_node_and_match(np, matches, &match) {
-               struct clock_provider *parent =
-                       kzalloc(sizeof(struct clock_provider),  GFP_KERNEL);
+               struct clock_provider *parent;
+
+               parent = kzalloc(sizeof(*parent), GFP_KERNEL);
+               if (!parent) {
+                       list_for_each_entry_safe(clk_provider, next,
+                                                &clk_provider_list, node) {
+                               list_del(&clk_provider->node);
+                               kfree(clk_provider);
+                       }
+                       return;
+               }
 
                parent->clk_init_cb = match->data;
                parent->np = np;