Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46060778 authored by Eric Dumazet's avatar Eric Dumazet Committed by Greg Kroah-Hartman
Browse files

bpf: fix divides by zero



[ upstream commit c366287ebd698ef5e3de300d90cd62ee9ee7373e ]

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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5cb917aa
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -642,7 +642,7 @@ static unsigned int __bpf_prog_run(void *ctx, 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);
@@ -661,7 +661,7 @@ static unsigned int __bpf_prog_run(void *ctx, 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);