diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 21 |
3 files changed, 26 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog index b38246eba7..2e16f982fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2012-03-30 Siddhesh Poyarekar <siddhesh@redhat.com> + + [BZ #13928] + * resolv/nss_dns/dns-host.c (getanswer_r): Also consider ttl + from a CNAME entry and return the minimum ttl for the query. + (gaih_getanswer_slice): Likewise. + 2012-03-30 Jeff Law <law@redhat.com> * crypt/md5-crypt.c (__md5_crypt_r): Avoid unbounded alloca uses diff --git a/NEWS b/NEWS index 93432bf416..5489c9725d 100644 --- a/NEWS +++ b/NEWS @@ -18,7 +18,7 @@ Version 2.16 13618, 13637, 13656, 13658, 13673, 13691, 13695, 13704, 13706, 13726, 13738, 13760, 13761, 13786, 13792, 13806, 13824, 13840, 13841, 13844, 13846, 13851, 13852, 13854, 13871, 13879, 13883, 13892, 13910, 13911, - 13912, 13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921 + 13912, 13913, 13915, 13916, 13917, 13918, 13919, 13920, 13921, 13928 * ISO C11 support: diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 3b287b717a..ba83c440cc 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2004, 2007-2009, 2010, 2012 Free Software Foundation, Inc. +/* Copyright (C) 1996-2004, 2007-2010, 2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -744,6 +744,10 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, if ((qtype == T_A || qtype == T_AAAA) && type == T_CNAME) { + /* A CNAME could also have a TTL entry. */ + if (ttlp != NULL && ttl < *ttlp) + *ttlp = ttl; + if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1]) continue; n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); @@ -905,7 +909,10 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, { register int nn; - if (ttlp != NULL) + /* We compose a single hostent out of the entire chain of + entries, so the TTL of the hostent is essentially the lowest + TTL in the chain. */ + if (ttlp != NULL && ttl < *ttlp) *ttlp = ttl; if (canonp != NULL) *canonp = bp; @@ -1081,6 +1088,11 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, if (type == T_CNAME) { char tbuf[MAXDNAME]; + + /* 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_hnok (tbuf) == 0, 0)) { @@ -1161,7 +1173,10 @@ gaih_getanswer_slice (const querybuf *answer, int anslen, const char *qname, if (*firstp) { - if (ttlp != NULL) + /* We compose a single hostent out of the entire chain of + entries, so the TTL of the hostent is essentially the lowest + TTL in the chain. */ + if (ttlp != NULL && ttl < *ttlp) *ttlp = ttl; (*pat)->name = canon ?: h_name; |