diff options
author | Rich Felker <dalias@aerifal.cx> | 2020-08-24 21:56:48 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2020-08-24 22:02:14 -0400 |
commit | 19f8642494b7d27b2ceed5c14d4a0b27cb749afe (patch) | |
tree | c08cdc143f4bded8a3a6a860186727815cf2800b /src | |
parent | 9d0b8b92a508c328e7eac774847f001f80dfb5ff (diff) | |
download | musl-19f8642494b7d27b2ceed5c14d4a0b27cb749afe.tar.gz musl-19f8642494b7d27b2ceed5c14d4a0b27cb749afe.tar.bz2 musl-19f8642494b7d27b2ceed5c14d4a0b27cb749afe.tar.xz musl-19f8642494b7d27b2ceed5c14d4a0b27cb749afe.zip |
report res_query failures, including nxdomain/nodata, via h_errno
while it's not clearly documented anywhere, this is the historical
behavior which some applications expect. applications which need to
see the response packet in these cases, for example to distinguish
between nonexistence in a secure vs insecure zone, must already use
res_mkquery with res_send in order to be portable, since most if not
all other implementations of res_query don't provide it.
Diffstat (limited to 'src')
-rw-r--r-- | src/network/res_query.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/network/res_query.c b/src/network/res_query.c index 2f4da2e2..506dc231 100644 --- a/src/network/res_query.c +++ b/src/network/res_query.c @@ -1,3 +1,4 @@ +#define _BSD_SOURCE #include <resolv.h> #include <netdb.h> @@ -6,7 +7,20 @@ int res_query(const char *name, int class, int type, unsigned char *dest, int le unsigned char q[280]; int ql = __res_mkquery(0, name, class, type, 0, 0, 0, q, sizeof q); if (ql < 0) return ql; - return __res_send(q, ql, dest, len); + int r = __res_send(q, ql, dest, len); + if (r<12) { + h_errno = TRY_AGAIN; + return -1; + } + if ((dest[3] & 15) == 3) { + h_errno = HOST_NOT_FOUND; + return -1; + } + if ((dest[3] & 15) == 0 && !dest[6] && !dest[7]) { + h_errno = NO_DATA; + return -1; + } + return r; } weak_alias(res_query, res_search); |