Re: [PATCH v2 5/5] rslib: Fix integer overflow on large fcr or prim

From: Randy Dunlap
Date: Sat Jun 18 2022 - 21:26:29 EST


Hi--


Somehow some of the kernel-doc notation in these files has been
entered incorrectly and you are propagating that mistake...
Please see below for more.


On 6/17/22 07:46, Zhang Boyang wrote:

> Signed-off-by: Zhang Boyang <zhangboyang.id@xxxxxxxxx>
> ---
> include/linux/rslib.h | 22 ++++++++++++
> lib/reed_solomon/decode_rs.c | 60 +++++++++++++++++++--------------
> lib/reed_solomon/reed_solomon.c | 30 ++++++++++++-----
> lib/reed_solomon/test_rslib.c | 8 ++---
> 4 files changed, 82 insertions(+), 38 deletions(-)
>
> diff --git a/include/linux/rslib.h b/include/linux/rslib.h
> index 44ec7c6f24b2..29abfb2de257 100644
> --- a/include/linux/rslib.h
> +++ b/include/linux/rslib.h

> @@ -127,6 +129,26 @@ static inline int rs_modnn(struct rs_codec *rs, int x)
> return x;
> }
>
> +/** modulo replacement for galois field arithmetics

/**
* rs_modnn_mul() - modulo replacement for galois field arithmetics

> + *
> + * @rs: Pointer to the RS codec
> + * @a: 0 <= a <= nn ; a*b is the value to reduce
> + * @b: 0 <= b <= nn ; a*b is the value to reduce
> + *
> + * Same as rs_modnn(a*b), but avoid interger overflow when calculating a*b

integer a * b


> +*/
> +static inline int rs_modnn_mul(struct rs_codec *rs, int a, int b)
> +{
> + /* nn <= 0xFFFF, so (a * b) will not overflow uint32_t */
> + uint32_t x = (uint32_t)a * (uint32_t)b;
> + uint32_t nn = (uint32_t)rs->nn;
> + while (x >= nn) {
> + x -= nn;
> + x = (x >> rs->mm) + (x & nn);
> + }
> + return (int)x;
> +}
> +
> /** modulo replacement for galois field arithmetics

/**
* rs_modnn() - modulo replacement for galois field arithmetics

> *
> * @rs: Pointer to the RS codec



--
~Randy