]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: arm64: Silence "UBSAN: negation-overflow" warning
authorSong Liu <song@kernel.org>
Tue, 18 Feb 2025 08:02:40 +0000 (00:02 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 23 Feb 2025 21:04:02 +0000 (13:04 -0800)
With UBSAN, test_bpf.ko triggers warnings like:

UBSAN: negation-overflow in arch/arm64/net/bpf_jit_comp.c:1333:28
negation of -2147483648 cannot be represented in type 's32' (aka 'int'):

Silence these warnings by casting imm to u32 first.

Reported-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Song Liu <song@kernel.org>
Tested-by: Breno Leitao <leitao@debian.org>
Link: https://lore.kernel.org/r/20250218080240.2431257-1-song@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
arch/arm64/net/bpf_jit_comp.c

index 8446848edddb839b6d8dfdef66587326705789cb..7409c8acbde354b077f6d34dce36e71aa7097eef 100644 (file)
@@ -272,7 +272,7 @@ static inline void emit_a64_add_i(const bool is64, const int dst, const int src,
 {
        if (is_addsub_imm(imm)) {
                emit(A64_ADD_I(is64, dst, src, imm), ctx);
-       } else if (is_addsub_imm(-imm)) {
+       } else if (is_addsub_imm(-(u32)imm)) {
                emit(A64_SUB_I(is64, dst, src, -imm), ctx);
        } else {
                emit_a64_mov_i(is64, tmp, imm, ctx);
@@ -1159,7 +1159,7 @@ emit_bswap_uxt:
        case BPF_ALU64 | BPF_SUB | BPF_K:
                if (is_addsub_imm(imm)) {
                        emit(A64_SUB_I(is64, dst, dst, imm), ctx);
-               } else if (is_addsub_imm(-imm)) {
+               } else if (is_addsub_imm(-(u32)imm)) {
                        emit(A64_ADD_I(is64, dst, dst, -imm), ctx);
                } else {
                        emit_a64_mov_i(is64, tmp, imm, ctx);
@@ -1330,7 +1330,7 @@ emit_cond_jmp:
        case BPF_JMP32 | BPF_JSLE | BPF_K:
                if (is_addsub_imm(imm)) {
                        emit(A64_CMP_I(is64, dst, imm), ctx);
-               } else if (is_addsub_imm(-imm)) {
+               } else if (is_addsub_imm(-(u32)imm)) {
                        emit(A64_CMN_I(is64, dst, -imm), ctx);
                } else {
                        emit_a64_mov_i(is64, tmp, imm, ctx);