From: Paul Selkirk Date: Tue, 7 May 2013 22:12:00 +0000 (-0400) Subject: [2521] add 0-length check to DHCID from-wire constructor X-Git-Tag: bind10-1.2.0beta1-release~473^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=65b7adb8a1578ae6f070b9c877149d0db77aefda;p=thirdparty%2Fkea.git [2521] add 0-length check to DHCID from-wire constructor --- diff --git a/src/lib/dns/rdata/in_1/dhcid_49.cc b/src/lib/dns/rdata/in_1/dhcid_49.cc index 2cfa522a20..184866c49c 100644 --- a/src/lib/dns/rdata/in_1/dhcid_49.cc +++ b/src/lib/dns/rdata/in_1/dhcid_49.cc @@ -55,13 +55,6 @@ DHCID::constructFromLexer(MasterLexer& lexer) { /// \brief Constructor from string. /// /// \param dhcid_str A base-64 representation of the DHCID binary data. -/// RFC4701 says "DNS software should consider the RDATA section to be opaque." -/// -/// It is okay for the key data to be missing. Note: BIND 9 also accepts -/// DHCID missing key data. While the RFC is silent in this case, and it -/// may be debatable what an implementation should do, but since this field -/// is algorithm dependent and this implementations doesn't reject unknown -/// algorithms, it's lenient here. /// /// \throw InvalidRdataText if the string could not be parsed correctly. DHCID::DHCID(const std::string& dhcid_str) { @@ -102,6 +95,10 @@ DHCID::DHCID(MasterLexer& lexer, const Name*, /// \param buffer A buffer storing the wire format data. /// \param rdata_len The length of the RDATA in bytes DHCID::DHCID(InputBuffer& buffer, size_t rdata_len) { + if (rdata_len == 0) { + isc_throw(InvalidRdataLength, "Missing DHCID rdata"); + } + digest_.resize(rdata_len); buffer.readData(&digest_[0], rdata_len); } diff --git a/src/lib/dns/tests/rdata_dhcid_unittest.cc b/src/lib/dns/tests/rdata_dhcid_unittest.cc index 90f44dcdae..77baccd893 100644 --- a/src/lib/dns/tests/rdata_dhcid_unittest.cc +++ b/src/lib/dns/tests/rdata_dhcid_unittest.cc @@ -107,6 +107,10 @@ TEST_F(Rdata_DHCID_Test, createFromWire) { EXPECT_EQ(0, rdata_dhcid.compare( *rdataFactoryFromFile(RRType("DHCID"), RRClass("IN"), "rdata_dhcid_fromWire"))); + + InputBuffer buffer(NULL, 0); + EXPECT_THROW(in::DHCID(buffer, 0), InvalidRdataLength); + // TBD: more tests }