diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 53 |
2 files changed, 20 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog index b98bdc4664..9a881fd506 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2019-05-17 Florian Weimer <fweimer@redhat.com> + + * resolv/nss_dns/dns-host.c (gethostbyname3_context): Do not + perform IPv6 lookup. Adjust getanswer_r call. + (_nss_dns_gethostbyname_r): Do not request IPv4 address mapping + from gethostbyname3_context. + (_nss_dns_gethostbyaddr2_r): Adjust getanswer_r call. + (getanswer_r): Remove map argument. Do not perform address + mapping. + 2019-05-16 Florian Weimer <fweimer@redhat.com> * resolv/nss_dns/dns-host.c (getanswer_r): Be more explicit about diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 9c40051aff..40c23dfe00 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -85,10 +85,6 @@ #include <resolv/resolv-internal.h> #include <resolv/resolv_context.h> -/* Get implementations of some internal functions. */ -#include <resolv/mapv4v6addr.h> -#include <resolv/mapv4v6hostent.h> - #define RESOLVSORT #if PACKETSZ > 65536 @@ -114,7 +110,7 @@ static enum nss_status getanswer_r (struct resolv_context *ctx, const char *qname, int qtype, struct hostent *result, char *buffer, size_t buflen, int *errnop, int *h_errnop, - int map, int32_t *ttlp, char **canonp); + int32_t *ttlp, char **canonp); static enum nss_status gaih_getanswer (const querybuf *answer1, int anslen1, const querybuf *answer2, int anslen2, @@ -182,7 +178,6 @@ gethostbyname3_context (struct resolv_context *ctx, char tmp[NS_MAXDNAME]; int size, type, n; const char *cp; - int map = 0; int olderr = errno; enum nss_status status; @@ -244,31 +239,14 @@ gethostbyname3_context (struct resolv_context *ctx, else __set_errno (olderr); - /* If we are looking for an IPv6 address and mapping is enabled - by having the RES_USE_INET6 bit in _res.options set, we try - another lookup. */ - if (af == AF_INET6 && res_use_inet6 ()) - n = __res_context_search (ctx, name, C_IN, T_A, host_buffer.buf->buf, - host_buffer.buf != orig_host_buffer - ? MAXPACKET : 1024, &host_buffer.ptr, - NULL, NULL, NULL, NULL); - - if (n < 0) - { - if (host_buffer.buf != orig_host_buffer) - free (host_buffer.buf); - return status; - } - - map = 1; - - result->h_addrtype = AF_INET; - result->h_length = INADDRSZ; + if (host_buffer.buf != orig_host_buffer) + free (host_buffer.buf); + return status; } status = getanswer_r (ctx, host_buffer.buf, n, name, type, result, buffer, buflen, - errnop, h_errnop, map, ttlp, canonp); + errnop, h_errnop, ttlp, canonp); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); return status; @@ -314,13 +292,8 @@ _nss_dns_gethostbyname_r (const char *name, struct hostent *result, *h_errnop = NETDB_INTERNAL; return NSS_STATUS_UNAVAIL; } - status = NSS_STATUS_NOTFOUND; - if (res_use_inet6 ()) - status = gethostbyname3_context (ctx, name, AF_INET6, result, buffer, - buflen, errnop, h_errnop, NULL, NULL); - if (status == NSS_STATUS_NOTFOUND) - status = gethostbyname3_context (ctx, name, AF_INET, result, buffer, - buflen, errnop, h_errnop, NULL, NULL); + status = gethostbyname3_context (ctx, name, AF_INET, result, buffer, + buflen, errnop, h_errnop, NULL, NULL); __resolv_context_put (ctx); return status; } @@ -547,7 +520,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, status = getanswer_r (ctx, host_buffer.buf, n, qbuf, T_PTR, result, buffer, buflen, - errnop, h_errnop, 0 /* XXX */, ttlp, NULL); + errnop, h_errnop, ttlp, NULL); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); if (status != NSS_STATUS_SUCCESS) @@ -627,7 +600,7 @@ static enum nss_status getanswer_r (struct resolv_context *ctx, const querybuf *answer, int anslen, const char *qname, int qtype, struct hostent *result, char *buffer, size_t buflen, - int *errnop, int *h_errnop, int map, int32_t *ttlp, char **canonp) + int *errnop, int *h_errnop, int32_t *ttlp, char **canonp) { struct host_data { @@ -645,7 +618,6 @@ getanswer_r (struct resolv_context *ctx, const char *tname; int (*name_ok) (const char *); u_char packtmp[NS_MAXCDNAME]; - int have_to_map = 0; uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); buffer += pad; buflen = buflen > pad ? buflen - pad : 0; @@ -870,9 +842,7 @@ getanswer_r (struct resolv_context *ctx, continue; } - if (type == T_A && qtype == T_AAAA && map) - have_to_map = 1; - else if (__glibc_unlikely (type != qtype)) + if (__glibc_unlikely (type != qtype)) { cp += n; continue; /* XXX - had_error++ ? */ @@ -995,9 +965,6 @@ getanswer_r (struct resolv_context *ctx, linebuflen -= n; } - if (have_to_map) - if (map_v4v6_hostent (result, &bp, &linebuflen)) - goto too_small; *h_errnop = NETDB_SUCCESS; return NSS_STATUS_SUCCESS; } |