sockmap_parse_prog.c is attached as an SK_SKB stream parser and modifies
the skb. It calls bpf_skb_pull_data() and writes a byte into the packet.
A stream parser runs on strparser's message head and must not modify it.
A resize frees the frag_list segments strparser still tracks, leading to
a use-after-free.

Make the parser read-only. It only needs to return the message length,
which keeps it attaching once packet-modifying parsers are rejected.

Signed-off-by: Sechang Lim <[email protected]>
---
 .../selftests/bpf/progs/sockmap_parse_prog.c  | 22 -------------------
 1 file changed, 22 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/sockmap_parse_prog.c 
b/tools/testing/selftests/bpf/progs/sockmap_parse_prog.c
index c9abfe3a11af..56e9aebf05f2 100644
--- a/tools/testing/selftests/bpf/progs/sockmap_parse_prog.c
+++ b/tools/testing/selftests/bpf/progs/sockmap_parse_prog.c
@@ -5,28 +5,6 @@
 SEC("sk_skb1")
 int bpf_prog1(struct __sk_buff *skb)
 {
-       void *data_end = (void *)(long) skb->data_end;
-       void *data = (void *)(long) skb->data;
-       __u8 *d = data;
-       int err;
-
-       if (data + 10 > data_end) {
-               err = bpf_skb_pull_data(skb, 10);
-               if (err)
-                       return SK_DROP;
-
-               data_end = (void *)(long)skb->data_end;
-               data = (void *)(long)skb->data;
-               if (data + 10 > data_end)
-                       return SK_DROP;
-       }
-
-       /* This write/read is a bit pointless but tests the verifier and
-        * strparser handler for read/write pkt data and access into sk
-        * fields.
-        */
-       d = data;
-       d[7] = 1;
        return skb->len;
 }
 
-- 
2.43.0


Reply via email to