[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#5251) getaddrinfo might return duplicate results



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.
> 


-- 
   -- Howard Chu
   Chief Architect, Symas Corp.  http://www.symas.com
   Director, Highland Sun        http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP     http://www.openldap.org/project/