diff options
| author | Wang YanQing <udknight@gmail.com> | 2019-04-27 04:28:26 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-05-01 17:32:16 -0400 |
| commit | 711aef1bbf88212a21f7103e88f397b47a528805 (patch) | |
| tree | 50251af800517ab34fff64993a758ba2d2cf3190 /tools | |
| parent | 886b7a50100a50f1cbd08a6f8ec5884dfbe082dc (diff) | |
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>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/testing/selftests/bpf/verifier/jit.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/verifier/jit.c b/tools/testing/selftests/bpf/verifier/jit.c index be488b4495a3..c33adf344fae 100644 --- a/tools/testing/selftests/bpf/verifier/jit.c +++ b/tools/testing/selftests/bpf/verifier/jit.c | |||
| @@ -86,3 +86,22 @@ | |||
| 86 | .result = ACCEPT, | 86 | .result = ACCEPT, |
| 87 | .retval = 2, | 87 | .retval = 2, |
| 88 | }, | 88 | }, |
| 89 | { | ||
| 90 | "jit: jsgt, jslt", | ||
| 91 | .insns = { | ||
| 92 | BPF_LD_IMM64(BPF_REG_1, 0x80000000ULL), | ||
| 93 | BPF_LD_IMM64(BPF_REG_2, 0x0ULL), | ||
| 94 | BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_2, 2), | ||
| 95 | BPF_MOV64_IMM(BPF_REG_0, 1), | ||
| 96 | BPF_EXIT_INSN(), | ||
| 97 | |||
| 98 | BPF_JMP_REG(BPF_JSLT, BPF_REG_2, BPF_REG_1, 2), | ||
| 99 | BPF_MOV64_IMM(BPF_REG_0, 1), | ||
| 100 | BPF_EXIT_INSN(), | ||
| 101 | |||
| 102 | BPF_MOV64_IMM(BPF_REG_0, 2), | ||
| 103 | BPF_EXIT_INSN(), | ||
| 104 | }, | ||
| 105 | .result = ACCEPT, | ||
| 106 | .retval = 2, | ||
| 107 | }, | ||
