| From 2f33720cbde8136eb9963be84f6d6d67331f4cec Mon Sep 17 00:00:00 2001 |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| Date: Tue, 15 Jan 2019 22:46:25 +0300 |
| Subject: clk: ti: Fix error handling in ti_clk_parse_divider_data() |
| |
| [ Upstream commit 303aef8b84272d73999a3207dd05bbe10ed89dc5 ] |
| |
| The ti_clk_parse_divider_data() function is only called from |
| _get_div_table_from_setup(). That function doesn't look at the return |
| value but instead looks at the "*table" pointer. In this case, if the |
| kcalloc() fails then *table is NULL (which means success). It should |
| instead be an error pointer. |
| |
| The ti_clk_parse_divider_data() function has two callers. One checks |
| for errors and the other doesn't. I have fixed it so now both handle |
| errors. |
| |
| Fixes: 4f6be5655dc9 ("clk: ti: divider: add driver internal API for parsing divider data") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Acked-by: Tero Kristo <t-kristo@ti.com> |
| Signed-off-by: Stephen Boyd <sboyd@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/clk/ti/divider.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/clk/ti/divider.c b/drivers/clk/ti/divider.c |
| index ccfb4d9a152a..079f0beda8b6 100644 |
| --- a/drivers/clk/ti/divider.c |
| +++ b/drivers/clk/ti/divider.c |
| @@ -367,8 +367,10 @@ int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div, |
| num_dividers = i; |
| |
| tmp = kcalloc(valid_div + 1, sizeof(*tmp), GFP_KERNEL); |
| - if (!tmp) |
| + if (!tmp) { |
| + *table = ERR_PTR(-ENOMEM); |
| return -ENOMEM; |
| + } |
| |
| valid_div = 0; |
| *width = 0; |
| @@ -403,6 +405,7 @@ struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup) |
| { |
| struct clk_omap_divider *div; |
| struct clk_omap_reg *reg; |
| + int ret; |
| |
| if (!setup) |
| return NULL; |
| @@ -422,6 +425,12 @@ struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup) |
| div->flags |= CLK_DIVIDER_POWER_OF_TWO; |
| |
| div->table = _get_div_table_from_setup(setup, &div->width); |
| + if (IS_ERR(div->table)) { |
| + ret = PTR_ERR(div->table); |
| + kfree(div); |
| + return ERR_PTR(ret); |
| + } |
| + |
| |
| div->shift = setup->bit_shift; |
| div->latch = -EINVAL; |
| -- |
| 2.19.1 |
| |