lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 11 Apr 2012 18:02:41 -0700 From: Mike Turquette <mturquette@...aro.org> To: <arnd.bergmann@...aro.org> CC: <linux-kernel@...r.kernel.org>, <linux-arm-kernel@...ts.infradead.org>, <linaro-dev@...ts.linaro.org>, <patches@...aro.org>, Mike Turquette <mturquette@...aro.org>, Olof Johansson <olof@...om.net>, Russell King <linux@....linux.org.uk>, Sascha Hauer <s.hauer@...gutronix.de>, Shawn Guo <shawn.guo@...escale.com>, Richard Zhao <richard.zhao@...aro.org>, Saravana Kannan <skannan@...eaurora.org>, Mark Brown <broonie@...nsource.wolfsonmicro.com>, Andrew Lunn <andrew@...n.ch>, Viresh Kumar <viresh.kumar@...com> Subject: [PATCH 03/13] clk: core: clk_calc_new_rates handles NULL parents It is possible to call clk_set_rate on a clock with a NULL parent. One such example is an adjustable-rate root clock. Ensure that clk_calc_new_rates does not dereference parent without checking first and also handle the corner cases gracefully. Reported-by: Rajendra Nayak <rnayak@...com> Signed-off-by: Mike Turquette <mturquette@...aro.org> Cc: Arnd Bergman <arnd.bergmann@...aro.org> Cc: Olof Johansson <olof@...om.net> Cc: Russell King <linux@....linux.org.uk> Cc: Sascha Hauer <s.hauer@...gutronix.de> Cc: Shawn Guo <shawn.guo@...escale.com> Cc: Richard Zhao <richard.zhao@...aro.org> Cc: Saravana Kannan <skannan@...eaurora.org> Cc: Mark Brown <broonie@...nsource.wolfsonmicro.com> Cc: Andrew Lunn <andrew@...n.ch> Cc: Viresh Kumar <viresh.kumar@...com> --- drivers/clk/clk.c | 29 +++++++++++++++++++++-------- 1 files changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 4daacf5..d83a9e0 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -763,25 +763,38 @@ static void clk_calc_subtree(struct clk *clk, unsigned long new_rate) static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) { struct clk *top = clk; - unsigned long best_parent_rate = clk->parent->rate; + unsigned long best_parent_rate; unsigned long new_rate; - if (!clk->ops->round_rate && !(clk->flags & CLK_SET_RATE_PARENT)) { - clk->new_rate = clk->rate; + /* sanity */ + if (IS_ERR_OR_NULL(clk)) + return NULL; + + /* never propagate up to the parent */ + if (!(clk->flags & CLK_SET_RATE_PARENT)) { + if (!clk->ops->round_rate) { + clk->new_rate = clk->rate; + return NULL; + } else { + new_rate = clk->ops->round_rate(clk->hw, rate, NULL); + goto out; + } + } + + /* need clk->parent from here on out */ + if (!clk->parent) { + pr_debug("%s: %s has NULL parent\n", __func__, clk->name); return NULL; } - if (!clk->ops->round_rate && (clk->flags & CLK_SET_RATE_PARENT)) { + if (!clk->ops->round_rate) { top = clk_calc_new_rates(clk->parent, rate); new_rate = clk->new_rate = clk->parent->new_rate; goto out; } - if (clk->flags & CLK_SET_RATE_PARENT) - new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); - else - new_rate = clk->ops->round_rate(clk->hw, rate, NULL); + new_rate = clk->ops->round_rate(clk->hw, rate, &best_parent_rate); if (best_parent_rate != clk->parent->rate) { top = clk_calc_new_rates(clk->parent, best_parent_rate); -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists