diff options
author | ume <ume@FreeBSD.org> | 2015-12-28 03:26:16 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2015-12-28 03:26:16 +0000 |
commit | 98e3a0ddfe89ece6f510205d46a62c718de6c8f0 (patch) | |
tree | 975f2d5d1471c2b3da9705f94ecd396dbca0db3a /lib/libc/net | |
parent | ca800abb78cb6010f8fa04bd0ba6cb26e7722d92 (diff) | |
download | FreeBSD-src-98e3a0ddfe89ece6f510205d46a62c718de6c8f0.zip FreeBSD-src-98e3a0ddfe89ece6f510205d46a62c718de6c8f0.tar.gz |
MFC r292539:
If we end up following a CNAME chain that does not find
any data return that instead of internal error.
PR: 156684
Diffstat (limited to 'lib/libc/net')
-rw-r--r-- | lib/libc/net/getaddrinfo.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/libc/net/getaddrinfo.c b/lib/libc/net/getaddrinfo.c index 4d1972d..4733e51 100644 --- a/lib/libc/net/getaddrinfo.c +++ b/lib/libc/net/getaddrinfo.c @@ -2166,7 +2166,11 @@ getanswer(const querybuf *answer, int anslen, const char *qname, int qtype, return sentinel.ai_next; } - RES_SET_H_ERRNO(res, NO_RECOVERY); + /* + * We could have walked a CNAME chain, but the ultimate target + * may not have what we looked for. + */ + RES_SET_H_ERRNO(res, ntohs(hp->ancount) > 0 ? NO_DATA : NO_RECOVERY); return NULL; } @@ -2343,6 +2347,7 @@ _dns_getaddrinfo(void *rv, void *cb_data, va_list ap) if (sentinel.ai_next == NULL) switch (res->res_h_errno) { case HOST_NOT_FOUND: + case NO_DATA: return NS_NOTFOUND; case TRY_AGAIN: return NS_TRYAGAIN; |