[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