1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-01 10:06:57 +03:00

Avoid __check_pf calls in getaddrinfo unless really needed

This commit is contained in:
Ulrich Drepper
2011-06-22 15:00:54 -04:00
parent e12df166d3
commit fa3fc0fe5f
3 changed files with 21 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2011-06-22 Ulrich Drepper <drepper@gmail.com>
[BZ #12907]
* sysdeps/posix/getaddrinfo.c (getaddrinfo): Avoid calling __check_pf
until it is clear that the information is realy needed.
Patch mostly by David Hanisch <david.hanisch@nsn.com>.
2011-06-22 Andreas Schwab <schwab@redhat.com> 2011-06-22 Andreas Schwab <schwab@redhat.com>
* sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change. * sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change.

4
NEWS
View File

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2011-6-21 GNU C Library NEWS -- history of user-visible changes. 2011-6-22
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc. Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
See the end for copying conditions. See the end for copying conditions.
@ -9,7 +9,7 @@ Version 2.15
* The following bugs are resolved with this release: * The following bugs are resolved with this release:
12885 12885, 12907
* New program pldd to list loaded object of a process * New program pldd to list loaded object of a process
Implemented by Ulrich Drepper. Implemented by Ulrich Drepper.

View File

@ -2352,14 +2352,17 @@ getaddrinfo (const char *name, const char *service,
size_t in6ailen = 0; size_t in6ailen = 0;
bool seen_ipv4 = false; bool seen_ipv4 = false;
bool seen_ipv6 = false; bool seen_ipv6 = false;
bool check_pf_called = false;
if (hints->ai_flags & AI_ADDRCONFIG)
{
/* We might need information about what interfaces are available. /* We might need information about what interfaces are available.
Also determine whether we have IPv4 or IPv6 interfaces or both. We Also determine whether we have IPv4 or IPv6 interfaces or both. We
cannot cache the results since new interfaces could be added at cannot cache the results since new interfaces could be added at
any time. */ any time. */
__check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen); __check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen);
check_pf_called = true;
if (hints->ai_flags & AI_ADDRCONFIG)
{
/* Now make a decision on what we return, if anything. */ /* Now make a decision on what we return, if anything. */
if (hints->ai_family == PF_UNSPEC && (seen_ipv4 || seen_ipv6)) if (hints->ai_family == PF_UNSPEC && (seen_ipv4 || seen_ipv6))
{ {
@ -2441,6 +2444,10 @@ getaddrinfo (const char *name, const char *service,
struct addrinfo *last = NULL; struct addrinfo *last = NULL;
char *canonname = NULL; char *canonname = NULL;
/* Now we definitely need the interface information. */
if (! check_pf_called)
__check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen);
/* If we have information about deprecated and temporary addresses /* If we have information about deprecated and temporary addresses
sort the array now. */ sort the array now. */
if (in6ai != NULL) if (in6ai != NULL)