From fa3fc0fe5f452d0aa7e435d8f32e992958683819 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 22 Jun 2011 15:00:54 -0400 Subject: [PATCH] Avoid __check_pf calls in getaddrinfo unless really needed --- ChangeLog | 7 +++++++ NEWS | 4 ++-- sysdeps/posix/getaddrinfo.c | 17 ++++++++++++----- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 33b7703..ad7303f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-06-22 Ulrich Drepper + + [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 . + 2011-06-22 Andreas Schwab * sysdeps/posix/getaddrinfo.c (gaih_inet): Fix last change. diff --git a/NEWS b/NEWS index 9e6832c..5a7ffc2 100644 --- a/NEWS +++ b/NEWS @@ -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) -- 2.7.4