Message ID | 20200516080806.1459784-1-natechancellor@gmail.com (mailing list archive) |
---|---|
State | Accepted, archived |
Headers | show |
Series | [1/2] clk: bcm2835: Fix return type of bcm2835_register_gate | expand |
Quoting Nathan Chancellor (2020-05-16 01:08:06) > bcm2835_register_gate is used as a callback for the clk_register member > of bcm2835_clk_desc, which expects a struct clk_hw * return type but > bcm2835_register_gate returns a struct clk *. > > This discrepancy is hidden by the fact that bcm2835_register_gate is > cast to the typedef bcm2835_clk_register by the _REGISTER macro. This > turns out to be a control flow integrity violation, which is how this > was noticed. > > Change the return type of bcm2835_register_gate to be struct clk_hw * > and use clk_hw_register_gate to do so. This should be a non-functional > change as clk_register_gate calls clk_hw_register_gate anyways but this > is needed to avoid issues with further changes. > > Fixes: b19f009d4510 ("clk: bcm2835: Migrate to clk_hw based registration and OF APIs") > Link: https://github.com/ClangBuiltLinux/linux/issues/1028 > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> > --- Thanks. Applied to clk-next. > > base-commit: bdecf38f228bcca73b31ada98b5b7ba1215eb9c9 Please don't base on some random linux-next commit though.
On Tue, May 26, 2020 at 04:42:04PM -0700, Stephen Boyd wrote: > Quoting Nathan Chancellor (2020-05-16 01:08:06) > > bcm2835_register_gate is used as a callback for the clk_register member > > of bcm2835_clk_desc, which expects a struct clk_hw * return type but > > bcm2835_register_gate returns a struct clk *. > > > > This discrepancy is hidden by the fact that bcm2835_register_gate is > > cast to the typedef bcm2835_clk_register by the _REGISTER macro. This > > turns out to be a control flow integrity violation, which is how this > > was noticed. > > > > Change the return type of bcm2835_register_gate to be struct clk_hw * > > and use clk_hw_register_gate to do so. This should be a non-functional > > change as clk_register_gate calls clk_hw_register_gate anyways but this > > is needed to avoid issues with further changes. > > > > Fixes: b19f009d4510 ("clk: bcm2835: Migrate to clk_hw based registration and OF APIs") > > Link: https://github.com/ClangBuiltLinux/linux/issues/1028 > > Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> > > --- > > Thanks. Applied to clk-next. > > > > > base-commit: bdecf38f228bcca73b31ada98b5b7ba1215eb9c9 > > Please don't base on some random linux-next commit though. Sorry, should have just used clk-next directly instead of the HEAD of linux-next at the time. Just hard to keep track of all of the different maintainer trees so it is easier to just use linux-next. I do forget to use the output of --scm from get_maintainer.pl though, I should use that more often. Thank you for picking it up! Nathan
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c index ded13ccf768e..7c845c293af0 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -1448,13 +1448,13 @@ static struct clk_hw *bcm2835_register_clock(struct bcm2835_cprman *cprman, return &clock->hw; } -static struct clk *bcm2835_register_gate(struct bcm2835_cprman *cprman, +static struct clk_hw *bcm2835_register_gate(struct bcm2835_cprman *cprman, const struct bcm2835_gate_data *data) { - return clk_register_gate(cprman->dev, data->name, data->parent, - CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, - cprman->regs + data->ctl_reg, - CM_GATE_BIT, 0, &cprman->regs_lock); + return clk_hw_register_gate(cprman->dev, data->name, data->parent, + CLK_IGNORE_UNUSED | CLK_SET_RATE_GATE, + cprman->regs + data->ctl_reg, + CM_GATE_BIT, 0, &cprman->regs_lock); } typedef struct clk_hw *(*bcm2835_clk_register)(struct bcm2835_cprman *cprman,
bcm2835_register_gate is used as a callback for the clk_register member of bcm2835_clk_desc, which expects a struct clk_hw * return type but bcm2835_register_gate returns a struct clk *. This discrepancy is hidden by the fact that bcm2835_register_gate is cast to the typedef bcm2835_clk_register by the _REGISTER macro. This turns out to be a control flow integrity violation, which is how this was noticed. Change the return type of bcm2835_register_gate to be struct clk_hw * and use clk_hw_register_gate to do so. This should be a non-functional change as clk_register_gate calls clk_hw_register_gate anyways but this is needed to avoid issues with further changes. Fixes: b19f009d4510 ("clk: bcm2835: Migrate to clk_hw based registration and OF APIs") Link: https://github.com/ClangBuiltLinux/linux/issues/1028 Signed-off-by: Nathan Chancellor <natechancellor@gmail.com> --- drivers/clk/bcm/clk-bcm2835.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) base-commit: bdecf38f228bcca73b31ada98b5b7ba1215eb9c9