Commit e3d5ea2c authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski

tcp: make tcp_read_sock() more robust

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: default avatarEric Dumazet <edumazet@google.com>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Acked-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
Acked-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20220302161723.3910001-2-eric.dumazet@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 60ce37b0
...@@ -1684,11 +1684,13 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, ...@@ -1684,11 +1684,13 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
if (!copied) if (!copied)
copied = used; copied = used;
break; break;
} else if (used <= len) { }
if (WARN_ON_ONCE(used > len))
used = len;
seq += used; seq += used;
copied += used; copied += used;
offset += used; offset += used;
}
/* If recv_actor drops the lock (e.g. TCP splice /* If recv_actor drops the lock (e.g. TCP splice
* receive) the skb pointer might be invalid when * receive) the skb pointer might be invalid when
* getting here: tcp_collapse might have deleted it * getting here: tcp_collapse might have deleted it
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment