bpf, x32: Fix bug for BPF_JMP | {BPF_JSGT, BPF_JSLE, BPF_JSLT, BPF_JSGE}
authorWang YanQing <udknight@gmail.com>
Sat, 27 Apr 2019 08:28:26 +0000 (16:28 +0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 1 May 2019 21:32:16 +0000 (23:32 +0200)
commit711aef1bbf88212a21f7103e88f397b47a528805
tree50251af800517ab34fff64993a758ba2d2cf3190
parent886b7a50100a50f1cbd08a6f8ec5884dfbe082dc
bpf, x32: Fix bug for BPF_JMP | {BPF_JSGT, BPF_JSLE, BPF_JSLT, BPF_JSGE}

The current method to compare 64-bit numbers for conditional jump is:

1) Compare the high 32-bit first.

2) If the high 32-bit isn't the same, then goto step 4.

3) Compare the low 32-bit.

4) Check the desired condition.

This method is right for unsigned comparison, but it is buggy for signed
comparison, because it does signed comparison for low 32-bit too.

There is only one sign bit in 64-bit number, that is the MSB in the 64-bit
number, it is wrong to treat low 32-bit as signed number and do the signed
comparison for it.

This patch fixes the bug and adds a testcase in selftests/bpf for such bug.

Signed-off-by: Wang YanQing <udknight@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
arch/x86/net/bpf_jit_comp32.c
tools/testing/selftests/bpf/verifier/jit.c