• Alexei Starovoitov's avatar
    selftests/bpf: Workaround for get_stack_rawtp test. · fea549b0
    Alexei Starovoitov authored
    ./test_progs-no_alu32 -t get_stack_raw_tp
    fails due to:
    
    52: (85) call bpf_get_stack#67
    53: (bf) r8 = r0
    54: (bf) r1 = r8
    55: (67) r1 <<= 32
    56: (c7) r1 s>>= 32
    ; if (usize < 0)
    57: (c5) if r1 s< 0x0 goto pc+26
     R0=inv(id=0,smax_value=800) R1_w=inv(id=0,umax_value=800,var_off=(0x0; 0x3ff)) R6=ctx(id=0,off=0,imm=0) R7=map_value(id=0,off=0,ks=4,vs=1600,imm=0) R8_w=inv(id=0,smax_value=800) R9=inv800
    ; ksize = bpf_get_stack(ctx, raw_data + usize, max_len - usize, 0);
    58: (1f) r9 -= r8
    ; ksize = bpf_get_stack(ctx, raw_data + usize, max_len - usize, 0);
    59: (bf) r2 = r7
    60: (0f) r2 += r1
    regs=1 stack=0 before 52: (85) call bpf_get_stack#67
    ; ksize = bpf_get_stack(ctx, raw_data + usize, max_len - usize, 0);
    61: (bf) r1 = r6
    62: (bf) r3 = r9
    63: (b7) r4 = 0
    64: (85) call bpf_get_stack#67
     R0=inv(id=0,smax_value=800) R1_w=ctx(id=0,off=0,imm=0) R2_w=map_value(id=0,off=0,ks=4,vs=1600,umax_value=800,var_off=(0x0; 0x3ff),s32_max_value=1023,u32_max_value=1023) R3_w=inv(id=0,umax_value=9223372036854776608)
    R3 unbounded memory access, use 'var &= const' or 'if (var < const)'
    
    In the C code:
      usize = bpf_get_stack(ctx, raw_data, max_len, BPF_F_USER_STACK);
      if (usize < 0)
              return 0;
    
      ksize = bpf_get_stack(ctx, raw_data + usize, max_len - usize, 0);
      if (ksize < 0)
              return 0;
    
    We used to have problem with pointer arith in R2.
    Now it's a problem with two integers in R3.
    'if (usize < 0)' is comparing R1 and makes it [0,800], but R8 stays [-inf,800].
    Both registers represent the same 'usize' variable.
    Then R9 -= R8 is doing 800 - [-inf, 800]
    so the result of "max_len - usize" looks unbounded to the verifier while
    it's obvious in C code that "max_len - usize" should be [0, 800].
    
    To workaround the problem convert ksize and usize variables from int to long.
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    fea549b0
test_get_stack_rawtp.c 3.02 KB