[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