From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from quail.birch.relay.mailchannels.net (quail.birch.relay.mailchannels.net [23.83.209.151]) by sourceware.org (Postfix) with ESMTPS id 09FD23858D20 for ; Mon, 14 Mar 2022 17:31:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 09FD23858D20 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 661516226DE for ; Mon, 14 Mar 2022 17:31:31 +0000 (UTC) Received: from pdx1-sub0-mail-a307.dreamhost.com (unknown [127.0.0.6]) (Authenticated sender: dreamhost) by relay.mailchannels.net (Postfix) with ESMTPA id 08A3D62278A for ; Mon, 14 Mar 2022 17:31:15 +0000 (UTC) ARC-Seal: i=1; s=arc-2022; d=mailchannels.net; t=1647279091; a=rsa-sha256; cv=none; b=CLEo02kRRaJorp11i7CuExKUAqYZ9Lj3tSyspALmmcGWwoL3F/sF3bgGSJhGQaNoPEAPEj pCGSYrdS2IStkPw8ZWLbdYIpKfs2mQfqmdshKruNmjAltQSMrZ03UCNQ8wZvHcsgboFYhx vCifUoRjN59Knogz92+c8rcd02JTX7t2I0Ie6wWSqqGZ/BrCay7ZyduidOoCYiNvNdFaO/ CAuoUhqa/xtLKIh85W31ssPhr8SqNnjxygTqjdi0G7tlSugV88OLuL+HZqbtqsMBlOEsjW wSjUQoe/8rWiMFvfdK0OAWDTi5+LTy3NcUZ0tZ9jEyGPVcVQz2WF0Txg2MUSUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1647279091; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2BRYpWEgI3ZPcQdjnYFr4QIH/Hk4H487akYSTtAuZwA=; b=W+1PvfHwiiZzucAESbaGwdz8auIkHxygOCV1zUlm/QC5aMAl1BCPtnJ1dXU/S8XcSiedmu VTcVN0jURBl2uX9kKW4ECA7BLwFEwV8UEFsKUb8wPlKNuRZ6+LFKITbvDhNaxMpOgHahQ1 c5TVSCKHTPpcKfBkcMehycE50x0tPNCAgL6eSsGMYJVlNkJUMltV9uWUGGcgVcdxQJ/bLi Jo6RttUDYqAFXIXrmaqyJZoNECtm3YL8t9xnlP+mxLgk/jsb/SHwNq7NcWzAoT5IsT8sTb cyxQ40AdrL5pGt4jA/8RUAHbRME+CSzkS/xAuD7syVMa9YraTyXcncKdNnItyg== ARC-Authentication-Results: i=1; rspamd-c9cb649d9-h8hch; auth=pass smtp.auth=dreamhost smtp.mailfrom=siddhesh@sourceware.org X-Sender-Id: dreamhost|x-authsender|siddhesh@gotplt.org Received: from pdx1-sub0-mail-a307.dreamhost.com (pop.dreamhost.com [64.90.62.162]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.112.144.9 (trex/6.5.3); Mon, 14 Mar 2022 17:31:31 +0000 X-MC-Relay: Neutral X-MailChannels-SenderId: dreamhost|x-authsender|siddhesh@gotplt.org X-MailChannels-Auth-Id: dreamhost X-Snatch-Spicy: 2e9cd5802f82b0fb_1647279091286_2597702305 X-MC-Loop-Signature: 1647279091286:457273194 X-MC-Ingress-Time: 1647279091286 Received: from rhbox.redhat.com (unknown [1.186.122.132]) (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) (Authenticated sender: siddhesh@gotplt.org) by pdx1-sub0-mail-a307.dreamhost.com (Postfix) with ESMTPSA id 4KHNqR5Jgsz1Pl for ; Mon, 14 Mar 2022 10:30:59 -0700 (PDT) From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Subject: [PATCH 3/3] getaddrinfo: Refactor code for readability Date: Mon, 14 Mar 2022 23:00:39 +0530 Message-Id: <20220314173039.1060650-4-siddhesh@sourceware.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220314173039.1060650-1-siddhesh@sourceware.org> References: <20220314173039.1060650-1-siddhesh@sourceware.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3494.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, RCVD_IN_SBL, SPF_HELO_NONE, SPF_NEUTRAL, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org 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: , X-List-Received-Date: Mon, 14 Mar 2022 17:31:38 -0000 The close_retry goto jump is confusing and clumsy to read, so refactor the code a bit to make it easier to follow. Signed-off-by: Siddhesh Poyarekar --- 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 4e947024ec..5556876108 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2156,6 +2156,37 @@ gaiconf_reload (void) gaiconf_init (); } +static bool +try_connect (int *fdp, int *afp, struct sockaddr_in6 *source_addrp, + const struct sockaddr *addr, socklen_t addrlen, int family) +{ + int fd = *fdp; + int af = *afp; + socklen_t sl = sizeof (*source_addrp); + bool retry = false; + + do + { + if (fd != -1 && __connect (fd, addr, addrlen) == 0 + && __getsockname (fd, (struct sockaddr *) source_addrp, &sl) == 0) + return true; + else if (errno == EAFNOSUPPORT && af == AF_INET6 && family == AF_INET) + { + /* This could mean IPv6 sockets are IPv6-only. */ + if (fd != -1) + __close_nocancel_nostatus (fd); + *afp = af = AF_INET; + *fdp = fd = __socket (AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, + IPPROTO_IP); + retry = true; + } + else + return false; + } + while (retry); + + __builtin_unreachable (); +} int getaddrinfo (const char *name, const char *service, @@ -2346,7 +2377,6 @@ getaddrinfo (const char *name, const char *service, if (fd == -1 || (af == AF_INET && q->ai_family == AF_INET6)) { if (fd != -1) - close_retry: __close_nocancel_nostatus (fd); af = q->ai_family; fd = __socket (af, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_IP); @@ -2358,14 +2388,10 @@ getaddrinfo (const char *name, const char *service, __connect (fd, &sa, sizeof (sa)); } - socklen_t sl = sizeof (results[i].source_addr); - if (fd != -1 - && __connect (fd, q->ai_addr, q->ai_addrlen) == 0 - && __getsockname (fd, - (struct sockaddr *) &results[i].source_addr, - &sl) == 0) + if (try_connect (&fd, &af, &results[i].source_addr, q->ai_addr, + q->ai_addrlen, q->ai_family)) { - results[i].source_addr_len = sl; + results[i].source_addr_len = sizeof (results[i].source_addr); results[i].got_source_addr = true; if (in6ai != NULL) @@ -2430,10 +2456,6 @@ getaddrinfo (const char *name, const char *service, results[i].source_addr_len = sizeof (struct sockaddr_in); } } - else if (errno == EAFNOSUPPORT && af == AF_INET6 - && q->ai_family == 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. */ -- 2.35.1