]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
lib/bch: fix signed left-shift undefined behavior
authorJosh Law <objecting@objecting.org>
Wed, 18 Mar 2026 07:48:05 +0000 (07:48 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 28 Mar 2026 04:19:48 +0000 (21:19 -0700)
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 <objecting@objecting.org>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Ivan Djelic <ivan.djelic@parrot.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/bch.c

index 9561c082880255063f463cba59c7c85e23edbba4..ef733f08082f7b684566a8c1b848163d08ae917b 100644 (file)
--- 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) {