diff --git a/src/lib/dns/gen-rdatacode.py.in b/src/lib/dns/gen-rdatacode.py.in index fc63d73a06..86ef782c8d 100755 --- a/src/lib/dns/gen-rdatacode.py.in +++ b/src/lib/dns/gen-rdatacode.py.in @@ -35,6 +35,7 @@ import sys new_rdata_factory_users = [('aaaa', 'in'), ('hinfo', 'generic'), ('naptr', 'generic'), + ('mx', 'generic'), ('soa', 'generic'), ('spf', 'generic'), ('txt', 'generic') diff --git a/src/lib/dns/rdata/generic/mx_15.cc b/src/lib/dns/rdata/generic/mx_15.cc index b95ba059e0..48e4c26afc 100644 --- a/src/lib/dns/rdata/generic/mx_15.cc +++ b/src/lib/dns/rdata/generic/mx_15.cc @@ -57,6 +57,19 @@ MX::MX(const std::string& mx_str) : mxname_ = Name(mxname); } +MX::MX(MasterLexer& lexer, const Name*, MasterLoader::Options, + MasterLoaderCallbacks&) : + preference_(0), mxname_(".") +{ + uint32_t num = lexer.getNextToken(MasterToken::NUMBER).getNumber(); + if (num > 65535) { + isc_throw(InvalidRdataText, "Invalid MX preference"); + } + + preference_ = static_cast(num); + mxname_ = Name(lexer.getNextToken(MasterToken::QSTRING).getString()); +} + MX::MX(uint16_t preference, const Name& mxname) : preference_(preference), mxname_(mxname) {} diff --git a/src/lib/dns/tests/rdata_mx_unittest.cc b/src/lib/dns/tests/rdata_mx_unittest.cc index 6c6039aa60..7eba588d7d 100644 --- a/src/lib/dns/tests/rdata_mx_unittest.cc +++ b/src/lib/dns/tests/rdata_mx_unittest.cc @@ -70,6 +70,10 @@ TEST_F(Rdata_MX_Test, createFromLexer) { // Exceptions cause NULL to be returned. EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(), "10 mx. example.com")); + + // 65536 is larger than maximum possible preference + EXPECT_FALSE(test::createRdataUsingLexer(RRType::MX(), RRClass::IN(), + "65536 mx.example.com")); } TEST_F(Rdata_MX_Test, toWireRenderer) {