From: Eric Dumazet Date: Mon, 15 Nov 2021 19:02:47 +0000 (-0800) Subject: tcp: check local var (timeo) before socket fields in one test X-Git-Tag: v5.17-rc1~170^2~443^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8bd172b787298124ef75c0e466101107c036d54d;p=thirdparty%2Fkernel%2Flinux.git tcp: check local var (timeo) before socket fields in one test Testing timeo before sk_err/sk_state/sk_shutdown makes more sense. Modern applications use non-blocking IO, while a socket is terminated only once during its life time. Signed-off-by: Eric Dumazet Signed-off-by: David S. Miller --- diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 33cd9a1c199ce..7b1886103556e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2399,10 +2399,10 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len, break; if (copied) { - if (sk->sk_err || + if (!timeo || + sk->sk_err || sk->sk_state == TCP_CLOSE || (sk->sk_shutdown & RCV_SHUTDOWN) || - !timeo || signal_pending(current)) break; } else {