From: Simon Horman <horms@kernel.org>
To: Eric Dumazet <edumazet@google.com>
Cc: "David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Neal Cardwell <ncardwell@google.com>,
Kuniyuki Iwashima <kuniyu@google.com>,
netdev@vger.kernel.org, eric.dumazet@gmail.com
Subject: Re: [PATCH net] tcp: do not let tcp_rmem be set below 4096
Date: Tue, 15 Sep 2026 10:01:11 +0100 [thread overview]
Message-ID: <20260915090111.GC314999@horms.kernel.org> (raw)
In-Reply-To: <20260912144848.3448026-1-edumazet@google.com>
On Sat, Sep 12, 2026 at 02:48:48PM +0000, Eric Dumazet wrote:
> We can hit a division by zero crash in tcp_rcvbuf_grow()
> and tcp_rcv_space_adjust():
>
> divide error: 0000 [#1] PREEMPT SMP
> RIP: 0010:tcp_rcvbuf_grow+0x187/0x450 net/ipv4/tcp_input.c:939
> ...
> grow = div_u64(((u64)rcvwin << 1) * (newval - oldval), oldval);
>
> The division uses oldval = tp->rcvq_space.space as divisor.
> When tp->rcvq_space.space is zero, this leads to a divide-by-zero
> exception.
>
> tp->rcvq_space.space is initialized in tcp_init_buffer_space():
> tp->rcvq_space.space = min3(tp->rcv_ssthresh, tp->rcv_wnd,
> (u32)TCP_INIT_CWND * tp->advmss);
>
> If tcp_rmem[1] is configured to very small values (such as 1),
> sk->sk_rcvbuf is initialized to 1. Then tcp_full_space(sk), which
> computes (sk->sk_rcvbuf * scaling_ratio) >> 8, truncates to 0.
> This sets tp->window_clamp = 0, tp->rcv_ssthresh = 0, and
> tp->rcvq_space.space = 0. Later, when data arrives and DRS is invoked,
> tcp_rcvbuf_grow() divides by oldval == 0.
>
> Back in 2015, commit b1cb59cf2efe ("net: sysctl_net_core: check SNDBUF
> and RCVBUF for min length") ensured that net.core.rmem_default and
> net.core.rmem_max cannot be set below SOCK_MIN_RCVBUF. Similarly,
> SO_RCVBUF setsockopt enforces max_t(int, val * 2, SOCK_MIN_RCVBUF).
>
> However, net.ipv4.tcp_rmem still had .extra1 = SYSCTL_ONE, allowing
> arbitrarily small values.
>
> Because SOCK_MIN_RCVBUF depends on sizeof(struct sk_buff) and cacheline
> alignment, its value varies across architectures and configuration options.
> Using a fixed constant of 4096 ensures a predictable, architecture-
> independent lower bound that is safely above SOCK_MIN_RCVBUF everywhere
> and matches the documented 4K default.
>
> Fix this by setting tcp_rmem.extra1 to 4096 and updating the documentation.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Simon Horman <horms@kernel.org>
next prev parent reply other threads:[~2026-09-15 9:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-12 14:48 [PATCH net] tcp: do not let tcp_rmem be set below 4096 Eric Dumazet
2026-09-15 9:01 ` Simon Horman [this message]
2026-09-15 13:30 ` 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=20260915090111.GC314999@horms.kernel.org \
--to=horms@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=kuba@kernel.org \
--cc=kuniyu@google.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.