From: Josh Law Date: Wed, 18 Mar 2026 07:48:05 +0000 (+0000) Subject: lib/bch: fix signed left-shift undefined behavior X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f42b510990030bbc0d6e4ba4486decbcd952b924;p=thirdparty%2Fkernel%2Fstable.git lib/bch: fix signed left-shift undefined behavior Patch series "lib/bch: fix undefined behavior from signed left-shifts". Fix two instances of undefined behavior in lib/bch.c caused by left-shifting signed integers into or past the sign bit. While the kernel's -fno-strict-overflow flag prevents miscompilation today, these are formally UB per C11 6.5.7p4 and trivial to fix. This patch (of 2): Use 1u instead of 1 to avoid undefined behavior when left-shifting into the sign bit of a signed int. deg() can return up to 31, and 1 << 31 is UB per C11. Link: https://lkml.kernel.org/r/20260318074806.16527-2-objecting@objecting.org Signed-off-by: Josh Law Reviewed-by: Andrew Morton Cc: Ivan Djelic Signed-off-by: Andrew Morton --- diff --git a/lib/bch.c b/lib/bch.c index 9561c0828802..ef733f08082f 100644 --- a/lib/bch.c +++ b/lib/bch.c @@ -392,7 +392,7 @@ static void compute_syndromes(struct bch_control *bch, uint32_t *ecc, for (j = 0; j < 2*t; j += 2) syn[j] ^= a_pow(bch, (j+1)*(i+s)); - poly ^= (1 << i); + poly ^= (1u << i); } } while (s > 0); @@ -612,7 +612,7 @@ static int find_poly_deg2_roots(struct bch_control *bch, struct gf_poly *poly, while (v) { i = deg(v); r ^= bch->xi_tab[i]; - v ^= (1 << i); + v ^= (1u << i); } /* verify root */ if ((gf_sqr(bch, r)^r) == u) {