From: Mukund Sivaraman Date: Wed, 25 Jul 2012 05:54:52 +0000 (+0530) Subject: [2124] Add wiredata tests where the record is shorter than rdata len indicates X-Git-Tag: trac2351_base~171 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=16cd39d09fbdf9c2121b9aa0cbe124355f42f134;p=thirdparty%2Fkea.git [2124] Add wiredata tests where the record is shorter than rdata len indicates --- diff --git a/src/lib/dns/rdata/generic/sshfp_44.cc b/src/lib/dns/rdata/generic/sshfp_44.cc index b4175b887a..b183180b64 100644 --- a/src/lib/dns/rdata/generic/sshfp_44.cc +++ b/src/lib/dns/rdata/generic/sshfp_44.cc @@ -40,12 +40,18 @@ SSHFP::SSHFP(InputBuffer& buffer, size_t rdata_len) { isc_throw(InvalidRdataLength, "SSHFP record too short"); } - algorithm_ = buffer.readUint8(); - fingerprint_type_ = buffer.readUint8(); + try { + algorithm_ = buffer.readUint8(); + fingerprint_type_ = buffer.readUint8(); + + rdata_len -= 2; + fingerprint_.resize(rdata_len); - rdata_len -= 2; - fingerprint_.resize(rdata_len); - buffer.readData(&fingerprint_[0], rdata_len); + buffer.readData(&fingerprint_[0], rdata_len); + } catch (const isc::util::InvalidBufferPosition& e) { + isc_throw(InvalidRdataLength, + "SSHFP record shorter than RDATA len: " << e.what()); + } } SSHFP::SSHFP(const std::string& sshfp_str) { diff --git a/src/lib/dns/tests/rdata_sshfp_unittest.cc b/src/lib/dns/tests/rdata_sshfp_unittest.cc index 7759bfd40f..8c493a4ed1 100644 --- a/src/lib/dns/tests/rdata_sshfp_unittest.cc +++ b/src/lib/dns/tests/rdata_sshfp_unittest.cc @@ -126,6 +126,21 @@ TEST_F(Rdata_SSHFP_Test, createFromWire) { // short fingerprint data EXPECT_NO_THROW(rdataFactoryFromFile(RRType("SSHFP"), RRClass("IN"), "rdata_sshfp_fromWire8.wire")); + + // fingerprint is shorter than rdata len + EXPECT_THROW(rdataFactoryFromFile(RRType("SSHFP"), RRClass("IN"), + "rdata_sshfp_fromWire9"), + InvalidRdataLength); + + // fingerprint is missing + EXPECT_THROW(rdataFactoryFromFile(RRType("SSHFP"), RRClass("IN"), + "rdata_sshfp_fromWire10"), + InvalidRdataLength); + + // all rdata is missing + EXPECT_THROW(rdataFactoryFromFile(RRType("SSHFP"), RRClass("IN"), + "rdata_sshfp_fromWire11"), + InvalidRdataLength); } TEST_F(Rdata_SSHFP_Test, toText) { diff --git a/src/lib/dns/tests/testdata/Makefile.am b/src/lib/dns/tests/testdata/Makefile.am index 86de476301..77308a7310 100644 --- a/src/lib/dns/tests/testdata/Makefile.am +++ b/src/lib/dns/tests/testdata/Makefile.am @@ -135,6 +135,8 @@ EXTRA_DIST += rdata_sshfp_fromWire1.spec rdata_sshfp_fromWire2.spec EXTRA_DIST += rdata_sshfp_fromWire3.spec rdata_sshfp_fromWire4.spec EXTRA_DIST += rdata_sshfp_fromWire5.spec rdata_sshfp_fromWire6.spec EXTRA_DIST += rdata_sshfp_fromWire7.spec rdata_sshfp_fromWire8.spec +EXTRA_DIST += rdata_sshfp_fromWire9 rdata_sshfp_fromWire10 +EXTRA_DIST += rdata_sshfp_fromWire11 EXTRA_DIST += rdata_afsdb_fromWire1.spec rdata_afsdb_fromWire2.spec EXTRA_DIST += rdata_afsdb_fromWire3.spec rdata_afsdb_fromWire4.spec EXTRA_DIST += rdata_afsdb_fromWire5.spec diff --git a/src/lib/dns/tests/testdata/rdata_sshfp_fromWire10 b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire10 new file mode 100644 index 0000000000..7e04a203ee --- /dev/null +++ b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire10 @@ -0,0 +1,6 @@ +# Test where fingerprint is missing + +# SSHFP RDATA, RDLEN=22 +0020 +# ALGORITHM=2 FINGERPRINT_TYPE=1 FINGERPRINT=123456789abcdef67890123456789abcdef67890 +02 01 diff --git a/src/lib/dns/tests/testdata/rdata_sshfp_fromWire11 b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire11 new file mode 100644 index 0000000000..0756c836d5 --- /dev/null +++ b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire11 @@ -0,0 +1,4 @@ +# Test where RDATA is completely missing + +# SSHFP RDATA, RDLEN=22 +0020 diff --git a/src/lib/dns/tests/testdata/rdata_sshfp_fromWire9 b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire9 new file mode 100644 index 0000000000..05fc80684b --- /dev/null +++ b/src/lib/dns/tests/testdata/rdata_sshfp_fromWire9 @@ -0,0 +1,6 @@ +# Test where fingerprint length is smaller than what RDATA len indicates + +# SSHFP RDATA, RDLEN=32 +0020 +# ALGORITHM=2 FINGERPRINT_TYPE=1 FINGERPRINT=123456789abcdef67890123456789abcdef67890 +02 01 123456789abcdef67890123456789abcdef67890