From nobody Fri Nov 7 13:04:08 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1538935626106259.74830545949794; Sun, 7 Oct 2018 11:07:06 -0700 (PDT) Received: from localhost ([::1]:43138 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g9DSF-0000pL-Od for importer@patchew.org; Sun, 07 Oct 2018 14:06:59 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54612) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g9DQp-0008VP-I3 for qemu-devel@nongnu.org; Sun, 07 Oct 2018 14:05:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g9DQo-00017w-Aj for qemu-devel@nongnu.org; Sun, 07 Oct 2018 14:05:31 -0400 Received: from hera.aquilenet.fr ([2a0c:e300::1]:54658) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1g9DQn-0000xM-Q2 for qemu-devel@nongnu.org; Sun, 07 Oct 2018 14:05:30 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 523F7CEB; Sun, 7 Oct 2018 20:05:21 +0200 (CEST) Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6yzXeFyD6d-C; Sun, 7 Oct 2018 20:05:20 +0200 (CEST) Received: from var.youpi.perso.aquilenet.fr (unknown [IPv6:2a01:cb19:181:c200:3602:86ff:fe2c:6a19]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 5629ECF3; Sun, 7 Oct 2018 20:05:19 +0200 (CEST) Received: from samy by var.youpi.perso.aquilenet.fr with local (Exim 4.91) (envelope-from ) id 1g9DQc-0001Mu-Dd; Sun, 07 Oct 2018 20:05:18 +0200 X-Virus-Scanned: Debian amavisd-new at aquilenet.fr From: Samuel Thibault To: qemu-devel@nongnu.org, peter.maydell@linaro.org Date: Sun, 7 Oct 2018 20:05:18 +0200 Message-Id: <20181007180518.5212-4-samuel.thibault@ens-lyon.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181007180518.5212-1-samuel.thibault@ens-lyon.org> References: <20181007180518.5212-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a0c:e300::1 Subject: [Qemu-devel] [PULL 3/3] slirp: Propagate host TCP RST packet to the guest after socket disconnected X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jan.kiszka@siemens.com, Gavin Grant , stefanha@redhat.com, Samuel Thibault Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Gavin Grant Commit 27d92ebc5ed1bb0b518d0ebc4c609182ad20a799 handled the case where the = TCP connection is abruptly closed via a RST packet, by checking for the ECONNRE= SET errno. However it does not consider the case where the connection has been half-closed by the host (FIN/ACK), then the host socket is disconnected. For example, if the host application calls close() on the socket, then the application exits. In this case, the socket still exists due to the file descriptor in SLIRP, = but it is disconnected. recv() does not indicate an error since an orderly sock= et close has previously occurred. The socket will then be stuck in FIN_WAIT_2, until the peer sends FIN/ACK or a timeout occurs. Instead we can send a RST to the peer and transition to the CLOSED state. Signed-off-by: Gavin Grant Signed-off-by: Samuel Thibault --- slirp/socket.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/slirp/socket.c b/slirp/socket.c index 08fe98907d..322383a1f9 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -204,12 +204,19 @@ soread(struct socket *so) return 0; else { int err; - socklen_t slen =3D sizeof err; + socklen_t elen =3D sizeof err; + struct sockaddr_storage addr; + struct sockaddr *paddr =3D (struct sockaddr *) &addr; + socklen_t alen =3D sizeof addr; =20 err =3D errno; if (nn =3D=3D 0) { - getsockopt(so->s, SOL_SOCKET, SO_ERROR, - &err, &slen); + if (getpeername(so->s, paddr, &alen) < 0) { + err =3D errno; + } else { + getsockopt(so->s, SOL_SOCKET, SO_ERROR, + &err, &elen); + } } =20 DEBUG_MISC((dfd, " --- soread() disconnected, nn =3D %d, errno =3D %d-%= s\n", nn, errno,strerror(errno))); --=20 2.19.0