Module Name:    src
Committed By:   sborrill
Date:           Fri Nov 18 23:05:07 UTC 2011

Modified Files:
        src/dist/bind/bin/named [netbsd-5-0]: query.c
        src/dist/bind/lib/dns [netbsd-5-0]: rbtdb.c

Log Message:
Pull up the following revisions(s) (requested by christos in ticket #1692):
        dist/bind/bin/named/query.c             patch
        dist/bind/lib/dns/rbtdb.c               patch

Cache lookup could return RRSIG data associated with nonexistent records,
leading to an assertion failure.  Fixes CVE-2011-4313.


To generate a diff of this commit:
cvs rdiff -u -r1.8.8.4 -r1.8.8.5 src/dist/bind/bin/named/query.c
cvs rdiff -u -r1.1.1.6.8.5 -r1.1.1.6.8.6 src/dist/bind/lib/dns/rbtdb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/dist/bind/bin/named/query.c
diff -u src/dist/bind/bin/named/query.c:1.8.8.4 src/dist/bind/bin/named/query.c:1.8.8.5
--- src/dist/bind/bin/named/query.c:1.8.8.4	Sat Jun 18 11:35:06 2011
+++ src/dist/bind/bin/named/query.c	Fri Nov 18 23:05:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: query.c,v 1.8.8.4 2011/06/18 11:35:06 bouyer Exp $	*/
+/*	$NetBSD: query.c,v 1.8.8.5 2011/11/18 23:05:07 sborrill Exp $	*/
 
 /*
  * Copyright (C) 2004-2010  Internet Systems Consortium, Inc. ("ISC")
@@ -1282,11 +1282,9 @@ query_addadditional(void *arg, dns_name_
 			goto addname;
 		if (result == DNS_R_NCACHENXRRSET) {
 			dns_rdataset_disassociate(rdataset);
-			/*
-			 * Negative cache entries don't have sigrdatasets.
-			 */
-			INSIST(sigrdataset == NULL ||
-			       ! dns_rdataset_isassociated(sigrdataset));
+			if (sigrdataset != NULL &&
+			    dns_rdataset_isassociated(sigrdataset))
+				dns_rdataset_disassociate(sigrdataset);
 		}
 		if (result == ISC_R_SUCCESS) {
 			mname = NULL;
@@ -1327,8 +1325,9 @@ query_addadditional(void *arg, dns_name_
 			goto addname;
 		if (result == DNS_R_NCACHENXRRSET) {
 			dns_rdataset_disassociate(rdataset);
-			INSIST(sigrdataset == NULL ||
-			       ! dns_rdataset_isassociated(sigrdataset));
+			if (sigrdataset != NULL &&
+			    dns_rdataset_isassociated(sigrdataset))
+				dns_rdataset_disassociate(sigrdataset);
 		}
 		if (result == ISC_R_SUCCESS) {
 			mname = NULL;
@@ -1777,10 +1776,8 @@ query_addadditional2(void *arg, dns_name
 		goto setcache;
 	if (result == DNS_R_NCACHENXRRSET) {
 		dns_rdataset_disassociate(rdataset);
-		/*
-		 * Negative cache entries don't have sigrdatasets.
-		 */
-		INSIST(! dns_rdataset_isassociated(sigrdataset));
+		if (dns_rdataset_isassociated(sigrdataset))
+			dns_rdataset_disassociate(sigrdataset);
 	}
 	if (result == ISC_R_SUCCESS) {
 		/* Remember the result as a cache */

Index: src/dist/bind/lib/dns/rbtdb.c
diff -u src/dist/bind/lib/dns/rbtdb.c:1.1.1.6.8.5 src/dist/bind/lib/dns/rbtdb.c:1.1.1.6.8.6
--- src/dist/bind/lib/dns/rbtdb.c:1.1.1.6.8.5	Thu Jul  7 20:27:41 2011
+++ src/dist/bind/lib/dns/rbtdb.c	Fri Nov 18 23:05:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rbtdb.c,v 1.1.1.6.8.5 2011/07/07 20:27:41 sborrill Exp $	*/
+/*	$NetBSD: rbtdb.c,v 1.1.1.6.8.6 2011/11/18 23:05:07 sborrill Exp $	*/
 
 /*
  * Copyright (C) 2004-2010  Internet Systems Consortium, Inc. ("ISC")
@@ -4824,7 +4824,7 @@ cache_find(dns_db_t *db, dns_name_t *nam
 			      rdataset);
 		if (need_headerupdate(found, search.now))
 			update = found;
-		if (foundsig != NULL) {
+		if (!NEGATIVE(found) && foundsig != NULL) {
 			bind_rdataset(search.rbtdb, node, foundsig, search.now,
 				      sigrdataset);
 			if (need_headerupdate(foundsig, search.now))
@@ -5453,7 +5453,7 @@ cache_findrdataset(dns_db_t *db, dns_dbn
 	}
 	if (found != NULL) {
 		bind_rdataset(rbtdb, rbtnode, found, now, rdataset);
-		if (foundsig != NULL)
+		if (!NEGATIVE(found) && foundsig != NULL)
 			bind_rdataset(rbtdb, rbtnode, foundsig, now,
 				      sigrdataset);
 	}

Reply via email to