[lvc-project] [PATCH v3] zstd: fixed possible 'rtbTable' underflow in FSE_normalizeCount()

Fedor Pchelkin pchelkin at ispras.ru
Thu Dec 11 22:30:12 MSK 2025


On Thu, 11. Dec 17:19, Ilya Krutskih wrote:
> 'rtbTable' may be underflowed because 'proba' is used without
> checking for a non-negative as index of rtbTable[].
> 
> Add check: proba >= 0
> 
> Cc: stable at vger.kernel.org # v5.10+
> Fixes: e0c1b49f5b67 ("lib: zstd: Upgrade to latest upstream zstd version 1.4.10")
> Signed-off-by: Ilya Krutskih <devsec at tpz.ru>
> ---

Добрый вечер!

Что здесь происходит? Откуда вдруг возникла третья версия патча (первые
две в lvc-списки рассылки вроде бы не приходили)?

Патч подготовлен с ошибками в форматировании.  Просьба направлять в
lvc-patches at linuxtesting.org на предварительное ревью до отправки в
межд. сообщество.

>  lib/zstd/compress/fse_compress.c | 7 ++++---

Точно не знаю, но есть предположение, что апстримная разработка zstd
ведётся на внешнем ресурсе (github) через пулл-реквесты.  Вряд ли через
патчи в списке рассылки.

>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/zstd/compress/fse_compress.c b/lib/zstd/compress/fse_compress.c
> index 44a3c10becf2..6b83f8bc943a 100644
> --- a/lib/zstd/compress/fse_compress.c
> +++ b/lib/zstd/compress/fse_compress.c
> @@ -492,9 +492,10 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
>                  stillToDistribute--;
>              } else {
>                  short proba = (short)((count[s]*step) >> scale);
> -                if (proba<8) {
> -                    U64 restToBeat = vStep * rtbTable[proba];
> -                    proba += (count[s]*step) - ((U64)proba<<scale) > restToBeat;
> +		if ((proba >= 0) && (proba < 8)) {

Зачем столько лишних скобок?

На это всё должен scripts/checkpatch.pl давать замечания.  Этот скрипт
рекомендуется прогонять у себя локально перед отправкой патчей куда-либо.

> +			U64 restToBeat = vStep * rtbTable[proba];
> +
> +			proba += (count[s]*step) - ((U64)proba<<scale) > restToBeat;
>                  }
>                  if (proba > largestP) { largestP=proba; largest=s; }
>                  normalizedCounter[s] = proba;
> -- 
> 2.43.0



More information about the lvc-project mailing list