BIND 10 master, updated. 0ca10e6357d7a41bc308f90183848ce41582adf8 [master] Update Changelog
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri Mar 4 09:24:30 UTC 2011
The branch, master has been updated
via 0ca10e6357d7a41bc308f90183848ce41582adf8 (commit)
via 25a5f4ec755bc09b54410fcdff22691283147f32 (commit)
via 24ef7a16425e696fbb794605a89ff8d7bdd7172c (commit)
from 2275e0d7afa15b69bd7511616a6ebae0b9de0d22 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 0ca10e6357d7a41bc308f90183848ce41582adf8
Author: Jelte Jansen <jelte at isc.org>
Date: Fri Mar 4 10:24:18 2011 +0100
[master] Update Changelog
commit 25a5f4ec755bc09b54410fcdff22691283147f32
Merge: 2275e0d7afa15b69bd7511616a6ebae0b9de0d22 24ef7a16425e696fbb794605a89ff8d7bdd7172c
Author: Jelte Jansen <jelte at isc.org>
Date: Fri Mar 4 10:23:44 2011 +0100
Merge branch 'trac607'
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 6 ++++
src/bin/resolver/resolver.cc | 34 +++++++++++++++++++--------
src/bin/resolver/tests/resolver_unittest.cc | 21 ++++++++++++++++
3 files changed, 51 insertions(+), 10 deletions(-)
-----------------------------------------------------------------------
diff --git a/ChangeLog b/ChangeLog
index 695c78f..4ffd757 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+ 186. [bug] jelte
+ b10-resolver could stop with an assertion failure on certain kinds
+ of messages (there was a problem in error message creation). This
+ fixes that.
+ (Trac #607, git 25a5f4ec755bc09b54410fcdff22691283147f32)
+
185. [bug] vorner
Tests use port from private range (53210), lowering chance of
a conflict with something else (eg. running bind 10).
diff --git a/src/bin/resolver/resolver.cc b/src/bin/resolver/resolver.cc
index 4996b71..84df9d2 100644
--- a/src/bin/resolver/resolver.cc
+++ b/src/bin/resolver/resolver.cc
@@ -185,8 +185,8 @@ public:
// TODO: REMOVE, USE isc::resolve::MakeErrorMessage?
void
-makeErrorMessage(MessagePtr message, OutputBufferPtr buffer,
- const Rcode& rcode)
+makeErrorMessage(MessagePtr message, MessagePtr answer_message,
+ OutputBufferPtr buffer, const Rcode& rcode)
{
// extract the parameters that should be kept.
// XXX: with the current implementation, it's not easy to set EDNS0
@@ -197,6 +197,12 @@ makeErrorMessage(MessagePtr message, OutputBufferPtr buffer,
const Opcode& opcode = message->getOpcode();
vector<QuestionPtr> questions;
+ // answer_message is actually ignored right now,
+ // see the comment in #607
+ answer_message->setRcode(rcode);
+ answer_message->setOpcode(opcode);
+ answer_message->setQid(qid);
+
// If this is an error to a query or notify, we should also copy the
// question section.
if (opcode == Opcode::QUERY() || opcode == Opcode::NOTIFY()) {
@@ -385,12 +391,14 @@ Resolver::processMessage(const IOMessage& io_message,
} catch (const DNSProtocolError& error) {
dlog(string("returning ") + error.getRcode().toText() + ": " +
error.what());
- makeErrorMessage(query_message, buffer, error.getRcode());
+ makeErrorMessage(query_message, answer_message,
+ buffer, error.getRcode());
server->resume(true);
return;
} catch (const Exception& ex) {
dlog(string("returning SERVFAIL: ") + ex.what());
- makeErrorMessage(query_message, buffer, Rcode::SERVFAIL());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::SERVFAIL());
server->resume(true);
return;
} // other exceptions will be handled at a higher layer.
@@ -400,28 +408,34 @@ Resolver::processMessage(const IOMessage& io_message,
// Perform further protocol-level validation.
bool sendAnswer = true;
if (query_message->getOpcode() == Opcode::NOTIFY()) {
- makeErrorMessage(query_message, buffer, Rcode::NOTAUTH());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::NOTAUTH());
dlog("Notify arrived, but we are not authoritative");
} else if (query_message->getOpcode() != Opcode::QUERY()) {
dlog("Unsupported opcode (got: " + query_message->getOpcode().toText() +
", expected: " + Opcode::QUERY().toText());
- makeErrorMessage(query_message, buffer, Rcode::NOTIMP());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::NOTIMP());
} else if (query_message->getRRCount(Message::SECTION_QUESTION) != 1) {
dlog("The query contained " +
boost::lexical_cast<string>(query_message->getRRCount(
Message::SECTION_QUESTION) + " questions, exactly one expected"));
- makeErrorMessage(query_message, buffer, Rcode::FORMERR());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::FORMERR());
} else {
ConstQuestionPtr question = *query_message->beginQuestion();
const RRType &qtype = question->getType();
if (qtype == RRType::AXFR()) {
if (io_message.getSocket().getProtocol() == IPPROTO_UDP) {
- makeErrorMessage(query_message, buffer, Rcode::FORMERR());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::FORMERR());
} else {
- makeErrorMessage(query_message, buffer, Rcode::NOTIMP());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::NOTIMP());
}
} else if (qtype == RRType::IXFR()) {
- makeErrorMessage(query_message, buffer, Rcode::NOTIMP());
+ makeErrorMessage(query_message, answer_message,
+ buffer, Rcode::NOTIMP());
} else {
// The RecursiveQuery object will post the "resume" event to the
// DNSServer when an answer arrives, so we don't have to do it now.
diff --git a/src/bin/resolver/tests/resolver_unittest.cc b/src/bin/resolver/tests/resolver_unittest.cc
index a4f11f5..97edf12 100644
--- a/src/bin/resolver/tests/resolver_unittest.cc
+++ b/src/bin/resolver/tests/resolver_unittest.cc
@@ -96,6 +96,27 @@ TEST_F(ResolverTest, AXFRFail) {
QR_FLAG, 1, 0, 0, 0);
}
+TEST_F(ResolverTest, IXFRFail) {
+ UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
+ Name("example.com"), RRClass::IN(),
+ RRType::IXFR());
+ createRequestPacket(request_message, IPPROTO_TCP);
+ // IXFR is not implemented and should always send NOTIMP.
+ server.processMessage(*io_message,
+ parse_message,
+ response_message,
+ response_obuffer,
+ &dnsserv);
+ EXPECT_TRUE(dnsserv.hasAnswer());
+ // the second check is what we'll need in the end (with the values
+ // from the first one), but right now the first one is for what
+ // will actually be returned to the client
+ headerCheck(*parse_message, default_qid, Rcode::NOTIMP(), opcode.getCode(),
+ QR_FLAG, 1, 0, 0, 0);
+ headerCheck(*response_message, default_qid, Rcode::NOTIMP(), opcode.getCode(),
+ 0, 0, 0, 0, 0);
+}
+
TEST_F(ResolverTest, notifyFail) {
// Notify should always return NOTAUTH
request_message.clear(Message::RENDER);
More information about the bind10-changes
mailing list