* [PATCH bpf 0/2] Fix partial copy of non-linear skb test_run output @ 2026-06-15 7:38 Sun Jian 2026-06-15 7:38 ` [PATCH bpf 1/2] bpf: " Sun Jian 2026-06-15 7:38 ` [PATCH bpf 2/2] selftests/bpf: Cover " Sun Jian 0 siblings, 2 replies; 5+ messages in thread From: Sun Jian @ 2026-06-15 7:38 UTC (permalink / raw) To: bpf Cc: netdev, linux-kselftest, linux-kernel, ast, daniel, andrii, martin.lau, eddyz87, memxor, song, yonghong.song, jolsa, shuah, paul.chaignon, Sun Jian This series fixes BPF_PROG_TEST_RUN copy-out handling for non-linear skbs when userspace provides a short data_out buffer. Patch 1 fixes bpf_test_finish() to compute the skb linear head copy length from the skb layout instead of deriving it from the clamped copy size. Patch 2 adds a selftest covering a non-linear skb with a short data_out buffer. The test checks that test_run returns -ENOSPC, reports the full packet length through data_size_out, and copies the packet prefix into data_out. Tested with: ./test_progs -t skb_load_bytes Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED ./test_progs -t skb_load_bytes -v test_nonlinear_data_out_partial:PASS:nonlinear_partial_err test_nonlinear_data_out_partial:PASS:nonlinear_partial_data_size_out test_nonlinear_data_out_partial:PASS:nonlinear_partial_data_out Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED ./test_progs -t skb Summary: 14/92 PASSED, 0 SKIPPED, 0 FAILED Sun Jian (2): bpf: Fix partial copy of non-linear skb test_run output selftests/bpf: Cover partial copy of non-linear skb test_run output net/bpf/test_run.c | 11 +++--- .../selftests/bpf/prog_tests/skb_load_bytes.c | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) -- 2.43.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf 1/2] bpf: Fix partial copy of non-linear skb test_run output 2026-06-15 7:38 [PATCH bpf 0/2] Fix partial copy of non-linear skb test_run output Sun Jian @ 2026-06-15 7:38 ` Sun Jian 2026-06-15 13:39 ` Paul Chaignon 2026-06-15 7:38 ` [PATCH bpf 2/2] selftests/bpf: Cover " Sun Jian 1 sibling, 1 reply; 5+ messages in thread From: Sun Jian @ 2026-06-15 7:38 UTC (permalink / raw) To: bpf Cc: netdev, linux-kselftest, linux-kernel, ast, daniel, andrii, martin.lau, eddyz87, memxor, song, yonghong.song, jolsa, shuah, paul.chaignon, Sun Jian For non-linear skbs, bpf_test_finish() derives the linear head copy length from copy_size - frag_size. This only matches the skb head length when copy_size is the full packet size. When userspace provides a short data_out buffer, copy_size is clamped to that buffer size. If copy_size is smaller than frag_size, the computed length becomes negative and bpf_test_finish() returns -ENOSPC before copying the packet prefix or updating data_size_out. Compute the linear head length from the skb layout instead, and clamp the head copy length to copy_size. This preserves the expected partial-copy semantics: return -ENOSPC, copy the packet prefix that fits in data_out, and report the full packet length through data_size_out. Fixes: 838baa351cee ("bpf: Craft non-linear skbs in BPF_PROG_TEST_RUN") Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com> --- net/bpf/test_run.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 2bc04feadfab..976e8fa31bc9 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -453,19 +453,16 @@ static int bpf_test_finish(const union bpf_attr *kattr, } if (data_out) { - int len = sinfo ? copy_size - frag_size : copy_size; - - if (len < 0) { - err = -ENOSPC; - goto out; - } + u32 head_len = size - frag_size; + u32 len = min(copy_size, head_len); if (copy_to_user(data_out, data, len)) goto out; if (sinfo) { - int i, offset = len; + u32 offset = len; u32 data_len; + int i; for (i = 0; i < sinfo->nr_frags; i++) { skb_frag_t *frag = &sinfo->frags[i]; -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH bpf 1/2] bpf: Fix partial copy of non-linear skb test_run output 2026-06-15 7:38 ` [PATCH bpf 1/2] bpf: " Sun Jian @ 2026-06-15 13:39 ` Paul Chaignon 0 siblings, 0 replies; 5+ messages in thread From: Paul Chaignon @ 2026-06-15 13:39 UTC (permalink / raw) To: Sun Jian Cc: bpf, netdev, linux-kselftest, linux-kernel, ast, daniel, andrii, martin.lau, eddyz87, memxor, song, yonghong.song, jolsa, shuah On Mon, Jun 15, 2026 at 03:38:55PM +0800, Sun Jian wrote: > For non-linear skbs, bpf_test_finish() derives the linear head copy > length from copy_size - frag_size. This only matches the skb head length > when copy_size is the full packet size. > > When userspace provides a short data_out buffer, copy_size is clamped to > that buffer size. If copy_size is smaller than frag_size, the computed > length becomes negative and bpf_test_finish() returns -ENOSPC before > copying the packet prefix or updating data_size_out. Thanks for fixing this! > > Compute the linear head length from the skb layout instead, and clamp the > head copy length to copy_size. This preserves the expected partial-copy > semantics: return -ENOSPC, copy the packet prefix that fits in data_out, > and report the full packet length through data_size_out. > > Fixes: 838baa351cee ("bpf: Craft non-linear skbs in BPF_PROG_TEST_RUN") Wouldn't this bug actually go back to 7855e0db150ad ("bpf: test_run: add xdp_shared_info pointer in bpf_test_finish signature") and also affect the XDP bpf_prog_test_run_xdp()? If so, could you also add a selftest that covers it for XDP? > Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com> > --- > net/bpf/test_run.c | 11 ++++------- > 1 file changed, 4 insertions(+), 7 deletions(-) > > diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c > index 2bc04feadfab..976e8fa31bc9 100644 > --- a/net/bpf/test_run.c > +++ b/net/bpf/test_run.c > @@ -453,19 +453,16 @@ static int bpf_test_finish(const union bpf_attr *kattr, > } > > if (data_out) { > - int len = sinfo ? copy_size - frag_size : copy_size; > - > - if (len < 0) { > - err = -ENOSPC; > - goto out; > - } > + u32 head_len = size - frag_size; > + u32 len = min(copy_size, head_len); > > if (copy_to_user(data_out, data, len)) > goto out; > > if (sinfo) { > - int i, offset = len; > + u32 offset = len; > u32 data_len; > + int i; > > for (i = 0; i < sinfo->nr_frags; i++) { > skb_frag_t *frag = &sinfo->frags[i]; > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH bpf 2/2] selftests/bpf: Cover partial copy of non-linear skb test_run output 2026-06-15 7:38 [PATCH bpf 0/2] Fix partial copy of non-linear skb test_run output Sun Jian 2026-06-15 7:38 ` [PATCH bpf 1/2] bpf: " Sun Jian @ 2026-06-15 7:38 ` Sun Jian 2026-06-15 14:13 ` Paul Chaignon 1 sibling, 1 reply; 5+ messages in thread From: Sun Jian @ 2026-06-15 7:38 UTC (permalink / raw) To: bpf Cc: netdev, linux-kselftest, linux-kernel, ast, daniel, andrii, martin.lau, eddyz87, memxor, song, yonghong.song, jolsa, shuah, paul.chaignon, Sun Jian Add a test case for BPF_PROG_TEST_RUN with a non-linear skb and a short data_out buffer. The test verifies that test_run returns -ENOSPC, reports the full packet length through data_size_out, and copies the packet prefix into data_out. The test uses a 100-byte data_out buffer with a 64-byte linear head, so the expected output spans both the skb head and the first fragment. Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com> --- .../selftests/bpf/prog_tests/skb_load_bytes.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c b/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c index d7f83c0a40a5..134be0ea8ed7 100644 --- a/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c +++ b/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c @@ -3,6 +3,39 @@ #include <network_helpers.h> #include "skb_load_bytes.skel.h" +#define NONLINEAR_PKT_LEN 9000 +#define NONLINEAR_HEAD_LEN 64 +#define SHORT_OUT_LEN 100 + +static void test_nonlinear_data_out_partial(int prog_fd) +{ + LIBBPF_OPTS(bpf_test_run_opts, tattr); + __u8 pkt[NONLINEAR_PKT_LEN]; + __u8 out[SHORT_OUT_LEN]; + struct __sk_buff skb = {}; + int err, i; + + for (i = 0; i < sizeof(pkt); i++) + pkt[i] = i & 0xff; + + memset(out, 0xa5, sizeof(out)); + + skb.data_end = NONLINEAR_HEAD_LEN; + + tattr.data_in = pkt; + tattr.data_size_in = sizeof(pkt); + tattr.data_out = out; + tattr.data_size_out = sizeof(out); + tattr.ctx_in = &skb; + tattr.ctx_size_in = sizeof(skb); + + err = bpf_prog_test_run_opts(prog_fd, &tattr); + + ASSERT_EQ(err, -ENOSPC, "nonlinear_partial_err"); + ASSERT_EQ(tattr.data_size_out, sizeof(pkt), "nonlinear_partial_data_size_out"); + ASSERT_OK(memcmp(out, pkt, sizeof(out)), "nonlinear_partial_data_out"); +} + void test_skb_load_bytes(void) { struct skb_load_bytes *skel; @@ -40,6 +73,8 @@ void test_skb_load_bytes(void) if (!ASSERT_EQ(test_result, 0, "offset 10")) goto out; + test_nonlinear_data_out_partial(prog_fd); + out: skb_load_bytes__destroy(skel); } -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH bpf 2/2] selftests/bpf: Cover partial copy of non-linear skb test_run output 2026-06-15 7:38 ` [PATCH bpf 2/2] selftests/bpf: Cover " Sun Jian @ 2026-06-15 14:13 ` Paul Chaignon 0 siblings, 0 replies; 5+ messages in thread From: Paul Chaignon @ 2026-06-15 14:13 UTC (permalink / raw) To: Sun Jian Cc: bpf, netdev, linux-kselftest, linux-kernel, ast, daniel, andrii, martin.lau, eddyz87, memxor, song, yonghong.song, jolsa, shuah On Mon, Jun 15, 2026 at 03:38:56PM +0800, Sun Jian wrote: > Add a test case for BPF_PROG_TEST_RUN with a non-linear skb and a short > data_out buffer. > > The test verifies that test_run returns -ENOSPC, reports the full packet > length through data_size_out, and copies the packet prefix into data_out. > The test uses a 100-byte data_out buffer with a 64-byte linear head, so the > expected output spans both the skb head and the first fragment. > > Signed-off-by: Sun Jian <sun.jian.kdev@gmail.com> > --- > .../selftests/bpf/prog_tests/skb_load_bytes.c | 35 +++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c b/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c > index d7f83c0a40a5..134be0ea8ed7 100644 > --- a/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c > +++ b/tools/testing/selftests/bpf/prog_tests/skb_load_bytes.c > @@ -3,6 +3,39 @@ > #include <network_helpers.h> > #include "skb_load_bytes.skel.h" > > +#define NONLINEAR_PKT_LEN 9000 > +#define NONLINEAR_HEAD_LEN 64 > +#define SHORT_OUT_LEN 100 > + > +static void test_nonlinear_data_out_partial(int prog_fd) > +{ > + LIBBPF_OPTS(bpf_test_run_opts, tattr); > + __u8 pkt[NONLINEAR_PKT_LEN]; > + __u8 out[SHORT_OUT_LEN]; > + struct __sk_buff skb = {}; > + int err, i; > + > + for (i = 0; i < sizeof(pkt); i++) > + pkt[i] = i & 0xff; > + > + memset(out, 0xa5, sizeof(out)); > + > + skb.data_end = NONLINEAR_HEAD_LEN; > + > + tattr.data_in = pkt; > + tattr.data_size_in = sizeof(pkt); > + tattr.data_out = out; > + tattr.data_size_out = sizeof(out); > + tattr.ctx_in = &skb; > + tattr.ctx_size_in = sizeof(skb); > + > + err = bpf_prog_test_run_opts(prog_fd, &tattr); > + > + ASSERT_EQ(err, -ENOSPC, "nonlinear_partial_err"); > + ASSERT_EQ(tattr.data_size_out, sizeof(pkt), "nonlinear_partial_data_size_out"); > + ASSERT_OK(memcmp(out, pkt, sizeof(out)), "nonlinear_partial_data_out"); > +} > + > void test_skb_load_bytes(void) > { > struct skb_load_bytes *skel; > @@ -40,6 +73,8 @@ void test_skb_load_bytes(void) > if (!ASSERT_EQ(test_result, 0, "offset 10")) > goto out; > > + test_nonlinear_data_out_partial(prog_fd); > + Maybe prog_tests/prog_run_opts.c would be a better place to cover this? test_skb_load_bytes() is meant to cover the bpf_skb_load_bytes helper. > out: > skb_load_bytes__destroy(skel); > } > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-06-15 14:13 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-15 7:38 [PATCH bpf 0/2] Fix partial copy of non-linear skb test_run output Sun Jian 2026-06-15 7:38 ` [PATCH bpf 1/2] bpf: " Sun Jian 2026-06-15 13:39 ` Paul Chaignon 2026-06-15 7:38 ` [PATCH bpf 2/2] selftests/bpf: Cover " Sun Jian 2026-06-15 14:13 ` Paul Chaignon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox