diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 5e31ee9f7512..35cba247c531 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -1411,11 +1411,39 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn) ALU(SUB, -) ALU(AND, &) ALU(OR, |) - ALU(LSH, <<) - ALU(RSH, >>) ALU(XOR, ^) ALU(MUL, *) #undef ALU + +#define ALU(OPCODE, OP) \ + ALU64_##OPCODE##_X: \ + if (SRC >= 64) \ + DST = 0; \ + else \ + DST = DST OP SRC; \ + CONT; \ + ALU_##OPCODE##_X: \ + if (SRC >= 32) \ + DST = 0; \ + else \ + DST = (u32) DST OP (u32) SRC; \ + CONT; \ + ALU64_##OPCODE##_K: \ + if (IMM >= 64) \ + DST = 0; \ + else \ + DST = DST OP IMM; \ + CONT; \ + ALU_##OPCODE##_K: \ + if (IMM >= 32) \ + DST = 0; \ + else \ + DST = (u32) DST OP (u32) IMM; \ + CONT; + + ALU(LSH, <<) + ALU(RSH, >>) +#undef ALU ALU_NEG: DST = (u32) -DST; CONT;