From: Greg KH <greg@kroah.com>
To: Sasha Levin <sashal@kernel.org>
Cc: stable@vger.kernel.org, Yong Wang <edragain@163.com>,
Vega <vega@nebusec.ai>, Ren Wei <weir@nebusec.ai>,
Jakub Kicinski <kuba@kernel.org>
Subject: Re: [PATCH 6.6.y 5/5] tcp: clamp route advmss to TCP_MIN_MSS
Date: Wed, 30 Sep 2026 16:10:09 +0200 [thread overview]
Message-ID: <2026093005-skimmer-underfoot-a5df@gregkh> (raw)
In-Reply-To: <20260901141804.1031618-5-sashal@kernel.org>
On Tue, Sep 01, 2026 at 10:18:04AM -0400, Sasha Levin wrote:
> From: Yong Wang <edragain@163.com>
>
> [ Upstream commit 870a9e42ecc6fe1b8c25d87af043cb0d9c178fe1 ]
>
> tcp_select_initial_window() assumes that callers never pass an MSS
> smaller than 1, but route-derived advmss values can violate that
> assumption.
>
> A too-small explicit RTAX_ADVMSS is one way to get there, but it is not
> the only one. The same divide-by-zero can also be reached through the
> "default advmss" path when RTAX_ADVMSS is left at 0 and the effective
> advmss is later driven down by route MTU and min_adv_mss.
>
> Introduce a tcp_dst_advmss() helper that clamps route advmss to
> TCP_MIN_MSS before TCP consumes it, and use it in the TCP paths that
> derive advmss from dst metrics. This keeps the effective MSS from
> dropping to zero before tcp_select_initial_window() rounds the receive
> window.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Cc: stable@vger.kernel.org
> Reported-by: Vega <vega@nebusec.ai>
> Signed-off-by: Yong Wang <edragain@163.com>
> Signed-off-by: Ren Wei <weir@nebusec.ai>
> Link: https://patch.msgid.link/251eaf8277fa7c66364c9815c5da01662d269181.1787074852.git.edragain@163.com
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
> include/net/tcp.h | 5 +++++
> net/ipv4/tcp_ipv4.c | 2 +-
> net/ipv4/tcp_minisocks.c | 2 +-
> net/ipv4/tcp_output.c | 6 +++---
> net/ipv6/tcp_ipv6.c | 2 +-
> 5 files changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/include/net/tcp.h b/include/net/tcp.h
> index 23d830a7a6c82..8f411176b4180 100644
> --- a/include/net/tcp.h
> +++ b/include/net/tcp.h
> @@ -1475,6 +1475,11 @@ static inline int tcp_full_space(const struct sock *sk)
> return tcp_win_from_space(sk, READ_ONCE(sk->sk_rcvbuf));
> }
>
> +static inline u32 tcp_dst_advmss(const struct dst_entry *dst)
> +{
> + return max_t(u32, dst_metric_advmss(dst), TCP_MIN_MSS);
> +}
> +
> static inline void __tcp_adjust_rcv_ssthresh(struct sock *sk, u32 new_ssthresh)
> {
> int unused_mem = sk_unused_reserved_mem(sk);
> diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
> index 97e3ce3e60f98..446e696fb31e7 100644
> --- a/net/ipv4/tcp_ipv4.c
> +++ b/net/ipv4/tcp_ipv4.c
> @@ -1624,7 +1624,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
> tcp_ca_openreq_child(newsk, dst);
>
> tcp_sync_mss(newsk, dst4_mtu(dst));
> - newtp->advmss = tcp_mss_clamp(tcp_sk(sk), dst_metric_advmss(dst));
> + newtp->advmss = tcp_mss_clamp(tcp_sk(sk), tcp_dst_advmss(dst));
>
> tcp_initialize_rcv_mss(newsk);
>
> diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
> index 86f0feb2497f1..c5df72b548955 100644
> --- a/net/ipv4/tcp_minisocks.c
> +++ b/net/ipv4/tcp_minisocks.c
> @@ -403,7 +403,7 @@ void tcp_openreq_init_rwin(struct request_sock *req,
> u32 rcv_wnd;
> int mss;
>
> - mss = tcp_mss_clamp(tp, dst_metric_advmss(dst));
> + mss = tcp_mss_clamp(tp, tcp_dst_advmss(dst));
> window_clamp = READ_ONCE(tp->window_clamp);
> /* Set this up on the first call only */
> req->rsk_window_clamp = window_clamp ? : dst_metric(dst, RTAX_WINDOW);
> diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
> index 5abad93d3c743..67b88a962079f 100644
> --- a/net/ipv4/tcp_output.c
> +++ b/net/ipv4/tcp_output.c
> @@ -125,7 +125,7 @@ static __u16 tcp_advertise_mss(struct sock *sk)
> int mss = tp->advmss;
>
> if (dst) {
> - unsigned int metric = dst_metric_advmss(dst);
> + unsigned int metric = tcp_dst_advmss(dst);
>
> if (metric < mss) {
> mss = metric;
> @@ -3698,7 +3698,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst,
> }
> skb_dst_set(skb, dst);
>
> - mss = tcp_mss_clamp(tp, dst_metric_advmss(dst));
> + mss = tcp_mss_clamp(tp, tcp_dst_advmss(dst));
>
> memset(&opts, 0, sizeof(opts));
> now = tcp_clock_ns();
> @@ -3810,7 +3810,7 @@ static void tcp_connect_init(struct sock *sk)
>
> if (!tp->window_clamp)
> WRITE_ONCE(tp->window_clamp, dst_metric(dst, RTAX_WINDOW));
> - tp->advmss = tcp_mss_clamp(tp, dst_metric_advmss(dst));
> + tp->advmss = tcp_mss_clamp(tp, tcp_dst_advmss(dst));
>
> tcp_initialize_rcv_mss(sk);
>
> diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
> index 243d398c35868..4a6a0d95af150 100644
> --- a/net/ipv6/tcp_ipv6.c
> +++ b/net/ipv6/tcp_ipv6.c
> @@ -1341,7 +1341,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
> tcp_ca_openreq_child(newsk, dst);
>
> tcp_sync_mss(newsk, dst6_mtu(dst));
> - newtp->advmss = tcp_mss_clamp(tcp_sk(sk), dst_metric_advmss(dst));
> + newtp->advmss = tcp_mss_clamp(tcp_sk(sk), tcp_dst_advmss(dst));
>
> tcp_initialize_rcv_mss(newsk);
>
> --
> 2.53.0
>
>
did not apply
prev parent reply other threads:[~2026-09-30 14:11 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 12:53 FAILED: patch "[PATCH] tcp: clamp route advmss to TCP_MIN_MSS" failed to apply to 6.6-stable tree gregkh
2026-09-01 14:18 ` [PATCH 6.6.y 1/5] ipv6: pass proto by value to ipv6_push_nfrag_opts() and ipv6_push_frag_opts() Sasha Levin
2026-09-01 14:18 ` [PATCH 6.6.y 2/5] inet: add dst4_mtu() and dst6_mtu() helpers Sasha Levin
2026-09-01 14:18 ` [PATCH 6.6.y 3/5] ipv6: use dst6_mtu() instead of dst_mtu() Sasha Levin
2026-09-01 14:18 ` [PATCH 6.6.y 4/5] ipv4: use dst4_mtu() " Sasha Levin
2026-09-01 14:18 ` [PATCH 6.6.y 5/5] tcp: clamp route advmss to TCP_MIN_MSS Sasha Levin
2026-09-30 14:10 ` Greg KH [this message]
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=2026093005-skimmer-underfoot-a5df@gregkh \
--to=greg@kroah.com \
--cc=edragain@163.com \
--cc=kuba@kernel.org \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
--cc=vega@nebusec.ai \
--cc=weir@nebusec.ai \
/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