fix negative response and non-response handling for dns queries
authorRich Felker <dalias@aerifal.cx>
Tue, 3 Jun 2014 05:46:40 +0000 (01:46 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 3 Jun 2014 05:46:40 +0000 (01:46 -0400)
previously, all failures to obtain at least one address were treated
as nonexistant names (EAI_NONAME). this failed to account for the
possibility of transient failures (no response at all, or a response
with rcode of 2, server failure) or permanent failures that do not
indicate the nonexistence of the requested name. only an rcode of 3
should be treated as an indication of nonexistence.

src/network/lookup_name.c

index 8d41627..0292093 100644 (file)
@@ -151,7 +151,10 @@ static int name_from_dns(struct address buf[static MAXADDRS], char canon[static
        for (i=0; i<nq; i++)
                __dns_parse(abuf[i], alens[i], dns_parse_callback, &ctx);
 
-       return ctx.cnt;
+       if (ctx.cnt) return ctx.cnt;
+       if (alens[0] < 4 || (abuf[0][3] & 15) == 2) return EAI_AGAIN;
+       if ((abuf[0][3] & 15) == 3) return EAI_NONAME;
+       return EAI_FAIL;
 }
 
 int __lookup_name(struct address buf[static MAXADDRS], char canon[static 256], const char *name, int family, int flags)