From ffff5d67926821d3db8df63bdd84a9cb1ce56739 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Wed, 23 Jan 2013 15:39:05 -0800 Subject: [PATCH] [master] fix dns_request_createvia assert 3474. [bug] nsupdate could assert when the local and remote address families didn't match. [RT #22897] --- CHANGES | 3 +++ bin/tests/system/nsupdate/tests.sh | 11 +++++++++++ lib/dns/request.c | 6 ++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 38fcf50cbb..978a37ad0a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +3474. [bug] nsupdate could assert when the local and remote + address families didn't match. [RT #22897] + 3473. [bug] dnssec-signzone/verify could incorrectly report an error condition due to an empty node above an opt-out delegation lacking an NSEC3. [RT #32072] diff --git a/bin/tests/system/nsupdate/tests.sh b/bin/tests/system/nsupdate/tests.sh index dd34e5393c..375dd84b64 100644 --- a/bin/tests/system/nsupdate/tests.sh +++ b/bin/tests/system/nsupdate/tests.sh @@ -222,6 +222,17 @@ $DIG +tcp version.bind txt ch @10.53.0.1 -p 5300 > dig.out.ns1.$n grep "status: NOERROR" dig.out.ns1.$n > /dev/null || ret=1 [ $ret = 0 ] || { echo I:failed; status=1; } +n=`expr $n + 1` +echo "I:check that address family mismatch is handled ($n)" +$NSUPDATE < /dev/null 2>&1 && ret=1 +server ::1 +local 127.0.0.1 +update add 600 txt.example.nil in txt "test" +send +END +[ $ret = 0 ] || { echo I:failed; status=1; } + + n=`expr $n + 1` echo "I:check that unixtime serial number is correctly generated ($n)" oldserial=`$DIG +short unixtime.nil. soa @10.53.0.1 -p 5300 | awk '{print $3}'` || ret=1 diff --git a/lib/dns/request.c b/lib/dns/request.c index 58c0103f4c..7285348aa6 100644 --- a/lib/dns/request.c +++ b/lib/dns/request.c @@ -894,13 +894,15 @@ dns_request_createvia3(dns_requestmgr_t *requestmgr, dns_message_t *message, REQUIRE(action != NULL); REQUIRE(requestp != NULL && *requestp == NULL); REQUIRE(timeout > 0); - if (srcaddr != NULL) - REQUIRE(isc_sockaddr_pf(srcaddr) == isc_sockaddr_pf(destaddr)); mctx = requestmgr->mctx; req_log(ISC_LOG_DEBUG(3), "dns_request_createvia"); + if (srcaddr != NULL && + isc_sockaddr_pf(srcaddr) != isc_sockaddr_pf(destaddr)) + return (ISC_R_FAMILYMISMATCH); + if (isblackholed(requestmgr->dispatchmgr, destaddr)) return (DNS_R_BLACKHOLED);