From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS17314 8.43.84.0/22 X-Spam-Status: No, score=-3.6 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, PDS_RDNS_DYNAMIC_FP,RCVD_IN_DNSWL_MED,RDNS_DYNAMIC,SPF_HELO_PASS, SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 9669A1F8C6 for ; Tue, 3 Aug 2021 21:31:35 +0000 (UTC) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BC2733853820 for ; Tue, 3 Aug 2021 21:31:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BC2733853820 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1628026294; bh=Fp5xza+7b9PBb8/BUpAwLr7GSGsd15RVgfHEeyCSekk=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Wfmpfzate1q5ozBdNRObmIAW4vj82w2wS2XjBGZkNAdE7j4jf0H7KOsd3UKIpwktj PXkfJHmnDLC2WKJdKKF8+R9jnMSRnRErSApp7MXgaeEUXSMbjKwciveeU1OIs+YrBF soBGhPixbt7NWrsg56Flh75IeCN1KDISNsqwnXGo= Received: from bird.elm.relay.mailchannels.net (bird.elm.relay.mailchannels.net [23.83.212.17]) by sourceware.org (Postfix) with ESMTPS id 97A70385DC29 for ; Tue, 3 Aug 2021 21:29:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 97A70385DC29 X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 633D41E2364 for ; Tue, 3 Aug 2021 21:29:36 +0000 (UTC) Received: from pdx1-sub0-mail-a4.g.dreamhost.com (100-105-161-178.trex.outbound.svc.cluster.local [100.105.161.178]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id F2FF41E2739 for ; Tue, 3 Aug 2021 21:29:35 +0000 (UTC) X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from pdx1-sub0-mail-a4.g.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384) by 100.105.161.178 (trex/6.3.3); Tue, 03 Aug 2021 21:29:36 +0000 X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Bitter-Reign: 01ff9c752e4d7017_1628026176258_4078069738 X-MC-Loop-Signature: 1628026176258:2895288300 X-MC-Ingress-Time: 1628026176258 Received: from pdx1-sub0-mail-a4.g.dreamhost.com (localhost [127.0.0.1]) by pdx1-sub0-mail-a4.g.dreamhost.com (Postfix) with ESMTP id C05608AAAA for ; Tue, 3 Aug 2021 14:29:35 -0700 (PDT) Received: from rhbox.redhat.com (unknown [1.186.101.110]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a4.g.dreamhost.com (Postfix) with ESMTPSA id 9D8C98AAA8 for ; Tue, 3 Aug 2021 14:29:33 -0700 (PDT) X-DH-BACKEND: pdx1-sub0-mail-a4 To: libc-alpha@sourceware.org Subject: [PATCH 3/5] getaddrinfo: Refactor code for readability Date: Wed, 4 Aug 2021 02:59:17 +0530 Message-Id: <20210803212919.3059194-4-siddhesh@sourceware.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210803212919.3059194-1-siddhesh@sourceware.org> References: <20210803212919.3059194-1-siddhesh@sourceware.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Siddhesh Poyarekar via Libc-alpha Reply-To: Siddhesh Poyarekar Errors-To: libc-alpha-bounces+e=80x24.org@sourceware.org Sender: "Libc-alpha" The close_retry goto jump is confusing and clumsy to read, so refactor the code a bit to make it easier to follow. --- sysdeps/posix/getaddrinfo.c | 46 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 180048eec2..fd05d53c1a 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2156,6 +2156,37 @@ gaiconf_reload (void) gaiconf_init (); } =20 +static bool +try_connect (int *fdp, int *afp, struct sockaddr_in6 *source_addrp, + const struct sockaddr *addr, socklen_t addrlen, int family) +{ + int fd =3D *fdp; + int af =3D *afp; + socklen_t sl =3D sizeof (*source_addrp); + bool retry =3D false; + + do + { + if (fd !=3D -1 && __connect (fd, addr, addrlen) =3D=3D 0 + && __getsockname (fd, (struct sockaddr *) source_addrp, &sl) =3D=3D 0= ) + return true; + else if (errno =3D=3D EAFNOSUPPORT && af =3D=3D AF_INET6 && family= =3D=3D AF_INET) + { + /* This could mean IPv6 sockets are IPv6-only. */ + if (fd !=3D -1) + __close_nocancel_nostatus (fd); + *afp =3D af =3D AF_INET; + *fdp =3D fd =3D __socket (AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, + IPPROTO_IP); + retry =3D true; + } + else + return false; + } + while (retry); + + __builtin_unreachable (); +} =20 int getaddrinfo (const char *name, const char *service, @@ -2346,7 +2377,6 @@ getaddrinfo (const char *name, const char *service, if (fd =3D=3D -1 || (af =3D=3D AF_INET && q->ai_family =3D=3D AF_= INET6)) { if (fd !=3D -1) - close_retry: __close_nocancel_nostatus (fd); af =3D q->ai_family; fd =3D __socket (af, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_IP); @@ -2358,14 +2388,10 @@ getaddrinfo (const char *name, const char *servic= e, __connect (fd, &sa, sizeof (sa)); } =20 - socklen_t sl =3D sizeof (results[i].source_addr); - if (fd !=3D -1 - && __connect (fd, q->ai_addr, q->ai_addrlen) =3D=3D 0 - && __getsockname (fd, - (struct sockaddr *) &results[i].source_addr, - &sl) =3D=3D 0) + if (try_connect (&fd, &af, &results[i].source_addr, q->ai_addr, + q->ai_addrlen, q->ai_family)) { - results[i].source_addr_len =3D sl; + results[i].source_addr_len =3D sizeof (results[i].source_addr); results[i].got_source_addr =3D true; =20 if (in6ai !=3D NULL) @@ -2430,10 +2456,6 @@ getaddrinfo (const char *name, const char *service= , results[i].source_addr_len =3D sizeof (struct sockaddr_in); } } - else if (errno =3D=3D EAFNOSUPPORT && af =3D=3D AF_INET6 - && q->ai_family =3D=3D AF_INET) - /* This could mean IPv6 sockets are IPv6-only. */ - goto close_retry; else /* Just make sure that if we have to process the same address again we do not copy any memory. */ --=20 2.31.1