From: bot+bpf-ci@kernel.org
To: zirajs7@gmail.com,ast@kernel.org,daniel@iogearbox.net,andrii@kernel.org,eddyz87@gmail.com,memxor@gmail.com,martin.lau@linux.dev
Cc: sdf@fomichev.me,song@kernel.org,yonghong.song@linux.dev,jolsa@kernel.org,emil@etsalapatis.com,bpf@vger.kernel.org,linux-kernel@vger.kernel.org,rhkrqnwk98@gmail.com,ast@kernel.org,andrii@kernel.org,daniel@iogearbox.net,martin.lau@kernel.org,eddyz87@gmail.com,yonghong.song@linux.dev,clm@meta.com,ihor.solodrai@linux.dev
Subject: Re: [PATCH bpf v2 2/2] selftests/bpf: Exercise negative optlen in cgroup getsockopt hook
Date: Tue, 11 Aug 2026 15:10:47 +0000 (UTC) [thread overview]
Message-ID: <9cafe1dfeab0dfd1249f4881846a10c613e72a09124dadeff1b59765b664d512@mail.kernel.org> (raw)
In-Reply-To: <4dbdcda23b2f2be06c5659f8102cd6bd036825b3.1786448307.git.zirajs7@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3352 bytes --]
> diff --git a/tools/testing/selftests/bpf/prog_tests/sockopt.c b/tools/testing/selftests/bpf/prog_tests/sockopt.c
> index eaac83a7f388..6c96f2d9fccf 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sockopt.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sockopt.c
[ ... ]
> @@ -283,6 +284,27 @@ static struct sockopt_test {
> .error = EFAULT_GETSOCKOPT,
> .io_uring_support = true,
> },
> + {
> + .descr = "getsockopt: deny negative ctx->optlen in TCP_ZEROCOPY_RECEIVE",
> + .insns = {
> + /* ctx->optlen = -1 */
> + BPF_MOV64_IMM(BPF_REG_0, -1),
> + BPF_STX_MEM(BPF_W, BPF_REG_1, BPF_REG_0,
> + offsetof(struct bpf_sockopt, optlen)),
> +
> + /* return 1 */
> + BPF_MOV64_IMM(BPF_REG_0, 1),
> + BPF_EXIT_INSN(),
> + },
> + .attach_type = BPF_CGROUP_GETSOCKOPT,
> + .expected_attach_type = BPF_CGROUP_GETSOCKOPT,
> +
> + .get_level = IPPROTO_TCP,
> + .get_optname = TCP_ZEROCOPY_RECEIVE,
> + .get_optlen = sizeof(struct tcp_zerocopy_receive),
> +
> + .error = EFAULT_GETSOCKOPT,
> + },
> {
> .descr = "getsockopt: ignore >PAGE_SIZE optlen",
> .insns = {
A subsystem pattern flags this as potentially concerning: the test asserts
-EFAULT for negative ctx->optlen, but both a fixed kernel and an unfixed
kernel can return -EFAULT, so does the test provide regression protection?
The commit message notes this honestly: "the return value alone cannot
distinguish the bug." The test exercises the kernel-buffer getsockopt path
with ctx->optlen == -1, which triggers a hardened-usercopy WARN on
unpatched kernels.
Tracing it through:
run_test() creates socket(AF_INET, SOCK_STREAM, 0), state is TCP_CLOSE
and tcp_inq(sk) == 0.
do_tcp_getsockopt() accepts len (40) and calls tcp_zerocopy_receive().
With inq == 0 < PAGE_SIZE and SOCK_DONE unset:
zc->length = 0;
zc->recv_skip_hint = inq;
return 0;
so err == 0 going into the BPF hook.
Without the fix: ctx.optlen becomes -1, back in tcp.c, switch (len) with
len == -1 falls to default: goto zerocopy_rcv_out. The if (!err &&
copy_to_sockptr(optval, &zc, len)) runs with size (size_t)-1.
check_copy_size() WARNs and returns false, copy_to_user() returns n != 0,
so err = -EFAULT.
With the fix: ctx.optlen < 0 returns -EFAULT directly, all the !err
guards skip the copy, and -EFAULT is returned.
Userspace sees errno == EFAULT in both cases; run_test() returns 0 (PASS)
either way. The only difference between kernels is a WARN in dmesg, and
test_progs has no dmesg/taint/WARN detection (no references to dmesg,
kmsg, tainted, or panic_on_warn in test_progs.c/.h).
Strengthening it by making the handler fail first doesn't work either,
because __cgroup_bpf_run_filter_getsockopt_kern() does if (ret < 0) return
ret; before applying ctx.optlen, so a non-zero retval short-circuits the
buggy assignment. The buggy copy is only reachable when err == 0, and tcp.c
always converts it into EFAULT.
Is the intent that this test relies on WARN/taint detection or
panic_on_warn, or is the value of the test primarily as a WARN-only
reproducer rather than a pass/fail assertion?
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/31501873750
next prev parent reply other threads:[~2026-08-11 15:10 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 14:19 [PATCH bpf v2 0/2] bpf: Reject " Junseo Lim
2026-08-11 14:19 ` [PATCH bpf v2 1/2] " Junseo Lim
2026-08-11 14:19 ` [PATCH bpf v2 2/2] selftests/bpf: Exercise " Junseo Lim
2026-08-11 15:10 ` bot+bpf-ci [this message]
2026-08-17 4:57 ` Junseo Lim
2026-08-17 9:50 ` [PATCH bpf v2 0/2] bpf: Reject " patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9cafe1dfeab0dfd1249f4881846a10c613e72a09124dadeff1b59765b664d512@mail.kernel.org \
--to=bot+bpf-ci@kernel.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=clm@meta.com \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=ihor.solodrai@linux.dev \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=rhkrqnwk98@gmail.com \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=yonghong.song@linux.dev \
--cc=zirajs7@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®