From patchwork Sun Nov 24 21:01:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Tim_R=C3=BChsen?= X-Patchwork-Id: 36167 Received: (qmail 8884 invoked by alias); 24 Nov 2019 21:01:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 8876 invoked by uid 89); 24 Nov 2019 21:01:40 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.8 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mout.gmx.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1574629296; bh=CgZTGKjvBm3HD7KCkR3cGLiK90jNCXKffUmlWmAB6LY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=Y7SoYfoxhqNnO48JvM19NXR4EusEIR2ZJMq5rEerTSI7pMFCJXP6JeJERo3nvoxH/ 1PRWZ5jty7+EejlBapc2BhEvanZY5W1jHwHmvRb9TCuTppQHkeIWj0pF5LdsAzj42U Iy3s0XqrjiSjZ6RSa1/xlGXJ+CwdRCMNvbAAjSZY= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c From: =?UTF-8?q?Tim=20R=C3=BChsen?= To: libc-alpha@sourceware.org Cc: =?UTF-8?q?Tim=20R=C3=BChsen?= Subject: [PATCH] sysdeps/posix/getaddrinfo: Return early on invalid address family Date: Sun, 24 Nov 2019 22:01:29 +0100 Message-Id: <20191124210129.873243-1-tim.ruehsen@gmx.de> MIME-Version: 1.0 Check address family before expensive function call (__check_pf). --- sysdeps/posix/getaddrinfo.c | 40 +++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 22 deletions(-) -- 2.24.0 diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index afdcdf0a3b..c67c5a955c 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2186,6 +2186,10 @@ getaddrinfo (const char *name, const char *service, if ((hints->ai_flags & AI_CANONNAME) && name == NULL) return EAI_BADFLAGS; + if (hints->ai_family != AF_UNSPEC && hints->ai_family != AF_INET + && hints->ai_family != AF_INET6) + return EAI_FAMILY; + struct in6addrinfo *in6ai = NULL; size_t in6ailen = 0; bool seen_ipv4 = false; @@ -2244,33 +2248,25 @@ getaddrinfo (const char *name, const char *service, pservice = NULL; struct addrinfo **end = &p; - unsigned int naddrs = 0; - if (hints->ai_family == AF_UNSPEC || hints->ai_family == AF_INET - || hints->ai_family == AF_INET6) - { - struct scratch_buffer tmpbuf; - scratch_buffer_init (&tmpbuf); - last_i = gaih_inet (name, pservice, hints, end, &naddrs, &tmpbuf); - scratch_buffer_free (&tmpbuf); + struct scratch_buffer tmpbuf; - if (last_i != 0) - { - freeaddrinfo (p); - __free_in6ai (in6ai); + scratch_buffer_init (&tmpbuf); + last_i = gaih_inet (name, pservice, hints, end, &naddrs, &tmpbuf); + scratch_buffer_free (&tmpbuf); - return -last_i; - } - while (*end) - { - end = &((*end)->ai_next); - ++nresults; - } - } - else + if (last_i != 0) { + freeaddrinfo (p); __free_in6ai (in6ai); - return EAI_FAMILY; + + return -last_i; + } + + while (*end) + { + end = &((*end)->ai_next); + ++nresults; } if (naddrs > 1)