test_maps fails in the sockmap test because sockmap_verdict_prog.c
drops the packet when the first 8 bytes are not directly accessible:
          if (data + 8 > data_end)
                          return SK_DROP;

The blamed commit removed bpf_skb_pull_data() from the stream parser
program so that the parser no longer modifies the skb. That was needed,
but it also removed an implicit side effect: bpf_skb_pull_data()
linearized enough of the skb for later direct packet access.

In this test, the send side goes through the sockmap SK_MSG path. The
skb can have skb->len == 20 while its linear area is empty, so the
verdict program sees data == data_end and drops the packet even though
the payload length is sufficient.

Keep the parser read-only, and pull the first 8 bytes in the verdict
program before reading or writing them. Reload data/data_end after
bpf_skb_pull_data() as required.

Reported-by: Ihor Solodrai <[email protected]>
Closes: 
https://lore.kernel.org/bpf/[email protected]/
Fixes: 22a0cc10dacb ("selftests/bpf: don't modify the skb in the strparser 
parser prog")
Signed-off-by: Jiayuan Chen <[email protected]>
---
 .../selftests/bpf/progs/sockmap_verdict_prog.c     | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c 
b/tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c
index 0660f29dca955..3177bc5b733ac 100644
--- a/tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c
+++ b/tools/testing/selftests/bpf/progs/sockmap_verdict_prog.c
@@ -44,8 +44,18 @@ int bpf_prog2(struct __sk_buff *skb)
        __sink(lport);
        __sink(rport);
 
-       if (data + 8 > data_end)
-               return SK_DROP;
+       if (data + 8 > data_end) {
+               if (bpf_skb_pull_data(skb, 8))
+                       return SK_DROP;
+
+               data = (void *)(long)skb->data;
+               data_end = (void *)(long)skb->data_end;
+
+               if (data + 8 > data_end)
+                       return SK_DROP;
+
+               d = data;
+       }
 
        map = d[0];
        sk = d[1];
-- 
2.43.0


Reply via email to