summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlexei Starovoitov <ast@plumgrid.com>2014-10-10 20:30:23 -0700
committerDavid S. Miller <davem@davemloft.net>2014-10-14 13:13:14 -0400
commite0ee9c12157dc74e49e4731e0d07512e7d1ceb95 (patch)
treeadd38d7ee6a64ede3ed2e8ae26bb0f2a877b5c25 /net
parentb2532eb9abd88384aa586169b54a3e53574f29f8 (diff)
downloadop-kernel-dev-e0ee9c12157dc74e49e4731e0d07512e7d1ceb95.zip
op-kernel-dev-e0ee9c12157dc74e49e4731e0d07512e7d1ceb95.tar.gz
x86: bpf_jit: fix two bugs in eBPF JIT compiler
1. JIT compiler using multi-pass approach to converge to final image size, since x86 instructions are variable length. It starts with large gaps between instructions (so some jumps may use imm32 instead of imm8) and iterates until total program size is the same as in previous pass. This algorithm works only if program size is strictly decreasing. Programs that use LD_ABS insn need additional code in prologue, but it was not emitted during 1st pass, so there was a chance that 2nd pass would adjust imm32->imm8 jump offsets to the same number of bytes as increase in prologue, which may cause algorithm to erroneously decide that size converged. Fix it by always emitting largest prologue in the first pass which is detected by oldproglen==0 check. Also change error check condition 'proglen != oldproglen' to fail gracefully. 2. while staring at the code realized that 64-byte buffer may not be enough when 1st insn is large, so increase it to 128 to avoid buffer overflow (theoretical maximum size of prologue+div is 109) and add runtime check. Fixes: 622582786c9e ("net: filter: x86: internal BPF JIT") Reported-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> Tested-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud