From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
To: 平之 <treebacker@foxmail.com>, "Greg KH" <greg@kroah.com>,
netdev <netdev@vger.kernel.org>
Cc: "David S. Miller" <davem@davemloft.net>,
YOSHIFUJI <yoshfuji@linux-ipv6.org>, Ahern <dsahern@kernel.org>,
stable <stable@vger.kernel.org>
Subject: Re: [PATCH net] ipv6: fix dead half of the MTU guard in __ip6_append_data()
Date: Mon, 26 Oct 2026 11:19:20 -0400 [thread overview]
Message-ID: <willemdebruijn.kernel.491fe86e17fa@gmail.com> (raw)
In-Reply-To: <tencent_E14C00D5FE957DD7E12FFDC2E75A4FA9EE08@qq.com>
平之 wrote:
> The second half of the MTU guard in __ip6_append_data() has been dead
> code since the initial git import:
>
> if (mtu <= fragheaderlen ||
> ((mtu - fragheaderlen) & ~7) + fragheaderlen <= sizeof(struct frag_hdr))
> goto emsgsize;
>
> (x & ~7) is unsigned and >= 0, and fragheaderlen is at least
> sizeof(struct ipv6hdr) = 40 > sizeof(struct frag_hdr) = 8, so the
> second condition can never be true. Commit 5e34af4142ff ("net: ipv6:
> fix skb_over_panic in __ip6_append_data") tightened the first half
> (mtu == fragheaderlen) but left the dead second half in place.
>
> For mtu - fragheaderlen in [1,7], (x & ~7) == 0, so
>
> maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - 8
>
> underflows below fragheaderlen. Every later bound computed as
> maxfraglen - fragheaderlen then wraps to 0xfffffff8, in particular the
> datalen clamp inside the fragment loop, which never fires and lets
> fraglen = datalen + fragheaderlen escape the MTU constraint.
>
> With MSG_MORE on an egress device without NETIF_F_SG, alloclen = mtu
> while skb_put() is called with the unclamped fraglen, so a single
> sendmsg() on a raw IPv6 socket with a 1240-byte HOPOPTS cmsg and
> IPV6_MTU = fragheaderlen + 1 triggers:
>
> skbuff: skb_over_panic: len:61280 put:61280 ...
> [ 37.607856] kernel BUG at net/core/skbuff.c:214!
> [ 37.607865] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
> ...
> [ 37.616606] Call trace:
> [ 37.616606] skb_panic+0x5c/0x60 (P)
> [ 37.616778] skb_put+0x9c/0xa8
> [ 37.616952] __ip6_append_data+0xf80/0x1948
> [ 37.617172] ip6_append_data+0x94/0x2a8
> [ 37.617363] rawv6_sendmsg+0x588/0x988
> [ 37.617716] inet_sendmsg+0x4c/0xa8
> [ 37.617891] ____sys_sendmsg+0x268/0x308
> [ 37.618105] ___sys_sendmsg+0xb4/0x140
> [ 37.618299] __sys_sendmsg+0xa8/0x140
>
> Replace the dead expression with a direct check of the payload space
> available in a fragment, which rejects mtu - fragheaderlen in [1,8].
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Fixes: 6596a0229541 ("xfrm: fix MTU regression")
> Cc: stable@vger.kernel.org
> Signed-off-by: bo cao <treebacker@foxmail.com>
> ---
> net/ipv6/ip6_output.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
> index 25fe0ba98b1a..7d4d4d45e207 100644
> --- a/net/ipv6/ip6_output.c
> +++ b/net/ipv6/ip6_output.c
> @@ -1500,7 +1500,7 @@ static int __ip6_append_data(struct sock *sk,
> rt->rt6i_nfheader_len;
>
> if (mtu <= fragheaderlen ||
> - ((mtu - fragheaderlen) & ~7) + fragheaderlen <= sizeof(struct frag_hdr))
> + mtu - fragheaderlen <= sizeof(struct frag_hdr))
> goto emsgsize;
Correction: I thought a difference with ip6_fragment was benign and
this patch is still an improvement, but it seems that additionally
ensuring enough space for one octet of payload is mandatory:
+ if (mtu < fragheaderlen + sizeof(struct frag_hdr) + 8)
+ goto emsgsize;
See ip6_fragment:
if (mtu < hlen + sizeof(struct frag_hdr) + 8)
goto fail_toobig;
prev parent reply other threads:[~2026-10-26 15:19 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 10:54 ipv6: skb_over_panic in __ip6_append_data() when mtu - fragheaderlen is in [1,7] (single sendmsg, since 2.6.12) 平之
2026-10-26 11:46 ` Greg KH
[not found] ` <tencent_7454E65EE7BD1C085B6951A7D2305157370A@qq.com>
[not found] ` <2026102658-jockey-volley-94ff@gregkh>
2026-10-26 12:53 ` [PATCH net] ipv6: fix dead half of the MTU guard in __ip6_append_data() 平之
2026-10-26 12:56 ` netdev-bot+sinfo
2026-10-26 15:12 ` Willem de Bruijn
2026-10-26 15:19 ` Willem de Bruijn [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=willemdebruijn.kernel.491fe86e17fa@gmail.com \
--to=willemdebruijn.kernel@gmail.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=greg@kroah.com \
--cc=netdev@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=treebacker@foxmail.com \
--cc=yoshfuji@linux-ipv6.org \
/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