From nobody Sat Nov 1 07:51:05 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 1509641851427599.4924548105646; Thu, 2 Nov 2017 09:57:31 -0700 (PDT) Received: from localhost ([::1]:33156 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eAIo1-0000Sn-PI for importer@patchew.org; Thu, 02 Nov 2017 12:57:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48856) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eAInF-0008U6-Cb for qemu-devel@nongnu.org; Thu, 02 Nov 2017 12:56:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eAInC-0000dX-BM for qemu-devel@nongnu.org; Thu, 02 Nov 2017 12:56:37 -0400 Received: from mailrelay.quantumachine.net ([37.59.103.225]:47276) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eAInC-0000c3-1s for qemu-devel@nongnu.org; Thu, 02 Nov 2017 12:56:34 -0400 Received: from mail.quantumachine.net (unknown [185.48.86.222]) by mailrelay.quantumachine.net (Postfix) with ESMTP id 726215D for ; Thu, 2 Nov 2017 17:56:31 +0100 (CET) Received: by mail.quantumachine.net (Postfix, from userid 1005) id 0DF6ECF5A8; Thu, 2 Nov 2017 17:56:31 +0100 (CET) Received: from sector.int (unknown [192.168.4.12]) by mail.quantumachine.net (Postfix) with ESMTPSA id C9F48CF596; Thu, 2 Nov 2017 17:56:29 +0100 (CET) (envelope-from tuxillo@quantumachine.net) Received: from OpenWrt.sector.int (OpenWrt.sector.int [192.168.4.254]) by www.quantumachine.net (Horde Framework) with HTTPS; Thu, 02 Nov 2017 16:56:29 +0000 Date: Thu, 02 Nov 2017 16:56:29 +0000 Message-ID: <20171102165629.Horde.3vL2RJXzulVHv5PiXG00Bz4@www.quantumachine.net> From: Antonio Huete =?utf-8?b?Smltw6luZXo=?= To: qemu-devel@nongnu.org User-Agent: Horde Application Framework 5 MIME-Version: 1.0 Content-Disposition: inline X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 37.59.103.225 Subject: [Qemu-devel] [PATCH] sockets: Normalize test for addrinfo flag AI_V4MAPPED 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8"; format="flowed"; delsp="Yes" From 2b4d9d8cb617445af8f3b062f917dfea42dbdc27 Mon Sep 17 00:00:00 2001 From: Antonio Huete Jimenez Date: Thu, 2 Nov 2017 17:46:24 +0100 Subject: [PATCH] sockets: Normalize test for addrinfo flag AI_V4MAPPED Signed-off-by: Antonio Huete Jimenez --- util/qemu-sockets.c | 54 =20 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index b47fb45885..ce35b6a998 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -44,7 +44,6 @@ # define AI_NUMERICSERV 0 #endif - static int inet_getport(struct addrinfo *e) { struct sockaddr_in *i4; @@ -149,6 +148,31 @@ int inet_ai_family_from_address(InetSocketAddress *add= r, return PF_UNSPEC; } +static int +check_ai_v4mapped(const char *host, const char *port, struct addrinfo *ai, + struct addrinfo *res) +{ + static int useV4Mapped =3D -1; + int rc; + + /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but + * then don't implement it in their getaddrinfo(). + * Unconditionally deselect AI_V4MAPPED option upon + * getaddrinfo() failure, the next call to it will have to + * do the error handling. + */ + if (atomic_read(&useV4Mapped) =3D=3D -1) { + rc =3D getaddrinfo(host, port, ai, &res); + if (rc =3D=3D 0 && (ai->ai_flags & AI_V4MAPPED)) { + atomic_set(&useV4Mapped, 1); + } else { + atomic_set(&useV4Mapped, 0); + } + } + + return useV4Mapped; +} + static int create_fast_reuse_socket(struct addrinfo *e) { int slisten =3D qemu_socket(e->ai_family, e->ai_socktype, e->ai_proto= col); @@ -378,14 +402,10 @@ static struct addrinfo =20 *inet_parse_connect_saddr(InetSocketAddress *saddr, struct addrinfo ai, *res; int rc; Error *err =3D NULL; - static int useV4Mapped =3D 1; memset(&ai, 0, sizeof(ai)); - ai.ai_flags =3D AI_CANONNAME | AI_ADDRCONFIG; - if (atomic_read(&useV4Mapped)) { - ai.ai_flags |=3D AI_V4MAPPED; - } + ai.ai_flags =3D AI_CANONNAME | AI_ADDRCONFIG | AI_V4MAPPED; ai.ai_family =3D inet_ai_family_from_address(saddr, &err); ai.ai_socktype =3D SOCK_STREAM; @@ -399,21 +419,11 @@ static struct addrinfo =20 *inet_parse_connect_saddr(InetSocketAddress *saddr, return NULL; } - /* lookup */ - rc =3D getaddrinfo(saddr->host, saddr->port, &ai, &res); - - /* At least FreeBSD and OS-X 10.6 declare AI_V4MAPPED but - * then don't implement it in their getaddrinfo(). Detect - * this and retry without the flag since that's preferrable - * to a fatal error - */ - if (rc =3D=3D EAI_BADFLAGS && - (ai.ai_flags & AI_V4MAPPED)) { - atomic_set(&useV4Mapped, 0); + if ((check_ai_v4mapped(saddr->host, saddr->port, &ai, res)) =3D=3D 0) { ai.ai_flags &=3D ~AI_V4MAPPED; - rc =3D getaddrinfo(saddr->host, saddr->port, &ai, &res); } - if (rc !=3D 0) { + + if ((rc =3D getaddrinfo(saddr->host, saddr->port, &ai, &res)) !=3D 0) { error_setg(errp, "address resolution failed for %s:%s: %s", saddr->host, saddr->port, gai_strerror(rc)); return NULL; @@ -469,7 +479,7 @@ static int inet_dgram_saddr(InetSocketAddress *sraddr, /* lookup peer addr */ memset(&ai,0, sizeof(ai)); - ai.ai_flags =3D AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG; + ai.ai_flags =3D AI_CANONNAME | AI_ADDRCONFIG | AI_V4MAPPED; ai.ai_family =3D inet_ai_family_from_address(sraddr, &err); ai.ai_socktype =3D SOCK_DGRAM; @@ -488,6 +498,10 @@ static int inet_dgram_saddr(InetSocketAddress *sraddr, goto err; } + if ((check_ai_v4mapped(addr, port, &ai, &peer)) =3D=3D 0) { + ai.ai_flags &=3D ~AI_V4MAPPED; + } + if ((rc =3D getaddrinfo(addr, port, &ai, &peer)) !=3D 0) { error_setg(errp, "address resolution failed for %s:%s: %s", =20 addr, port, gai_strerror(rc)); --=20 2.14.1