diff options
author | Tim Rühsen <tim.ruehsen@gmx.de> | 2019-11-24 22:01:29 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2019-11-26 10:19:33 +0100 |
commit | c1de872c8cdfadb077b4c0a04b1a4bd8c18f3894 (patch) | |
tree | 1f1a0b16fdb03f1f914da7e12663edec7c5c528d | |
parent | cceb038ac0ea552d5eb81759572a358179fa0fc1 (diff) | |
download | glibc-c1de872c8cdfadb077b4c0a04b1a4bd8c18f3894.zip glibc-c1de872c8cdfadb077b4c0a04b1a4bd8c18f3894.tar.gz glibc-c1de872c8cdfadb077b4c0a04b1a4bd8c18f3894.tar.bz2 |
sysdeps/posix/getaddrinfo: Return early on invalid address family
Check address family before expensive function call (__check_pf).
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index afdcdf0..c67c5a9 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) |