Commit c366287e authored by Eric Dumazet's avatar Eric Dumazet Committed by Alexei Starovoitov

bpf: fix divides by zero

Divides by zero are not nice, lets avoid them if possible.

Also do_div() seems not needed when dealing with 32bit operands,
but this seems a minor detail.

Fixes: bd4cf0ed ("net: filter: rework/optimize internal BPF interpreter's instruction set")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarsyzbot <syzkaller@googlegroups.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 8155aedf
...@@ -956,7 +956,7 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, ...@@ -956,7 +956,7 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,
DST = tmp; DST = tmp;
CONT; CONT;
ALU_MOD_X: ALU_MOD_X:
if (unlikely(SRC == 0)) if (unlikely((u32)SRC == 0))
return 0; return 0;
tmp = (u32) DST; tmp = (u32) DST;
DST = do_div(tmp, (u32) SRC); DST = do_div(tmp, (u32) SRC);
...@@ -975,7 +975,7 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, ...@@ -975,7 +975,7 @@ static unsigned int ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn,
DST = div64_u64(DST, SRC); DST = div64_u64(DST, SRC);
CONT; CONT;
ALU_DIV_X: ALU_DIV_X:
if (unlikely(SRC == 0)) if (unlikely((u32)SRC == 0))
return 0; return 0;
tmp = (u32) DST; tmp = (u32) DST;
do_div(tmp, (u32) SRC); do_div(tmp, (u32) SRC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment