diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 19:50:45 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-08-20 19:50:45 +0200 |
commit | 4dd9e35bfd35d3138bc44169baba098005bad51e (patch) | |
tree | a4939c43a9c3fe00eb27f023e14acc5e1fe8808c /resolv/nss_dns | |
parent | bd42a4599d1b6f77bcfe1e4f67b7cbd9e1cb2dfd (diff) | |
parent | f76453c31593957fec1a99b986bfa5506618b79c (diff) |
Merge commit 'refs/top-bases/t/bigmem' into t/bigmem
Diffstat (limited to 'resolv/nss_dns')
-rw-r--r-- | resolv/nss_dns/dns-canon.c | 4 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 132 | ||||
-rw-r--r-- | resolv/nss_dns/dns-network.c | 12 |
3 files changed, 65 insertions, 83 deletions
diff --git a/resolv/nss_dns/dns-canon.c b/resolv/nss_dns/dns-canon.c index a9db232c7b..14ddd6cca0 100644 --- a/resolv/nss_dns/dns-canon.c +++ b/resolv/nss_dns/dns-canon.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2004-2014 Free Software Foundation, Inc. +/* Copyright (C) 2004-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2004. @@ -62,7 +62,7 @@ _nss_dns_getcanonname_r (const char *name, char *buffer, size_t buflen, { int r = __libc_res_nquery (&_res, name, ns_c_in, qtypes[i], buf, sizeof (buf), &ansp.ptr, NULL, NULL, - NULL); + NULL, NULL); if (r > 0) { /* We need to decode the response. Just one question record. diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index f8f192e5af..357ac04693 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -190,7 +190,7 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result, host_buffer.buf = orig_host_buffer = (querybuf *) alloca (1024); n = __libc_res_nsearch (&_res, name, C_IN, type, host_buffer.buf->buf, - 1024, &host_buffer.ptr, NULL, NULL, NULL); + 1024, &host_buffer.ptr, NULL, NULL, NULL, NULL); if (n < 0) { switch (errno) @@ -225,7 +225,7 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result, n = __libc_res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf->buf, host_buffer.buf != orig_host_buffer ? MAXPACKET : 1024, &host_buffer.ptr, - NULL, NULL, NULL); + NULL, NULL, NULL, NULL); if (n < 0) { @@ -308,13 +308,20 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, u_char *ans2p = NULL; int nans2p = 0; int resplen2 = 0; + int ans2p_malloced = 0; int olderr = errno; enum nss_status status; int n = __libc_res_nsearch (&_res, name, C_IN, T_UNSPEC, host_buffer.buf->buf, 2048, &host_buffer.ptr, - &ans2p, &nans2p, &resplen2); - if (n < 0) + &ans2p, &nans2p, &resplen2, &ans2p_malloced); + if (n >= 0) + { + status = gaih_getanswer (host_buffer.buf, n, (const querybuf *) ans2p, + resplen2, name, pat, buffer, buflen, + errnop, herrnop, ttlp); + } + else { switch (errno) { @@ -341,16 +348,11 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, *errnop = EAGAIN; else __set_errno (olderr); - - if (host_buffer.buf != orig_host_buffer) - free (host_buffer.buf); - - return status; } - status = gaih_getanswer(host_buffer.buf, n, (const querybuf *) ans2p, - resplen2, name, pat, buffer, buflen, - errnop, herrnop, ttlp); + /* Check whether ans2p was separately allocated. */ + if (ans2p_malloced) + free (ans2p); if (host_buffer.buf != orig_host_buffer) free (host_buffer.buf); @@ -398,7 +400,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, buffer += pad; buflen = buflen > pad ? buflen - pad : 0; - if (__builtin_expect (buflen < sizeof (struct host_data), 0)) + if (__glibc_unlikely (buflen < sizeof (struct host_data))) { *errnop = ERANGE; *h_errnop = NETDB_INTERNAL; @@ -452,7 +454,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, break; case AF_INET6: /* Only lookup with the byte string format if the user wants it. */ - if (__builtin_expect (_res.options & RES_USEBSTRING, 0)) + if (__glibc_unlikely (_res.options & RES_USEBSTRING)) { qp = stpcpy (qbuf, "\\[x"); for (n = 0; n < IN6ADDRSZ; ++n) @@ -460,7 +462,7 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, strcpy (qp, "].ip6.arpa"); n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf, 1024, &host_buffer.ptr, - NULL, NULL, NULL); + NULL, NULL, NULL, NULL); if (n >= 0) goto got_it_already; } @@ -481,14 +483,14 @@ _nss_dns_gethostbyaddr2_r (const void *addr, socklen_t len, int af, } n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf, - 1024, &host_buffer.ptr, NULL, NULL, NULL); + 1024, &host_buffer.ptr, NULL, NULL, NULL, NULL); if (n < 0 && af == AF_INET6 && (_res.options & RES_NOIP6DOTINT) == 0) { strcpy (qp, "ip6.int"); n = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer.buf->buf, host_buffer.buf != orig_host_buffer ? MAXPACKET : 1024, &host_buffer.ptr, - NULL, NULL, NULL); + NULL, NULL, NULL, NULL); } if (n < 0) { @@ -613,7 +615,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, int have_to_map = 0; uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data); buffer += pad; - if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0)) + buflen = buflen > pad ? buflen - pad : 0; + if (__glibc_unlikely (buflen < sizeof (struct host_data))) { /* The buffer is too small. */ too_small: @@ -727,14 +730,14 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, n = -1; } - if (__builtin_expect (n < 0 || (*name_ok) (bp) == 0, 0)) + if (__glibc_unlikely (n < 0 || (*name_ok) (bp) == 0)) { ++had_error; continue; } cp += n; /* name */ - if (__builtin_expect (cp + 10 > end_of_message, 0)) + if (__glibc_unlikely (cp + 10 > end_of_message)) { ++had_error; continue; @@ -748,7 +751,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, cp += INT32SZ; /* TTL */ n = __ns_get16 (cp); cp += INT16SZ; /* len */ - if (__builtin_expect (class != C_IN, 0)) + if (__glibc_unlikely (class != C_IN)) { /* XXX - debug? syslog? */ cp += n; @@ -764,7 +767,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1]) continue; n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); - if (__builtin_expect (n < 0 || (*name_ok) (tbuf) == 0, 0)) + if (__glibc_unlikely (n < 0 || (*name_ok) (tbuf) == 0)) { ++had_error; continue; @@ -782,7 +785,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, linebuflen -= n; /* Get canonical name. */ n = strlen (tbuf) + 1; /* For the \0. */ - if (__builtin_expect (n > linebuflen, 0)) + if (__glibc_unlikely (n > linebuflen)) goto too_small; if (__builtin_expect (n, 0) >= MAXHOSTNAMELEN) { @@ -797,8 +800,12 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, if (qtype == T_PTR && type == T_CNAME) { + /* A CNAME could also have a TTL entry. */ + if (ttlp != NULL && ttl < *ttlp) + *ttlp = ttl; + n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); - if (__builtin_expect (n < 0 || res_dnok (tbuf) == 0, 0)) + if (__glibc_unlikely (n < 0 || res_dnok (tbuf) == 0)) { ++had_error; continue; @@ -806,7 +813,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, cp += n; /* Get canonical name. */ n = strlen (tbuf) + 1; /* For the \0. */ - if (__builtin_expect (n > linebuflen, 0)) + if (__glibc_unlikely (n > linebuflen)) goto too_small; if (__builtin_expect (n, 0) >= MAXHOSTNAMELEN) { @@ -818,26 +825,19 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, linebuflen -= n; continue; } - if (__builtin_expect (type == T_SIG, 0) - || __builtin_expect (type == T_KEY, 0) - || __builtin_expect (type == T_NXT, 0)) - { - /* We don't support DNSSEC yet. For now, ignore the record - and send a low priority message to syslog. */ - syslog (LOG_DEBUG | LOG_AUTH, - "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class (C_IN), p_type(qtype), p_type (type)); - cp += n; - continue; - } if (type == T_A && qtype == T_AAAA && map) have_to_map = 1; - else if (__builtin_expect (type != qtype, 0)) + else if (__glibc_unlikely (type != qtype)) { - syslog (LOG_NOTICE | LOG_AUTH, - "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", - qname, p_class (C_IN), p_type (qtype), p_type (type)); + /* Log a low priority message if we get an unexpected record, but + skip it if we are using DNSSEC since it uses many different types + in responses that do not match QTYPE. */ + if ((_res.options & RES_USE_DNSSEC) == 0) + syslog (LOG_NOTICE | LOG_AUTH, + "gethostby*.getanswer: asked for \"%s %s %s\", " + "got type \"%s\"", + qname, p_class (C_IN), p_type (qtype), p_type (type)); cp += n; continue; /* XXX - had_error++ ? */ } @@ -845,7 +845,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, switch (type) { case T_PTR: - if (__builtin_expect (strcasecmp (tname, bp) != 0, 0)) + if (__glibc_unlikely (strcasecmp (tname, bp) != 0)) { syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp); cp += n; @@ -862,37 +862,20 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, n = -1; } - if (__builtin_expect (n < 0 || res_hnok (bp) == 0, 0)) + if (__glibc_unlikely (n < 0 || res_hnok (bp) == 0)) { ++had_error; break; } -#if MULTI_PTRS_ARE_ALIASES - cp += n; - if (haveanswer == 0) - result->h_name = bp; - else if (ap < &host_data->aliases[MAXALIASES-1]) - *ap++ = bp; - else - n = -1; - if (n != -1) - { - n = strlen (bp) + 1; /* for the \0 */ - if (__builtin_expect (n, 0) >= MAXHOSTNAMELEN) - { - ++had_error; - break; - } - bp += n; - linebuflen -= n; - } - break; -#else + if (ttlp != NULL && ttl < *ttlp) + *ttlp = ttl; + /* bind would put multiple PTR records as aliases, but we don't do + that. */ result->h_name = bp; if (have_to_map) { n = strlen (bp) + 1; /* for the \0 */ - if (__builtin_expect (n >= MAXHOSTNAMELEN, 0)) + if (__glibc_unlikely (n >= MAXHOSTNAMELEN)) { ++had_error; break; @@ -904,7 +887,6 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, } *h_errnop = NETDB_SUCCESS; return NSS_STATUS_SUCCESS; -#endif case T_A: case T_AAAA: if (__builtin_expect (strcasecmp (result->h_name, bp), 0) != 0) @@ -938,7 +920,7 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align)); bp += sizeof (align) - ((u_long) bp % sizeof (align)); - if (__builtin_expect (n > linebuflen, 0)) + if (__glibc_unlikely (n > linebuflen)) goto too_small; bp = __mempcpy (*hap++ = bp, cp, n); cp += n; @@ -1009,7 +991,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, int qdcount = ntohs (hp->qdcount); const u_char *cp = answer->buf + HFIXEDSZ; const u_char *end_of_message = answer->buf + anslen; - if (__builtin_expect (qdcount != 1, 0)) + if (__glibc_unlikely (qdcount != 1)) { *h_errnop = NO_RECOVERY; return NSS_STATUS_UNAVAIL; @@ -1063,7 +1045,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, n = -1; } - if (__builtin_expect (n < 0 || res_hnok (buffer) == 0, 0)) + if (__glibc_unlikely (n < 0 || res_hnok (buffer) == 0)) { ++had_error; continue; @@ -1077,7 +1059,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, cp += n; /* name */ - if (__builtin_expect (cp + 10 > end_of_message, 0)) + if (__glibc_unlikely (cp + 10 > end_of_message)) { ++had_error; continue; @@ -1107,7 +1089,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, *ttlp = ttl; n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); - if (__builtin_expect (n < 0 || res_hnok (tbuf) == 0, 0)) + if (__glibc_unlikely (n < 0 || res_hnok (tbuf) == 0)) { ++had_error; continue; @@ -1124,9 +1106,9 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, } n = strlen (tbuf) + 1; - if (__builtin_expect (n > buflen, 0)) + if (__glibc_unlikely (n > buflen)) goto too_small; - if (__builtin_expect (n >= MAXHOSTNAMELEN, 0)) + if (__glibc_unlikely (n >= MAXHOSTNAMELEN)) { ++had_error; continue; @@ -1143,7 +1125,7 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, // We should not see any types other than those explicitly listed // below. Some types sent by server seem missing, though. Just // collect the data for now. - if (__builtin_expect (type != T_A && type != T_AAAA, 0)) + if (__glibc_unlikely (type != T_A && type != T_AAAA)) #else if (__builtin_expect (type == T_SIG, 0) || __builtin_expect (type == T_KEY, 0) diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c index 8e80a6010e..00f4490c5d 100644 --- a/resolv/nss_dns/dns-network.c +++ b/resolv/nss_dns/dns-network.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2014 Free Software Foundation, Inc. +/* Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -129,7 +129,7 @@ _nss_dns_getnetbyname_r (const char *name, struct netent *result, net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); anslen = __libc_res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, - 1024, &net_buffer.ptr, NULL, NULL, NULL); + 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); if (anslen < 0) { /* Nothing found. */ @@ -205,7 +205,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, int type, struct netent *result, net_buffer.buf = orig_net_buffer = (querybuf *) alloca (1024); anslen = __libc_res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer.buf->buf, - 1024, &net_buffer.ptr, NULL, NULL, NULL); + 1024, &net_buffer.ptr, NULL, NULL, NULL, NULL); if (anslen < 0) { /* Nothing found. */ @@ -268,7 +268,7 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct net_data); buffer += pad; - if (__builtin_expect (buflen < sizeof (*net_data) + pad, 0)) + if (__glibc_unlikely (buflen < sizeof (*net_data) + pad)) { /* The buffer is too small. */ too_small: @@ -398,8 +398,8 @@ getanswer_r (const querybuf *answer, int anslen, struct netent *result, case BYNAME: { - char **ap = result->n_aliases++; - while (*ap != NULL) + char **ap; + for (ap = result->n_aliases; *ap != NULL; ++ap) { /* Check each alias name for being of the forms: 4.3.2.1.in-addr.arpa = net 1.2.3.4 |