Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: at91: do not leak resources

Do not leak memory and free irqs in case of an error.

Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: David Dueck <davidcdueck@googlemail.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>

authored by

David Dueck and committed by
Stephen Boyd
c76a024e 15ab3827

+30 -10
+3 -1
drivers/clk/at91/clk-h32mx.c
··· 116 116 h32mxclk->pmc = pmc; 117 117 118 118 clk = clk_register(NULL, &h32mxclk->hw); 119 - if (!clk) 119 + if (!clk) { 120 + kfree(h32mxclk); 120 121 return; 122 + } 121 123 122 124 of_clk_add_provider(np, of_clk_src_simple_get, clk); 123 125 }
+3 -1
drivers/clk/at91/clk-main.c
··· 171 171 irq_set_status_flags(osc->irq, IRQ_NOAUTOEN); 172 172 ret = request_irq(osc->irq, clk_main_osc_irq_handler, 173 173 IRQF_TRIGGER_HIGH, name, osc); 174 - if (ret) 174 + if (ret) { 175 + kfree(osc); 175 176 return ERR_PTR(ret); 177 + } 176 178 177 179 if (bypass) 178 180 pmc_write(pmc, AT91_CKGR_MOR,
+6 -2
drivers/clk/at91/clk-master.c
··· 165 165 irq_set_status_flags(master->irq, IRQ_NOAUTOEN); 166 166 ret = request_irq(master->irq, clk_master_irq_handler, 167 167 IRQF_TRIGGER_HIGH, "clk-master", master); 168 - if (ret) 168 + if (ret) { 169 + kfree(master); 169 170 return ERR_PTR(ret); 171 + } 170 172 171 173 clk = clk_register(NULL, &master->hw); 172 - if (IS_ERR(clk)) 174 + if (IS_ERR(clk)) { 175 + free_irq(master->irq, master); 173 176 kfree(master); 177 + } 174 178 175 179 return clk; 176 180 }
+6 -2
drivers/clk/at91/clk-pll.c
··· 338 338 irq_set_status_flags(pll->irq, IRQ_NOAUTOEN); 339 339 ret = request_irq(pll->irq, clk_pll_irq_handler, IRQF_TRIGGER_HIGH, 340 340 id ? "clk-pllb" : "clk-plla", pll); 341 - if (ret) 341 + if (ret) { 342 + kfree(pll); 342 343 return ERR_PTR(ret); 344 + } 343 345 344 346 clk = clk_register(NULL, &pll->hw); 345 - if (IS_ERR(clk)) 347 + if (IS_ERR(clk)) { 348 + free_irq(pll->irq, pll); 346 349 kfree(pll); 350 + } 347 351 348 352 return clk; 349 353 }
+6 -2
drivers/clk/at91/clk-system.c
··· 130 130 irq_set_status_flags(sys->irq, IRQ_NOAUTOEN); 131 131 ret = request_irq(sys->irq, clk_system_irq_handler, 132 132 IRQF_TRIGGER_HIGH, name, sys); 133 - if (ret) 133 + if (ret) { 134 + kfree(sys); 134 135 return ERR_PTR(ret); 136 + } 135 137 } 136 138 137 139 clk = clk_register(NULL, &sys->hw); 138 - if (IS_ERR(clk)) 140 + if (IS_ERR(clk)) { 141 + free_irq(sys->irq, sys); 139 142 kfree(sys); 143 + } 140 144 141 145 return clk; 142 146 }
+6 -2
drivers/clk/at91/clk-utmi.c
··· 118 118 irq_set_status_flags(utmi->irq, IRQ_NOAUTOEN); 119 119 ret = request_irq(utmi->irq, clk_utmi_irq_handler, 120 120 IRQF_TRIGGER_HIGH, "clk-utmi", utmi); 121 - if (ret) 121 + if (ret) { 122 + kfree(utmi); 122 123 return ERR_PTR(ret); 124 + } 123 125 124 126 clk = clk_register(NULL, &utmi->hw); 125 - if (IS_ERR(clk)) 127 + if (IS_ERR(clk)) { 128 + free_irq(utmi->irq, utmi); 126 129 kfree(utmi); 130 + } 127 131 128 132 return clk; 129 133 }