diff options
author | Phil Blundell <pb@reciva.com> | 2009-02-03 14:38:09 +0000 |
---|---|---|
committer | Phil Blundell <pb@reciva.com> | 2009-02-03 14:38:09 +0000 |
commit | 83d135f990f8420c3777bf1a5650545b46207a28 (patch) | |
tree | 12bd0c35c00c015fd35387d9833cc96fe62d48a0 | |
parent | d4ac3d53fc13ec9fdf4e693e4b6fe2539ee6592c (diff) |
* February 3 2009 (Phil Blundell)
- If the server returns garbage or nothing at all in response to an AAAA query,
go on and ask for A records anyway.
-rw-r--r-- | ares/CHANGES | 4 | ||||
-rw-r--r-- | ares/ares_gethostbyname.c | 14 |
2 files changed, 11 insertions, 7 deletions
diff --git a/ares/CHANGES b/ares/CHANGES index ec202261d..2a73a484e 100644 --- a/ares/CHANGES +++ b/ares/CHANGES @@ -1,5 +1,9 @@ Changelog for the c-ares project +* February 3 2009 (Phil Blundell) +- If the server returns garbage or nothing at all in response to an AAAA query, + go on and ask for A records anyway. + * January 31 2009 (Daniel Stenberg) - ares_gethostbyname() now accepts 'AF_UNSPEC' as a family for resolving either AF_INET6 or AF_INET. It works by accepting any of the looksups in the diff --git a/ares/ares_gethostbyname.c b/ares/ares_gethostbyname.c index e6b9f7f40..61fc59256 100644 --- a/ares/ares_gethostbyname.c +++ b/ares/ares_gethostbyname.c @@ -194,10 +194,10 @@ static void host_callback(void *arg, int status, int timeouts, else if (hquery->sent_family == AF_INET6) { status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL); - if (status == ARES_ENODATA) { - /* The query returned something (e.g. CNAME) but there were no - AAAA records. Try looking up A instead. We should possibly - limit this attempt-next logic to AF_UNSPEC lookups only. */ + if (status == ARES_ENODATA || status == ARES_EBADRESP) { + /* The query returned something but either there were no AAAA records (e.g. just CNAME) + or the response was malformed. Try looking up A instead. + We should possibly limit this attempt-next logic to AF_UNSPEC lookups only. */ hquery->sent_family = AF_INET; ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, hquery); @@ -208,10 +208,10 @@ static void host_callback(void *arg, int status, int timeouts, } end_hquery(hquery, status, host); } - else if (status == ARES_ENODATA && hquery->sent_family == AF_INET6) + else if ((status == ARES_ENODATA || status == ARES_EBADRESP || status == ARES_ETIMEOUT) && hquery->sent_family == AF_INET6) { - /* There was no AAAA. Now lookup an A. We should possibly limit this - attempt-next logic to AF_UNSPEC lookups only. */ + /* The AAAA query yielded no useful result. Now look up an A instead. + We should possibly limit this attempt-next logic to AF_UNSPEC lookups only. */ hquery->sent_family = AF_INET; ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, hquery); |