Skip to content
  • John Fastabend's avatar
    9efa9e49
    bpf, selftests: Add tests to sock_ops for loading sk · 9efa9e49
    John Fastabend authored
    
    
    Add tests to directly accesse sock_ops sk field. Then use it to
    ensure a bad pointer access will fault if something goes wrong.
    We do three tests:
    
    The first test ensures when we read sock_ops sk pointer into the
    same register that we don't fault as described earlier. Here r9
    is chosen as the temp register.  The xlated code is,
    
      36: (7b) *(u64 *)(r1 +32) = r9
      37: (61) r9 = *(u32 *)(r1 +28)
      38: (15) if r9 == 0x0 goto pc+3
      39: (79) r9 = *(u64 *)(r1 +32)
      40: (79) r1 = *(u64 *)(r1 +0)
      41: (05) goto pc+1
      42: (79) r9 = *(u64 *)(r1 +32)
    
    The second test ensures the temp register selection does not collide
    with in-use register r9. Shown here r8 is chosen because r9 is the
    sock_ops pointer. The xlated code is as follows,
    
      46: (7b) *(u64 *)(r9 +32) = r8
      47: (61) r8 = *(u32 *)(r9 +28)
      48: (15) if r8 == 0x0 goto pc+3
      49: (79) r8 = *(u64 *)(r9 +32)
      50: (79) r9 = *(u64 *)(r9 +0)
      51: (05) goto pc+1
      52: (79) r8 = *(u64 *)(r9 +32)
    
    And finally, ensure we didn't break the base case where dst_reg does
    not equal the source register,
    
      56: (61) r2 = *(u32 *)(r1 +28)
      57: (15) if r2 == 0x0 goto pc+1
      58: (79) r2 = *(u64 *)(r1 +0)
    
    Notice it takes us an extra four instructions when src reg is the
    same as dst reg. One to save the reg, two to restore depending on
    the branch taken and a goto to jump over the second restore.
    
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/159718355325.4728.4163036953345999636.stgit@john-Precision-5820-Tower
    9efa9e49
    bpf, selftests: Add tests to sock_ops for loading sk
    John Fastabend authored
    
    
    Add tests to directly accesse sock_ops sk field. Then use it to
    ensure a bad pointer access will fault if something goes wrong.
    We do three tests:
    
    The first test ensures when we read sock_ops sk pointer into the
    same register that we don't fault as described earlier. Here r9
    is chosen as the temp register.  The xlated code is,
    
      36: (7b) *(u64 *)(r1 +32) = r9
      37: (61) r9 = *(u32 *)(r1 +28)
      38: (15) if r9 == 0x0 goto pc+3
      39: (79) r9 = *(u64 *)(r1 +32)
      40: (79) r1 = *(u64 *)(r1 +0)
      41: (05) goto pc+1
      42: (79) r9 = *(u64 *)(r1 +32)
    
    The second test ensures the temp register selection does not collide
    with in-use register r9. Shown here r8 is chosen because r9 is the
    sock_ops pointer. The xlated code is as follows,
    
      46: (7b) *(u64 *)(r9 +32) = r8
      47: (61) r8 = *(u32 *)(r9 +28)
      48: (15) if r8 == 0x0 goto pc+3
      49: (79) r8 = *(u64 *)(r9 +32)
      50: (79) r9 = *(u64 *)(r9 +0)
      51: (05) goto pc+1
      52: (79) r8 = *(u64 *)(r9 +32)
    
    And finally, ensure we didn't break the base case where dst_reg does
    not equal the source register,
    
      56: (61) r2 = *(u32 *)(r1 +28)
      57: (15) if r2 == 0x0 goto pc+1
      58: (79) r2 = *(u64 *)(r1 +0)
    
    Notice it takes us an extra four instructions when src reg is the
    same as dst reg. One to save the reg, two to restore depending on
    the branch taken and a goto to jump over the second restore.
    
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/bpf/159718355325.4728.4163036953345999636.stgit@john-Precision-5820-Tower
Loading