Received: by 10.213.65.68 with SMTP id h4csp1791947imn; Thu, 29 Mar 2018 11:06:18 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/Z1N8OLZBKUMY//VBDVQWOABhcvxs0lVVtCviwZz54dlTjqjGHRE0FNFOJL+oDf3ExFBei X-Received: by 10.99.52.11 with SMTP id b11mr6074575pga.377.1522346778432; Thu, 29 Mar 2018 11:06:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522346778; cv=none; d=google.com; s=arc-20160816; b=UsEc9Giam4Aw1zz/3OGl0syUwiqWbEcebu/zjLCbdlNfd4HEURLNtl1iNMZEDBVUAT JTvBbDjf3rrO3Bl1PBjLXy/6GRnlRBUFGjCy6BtyUOUQMNn3bKhCb5RfvS9tRJz5K5j6 JNzUu0m/gwBfzztbOO7+YvPO+wfpH1oRN729Mrf/inaV1C5PFCcKhcb5f6URkLp/yVGi xvzSbN+cYg+nznOBkxouTlBP1t0Xuj/+U3/qfaZmCDTxJCO1DFSiwNd7Dk6xFFP3skfR +baZjovn4On946xMU/hvr6dmTbF1PEHMpOSrd9hWwq+QJgUMdPjneK3I1N+I1HxWqbgp 6/3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=LuUMLAE+PdGRw+N53USStlNatBMz0X90mKEkwMbQ+Mo=; b=th1nEv4bTzGb1vUQwFZFBSVgYp0JDCRNPtcbiZHPThbA/t36g6/F2MHQxOPUaLMbSE QA4alUWiXsqTKCaADK4vG5OF0eQQs3HZXoy01IB7Ondml7AJIiRklN72ceEUWW1JflwR S5XRiWMl3Hpr+FTvZBvXloNbdIEuaxdAdGmHB41ReeH9JD2o4abMIHcJp04Ql2P3YiZr kOoATMVWVaEG2p414cJrEpQp32Pir51VtmdD8QCnvB31WH2THzCR768+cGHX9DB48tTp GGfYHHfsbQ2A++mQFHNGdz8E5pkxtzIrVFz5BZNvfi9dBXvJgje5gqr4Qk95rWlTbIBS mL6Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s21si4929593pfi.87.2018.03.29.11.06.04; Thu, 29 Mar 2018 11:06:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753331AbeC2SE6 (ORCPT + 99 others); Thu, 29 Mar 2018 14:04:58 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:58940 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752199AbeC2SEz (ORCPT ); Thu, 29 Mar 2018 14:04:55 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 4FC9FC83; Thu, 29 Mar 2018 18:04:54 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paolo Abeni , "David S. Miller" Subject: [PATCH 4.14 08/43] net: ipv6: keep sk status consistent after datagram connect failure Date: Thu, 29 Mar 2018 20:00:03 +0200 Message-Id: <20180329175730.961864384@linuxfoundation.org> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180329175730.190353692@linuxfoundation.org> References: <20180329175730.190353692@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Paolo Abeni [ Upstream commit 2f987a76a97773beafbc615b9c4d8fe79129a7f4 ] On unsuccesful ip6_datagram_connect(), if the failure is caused by ip6_datagram_dst_update(), the sk peer information are cleared, but the sk->sk_state is preserved. If the socket was already in an established status, the overall sk status is inconsistent and fouls later checks in datagram code. Fix this saving the old peer information and restoring them in case of failure. This also aligns ipv6 datagram connect() behavior with ipv4. v1 -> v2: - added missing Fixes tag Fixes: 85cb73ff9b74 ("net: ipv6: reset daddr and dport in sk if connect() fails") Signed-off-by: Paolo Abeni Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/ipv6/datagram.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -146,10 +146,12 @@ int __ip6_datagram_connect(struct sock * struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; struct inet_sock *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); - struct in6_addr *daddr; + struct in6_addr *daddr, old_daddr; + __be32 fl6_flowlabel = 0; + __be32 old_fl6_flowlabel; + __be32 old_dport; int addr_type; int err; - __be32 fl6_flowlabel = 0; if (usin->sin6_family == AF_INET) { if (__ipv6_only_sock(sk)) @@ -239,9 +241,13 @@ ipv4_connected: } } + /* save the current peer information before updating it */ + old_daddr = sk->sk_v6_daddr; + old_fl6_flowlabel = np->flow_label; + old_dport = inet->inet_dport; + sk->sk_v6_daddr = *daddr; np->flow_label = fl6_flowlabel; - inet->inet_dport = usin->sin6_port; /* @@ -251,11 +257,12 @@ ipv4_connected: err = ip6_datagram_dst_update(sk, true); if (err) { - /* Reset daddr and dport so that udp_v6_early_demux() - * fails to find this socket + /* Restore the socket peer info, to keep it consistent with + * the old socket state */ - memset(&sk->sk_v6_daddr, 0, sizeof(sk->sk_v6_daddr)); - inet->inet_dport = 0; + sk->sk_v6_daddr = old_daddr; + np->flow_label = old_fl6_flowlabel; + inet->inet_dport = old_dport; goto out; }