sysdeps/posix/getaddrinfo: Return early on invalid address family
Commit Message
Check address family before expensive function call (__check_pf).
---
sysdeps/posix/getaddrinfo.c | 40 +++++++++++++++++--------------------
1 file changed, 18 insertions(+), 22 deletions(-)
--
2.24.0
Comments
* Tim Rühsen:
> Check address family before expensive function call (__check_pf).
I have pushed this for you. I did not check your copyright assignment
status because the changes are mostly reindentation. But if you don't
have paperwork in place, this is probably the last contribution we can
accept from you. Sorry about that.
<https://sourceware.org/glibc/wiki/Contribution%20checklist#FSF_copyright_Assignment>
On 11/26/19 11:30 AM, Florian Weimer wrote:
> * Tim Rühsen:
>
>> Check address family before expensive function call (__check_pf).
>
> I have pushed this for you. I did not check your copyright assignment
> status because the changes are mostly reindentation. But if you don't
> have paperwork in place, this is probably the last contribution we can
> accept from you. Sorry about that.
>
> <https://sourceware.org/glibc/wiki/Contribution%20checklist#FSF_copyright_Assignment>
Thank you for heads up, Florian !
I will sign the FSF copyright assignment for GNU glibc in the next days
(have to check a few things first).
Regards, Tim
@@ -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)