Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3418005pxf; Mon, 29 Mar 2021 01:27:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzv9Gm6IVNftJd1AaJL2u6v09p1id4mmyIvqnElW43/VNsy+dzXo/XQkk/5SsX+uIRlxvC6 X-Received: by 2002:a17:906:b318:: with SMTP id n24mr26780778ejz.372.1617006452070; Mon, 29 Mar 2021 01:27:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617006452; cv=none; d=google.com; s=arc-20160816; b=WW1vGFE257JbeMiUiHANQpM3JXPQR9hxCiUDG1ZOpgAxBzTEAheSRdLT9dvkzD6yDA 9Zr3LLwyjJwQyyIU2ViJpI9taVG+OnbZU2cKIRmDgoEy+4gcea66oX9YdPbf/APU3YOc NvxJMG7WwUXMYUEie5SlM1g/E39Zmn+j/jRefdKZlIYGZWv1J85BYEpgq6fm8ClTKgAt 3uLt1TaTWX2aLDlO5QeO8tU9bgeDUxQ10Bd/WMWEXF7KgqWVmMt/1g5SEgtXRmmI0UiJ whJJ5qvgASkxGf0RZ0fzOcxhyTrw8hNG7TNBkZNKlpP9E1fwGwbfrLZH/vsizOErdaRQ uRvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=sBYuWU+QGFf9NnRRZ3ulzdYT6EL7jDIcO0ouCAFPIFY=; b=OJfABBwISpZG6U/hQ+fwfPFk6WZPRluTkk/ITCiTKHg2C1ymoI+rCYFLMiqPSC2A0M o5ShJV4ynI2A9BaXZ2YH5Z3ZIIeSWOmxg45ONeWs8NS0OuGD5iiiNMLyZ33KorZZPtE8 4wl69wGvI1pZLvaRXGrFw1x/nFGOIn7vs5k+wjnxeHPTvqGCDfy2vku1cHq8LLhLS08A FT/5ryVTnSeHQ1JlQdCTBKOQBdvrJOeQFs+pPjwR5k0JSYRaTtc3BpEbRE/NEHL4X3bo tgYPGdYcoodzjh8GErKnlbqmocA+auw1D55pw8fAu6oDXC3kNXkBwlRMz3Zwgds4aEPQ c+vA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=0snic1fs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i15si12738588ejv.550.2021.03.29.01.27.09; Mon, 29 Mar 2021 01:27:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=0snic1fs; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231903AbhC2IZy (ORCPT + 99 others); Mon, 29 Mar 2021 04:25:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:58896 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233178AbhC2IQy (ORCPT ); Mon, 29 Mar 2021 04:16:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 6837861601; Mon, 29 Mar 2021 08:16:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1617005779; bh=Vg20Nm++ebwyXWmx/Vjif0ME9zKVYghYM6vxJ2aqTy0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0snic1fscl7Nm5kU3oi5bZTPxPW1Cswh5iDu1ZPzEs4LdQqmtQKT6je0NsXptpPof Ouz4X6Tb4R1ELjTytFs/CbIOXo6JoOWympoq9Rsab3s0bdFb6GNn68nFuOHKNBtqik M+4MDBH2QPpmAjOx4ixenGly3Bc+3oLm+VJeOidc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Alexander Ovechkin , Oleg Senin , Eric Dumazet , "David S. Miller" , Sasha Levin Subject: [PATCH 5.4 069/111] tcp: relookup sock for RST+ACK packets handled by obsolete req sock Date: Mon, 29 Mar 2021 09:58:17 +0200 Message-Id: <20210329075617.513843886@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210329075615.186199980@linuxfoundation.org> References: <20210329075615.186199980@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexander Ovechkin [ Upstream commit 7233da86697efef41288f8b713c10c2499cffe85 ] Currently tcp_check_req can be called with obsolete req socket for which big socket have been already created (because of CPU race or early demux assigning req socket to multiple packets in gro batch). Commit e0f9759f530bf789e984 ("tcp: try to keep packet if SYN_RCV race is lost") added retry in case when tcp_check_req is called for PSH|ACK packet. But if client sends RST+ACK immediatly after connection being established (it is performing healthcheck, for example) retry does not occur. In that case tcp_check_req tries to close req socket, leaving big socket active. Fixes: e0f9759f530 ("tcp: try to keep packet if SYN_RCV race is lost") Signed-off-by: Alexander Ovechkin Reported-by: Oleg Senin Reviewed-by: Eric Dumazet Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- include/net/inet_connection_sock.h | 2 +- net/ipv4/inet_connection_sock.c | 7 +++++-- net/ipv4/tcp_minisocks.c | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h index 6c8f8e5e33c3..13792c0ef46e 100644 --- a/include/net/inet_connection_sock.h +++ b/include/net/inet_connection_sock.h @@ -287,7 +287,7 @@ static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk) return inet_csk_reqsk_queue_len(sk) >= sk->sk_max_ack_backlog; } -void inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req); +bool inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req); void inet_csk_reqsk_queue_drop_and_put(struct sock *sk, struct request_sock *req); void inet_csk_destroy_sock(struct sock *sk); diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index ac5c4f6cdefe..85a88425edc4 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -700,12 +700,15 @@ static bool reqsk_queue_unlink(struct request_sock *req) return found; } -void inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req) +bool inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req) { - if (reqsk_queue_unlink(req)) { + bool unlinked = reqsk_queue_unlink(req); + + if (unlinked) { reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req); reqsk_put(req); } + return unlinked; } EXPORT_SYMBOL(inet_csk_reqsk_queue_drop); diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index c802bc80c400..194743bd3fc1 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -796,8 +796,11 @@ embryonic_reset: tcp_reset(sk); } if (!fastopen) { - inet_csk_reqsk_queue_drop(sk, req); - __NET_INC_STATS(sock_net(sk), LINUX_MIB_EMBRYONICRSTS); + bool unlinked = inet_csk_reqsk_queue_drop(sk, req); + + if (unlinked) + __NET_INC_STATS(sock_net(sk), LINUX_MIB_EMBRYONICRSTS); + *req_stolen = !unlinked; } return NULL; } -- 2.30.1