Skip to content

Commit 65f9e1b

Browse files
GustavoARSilvabebarino
authored andcommitted
clk: socfpga: agilex: Add bounds-checking coverage for struct stratix10_clock_data
In order to gain the bounds-checking coverage that __counted_by provides to flexible-array members at run-time via CONFIG_UBSAN_BOUNDS (for array indexing) and CONFIG_FORTIFY_SOURCE (for strcpy/memcpy-family functions), we must make sure that the counter member, in this case `num`, is updated before the first access to the flex-array member, in this case array `hws`. commit f316cdf ("clk: Annotate struct clk_hw_onecell_data with __counted_by") introduced `__counted_by` for `struct clk_hw_onecell_data` together with changes to relocate some of assignments of counter `num` before `hws` is accessed: include/linux/clk-provider.h: 1380 struct clk_hw_onecell_data { 1381 unsigned int num; 1382 struct clk_hw *hws[] __counted_by(num); 1383 }; However, this structure is used as a member in other structs, in this case in `struct sstratix10_clock_data`: drivers/clk/socfpga/stratix10-clk.h: 9 struct stratix10_clock_data { 10 void __iomem *base; 11 12 /* Must be last */ 13 struct clk_hw_onecell_data clk_data; 14 }; Hence, we need to move the assignments to `clk_data->clk_data.num` after allocations for `struct stratix10_clock_data` and before accessing the flexible array `clk_data->clk_data.hws`. And, as assignments for both `clk_data->clk_data.num` and `clk_data->base` are originally adjacent to each other, relocate both assignments together. Reviewed-by: Kees Cook <[email protected]> Signed-off-by: Gustavo A. R. Silva <[email protected]> Link: https://lore.kernel.org/r/385c516c498e07eb9a521107e16a7efd26e86ea5.1698117815.git.gustavoars@kernel.org Signed-off-by: Stephen Boyd <[email protected]>
1 parent d761bb0 commit 65f9e1b

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

drivers/clk/socfpga/clk-agilex.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -471,12 +471,12 @@ static int agilex_clkmgr_init(struct platform_device *pdev)
471471
if (!clk_data)
472472
return -ENOMEM;
473473

474+
clk_data->clk_data.num = num_clks;
475+
clk_data->base = base;
476+
474477
for (i = 0; i < num_clks; i++)
475478
clk_data->clk_data.hws[i] = ERR_PTR(-ENOENT);
476479

477-
clk_data->base = base;
478-
clk_data->clk_data.num = num_clks;
479-
480480
agilex_clk_register_pll(agilex_pll_clks, ARRAY_SIZE(agilex_pll_clks), clk_data);
481481

482482
agilex_clk_register_c_perip(agilex_main_perip_c_clks,
@@ -511,12 +511,12 @@ static int n5x_clkmgr_init(struct platform_device *pdev)
511511
if (!clk_data)
512512
return -ENOMEM;
513513

514-
for (i = 0; i < num_clks; i++)
515-
clk_data->clk_data.hws[i] = ERR_PTR(-ENOENT);
516-
517514
clk_data->base = base;
518515
clk_data->clk_data.num = num_clks;
519516

517+
for (i = 0; i < num_clks; i++)
518+
clk_data->clk_data.hws[i] = ERR_PTR(-ENOENT);
519+
520520
n5x_clk_register_pll(agilex_pll_clks, ARRAY_SIZE(agilex_pll_clks), clk_data);
521521

522522
n5x_clk_register_c_perip(n5x_main_perip_c_clks,

drivers/clk/socfpga/clk-s10.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,12 @@ static int s10_clkmgr_init(struct platform_device *pdev)
402402
if (!clk_data)
403403
return -ENOMEM;
404404

405-
for (i = 0; i < num_clks; i++)
406-
clk_data->clk_data.hws[i] = ERR_PTR(-ENOENT);
407-
408405
clk_data->base = base;
409406
clk_data->clk_data.num = num_clks;
410407

408+
for (i = 0; i < num_clks; i++)
409+
clk_data->clk_data.hws[i] = ERR_PTR(-ENOENT);
410+
411411
s10_clk_register_pll(s10_pll_clks, ARRAY_SIZE(s10_pll_clks), clk_data);
412412

413413
s10_clk_register_c_perip(s10_main_perip_c_clks,

0 commit comments

Comments
 (0)