| From 0cee123a793a3bc51489c594cbc9c35bcf6a6588 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Mar 2022 08:17:23 -0800 |
| Subject: tcp: make tcp_read_sock() more robust |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit e3d5ea2c011ecb16fb94c56a659364e6b30fac94 ] |
| |
| If recv_actor() returns an incorrect value, tcp_read_sock() |
| might loop forever. |
| |
| Instead, issue a one time warning and make sure to make progress. |
| |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Acked-by: John Fastabend <john.fastabend@gmail.com> |
| Acked-by: Jakub Sitnicki <jakub@cloudflare.com> |
| Acked-by: Daniel Borkmann <daniel@iogearbox.net> |
| Link: https://lore.kernel.org/r/20220302161723.3910001-2-eric.dumazet@gmail.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/ipv4/tcp.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
| index 4dce1b418acc..f7795488b0ad 100644 |
| --- a/net/ipv4/tcp.c |
| +++ b/net/ipv4/tcp.c |
| @@ -1669,11 +1669,13 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, |
| if (!copied) |
| copied = used; |
| break; |
| - } else if (used <= len) { |
| - seq += used; |
| - copied += used; |
| - offset += used; |
| } |
| + if (WARN_ON_ONCE(used > len)) |
| + used = len; |
| + seq += used; |
| + copied += used; |
| + offset += used; |
| + |
| /* If recv_actor drops the lock (e.g. TCP splice |
| * receive) the skb pointer might be invalid when |
| * getting here: tcp_collapse might have deleted it |
| -- |
| 2.34.1 |
| |