• Alexei Starovoitov's avatar
    bpf: fix callees pruning callers · eea1c227
    Alexei Starovoitov authored
    The commit 7640ead9 partially resolved the issue of callees
    incorrectly pruning the callers.
    With introduction of bounded loops and jmps_processed heuristic
    single verifier state may contain multiple branches and calls.
    It's possible that new verifier state (for future pruning) will be
    allocated inside callee. Then callee will exit (still within the same
    verifier state). It will go back to the caller and there R6-R9 registers
    will be read and will trigger mark_reg_read. But the reg->live for all frames
    but the top frame is not set to LIVE_NONE. Hence mark_reg_read will fail
    to propagate liveness into parent and future walking will incorrectly
    conclude that the states are equivalent because LIVE_READ is not set.
    In other words the rule for parent/live should be:
    whenever register parentage chain is set the reg->live should be set to LIVE_NONE.
    is_state_visited logic already follows this rule for spilled registers.
    
    Fixes: 7640ead9 ("bpf: verifier: make sure callees don't prune with caller differences")
    Fixes: f4d7e40a ("bpf: introduce function calls (verification)")
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    eea1c227
verifier.c 252 KB