bpf: propagate nullness information for reg to reg comparisons
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 15 Nov 2022 22:48:58 +0000 (00:48 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 16 Nov 2022 01:38:36 +0000 (17:38 -0800)
commitbefae75856ab406a3f3fab2aa2118cf3b2dfe3e6
treedf373b27a681958e041929cd5a91b7f679616905
parent32637e33003f36e75e9147788cc0e2f21706ef99
bpf: propagate nullness information for reg to reg comparisons

Propagate nullness information for branches of register to register
equality compare instructions. The following rules are used:
- suppose register A maybe null
- suppose register B is not null
- for JNE A, B, ... - A is not null in the false branch
- for JEQ A, B, ... - A is not null in the true branch

E.g. for program like below:

  r6 = skb->sk;
  r7 = sk_fullsock(r6);
  r0 = sk_fullsock(r6);
  if (r0 == 0) return 0;    (a)
  if (r0 != r7) return 0;   (b)
  *r7->type;                (c)
  return 0;

It is safe to dereference r7 at point (c), because of (a) and (b).

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/r/20221115224859.2452988-2-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c