• A
    bpf: support decreasing order in direct packet access · d91b28ed
    Alexei Starovoitov 提交于
    when packet headers are accessed in 'decreasing' order (like TCP port
    may be fetched before the program reads IP src) the llvm may generate
    the following code:
    [...]                // R7=pkt(id=0,off=22,r=70)
    r2 = *(u32 *)(r7 +0) // good access
    [...]
    r7 += 40             // R7=pkt(id=0,off=62,r=70)
    r8 = *(u32 *)(r7 +0) // good access
    [...]
    r1 = *(u32 *)(r7 -20) // this one will fail though it's within a safe range
                          // it's doing *(u32*)(skb->data + 42)
    Fix verifier to recognize such code pattern
    
    Alos turned out that 'off > range' condition is not a verifier bug.
    It's a buggy program that may do something like:
    if (ptr + 50 > data_end)
      return 0;
    ptr += 60;
    *(u32*)ptr;
    in such case emit
    "invalid access to packet, off=0 size=4, R1(id=0,off=60,r=50)" error message,
    so all information is available for the program author to fix the program.
    
    Fixes: 969bf05e ("bpf: direct packet access")
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    Acked-by: NDaniel Borkmann <daniel@iogearbox.net>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    d91b28ed
verifier.c 76.8 KB