diff --git a/ares/CHANGES b/ares/CHANGES
index ec202261d852aa9979a69d6c1aa285c741eb9ca5..2a73a484e9973c26b9568f766248fd5c6dc6c047 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 e6b9f7f4005c27ceb75792b6622914b62b0ca0ca..61fc59256cc1489b661fc4d51a7d8071b1907830 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);