• Eduard Zingerman's avatar
    selftests/bpf: adjust dummy_st_ops_success to detect additional error · 3b3b84aa
    Eduard Zingerman authored
    As reported by Jose E. Marchesi in off-list discussion, GCC and LLVM
    generate slightly different code for dummy_st_ops_success/test_1():
    
      SEC("struct_ops/test_1")
      int BPF_PROG(test_1, struct bpf_dummy_ops_state *state)
      {
      	int ret;
    
      	if (!state)
      		return 0xf2f3f4f5;
    
      	ret = state->val;
      	state->val = 0x5a;
      	return ret;
      }
    
      GCC-generated                  LLVM-generated
      ----------------------------   ---------------------------
      0: r1 = *(u64 *)(r1 + 0x0)     0: w0 = -0xd0c0b0b
      1: if r1 == 0x0 goto 5f        1: r1 = *(u64 *)(r1 + 0x0)
      2: r0 = *(s32 *)(r1 + 0x0)     2: if r1 == 0x0 goto 6f
      3: *(u32 *)(r1 + 0x0) = 0x5a   3: r0 = *(u32 *)(r1 + 0x0)
      4: exit                        4: w2 = 0x5a
      5: r0 = -0xd0c0b0b             5: *(u32 *)(r1 + 0x0) = r2
      6: exit                        6: exit
    
    If the 'state' argument is not marked as nullable in
    net/bpf/bpf_dummy_struct_ops.c, the verifier would assume that
    'r1 == 0x0' is never true:
    - for the GCC version, this means that instructions #5-6 would be
      marked as dead and removed;
    - for the LLVM version, all instructions would be marked as live.
    
    The test dummy_st_ops/dummy_init_ret_value actually sets the 'state'
    parameter to NULL.
    
    Therefore, when the 'state' argument is not marked as nullable,
    the GCC-generated version of the code would trigger a NULL pointer
    dereference at instruction #3.
    
    This patch updates the test_1() test case to always follow a shape
    similar to the GCC-generated version above, in order to verify whether
    the 'state' nullability is marked correctly.
    Reported-by: default avatarJose E. Marchesi <jemarch@gnu.org>
    Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
    Link: https://lore.kernel.org/r/20240424012821.595216-3-eddyz87@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    3b3b84aa
dummy_st_ops_success.c 1.29 KB