Skip to content

Commit

Permalink
Avoid __check_pf calls in getaddrinfo unless really needed
Browse files Browse the repository at this point in the history
  • Loading branch information
Ulrich Drepper committed Jun 22, 2011
1 parent e12df16 commit fa3fc0f
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 7 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
4 changes: 2 additions & 2 deletions NEWS
Original file line number Diff line number Diff line 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.

Expand All @@ -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.
Expand Down
17 changes: 12 additions & 5 deletions sysdeps/posix/getaddrinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit fa3fc0f

Please sign in to comment.