diff options
| author | Dan Carpenter <dan.carpenter@oracle.com> | 2019-01-15 14:46:25 -0500 |
|---|---|---|
| committer | Stephen Boyd <sboyd@kernel.org> | 2019-01-24 14:23:32 -0500 |
| commit | 303aef8b84272d73999a3207dd05bbe10ed89dc5 (patch) | |
| tree | 1fe00e13f1110eab24421a9bd156d17528076df3 | |
| parent | a64a9c088b75cba5840320d57e0bbfb36739c3b5 (diff) | |
clk: ti: Fix error handling in ti_clk_parse_divider_data()
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>
| -rw-r--r-- | drivers/clk/ti/divider.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/clk/ti/divider.c b/drivers/clk/ti/divider.c index 8d77090ad94a..0241450f3eb3 100644 --- a/drivers/clk/ti/divider.c +++ b/drivers/clk/ti/divider.c | |||
| @@ -403,8 +403,10 @@ int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div, | |||
| 403 | num_dividers = i; | 403 | num_dividers = i; |
| 404 | 404 | ||
| 405 | tmp = kcalloc(valid_div + 1, sizeof(*tmp), GFP_KERNEL); | 405 | tmp = kcalloc(valid_div + 1, sizeof(*tmp), GFP_KERNEL); |
| 406 | if (!tmp) | 406 | if (!tmp) { |
| 407 | *table = ERR_PTR(-ENOMEM); | ||
| 407 | return -ENOMEM; | 408 | return -ENOMEM; |
| 409 | } | ||
| 408 | 410 | ||
| 409 | valid_div = 0; | 411 | valid_div = 0; |
| 410 | *width = 0; | 412 | *width = 0; |
| @@ -439,6 +441,7 @@ struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup) | |||
| 439 | { | 441 | { |
| 440 | struct clk_omap_divider *div; | 442 | struct clk_omap_divider *div; |
| 441 | struct clk_omap_reg *reg; | 443 | struct clk_omap_reg *reg; |
| 444 | int ret; | ||
| 442 | 445 | ||
| 443 | if (!setup) | 446 | if (!setup) |
| 444 | return NULL; | 447 | return NULL; |
| @@ -458,6 +461,12 @@ struct clk_hw *ti_clk_build_component_div(struct ti_clk_divider *setup) | |||
| 458 | div->flags |= CLK_DIVIDER_POWER_OF_TWO; | 461 | div->flags |= CLK_DIVIDER_POWER_OF_TWO; |
| 459 | 462 | ||
| 460 | div->table = _get_div_table_from_setup(setup, &div->width); | 463 | div->table = _get_div_table_from_setup(setup, &div->width); |
| 464 | if (IS_ERR(div->table)) { | ||
| 465 | ret = PTR_ERR(div->table); | ||
| 466 | kfree(div); | ||
| 467 | return ERR_PTR(ret); | ||
| 468 | } | ||
| 469 | |||
| 461 | 470 | ||
| 462 | div->shift = setup->bit_shift; | 471 | div->shift = setup->bit_shift; |
| 463 | div->latch = -EINVAL; | 472 | div->latch = -EINVAL; |
