diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-06-22 15:00:54 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-06-22 15:00:54 -0400 |
commit | fa3fc0fe5f452d0aa7e435d8f32e992958683819 (patch) | |
tree | 37203438a7bfb2a347803415289aacc6fdf8c82e | |
parent | e12df166d37522c2ed434c2d70a1b04640d2d7c6 (diff) | |
download | glibc-fa3fc0fe5f452d0aa7e435d8f32e992958683819.zip glibc-fa3fc0fe5f452d0aa7e435d8f32e992958683819.tar.gz glibc-fa3fc0fe5f452d0aa7e435d8f32e992958683819.tar.bz2 |
Avoid __check_pf calls in getaddrinfo unless really needed
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 17 |
3 files changed, 21 insertions, 7 deletions
@@ -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> * sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change. @@ -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. See the end for copying conditions. @@ -9,7 +9,7 @@ Version 2.15 * The following bugs are resolved with this release: - 12885 + 12885, 12907 * New program pldd to list loaded object of a process Implemented by Ulrich Drepper. diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 14e9270..05c883d 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -2352,14 +2352,17 @@ getaddrinfo (const char *name, const char *service, size_t in6ailen = 0; bool seen_ipv4 = false; bool seen_ipv6 = false; - /* We might need information about what interfaces are available. - Also determine whether we have IPv4 or IPv6 interfaces or both. We - cannot cache the results since new interfaces could be added at - any time. */ - __check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen); + bool check_pf_called = false; if (hints->ai_flags & AI_ADDRCONFIG) { + /* We might need information about what interfaces are available. + Also determine whether we have IPv4 or IPv6 interfaces or both. We + cannot cache the results since new interfaces could be added at + any time. */ + __check_pf (&seen_ipv4, &seen_ipv6, &in6ai, &in6ailen); + check_pf_called = true; + /* Now make a decision on what we return, if anything. */ 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; 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 sort the array now. */ if (in6ai != NULL) |