Skip to content
  • Michał Kępień's avatar
    Restore localhost fallback in bin/dig/dighost.c · 18758392
    Michał Kępień authored
    In BIND 9.11 and earlier, dig and similar tools used liblwres for
    parsing /etc/resolv.conf.  After getting a list of servers from
    liblwres, a tool would check the address family of each server found and
    reject those unusable.  When the resulting list of usable servers was
    empty, localhost addresses were queried as a fallback.
    
    When liblwres was removed in BIND 9.12, dig and similar tools were
    updated to parse /etc/resolv.conf using libirs instead.  As part of that
    process, the localhost fallback was removed from bin/dig/dighost.c since
    the localhost fallback built into libirs was deemed to be sufficient.
    However, libirs only falls back to localhost if it does not find any
    name servers at all; if it does find any valid nameserver entry in
    /etc/resolv.conf, it just returns it to the caller because it is
    oblivious to whether the caller supports IPv4 and/or IPv6 or not.  The
    code in bin/dig/dighost.c subsequently filters the returned list of
    servers in get_server_list() according to the requested address family
    restrictions.  This may result in none of the addresses returned by
    libirs being usable, in which case a tool will attempt to work with an
    empty server list, causing a hang and subsequently a crash upon user
    interruption.
    
    Restore the localhost fallback in bin/dig/dighost.c to prevent the
    aforementioned hangs and crashes and ensure recent BIND versions behave
    identically to the older ones in the circumstances described above.
    18758392