bpf: Use scalar ids in mark_chain_precision()
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 13 Jun 2023 15:38:21 +0000 (18:38 +0300)
committerAndrii Nakryiko <andrii@kernel.org>
Tue, 13 Jun 2023 22:14:27 +0000 (15:14 -0700)
commit904e6ddf4133c52fdb9654c2cd2ad90f320d48b9
treef058b54d3abf0198d69d18f11943f17db132e9d3
parent25085b4e9251c77758964a8e8651338972353642
bpf: Use scalar ids in mark_chain_precision()

Change mark_chain_precision() to track precision in situations
like below:

    r2 = unknown value
    ...
  --- state #0 ---
    ...
    r1 = r2                 // r1 and r2 now share the same ID
    ...
  --- state #1 {r1.id = A, r2.id = A} ---
    ...
    if (r2 > 10) goto exit; // find_equal_scalars() assigns range to r1
    ...
  --- state #2 {r1.id = A, r2.id = A} ---
    r3 = r10
    r3 += r1                // need to mark both r1 and r2

At the beginning of the processing of each state, ensure that if a
register with a scalar ID is marked as precise, all registers sharing
this ID are also marked as precise.

This property would be used by a follow-up change in regsafe().

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20230613153824.3324830-2-eddyz87@gmail.com
include/linux/bpf_verifier.h
kernel/bpf/verifier.c
tools/testing/selftests/bpf/verifier/precise.c