Hello Joe Stringer,
Commit de375f4e91e3 ("selftests/bpf: Add C tests for reference tracking") from Oct 2, 2018 (linux-next), leads to the following Smatch static checker warning:
./tools/testing/selftests/bpf/progs/test_sk_lookup_kern.c:70 sk_lookup_success() warn: potential pointer math issue ('tuple' is a 288 bit pointer)
./tools/testing/selftests/bpf/progs/test_sk_lookup_kern.c 55 SEC("?tc") 56 int sk_lookup_success(struct __sk_buff *skb) 57 { 58 void *data_end = (void *)(long)skb->data_end; 59 void *data = (void *)(long)skb->data; 60 struct ethhdr *eth = (struct ethhdr *)(data); 61 struct bpf_sock_tuple *tuple; 62 struct bpf_sock *sk; 63 size_t tuple_len; 64 bool ipv4; 65 66 if (eth + 1 > data_end) 67 return TC_ACT_SHOT; 68 69 tuple = get_tuple(data, sizeof(*eth), data_end, eth->h_proto, &ipv4); --> 70 if (!tuple || tuple + sizeof *tuple > data_end) ^^^^^^^^^^^^^^^^^^^^^ This is pointer math. It should be "tuple + 1" or (u8 *)tuple + sizeof(*tuple).
71 return TC_ACT_SHOT; 72 73 tuple_len = ipv4 ? sizeof(tuple->ipv4) : sizeof(tuple->ipv6); 74 sk = bpf_sk_lookup_tcp(skb, tuple, tuple_len, BPF_F_CURRENT_NETNS, 0); 75 bpf_printk("sk=%d\n", sk ? 1 : 0); 76 if (sk) 77 bpf_sk_release(sk); 78 return sk ? TC_ACT_OK : TC_ACT_UNSPEC; 79 }
regards, dan carpenter