[lvc-project] [PATCH RFC] renesas: add zero check for prate variable
Fedor Pchelkin
pchelkin at ispras.ru
Tue Apr 22 18:49:22 MSK 2025
Добрый день!
On Thu, 27. Mar 18:10, Tigran Sogomonian wrote:
> To avoid division by zero, a check was added to the prate
> variable, since no guarantees were found that it could not
> be equal to zero.
>
> Found by Linux Verification Center (linuxtesting.org) with SVACE.
>
Нужен тег Fixes в патче, чтобы понимать, насколько далеко это уходит.
> Signed-off-by: Tigran Sogomonian <tsogomonian at astralinux.ru>
> ---
> drivers/clk/renesas/rcar-gen3-cpg.c | 2 ++
> drivers/clk/renesas/rcar-gen4-cpg.c | 2 ++
> 2 files changed, 4 insertions(+)
>
> diff --git a/drivers/clk/renesas/rcar-gen3-cpg.c b/drivers/clk/renesas/rcar-gen3-cpg.c
> index 027100e84ee4..66da3b4398cd 100644
> --- a/drivers/clk/renesas/rcar-gen3-cpg.c
> +++ b/drivers/clk/renesas/rcar-gen3-cpg.c
> @@ -205,6 +205,8 @@ static int cpg_z_clk_determine_rate(struct clk_hw *hw,
> prate * zclk->fixed_div);
>
> prate = req->best_parent_rate / zclk->fixed_div;
> + if (prate == 0)
Лучше с WARN_ON_ONCE. Это неожидаемое событие, означающее серьёзную
ошибку в логике работы драйвера. Обычно топология и значения частот
тактовых генераторов задаются в device tree, но в данном случае какие-то
однозначные выводы действительно сделать проблематично.
Прошу подготовить патчи для 5.10 и 6.1 веток и направить в
lvc-patches at linuxtesting.org, отметив целевые ветки в теме письма.
> + return -EINVAL;
> min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL);
> max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL);
> if (max_mult < min_mult)
> diff --git a/drivers/clk/renesas/rcar-gen4-cpg.c b/drivers/clk/renesas/rcar-gen4-cpg.c
> index 31aa790fd003..4c9a7d699290 100644
> --- a/drivers/clk/renesas/rcar-gen4-cpg.c
> +++ b/drivers/clk/renesas/rcar-gen4-cpg.c
> @@ -308,6 +308,8 @@ static int cpg_z_clk_determine_rate(struct clk_hw *hw,
> prate * zclk->fixed_div);
>
> prate = req->best_parent_rate / zclk->fixed_div;
> + if (prate == 0)
> + return -EINVAL;
> min_mult = max(div64_ul(req->min_rate * 32ULL, prate), 1ULL);
> max_mult = min(div64_ul(req->max_rate * 32ULL, prate), 32ULL);
> if (max_mult < min_mult)
> --
> 2.47.1
More information about the lvc-project
mailing list