<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SukmoonLee Blog &#187; isc.bind</title>
	<atom:link href="http://blog.sukmoonlee.com/wordpress/archives/tag/isc-bind/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.sukmoonlee.com/wordpress</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Thu, 20 Sep 2012 00:01:14 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Operational Notification &#8212; Segmentation Fault in resolver.c Affects BIND 9.6-ESV-R6, 9.7.5, 9.8.2, &amp; 9.9.0</title>
		<link>http://blog.sukmoonlee.com/wordpress/archives/185</link>
		<comments>http://blog.sukmoonlee.com/wordpress/archives/185#comments</comments>
		<pubDate>Tue, 01 May 2012 00:30:16 +0000</pubDate>
		<dc:creator>Sukmoon Lee</dc:creator>
				<category><![CDATA[smlee]]></category>
		<category><![CDATA[isc.bind]]></category>

		<guid isPermaLink="false">http://blog.sukmoonlee.com/wordpress/?p=185</guid>
		<description><![CDATA[ISC에서 2012년 4월 초에 릴리즈된 버전에 문제가 있다라고 합니다. 5월 중순에 문제를 해결한 버전을 다시 릴리즈를 한다라고 합니다. https://lists.isc.org/pipermail/bind-announce/2012-April/000772.html 관심이 있는 분야라서 소스를 확인해봤습니다. 패치가 나오면 제가 예상 했던 부분과 비교를 해봐야 할것 같네요. &#160; &#91;stone@localhost ~&#93;$ diff -Nur bind-9.7.4-P1/lib/dns/resolver.c bind-9.7.5/lib/dns/resolver.c --- bind-9.7.4-P1/lib/dns/resolver.c 2011-06-09 08:15:43.000000000 +0900 +++ bind-9.7.5/lib/dns/resolver.c 2012-03-23 04:14:04.000000000 +0900 @@ -1,5 +1,5 @@ <a href='http://blog.sukmoonlee.com/wordpress/archives/185' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>ISC에서 2012년 4월 초에 릴리즈된 버전에 문제가 있다라고 합니다. 5월 중순에 문제를 해결한 버전을 다시 릴리즈를 한다라고 합니다.</p>
<blockquote><p><a href="https://lists.isc.org/pipermail/bind-announce/2012-April/000772.html">https://lists.isc.org/pipermail/bind-announce/2012-April/000772.html</a></p></blockquote>
<p>관심이 있는 분야라서 소스를 확인해봤습니다. 패치가 나오면 제가 예상 했던 부분과 비교를 해봐야 할것 같네요.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="diff" style="font-family:monospace;">&nbsp;
<span style="">&#91;</span>stone@localhost ~<span style="">&#93;</span>$ diff -Nur bind-9.7.4-P1/lib/dns/resolver.c bind-9.7.5/lib/dns/resolver.c  
<span style="color: #888822;">--- bind-9.7.4-P1/lib/dns/resolver.c    2011-06-09 08:15:43.000000000 +0900</span>
<span style="color: #888822;">+++ bind-9.7.5/lib/dns/resolver.c       2012-03-23 04:14:04.000000000 +0900</span>
<span style="color: #440088;">@@ -1,5 +1,5 @@</span>
 /*
<span style="color: #991111;">- * Copyright <span style="">&#40;</span>C<span style="">&#41;</span> 2004-2011  Internet Systems Consortium, Inc. <span style="">&#40;</span>&quot;ISC&quot;<span style="">&#41;</span></span>
<span style="color: #00b000;">+ * Copyright <span style="">&#40;</span>C<span style="">&#41;</span> 2004-2012  Internet Systems Consortium, Inc. <span style="">&#40;</span>&quot;ISC&quot;<span style="">&#41;</span></span>
  * Copyright <span style="">&#40;</span>C<span style="">&#41;</span> <span style="">1999</span>-<span style="">2003</span>  Internet Software Consortium.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
<span style="color: #440088;">@@ -15,7 +15,7 @@</span>
  * PERFORMANCE OF THIS SOFTWARE.
  */
&nbsp;
<span style="color: #991111;">-/* $Id: resolver.c,v 1.413.14.17 2011-06-08 23:15:43 each Exp $ */</span>
<span style="color: #00b000;">+/* $Id$ */</span>
&nbsp;
 /*! \file */
&nbsp;
<span style="color: #440088;">@@ -208,6 +208,8 @@</span>
        ISC_LIST<span style="">&#40;</span>dns_validator_t<span style="">&#41;</span>       validators;
        dns_db_t *                      cache;
        dns_adb_t *                     adb;
<span style="color: #00b000;">+       isc_boolean_t                   ns_ttl_ok;</span>
<span style="color: #00b000;">+       isc_uint32_t                    ns_ttl;</span>
&nbsp;
        /*%
         * The number of events we're waiting for.
<span style="color: #440088;">@@ -444,7 +446,7 @@</span>
                                      dns_rdataset_t *ardataset,
                                      isc_result_t *eresultp<span style="">&#41;</span>;
 static void validated<span style="">&#40;</span>isc_task_t *task, isc_event_t *event<span style="">&#41;</span>;
<span style="color: #991111;">-static void maybe_destroy<span style="">&#40;</span>fetchctx_t *fctx<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+static isc_boolean_t maybe_destroy<span style="">&#40;</span>fetchctx_t *fctx, isc_boolean_t locked<span style="">&#41;</span>;</span>
 static void add_bad<span style="">&#40;</span>fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
                    isc_result_t reason, badnstype_t badtype<span style="">&#41;</span>;
&nbsp;
<span style="color: #440088;">@@ -737,8 +739,11 @@</span>
        INSIST<span style="">&#40;</span>query-&gt;tcpsocket == NULL<span style="">&#41;</span>;
&nbsp;
        query-&gt;fctx-&gt;nqueries--;
<span style="color: #991111;">-       if <span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>query-&gt;fctx<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #991111;">-               maybe_destroy<span style="">&#40;</span>query-&gt;fctx<span style="">&#41;</span>;     /* Locks bucket. */</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>query-&gt;fctx<span style="">&#41;</span><span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+               dns_resolver_t *res = query-&gt;fctx-&gt;res;</span>
<span style="color: #00b000;">+               if <span style="">&#40;</span>maybe_destroy<span style="">&#40;</span>query-&gt;fctx, ISC_FALSE<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+                       empty_bucket<span style="">&#40;</span>res<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       <span style="">&#125;</span></span>
        query-&gt;magic = <span style="">0</span>;
        isc_mem_put<span style="">&#40;</span>query-&gt;mctx, query, sizeof<span style="">&#40;</span>*query<span style="">&#41;</span><span style="">&#41;</span>;
        *queryp = NULL;
<span style="color: #440088;">@@ -1553,9 +1558,11 @@</span>
                dns_dispatch_detach<span style="">&#40;</span>&amp;query-&gt;dispatch<span style="">&#41;</span>;
&nbsp;
  cleanup_query:
<span style="color: #991111;">-       query-&gt;magic = <span style="">0</span>;</span>
<span style="color: #991111;">-       isc_mem_put<span style="">&#40;</span>res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.mctx,</span>
<span style="color: #991111;">-                   query, sizeof<span style="">&#40;</span>*query<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>query-&gt;connects == 0<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+               query-&gt;magic = <span style="">0</span>;</span>
<span style="color: #00b000;">+               isc_mem_put<span style="">&#40;</span>res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.mctx,</span>
<span style="color: #00b000;">+                           query, sizeof<span style="">&#40;</span>*query<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       <span style="">&#125;</span></span>
&nbsp;
  stop_idle_timer:
        RUNTIME_CHECK<span style="">&#40;</span>fctx_stopidletimer<span style="">&#40;</span>fctx<span style="">&#41;</span> == ISC_R_SUCCESS<span style="">&#41;</span>;
<span style="color: #440088;">@@ -1673,6 +1680,7 @@</span>
        dns_compress_t cctx;
        isc_boolean_t cleanup_cctx = ISC_FALSE;
        isc_boolean_t secure_domain;
<span style="color: #00b000;">+       isc_boolean_t connecting = ISC_FALSE;</span>
&nbsp;
        fctx = query-&gt;fctx;
        QTRACE<span style="">&#40;</span>&quot;send&quot;<span style="">&#41;</span>;
<span style="color: #440088;">@@ -1963,6 +1971,7 @@</span>
                                                    query<span style="">&#41;</span>;
                        if <span style="">&#40;</span>result != ISC_R_SUCCESS<span style="">&#41;</span>
                                goto cleanup_message;
<span style="color: #00b000;">+                       connecting = ISC_TRUE;</span>
                        query-&gt;connects++;
                <span style="">&#125;</span>
        <span style="">&#125;</span>
<span style="color: #440088;">@@ -1974,8 +1983,19 @@</span>
         */
        result = isc_socket_sendto<span style="">&#40;</span>socket, &amp;r, task, resquery_senddone,
                                   query, address, NULL<span style="">&#41;</span>;
<span style="color: #991111;">-       if <span style="">&#40;</span>result != ISC_R_SUCCESS<span style="">&#41;</span></span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>result != ISC_R_SUCCESS<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+               if <span style="">&#40;</span>connecting<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+                       /*</span>
<span style="color: #00b000;">+                        * This query is still connecting.</span>
<span style="color: #00b000;">+                        * Mark it as canceled so that it will just be</span>
<span style="color: #00b000;">+                        * cleaned up when the connected event is received.</span>
<span style="color: #00b000;">+                        * Keep fctx around until the event is processed.</span>
<span style="color: #00b000;">+                        */</span>
<span style="color: #00b000;">+                       query-&gt;fctx-&gt;nqueries++;</span>
<span style="color: #00b000;">+                       query-&gt;attributes |= RESQUERY_ATTR_CANCELED;</span>
<span style="color: #00b000;">+               <span style="">&#125;</span></span>
                goto cleanup_message;
<span style="color: #00b000;">+       <span style="">&#125;</span></span>
&nbsp;
        query-&gt;sends++;
&nbsp;
<span style="color: #440088;">@@ -2137,6 +2157,7 @@</span>
        isc_boolean_t want_try = ISC_FALSE;
        isc_boolean_t want_done = ISC_FALSE;
        isc_boolean_t bucket_empty = ISC_FALSE;
<span style="color: #00b000;">+       isc_boolean_t destroy = ISC_FALSE;</span>
        unsigned int bucketnum;
&nbsp;
        find = event-&gt;ev_sender;
<span style="color: #440088;">@@ -2148,6 +2169,9 @@</span>
&nbsp;
        FCTXTRACE<span style="">&#40;</span>&quot;finddone&quot;<span style="">&#41;</span>;
&nbsp;
<span style="color: #00b000;">+       bucketnum = fctx-&gt;bucketnum;</span>
<span style="color: #00b000;">+       LOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
        INSIST<span style="">&#40;</span>fctx-&gt;pending &gt; <span style="">0</span><span style="">&#41;</span>;
        fctx-&gt;pending--;
&nbsp;
<span style="color: #440088;">@@ -2172,17 +2196,17 @@</span>
                <span style="">&#125;</span>
        <span style="">&#125;</span> else if <span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>fctx<span style="">&#41;</span> &amp;&amp; fctx-&gt;pending == <span style="">0</span> &amp;&amp;
                   fctx-&gt;nqueries == <span style="">0</span> &amp;&amp; ISC_LIST_EMPTY<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span><span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #991111;">-               bucketnum = fctx-&gt;bucketnum;</span>
<span style="color: #991111;">-               LOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
                /*
                 * Note that we had to wait until we had the lock before
                 * looking at fctx-&gt;references.
                 */
                if <span style="">&#40;</span>fctx-&gt;references == <span style="">0</span><span style="">&#41;</span>
<span style="color: #991111;">-                       bucket_empty = fctx_destroy<span style="">&#40;</span>fctx<span style="">&#41;</span>;</span>
<span style="color: #991111;">-               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+                       destroy = ISC_TRUE;</span>
        <span style="">&#125;</span>
<span style="color: #00b000;">+       UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
&nbsp;
<span style="color: #00b000;">+       if <span style="">&#40;</span>destroy<span style="">&#41;</span></span>
<span style="color: #00b000;">+               bucket_empty = fctx_destroy<span style="">&#40;</span>fctx<span style="">&#41;</span>;</span>
        isc_event_free<span style="">&#40;</span>&amp;event<span style="">&#41;</span>;
        dns_adb_destroyfind<span style="">&#40;</span>&amp;find<span style="">&#41;</span>;
&nbsp;
<span style="color: #440088;">@@ -3476,6 +3500,20 @@</span>
        return <span style="">&#40;</span>ISC_R_SUCCESS<span style="">&#41;</span>;
 <span style="">&#125;</span>
&nbsp;
<span style="color: #00b000;">+static inline void</span>
<span style="color: #00b000;">+log_ns_ttl<span style="">&#40;</span>fetchctx_t *fctx, const char *where<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+       char namebuf<span style="">&#91;</span>DNS_NAME_FORMATSIZE<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+       char domainbuf<span style="">&#91;</span>DNS_NAME_FORMATSIZE<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+       dns_name_format<span style="">&#40;</span>&amp;fctx-&gt;name, namebuf, sizeof<span style="">&#40;</span>namebuf<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       dns_name_format<span style="">&#40;</span>&amp;fctx-&gt;domain, domainbuf, sizeof<span style="">&#40;</span>domainbuf<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       isc_log_write<span style="">&#40;</span>dns_lctx, DNS_LOGCATEGORY_RESOLVER,</span>
<span style="color: #00b000;">+                     DNS_LOGMODULE_RESOLVER, ISC_LOG_DEBUG<span style="">&#40;</span>10<span style="">&#41;</span>,</span>
<span style="color: #00b000;">+                     &quot;log_ns_ttl: fctx %p: %s: %s <span style="">&#40;</span>in '%s'?<span style="">&#41;</span>: %u %u&quot;,</span>
<span style="color: #00b000;">+                     fctx, where, namebuf, domainbuf,</span>
<span style="color: #00b000;">+                     fctx-&gt;ns_ttl_ok, fctx-&gt;ns_ttl<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+<span style="">&#125;</span></span>
<span style="color: #00b000;">+</span>
 static isc_result_t
 fctx_create<span style="">&#40;</span>dns_resolver_t *res, dns_name_t *name, dns_rdatatype_t type,
            dns_name_t *domain, dns_rdataset_t *nameservers,
<span style="color: #440088;">@@ -3569,6 +3607,8 @@</span>
        fctx-&gt;timeout = ISC_FALSE;
        fctx-&gt;addrinfo = NULL;
        fctx-&gt;client = NULL;
<span style="color: #00b000;">+       fctx-&gt;ns_ttl = <span style="">0</span>;</span>
<span style="color: #00b000;">+       fctx-&gt;ns_ttl_ok = ISC_FALSE;</span>
&nbsp;
        dns_name_init<span style="">&#40;</span>&amp;fctx-&gt;nsname, NULL<span style="">&#41;</span>;
        fctx-&gt;nsfetch = NULL;
<span style="color: #440088;">@@ -3618,6 +3658,8 @@</span>
                                dns_rdataset_disassociate<span style="">&#40;</span>&amp;fctx-&gt;nameservers<span style="">&#41;</span>;
                                goto cleanup_name;
                        <span style="">&#125;</span>
<span style="color: #00b000;">+                       fctx-&gt;ns_ttl = fctx-&gt;nameservers.ttl;</span>
<span style="color: #00b000;">+                       fctx-&gt;ns_ttl_ok = ISC_TRUE;</span>
                <span style="">&#125;</span> else <span style="">&#123;</span>
                        /*
                         * We're in forward-only mode.  Set the query domain.
<span style="color: #440088;">@@ -3635,8 +3677,12 @@</span>
                if <span style="">&#40;</span>result != ISC_R_SUCCESS<span style="">&#41;</span>
                        goto cleanup_name;
                dns_rdataset_clone<span style="">&#40;</span>nameservers, &amp;fctx-&gt;nameservers<span style="">&#41;</span>;
<span style="color: #00b000;">+               fctx-&gt;ns_ttl = fctx-&gt;nameservers.ttl;</span>
<span style="color: #00b000;">+               fctx-&gt;ns_ttl_ok = ISC_TRUE;</span>
        <span style="">&#125;</span>
&nbsp;
<span style="color: #00b000;">+       log_ns_ttl<span style="">&#40;</span>fctx, &quot;fctx_create&quot;<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
        INSIST<span style="">&#40;</span>dns_name_issubdomain<span style="">&#40;</span>&amp;fctx-&gt;name, &amp;fctx-&gt;domain<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
        fctx-&gt;qmessage = NULL;
<span style="color: #440088;">@@ -3929,14 +3975,16 @@</span>
&nbsp;
 /*
  * Destroy '*fctx' if it is ready to be destroyed <span style="">&#40;</span>i.e., if it has
<span style="color: #991111;">- * no references and is no longer waiting for any events<span style="">&#41;</span>.  If this</span>
<span style="color: #991111;">- * was the last fctx in the resolver, destroy the resolver.</span>
<span style="color: #00b000;">+ * no references and is no longer waiting for any events<span style="">&#41;</span>.</span>
  *
  * Requires:
  *      '*fctx' is shutting down.
<span style="color: #00b000;">+ *</span>
<span style="color: #00b000;">+ * Returns:</span>
<span style="color: #00b000;">+ *     true if the resolver is exiting and this is the last fctx in the bucket.</span>
  */
<span style="color: #991111;">-static void</span>
<span style="color: #991111;">-maybe_destroy<span style="">&#40;</span>fetchctx_t *fctx<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+static isc_boolean_t</span>
<span style="color: #00b000;">+maybe_destroy<span style="">&#40;</span>fetchctx_t *fctx, isc_boolean_t locked<span style="">&#41;</span> <span style="">&#123;</span></span>
        unsigned int bucketnum;
        isc_boolean_t bucket_empty = ISC_FALSE;
        dns_resolver_t *res = fctx-&gt;res;
<span style="color: #440088;">@@ -3944,8 +3992,11 @@</span>
&nbsp;
        REQUIRE<span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>fctx<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
<span style="color: #00b000;">+       bucketnum = fctx-&gt;bucketnum;</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>!locked<span style="">&#41;</span></span>
<span style="color: #00b000;">+               LOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
        if <span style="">&#40;</span>fctx-&gt;pending != <span style="">0</span> || fctx-&gt;nqueries != <span style="">0</span><span style="">&#41;</span>
<span style="color: #991111;">-               return;</span>
<span style="color: #00b000;">+               goto unlock;</span>
&nbsp;
        for <span style="">&#40;</span>validator = ISC_LIST_HEAD<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span>;
             validator != NULL; validator = next_validator<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #440088;">@@ -3953,14 +4004,12 @@</span>
                dns_validator_cancel<span style="">&#40;</span>validator<span style="">&#41;</span>;
        <span style="">&#125;</span>
&nbsp;
<span style="color: #991111;">-       bucketnum = fctx-&gt;bucketnum;</span>
<span style="color: #991111;">-       LOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
        if <span style="">&#40;</span>fctx-&gt;references == <span style="">0</span> &amp;&amp; ISC_LIST_EMPTY<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span><span style="">&#41;</span>
                bucket_empty = fctx_destroy<span style="">&#40;</span>fctx<span style="">&#41;</span>;
<span style="color: #991111;">-       UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #991111;">-</span>
<span style="color: #991111;">-       if <span style="">&#40;</span>bucket_empty<span style="">&#41;</span></span>
<span style="color: #991111;">-               empty_bucket<span style="">&#40;</span>res<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+ unlock:</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>!locked<span style="">&#41;</span></span>
<span style="color: #00b000;">+               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+       return <span style="">&#40;</span>bucket_empty<span style="">&#41;</span>;</span>
 <span style="">&#125;</span>
&nbsp;
 /*
<span style="color: #440088;">@@ -3968,31 +4017,33 @@</span>
  */
 static void
 validated<span style="">&#40;</span>isc_task_t *task, isc_event_t *event<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #991111;">-       isc_result_t result = ISC_R_SUCCESS;</span>
<span style="color: #991111;">-       isc_result_t eresult = ISC_R_SUCCESS;</span>
<span style="color: #991111;">-       isc_stdtime_t now;</span>
<span style="color: #991111;">-       fetchctx_t *fctx;</span>
<span style="color: #991111;">-       dns_validatorevent_t *vevent;</span>
<span style="color: #991111;">-       dns_fetchevent_t *hevent;</span>
<span style="color: #991111;">-       dns_rdataset_t *ardataset = NULL;</span>
<span style="color: #991111;">-       dns_rdataset_t *asigrdataset = NULL;</span>
<span style="color: #00b000;">+       dns_adbaddrinfo_t *addrinfo;</span>
        dns_dbnode_t *node = NULL;
<span style="color: #991111;">-       isc_boolean_t negative;</span>
<span style="color: #991111;">-       isc_boolean_t chaining;</span>
<span style="color: #991111;">-       isc_boolean_t sentresponse;</span>
<span style="color: #991111;">-       isc_uint32_t ttl;</span>
        dns_dbnode_t *nsnode = NULL;
<span style="color: #00b000;">+       dns_fetchevent_t *hevent;</span>
        dns_name_t *name;
<span style="color: #00b000;">+       dns_rdataset_t *ardataset = NULL;</span>
<span style="color: #00b000;">+       dns_rdataset_t *asigrdataset = NULL;</span>
        dns_rdataset_t *rdataset;
        dns_rdataset_t *sigrdataset;
<span style="color: #00b000;">+       dns_resolver_t *res;</span>
        dns_valarg_t *valarg;
<span style="color: #991111;">-       dns_adbaddrinfo_t *addrinfo;</span>
<span style="color: #00b000;">+       dns_validatorevent_t *vevent;</span>
<span style="color: #00b000;">+       fetchctx_t *fctx;</span>
<span style="color: #00b000;">+       isc_boolean_t chaining;</span>
<span style="color: #00b000;">+       isc_boolean_t negative;</span>
<span style="color: #00b000;">+       isc_boolean_t sentresponse;</span>
<span style="color: #00b000;">+       isc_result_t eresult = ISC_R_SUCCESS;</span>
<span style="color: #00b000;">+       isc_result_t result = ISC_R_SUCCESS;</span>
<span style="color: #00b000;">+       isc_stdtime_t now;</span>
<span style="color: #00b000;">+       isc_uint32_t ttl;</span>
&nbsp;
        UNUSED<span style="">&#40;</span>task<span style="">&#41;</span>; /* for now */
&nbsp;
        REQUIRE<span style="">&#40;</span>event-&gt;ev_type == DNS_EVENT_VALIDATORDONE<span style="">&#41;</span>;
        valarg = event-&gt;ev_arg;
        fctx = valarg-&gt;fctx;
<span style="color: #00b000;">+       res = fctx-&gt;res;</span>
        addrinfo = valarg-&gt;addrinfo;
        REQUIRE<span style="">&#40;</span>VALID_FCTX<span style="">&#40;</span>fctx<span style="">&#41;</span><span style="">&#41;</span>;
        REQUIRE<span style="">&#40;</span>!ISC_LIST_EMPTY<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span><span style="">&#41;</span>;
<span style="color: #440088;">@@ -4002,6 +4053,8 @@</span>
&nbsp;
        FCTXTRACE<span style="">&#40;</span>&quot;received validation completion event&quot;<span style="">&#41;</span>;
&nbsp;
<span style="color: #00b000;">+       LOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
        ISC_LIST_UNLINK<span style="">&#40;</span>fctx-&gt;validators, vevent-&gt;validator, link<span style="">&#41;</span>;
        fctx-&gt;validator = NULL;
&nbsp;
<span style="color: #440088;">@@ -4010,7 +4063,7 @@</span>
         * destroy the fctx if necessary.
         */
        dns_validator_destroy<span style="">&#40;</span>&amp;vevent-&gt;validator<span style="">&#41;</span>;
<span style="color: #991111;">-       isc_mem_put<span style="">&#40;</span>fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.mctx,</span>
<span style="color: #00b000;">+       isc_mem_put<span style="">&#40;</span>res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.mctx,</span>
                    valarg, sizeof<span style="">&#40;</span>*valarg<span style="">&#41;</span><span style="">&#41;</span>;
&nbsp;
        negative = ISC_TF<span style="">&#40;</span>vevent-&gt;rdataset == NULL<span style="">&#41;</span>;
<span style="color: #440088;">@@ -4023,12 +4076,15 @@</span>
         * so, destroy the fctx.
         */
        if <span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>fctx<span style="">&#41;</span> &amp;&amp; !sentresponse<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #991111;">-               maybe_destroy<span style="">&#40;</span>fctx<span style="">&#41;</span>;    /* Locks bucket. */</span>
<span style="color: #00b000;">+               isc_uint32_t bucketnum = fctx-&gt;bucketnum;</span>
<span style="color: #00b000;">+               isc_boolean_t bucket_empty;</span>
<span style="color: #00b000;">+               bucket_empty = maybe_destroy<span style="">&#40;</span>fctx, ISC_TRUE<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               if <span style="">&#40;</span>bucket_empty<span style="">&#41;</span></span>
<span style="color: #00b000;">+                       empty_bucket<span style="">&#40;</span>res<span style="">&#41;</span>;</span>
                goto cleanup_event;
        <span style="">&#125;</span>
&nbsp;
<span style="color: #991111;">-       LOCK<span style="">&#40;</span>&amp;fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #991111;">-</span>
        isc_stdtime_get<span style="">&#40;</span>&amp;now<span style="">&#41;</span>;
&nbsp;
        /*
<span style="color: #440088;">@@ -4074,7 +4130,7 @@</span>
&nbsp;
        if <span style="">&#40;</span>vevent-&gt;result != ISC_R_SUCCESS<span style="">&#41;</span> <span style="">&#123;</span>
                FCTXTRACE<span style="">&#40;</span>&quot;validation failed&quot;<span style="">&#41;</span>;
<span style="color: #991111;">-               inc_stats<span style="">&#40;</span>fctx-&gt;res, dns_resstatscounter_valfail<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               inc_stats<span style="">&#40;</span>res, dns_resstatscounter_valfail<span style="">&#41;</span>;</span>
                fctx-&gt;valfail++;
                fctx-&gt;vresult = vevent-&gt;result;
                if <span style="">&#40;</span>fctx-&gt;vresult != DNS_R_BROKENCHAIN<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #440088;">@@ -4123,7 +4179,7 @@</span>
                result = fctx-&gt;vresult;
                add_bad<span style="">&#40;</span>fctx, addrinfo, result, badns_validation<span style="">&#41;</span>;
                isc_event_free<span style="">&#40;</span>&amp;event<span style="">&#41;</span>;
<span style="color: #991111;">-               UNLOCK<span style="">&#40;</span>&amp;fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
                INSIST<span style="">&#40;</span>fctx-&gt;validator == NULL<span style="">&#41;</span>;
                fctx-&gt;validator = ISC_LIST_HEAD<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span>;
                if <span style="">&#40;</span>fctx-&gt;validator != NULL<span style="">&#41;</span>
<span style="color: #440088;">@@ -4142,8 +4198,7 @@</span>
                             fctx-&gt;type == dns_rdatatype_dlv ||
                             fctx-&gt;type == dns_rdatatype_ds<span style="">&#41;</span> &amp;&amp;
                             tresult == ISC_R_SUCCESS<span style="">&#41;</span>
<span style="color: #991111;">-                               dns_resolver_addbadcache<span style="">&#40;</span>fctx-&gt;res,</span>
<span style="color: #991111;">-                                                        &amp;fctx-&gt;name,</span>
<span style="color: #00b000;">+                               dns_resolver_addbadcache<span style="">&#40;</span>res, &amp;fctx-&gt;name,</span>
                                                         fctx-&gt;type, &amp;expire<span style="">&#41;</span>;
                        fctx_done<span style="">&#40;</span>fctx, result, __LINE__<span style="">&#41;</span>; /* Locks bucket. */
                <span style="">&#125;</span> else
<span style="color: #440088;">@@ -4156,7 +4211,7 @@</span>
                dns_rdatatype_t covers;
                FCTXTRACE<span style="">&#40;</span>&quot;nonexistence validation OK&quot;<span style="">&#41;</span>;
&nbsp;
<span style="color: #991111;">-               inc_stats<span style="">&#40;</span>fctx-&gt;res, dns_resstatscounter_valnegsuccess<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               inc_stats<span style="">&#40;</span>res, dns_resstatscounter_valnegsuccess<span style="">&#41;</span>;</span>
&nbsp;
                if <span style="">&#40;</span>fctx-&gt;rmessage-&gt;rcode == dns_rcode_nxdomain<span style="">&#41;</span>
                        covers = dns_rdatatype_any;
<span style="color: #440088;">@@ -4173,10 +4228,9 @@</span>
                 * to zero to facilitate locating the containing zone of
                 * a arbitrary zone.
                 */
<span style="color: #991111;">-               ttl = fctx-&gt;res-&gt;view-&gt;maxncachettl;</span>
<span style="color: #00b000;">+               ttl = res-&gt;view-&gt;maxncachettl;</span>
                if <span style="">&#40;</span>fctx-&gt;type == dns_rdatatype_soa &amp;&amp;
<span style="color: #991111;">-                   covers == dns_rdatatype_any &amp;&amp;</span>
<span style="color: #991111;">-                   fctx-&gt;res-&gt;zero_no_soa_ttl<span style="">&#41;</span></span>
<span style="color: #00b000;">+                   covers == dns_rdatatype_any &amp;&amp; res-&gt;zero_no_soa_ttl<span style="">&#41;</span></span>
                        ttl = <span style="">0</span>;
&nbsp;
                result = ncache_adderesult<span style="">&#40;</span>fctx-&gt;rmessage, fctx-&gt;cache, node,
<span style="color: #440088;">@@ -4186,7 +4240,7 @@</span>
                        goto noanswer_response;
                goto answer_response;
        <span style="">&#125;</span> else
<span style="color: #991111;">-               inc_stats<span style="">&#40;</span>fctx-&gt;res, dns_resstatscounter_valsuccess<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               inc_stats<span style="">&#40;</span>res, dns_resstatscounter_valsuccess<span style="">&#41;</span>;</span>
&nbsp;
        FCTXTRACE<span style="">&#40;</span>&quot;validation OK&quot;<span style="">&#41;</span>;
&nbsp;
<span style="color: #440088;">@@ -4234,14 +4288,17 @@</span>
        <span style="">&#125;</span>
&nbsp;
        if <span style="">&#40;</span>sentresponse<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #00b000;">+               isc_boolean_t bucket_empty = ISC_FALSE;</span>
                /*
                 * If we only deferred the destroy because we wanted to cache
                 * the data, destroy now.
                 */
                dns_db_detachnode<span style="">&#40;</span>fctx-&gt;cache, &amp;node<span style="">&#41;</span>;
<span style="color: #991111;">-               UNLOCK<span style="">&#40;</span>&amp;fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
                if <span style="">&#40;</span>SHUTTINGDOWN<span style="">&#40;</span>fctx<span style="">&#41;</span><span style="">&#41;</span>
<span style="color: #991111;">-                       maybe_destroy<span style="">&#40;</span>fctx<span style="">&#41;</span>;    /* Locks bucket. */</span>
<span style="color: #00b000;">+                       bucket_empty = maybe_destroy<span style="">&#40;</span>fctx, ISC_TRUE<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               if <span style="">&#40;</span>bucket_empty<span style="">&#41;</span></span>
<span style="color: #00b000;">+                       empty_bucket<span style="">&#40;</span>res<span style="">&#41;</span>;</span>
                goto cleanup_event;
        <span style="">&#125;</span>
&nbsp;
<span style="color: #440088;">@@ -4256,7 +4313,7 @@</span>
                 * be validated.
                 */
                dns_db_detachnode<span style="">&#40;</span>fctx-&gt;cache, &amp;node<span style="">&#41;</span>;
<span style="color: #991111;">-               UNLOCK<span style="">&#40;</span>&amp;fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
                dns_validator_send<span style="">&#40;</span>ISC_LIST_HEAD<span style="">&#40;</span>fctx-&gt;validators<span style="">&#41;</span><span style="">&#41;</span>;
                goto cleanup_event;
        <span style="">&#125;</span>
<span style="color: #440088;">@@ -4331,8 +4388,7 @@</span>
        if <span style="">&#40;</span>node != NULL<span style="">&#41;</span>
                dns_db_detachnode<span style="">&#40;</span>fctx-&gt;cache, &amp;node<span style="">&#41;</span>;
&nbsp;
<span style="color: #991111;">-       UNLOCK<span style="">&#40;</span>&amp;fctx-&gt;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
<span style="color: #991111;">-</span>
<span style="color: #00b000;">+       UNLOCK<span style="">&#40;</span>&amp;res-&gt;buckets<span style="">&#91;</span>fctx-&gt;bucketnum<span style="">&#93;</span>.lock<span style="">&#41;</span>;</span>
        fctx_done<span style="">&#40;</span>fctx, result, __LINE__<span style="">&#41;</span>; /* Locks bucket. */
&nbsp;
  cleanup_event:
<span style="color: #440088;">@@ -5303,6 +5359,26 @@</span>
        return <span style="">&#40;</span>ISC_TRUE<span style="">&#41;</span>;
 <span style="">&#125;</span>
&nbsp;
<span style="color: #00b000;">+static void</span>
<span style="color: #00b000;">+trim_ns_ttl<span style="">&#40;</span>fetchctx_t *fctx, dns_name_t *name, dns_rdataset_t *rdataset<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+       char ns_namebuf<span style="">&#91;</span>DNS_NAME_FORMATSIZE<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+       char namebuf<span style="">&#91;</span>DNS_NAME_FORMATSIZE<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+       char tbuf<span style="">&#91;</span>DNS_RDATATYPE_FORMATSIZE<span style="">&#93;</span>;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>fctx-&gt;ns_ttl_ok &amp;&amp; rdataset-&gt;ttl &gt; fctx-&gt;ns_ttl<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+               dns_name_format<span style="">&#40;</span>name, ns_namebuf, sizeof<span style="">&#40;</span>ns_namebuf<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               dns_name_format<span style="">&#40;</span>&amp;fctx-&gt;name, namebuf, sizeof<span style="">&#40;</span>namebuf<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               dns_rdatatype_format<span style="">&#40;</span>fctx-&gt;type, tbuf, sizeof<span style="">&#40;</span>tbuf<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+               isc_log_write<span style="">&#40;</span>dns_lctx, DNS_LOGCATEGORY_RESOLVER,</span>
<span style="color: #00b000;">+                             DNS_LOGMODULE_RESOLVER, ISC_LOG_DEBUG<span style="">&#40;</span>10<span style="">&#41;</span>,</span>
<span style="color: #00b000;">+                             &quot;fctx %p: trimming ttl of %s/NS for %s/%s: &quot;</span>
<span style="color: #00b000;">+                             &quot;%u -&gt; %u&quot;, fctx, ns_namebuf, namebuf, tbuf,</span>
<span style="color: #00b000;">+                             rdataset-&gt;ttl, fctx-&gt;ns_ttl<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+               rdataset-&gt;ttl = fctx-&gt;ns_ttl;</span>
<span style="color: #00b000;">+       <span style="">&#125;</span></span>
<span style="color: #00b000;">+<span style="">&#125;</span></span>
<span style="color: #00b000;">+</span>
 /*
  * Handle a no-answer response <span style="">&#40;</span>NXDOMAIN, NXRRSET, or referral<span style="">&#41;</span>.
  * If look_in_options has LOOK_FOR_NS_IN_ANSWER then we look in the answer
<span style="color: #440088;">@@ -5473,6 +5549,9 @@</span>
                                        if <span style="">&#40;</span>aa<span style="">&#41;</span>
                                                rdataset-&gt;trust =
                                                    dns_trust_authauthority;
<span style="color: #00b000;">+                                       else if <span style="">&#40;</span>ISFORWARDER<span style="">&#40;</span>fctx-&gt;addrinfo<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+                                               rdataset-&gt;trust =</span>
<span style="color: #00b000;">+                                                       dns_trust_answer;</span>
                                        else
                                                rdataset-&gt;trust =
                                                        dns_trust_additional;
<span style="color: #440088;">@@ -5486,6 +5565,12 @@</span>
                        return <span style="">&#40;</span>result<span style="">&#41;</span>;
        <span style="">&#125;</span>
&nbsp;
<span style="color: #00b000;">+       log_ns_ttl<span style="">&#40;</span>fctx, &quot;noanswer_response&quot;<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>ns_rdataset != NULL &amp;&amp; dns_name_equal<span style="">&#40;</span>&amp;fctx-&gt;domain, ns_name<span style="">&#41;</span> &amp;&amp;</span>
<span style="color: #00b000;">+           !dns_name_equal<span style="">&#40;</span>ns_name, dns_rootname<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+               trim_ns_ttl<span style="">&#40;</span>fctx, ns_name, ns_rdataset<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
        /*
         * A negative response has a SOA record <span style="">&#40;</span>Type <span style="">2</span><span style="">&#41;</span>
         * and a optional NS RRset <span style="">&#40;</span>Type <span style="">1</span><span style="">&#41;</span> or it has neither
<span style="color: #440088;">@@ -5526,6 +5611,9 @@</span>
                                        if <span style="">&#40;</span>aa<span style="">&#41;</span>
                                                rdataset-&gt;trust =
                                                    dns_trust_authauthority;
<span style="color: #00b000;">+                                       else if <span style="">&#40;</span>ISFORWARDER<span style="">&#40;</span>fctx-&gt;addrinfo<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+                                               rdataset-&gt;trust =</span>
<span style="color: #00b000;">+                                                       dns_trust_answer;</span>
                                        else
                                                rdataset-&gt;trust =
                                                        dns_trust_additional;
<span style="color: #440088;">@@ -5567,6 +5655,9 @@</span>
                                        if <span style="">&#40;</span>aa<span style="">&#41;</span>
                                                rdataset-&gt;trust =
                                                    dns_trust_authauthority;
<span style="color: #00b000;">+                                       else if <span style="">&#40;</span>ISFORWARDER<span style="">&#40;</span>fctx-&gt;addrinfo<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+                                               rdataset-&gt;trust =</span>
<span style="color: #00b000;">+                                                       dns_trust_answer;</span>
                                        else
                                                rdataset-&gt;trust =
                                                        dns_trust_additional;
<span style="color: #440088;">@@ -5698,6 +5789,8 @@</span>
                if <span style="">&#40;</span>result != ISC_R_SUCCESS<span style="">&#41;</span>
                        return <span style="">&#40;</span>result<span style="">&#41;</span>;
                fctx-&gt;attributes |= FCTX_ATTR_WANTCACHE;
<span style="color: #00b000;">+               fctx-&gt;ns_ttl_ok = ISC_FALSE;</span>
<span style="color: #00b000;">+               log_ns_ttl<span style="">&#40;</span>fctx, &quot;DELEGATION&quot;<span style="">&#41;</span>;</span>
                return <span style="">&#40;</span>DNS_R_DELEGATION<span style="">&#41;</span>;
        <span style="">&#125;</span>
&nbsp;
<span style="color: #440088;">@@ -5718,8 +5811,8 @@</span>
 answer_response<span style="">&#40;</span>fetchctx_t *fctx<span style="">&#41;</span> <span style="">&#123;</span>
        isc_result_t result;
        dns_message_t *message;
<span style="color: #991111;">-       dns_name_t *name, *qname, tname;</span>
<span style="color: #991111;">-       dns_rdataset_t *rdataset;</span>
<span style="color: #00b000;">+       dns_name_t *name, *qname, tname, *ns_name;</span>
<span style="color: #00b000;">+       dns_rdataset_t *rdataset, *ns_rdataset;</span>
        isc_boolean_t done, external, chaining, aa, found, want_chaining;
        isc_boolean_t have_answer, found_cname, found_type, wanted_chaining;
        unsigned int aflag;
<span style="color: #440088;">@@ -6119,6 +6212,8 @@</span>
         * in this section, and we expect that it is not external.
         */
        done = ISC_FALSE;
<span style="color: #00b000;">+       ns_name = NULL;</span>
<span style="color: #00b000;">+       ns_rdataset = NULL;</span>
        result = dns_message_firstname<span style="">&#40;</span>message, DNS_SECTION_AUTHORITY<span style="">&#41;</span>;
        while <span style="">&#40;</span>!done &amp;&amp; result == ISC_R_SUCCESS<span style="">&#41;</span> <span style="">&#123;</span>
                name = NULL;
<span style="color: #440088;">@@ -6146,6 +6241,10 @@</span>
                                                rdataset-&gt;trust =
                                                    dns_trust_additional;
&nbsp;
<span style="color: #00b000;">+                                       if <span style="">&#40;</span>rdataset-&gt;type == dns_rdatatype_ns<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+                                               ns_name = name;</span>
<span style="color: #00b000;">+                                               ns_rdataset = rdataset;</span>
<span style="color: #00b000;">+                                       <span style="">&#125;</span></span>
                                        /*
                                         * Mark any additional data related
                                         * to this rdataset.
<span style="color: #440088;">@@ -6163,6 +6262,12 @@</span>
        if <span style="">&#40;</span>result == ISC_R_NOMORE<span style="">&#41;</span>
                result = ISC_R_SUCCESS;
&nbsp;
<span style="color: #00b000;">+       log_ns_ttl<span style="">&#40;</span>fctx, &quot;answer_response&quot;<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+       if <span style="">&#40;</span>ns_rdataset != NULL &amp;&amp; dns_name_equal<span style="">&#40;</span>&amp;fctx-&gt;domain, ns_name<span style="">&#41;</span> &amp;&amp;</span>
<span style="color: #00b000;">+           !dns_name_equal<span style="">&#40;</span>ns_name, dns_rootname<span style="">&#41;</span><span style="">&#41;</span></span>
<span style="color: #00b000;">+               trim_ns_ttl<span style="">&#40;</span>fctx, ns_name, ns_rdataset<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+</span>
        return <span style="">&#40;</span>result<span style="">&#41;</span>;
 <span style="">&#125;</span>
&nbsp;
<span style="color: #440088;">@@ -6234,6 +6339,9 @@</span>
                if <span style="">&#40;</span>dns_rdataset_isassociated<span style="">&#40;</span>&amp;fctx-&gt;nameservers<span style="">&#41;</span><span style="">&#41;</span>
                        dns_rdataset_disassociate<span style="">&#40;</span>&amp;fctx-&gt;nameservers<span style="">&#41;</span>;
                dns_rdataset_clone<span style="">&#40;</span>fevent-&gt;rdataset, &amp;fctx-&gt;nameservers<span style="">&#41;</span>;
<span style="color: #00b000;">+               fctx-&gt;ns_ttl = fctx-&gt;nameservers.ttl;</span>
<span style="color: #00b000;">+               fctx-&gt;ns_ttl_ok = ISC_TRUE;</span>
<span style="color: #00b000;">+               log_ns_ttl<span style="">&#40;</span>fctx, &quot;resume_dslookup&quot;<span style="">&#41;</span>;</span>
                dns_name_free<span style="">&#40;</span>&amp;fctx-&gt;domain,
                              fctx-&gt;res-&gt;buckets<span style="">&#91;</span>bucketnum<span style="">&#93;</span>.mctx<span style="">&#41;</span>;
                dns_name_init<span style="">&#40;</span>&amp;fctx-&gt;domain, NULL<span style="">&#41;</span>;
<span style="color: #440088;">@@ -7167,6 +7275,8 @@</span>
                                fctx_done<span style="">&#40;</span>fctx, DNS_R_SERVFAIL, __LINE__<span style="">&#41;</span>;
                                return;
                        <span style="">&#125;</span>
<span style="color: #00b000;">+                       fctx-&gt;ns_ttl = fctx-&gt;nameservers.ttl;</span>
<span style="color: #00b000;">+                       fctx-&gt;ns_ttl_ok = ISC_TRUE;</span>
                        fctx_cancelqueries<span style="">&#40;</span>fctx, ISC_TRUE<span style="">&#41;</span>;
                        fctx_cleanupfinds<span style="">&#40;</span>fctx<span style="">&#41;</span>;
                        fctx_cleanupaltfinds<span style="">&#40;</span>fctx<span style="">&#41;</span>;</pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.sukmoonlee.com/wordpress/archives/185/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
