Ralf Haferkamp wrote:
On Donnerstag, 29. November 2007, hyc@symas.com wrote:
rhafer@suse.de wrote:
Full_Name: Ralf Haferkamp Version: All OS: Linux, glibc 2.7 URL: ftp://ftp.openldap.org/incoming/ Submission from: (NULL) (89.166.161.148)
Newer versions of glibc (2.7) in my case might return duplicate addrinfo structs in the results under certain circumstances. According to the friendly glibc maintainer ;) this is not a bug: http://sources.redhat.com/bugzilla/show_bug.cgi?id=4980 Unfortunately he doesn't give a reason for this change in behavior.
Interesting. In that bug report the /etc/hosts file has 127.0.0.1 once and ::1 once, so why is 127.0.0.1 being returned twice? That is clearly bogus.
The glibc code explicitly checks the /etc/hosts entry for IN6_IS_ADDR_LOOPBACK and returns the the in_attr_t for INADDR_LOOPBACK in that case. For reasons that the glibc author seemingly doesn't want to share with the outer world.
We're calling getaddrinfo with hints.ai_family = AF_UNSPEC, so we should be getting both IPv4 and IPv6 addresses back. In this case, converting the V6 address to V4 format is obviously not desired.
Also RFC2553 pretty much forbids this: (Page 25)
Also note that the IPv6 hex addresses "::" and "::1" MUST NOT be treated as IPv4- compatible addresses, and if the address is "::", HOST_NOT_FOUND MUST be returned and a query of the address not performed.
Also for the macro in section 6.7 IN6_IS_ADDR_V4COMPAT MUST return false for "::" and "::1".
BTW, I didn't find any reference in the related RFCs that state that the getaddrinfo results need to be unique (nor the opposite). In my current builds I simply patched slapd to check the getaddrinfo() results for uniqueness in the slap_get_listner_addresses() function. Has anybody a better idea how to fix this?
I'm sure there's nothing that states that the returned info is required to be unique. The returned data must accurately reflect the host databases being queried though. If you put "127.0.0.1 localhost" twice in /etc/hosts, then it's reasonable to get it returned twice. But if it's only in there once, then returning it twice is a bug.