[lvc-project] [PATCH] atm: horizon: Casting type 32 to 64 bits in make_rate().

Fedor Pchelkin pchelkin at ispras.ru
Tue Oct 15 14:31:52 MSK 2024


On Tue, 15. Oct 14:00, Fedor Pchelkin wrote:
> On Tue, 15. Oct 08:19, Andrey Shumilin wrote:
> > diff --git a/drivers/atm/horizon.c b/drivers/atm/horizon.c
> > index 4f2951cbe69c..6f3e65e65225 100644
> > --- a/drivers/atm/horizon.c
> > +++ b/drivers/atm/horizon.c
> > @@ -631,7 +631,7 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r,
> >  	// d == MIND and (c << (MAXPEXP+MIND)) < B
> >  	while (div < CR_MAXD) {
> >  		div++;
> > -		if (br_man <= (c << (CR_MAXPEXP+div-br_exp))) {
> 
> Здесь беззнаковое переполнение используется намеренно - видимо часть
> алгоритма, который повсюду в комментариях внутри и к данной функции
> описывается.
> 
> В Svacer предлагаю выставить Won't fix с данной аргументацией.

CR_MAXPEXP = 4
CR_MAXD = 14
0 <= div < CR_MAXD
0 <= br_exp < CR_MAXPEXP

Точнее сказать, (c << arg) будет давать 0, начиная с arg, равного 2.
arg не отрицательный и не превосходит 31, поэтому ошибки нет.

br_man на данном этапе больше нуля, т.к. он изначально задаётся значениями
  #define BR_HRZ 4000000l
  #define BR_ULT 5000000l
которые в процессе могут быть максимум сдвинуты на 4 бита вправо. Т.е.
br_man больше нуля.

Поэтому if-блок не будет выполняться для некорректных значений.

Влияния на безопасность здесь никакого нет, трогать данный древний код для
устранения возможно недостижимого или лишнего кода нет смысла - в upstream
он всё равно убран.

> 
> > +		if (br_man <= ((u64)c << (CR_MAXPEXP+div-br_exp))) {
> >  			// Equivalent to: B <= (c << (MAXPEXP+d))
> >  			// c << (MAXPEXP+d-1) < B <= c << (MAXPEXP+d)
> >  			// 1 << (MAXPEXP-1) < B/2^d/c <= 1 << MAXPEXP
> > @@ -645,7 +645,7 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r,
> >  					pre = DIV_ROUND_CLOSEST(br, c<<div);
> >  					break;
> >  				default: /* round_up */
> > -					pre = br/(c<<div);
> > +					pre = br/((u64)c<<div);
> >  			}
> >  			PRINTD (DBG_QOS, "B: p=%u, d=%u", pre, div);
> >  			goto got_it;
> > -- 
> > 2.30.2



More information about the lvc-project mailing list