• Daniel Borkmann's avatar
    bpf: Fix verifier jsgt branch analysis on max bound · ee114dd6
    Daniel Borkmann authored
    Fix incorrect is_branch{32,64}_taken() analysis for the jsgt case. The return
    code for both will tell the caller whether a given conditional jump is taken
    or not, e.g. 1 means branch will be taken [for the involved registers] and the
    goto target will be executed, 0 means branch will not be taken and instead we
    fall-through to the next insn, and last but not least a -1 denotes that it is
    not known at verification time whether a branch will be taken or not. Now while
    the jsgt has the branch-taken case correct with reg->s32_min_value > sval, the
    branch-not-taken case is off-by-one when testing for reg->s32_max_value < sval
    since the branch will also be taken for reg->s32_max_value == sval. The jgt
    branch analysis, for example, gets this right.
    
    Fixes: 3f50f132 ("bpf: Verifier, do explicit ALU32 bounds tracking")
    Fixes: 4f7b3e82 ("bpf: improve verifier branch analysis")
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    ee114dd6
verifier.c 347 KB