From: sashiko-bot@kernel.org
To: "Geliang Tang" <geliang@kernel.org>, mptcp@lists.linux.dev
Subject: Re: [PATCH mptcp-next v22 6/8] mptcp: remove CB offset field
Date: Fri, 06 Nov 2026 12:12:12 +0000 [thread overview]
Message-ID: <sashiko-outbox-201391@kernel.org> (raw)
In-Reply-To: <7c1d46fbe47ef7510fa106d0920580d64baa7187.1793964796.git.tanggeliang@kylinos.cn>
Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [High] mptcp: broken skb pull and error path in mptcp_init_skb() and
caller
--
commit 37ab52009b6bb1043a1c621a00f409a14fa73507
Author: Paolo Abeni <pabeni@redhat.com>
mptcp: remove CB offset field
This commit replaces the per-skb MPTCP control buffer offset field with an
msk-level copied_seq counter and pulls already-consumed prefix bytes when an
skb spans a DSS mapping boundary in mptcp_init_skb().
> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> index 74a94264111dc..cedc91accc6b4 100644
> --- a/net/mptcp/protocol.c
> +++ b/net/mptcp/protocol.c
[ ... ]
> @@ -415,25 +414,38 @@ static void mptcp_data_queue_ofo(struct mptcp_sock *msk, struct sk_buff *skb)
> skb_set_owner_r(skb, sk);
> }
>
> -static void mptcp_init_skb(struct sock *ssk, struct sk_buff *skb, int offset,
> - int copy_len)
> +static bool mptcp_init_skb(struct sock *ssk, struct sk_buff *skb, int offset)
> {
> struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
> bool has_rxtstamp = TCP_SKB_CB(skb)->has_rxtstamp;
>
> + /* Detect mapping boundary: skb spans multiple mappings */
> + if (unlikely(offset > 0 &&
> + before(TCP_SKB_CB(skb)->seq - subflow->ssn_offset,
> + subflow->map_subflow_seq))) {
> + if (offset >= skb->len || !pskb_pull(skb, offset)) {
> + WARN_ON_ONCE(1);
> + sk_eat_skb(ssk, skb);
> + return false;
> + }
> + offset = 0;
> + }
> +
> /* the skb map_seq accounts for the skb offset:
> * mptcp_subflow_get_mapped_dsn() is based on the current tp->copied_seq
> * value
> */
> - MPTCP_SKB_CB(skb)->map_seq = mptcp_subflow_get_mapped_dsn(subflow);
> - MPTCP_SKB_CB(skb)->end_seq = MPTCP_SKB_CB(skb)->map_seq + copy_len;
> - MPTCP_SKB_CB(skb)->offset = offset;
> + MPTCP_SKB_CB(skb)->map_seq = mptcp_subflow_get_mapped_dsn(subflow) -
> + offset;
> + MPTCP_SKB_CB(skb)->end_seq = MPTCP_SKB_CB(skb)->map_seq + skb->len;
> MPTCP_SKB_CB(skb)->has_rxtstamp = has_rxtstamp;
>
> __skb_unlink(skb, &ssk->sk_receive_queue);
>
> skb_ext_reset(skb);
> skb_dst_drop(skb);
> +
> + return true;
> }
[ ... ]
> @@ -855,7 +863,8 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
> if (offset < skb->len) {
> size_t len = skb->len - offset;
>
> - mptcp_init_skb(ssk, skb, offset, len);
> + if (!mptcp_init_skb(ssk, skb, offset))
> + continue;
>
> if (own_msk) {
> mptcp_subflow_lend_fwdmem(subflow, skb);
[Severity: High]
Does jumping via continue when mptcp_init_skb() returns false evaluate an
uninitialized more_data_avail variable and corrupt tp->copied_seq?
In __mptcp_move_skbs_from_subflow(), more_data_avail is declared without an
initializer and is only assigned at the end of the do-while body:
net/mptcp/protocol.c:__mptcp_move_skbs_from_subflow() {
...
bool more_data_avail;
...
do {
...
if (offset < skb->len) {
size_t len = skb->len - offset;
if (!mptcp_init_skb(ssk, skb, offset))
continue;
...
seq += len;
...
}
...
WRITE_ONCE(tp->copied_seq, seq);
more_data_avail = mptcp_subflow_data_available(ssk);
} while (more_data_avail);
}
When pskb_pull() fails in mptcp_init_skb() (for example, when
__pskb_pull_tail() -> pskb_expand_head(..., GFP_ATOMIC) fails under memory
pressure on a nonlinear or cloned skb), mptcp_init_skb() triggers a
WARN_ON_ONCE(1), calls sk_eat_skb(ssk, skb), and returns false. On the first
loop iteration, continue jumps straight to while (more_data_avail) and reads
more_data_avail uninitialized. Because sk_eat_skb() already removed the skb
while continue skips updating tp->copied_seq and calling
mptcp_subflow_data_available(ssk), a subsequent iteration will compute a
wrapped offset = seq - TCP_SKB_CB(skb)->seq >= skb->len on the next skb,
eat it, and trigger a false mptcp_dss_corruption() reset.
In addition, when pskb_pull(skb, offset) succeeds on a nonlinear skb by
expanding its head via pskb_expand_head() and pulling all skb_headlen(skb)
bytes, skb_end_offset(skb) grows without updating skb->truesize while skb->sk
is still ssk. If that skb is later coalesced as the from skb in
mptcp_try_coalesce() -> skb_try_coalesce(), delta = from->truesize -
SKB_TRUESIZE(skb_end_offset(from)) can become smaller than from->len (or
negative), firing WARN_ON_ONCE(delta < len) and corrupting to->truesize and
sk->sk_rmem_alloc.
--
Sashiko AI review · https://sashiko.dev/#/patchset/cover.1793964796.git.tanggeliang@kylinos.cn?part=6
next prev parent reply other threads:[~2026-11-06 12:12 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 11:36 [PATCH mptcp-next v22 0/8] Reduce the differences between TCP and MPTCP for TLS usage Geliang Tang
2026-11-06 11:36 ` [PATCH mptcp-net v22 1/8] mptcp: fix TFO SIOCINQ overflow in mptcp_inq_hint Geliang Tang
2026-11-06 11:36 ` [PATCH mptcp-next v22 2/8] selftests: mptcp: connect: check TFO SIOCINQ overflow Geliang Tang
2026-11-06 11:51 ` sashiko-bot
2026-11-06 11:36 ` [PATCH mptcp-net v22 3/8] mptcp: fix fallback dummy mapping anchor Geliang Tang
2026-11-06 11:37 ` [PATCH mptcp-next v22 4/8] mptcp: drop the mptcp_ooo_try_coalesce() helper Geliang Tang
2026-11-06 11:37 ` [PATCH mptcp-next v22 5/8] mptcp: drop the cant_coalesce CB field Geliang Tang
2026-11-06 11:37 ` [PATCH mptcp-next v22 6/8] mptcp: remove CB offset field Geliang Tang
2026-11-06 12:12 ` sashiko-bot [this message]
2026-11-06 11:37 ` [PATCH mptcp-next v22 7/8] mptcp: sync mptcp skb cb layout with tcp one Geliang Tang
2026-11-06 12:04 ` sashiko-bot
2026-11-06 11:37 ` [PATCH mptcp-next v22 8/8] mptcp: defer read_sock cleanup to mptcp_worker Geliang Tang
2026-11-06 13:59 ` [PATCH mptcp-next v22 0/8] Reduce the differences between TCP and MPTCP for TLS usage MPTCP CI
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=sashiko-outbox-201391@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=geliang@kernel.org \
--cc=mptcp@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
/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