]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2387] Make DNSKEY wire constructor throw on empty keydata
authorMukund Sivaraman <muks@isc.org>
Thu, 14 Mar 2013 02:30:14 +0000 (08:00 +0530)
committerMukund Sivaraman <muks@isc.org>
Thu, 14 Mar 2013 02:30:51 +0000 (08:00 +0530)
src/lib/dns/rdata/generic/dnskey_48.cc
src/lib/dns/tests/rdata_dnskey_unittest.cc
src/lib/dns/tests/testdata/Makefile.am
src/lib/dns/tests/testdata/rdata_dnskey_empty_keydata_fromWire [new file with mode: 0644]

index 449a84f046cb9ddfca457372e632595dde35e90d..2cba1be2edc93c1ff7241af34856f1e4ed32cfc3 100644 (file)
@@ -98,6 +98,12 @@ DNSKEY::DNSKEY(InputBuffer& buffer, size_t rdata_len) {
     const uint16_t algorithm = buffer.readUint8();
 
     rdata_len -= 4;
+    // Though the size of the public key is algorithm-dependent, we
+    // assume that it should not be empty.
+    if (rdata_len < 1) {
+        isc_throw(InvalidRdataLength, "DNSKEY keydata too short");
+    }
+
     vector<uint8_t> keydata(rdata_len);
     buffer.readData(&keydata[0], rdata_len);
 
index f175c87c5331d9e58744212422933f91b8b2b7cc..9676cd9d08293f26f778cd1103d70fbcd3d2f244 100644 (file)
@@ -134,6 +134,10 @@ TEST_F(Rdata_DNSKEY_Test, createFromWire) {
     EXPECT_EQ(0, rdata_dnskey.compare(
                   *rdataFactoryFromFile(RRType("DNSKEY"), RRClass("IN"),
                                         "rdata_dnskey_fromWire")));
+    // Empty keydata should throw
+    EXPECT_THROW(rdataFactoryFromFile(RRType("DNSKEY"), RRClass("IN"),
+                                      "rdata_dnskey_empty_keydata_fromWire"),
+                 InvalidRdataLength);
 }
 
 TEST_F(Rdata_DNSKEY_Test, getTag) {
index 52acb7c110eef6c5973f2bfa432a5a3d4333ec88..eee2e16ca3480dea9f15191172174abdc8e6a707 100644 (file)
@@ -101,7 +101,8 @@ EXTRA_DIST += name_toWire7 name_toWire8 name_toWire9
 EXTRA_DIST += question_fromWire question_toWire1 question_toWire2
 EXTRA_DIST += rdatafields1.spec rdatafields2.spec rdatafields3.spec
 EXTRA_DIST += rdatafields4.spec rdatafields5.spec rdatafields6.spec
-EXTRA_DIST += rdata_cname_fromWire rdata_dname_fromWire rdata_dnskey_fromWire
+EXTRA_DIST += rdata_cname_fromWire rdata_dname_fromWire
+EXTRA_DIST += rdata_dnskey_fromWire rdata_dnskey_empty_keydata_fromWire
 EXTRA_DIST += rdata_dhcid_fromWire rdata_dhcid_toWire
 EXTRA_DIST += rdata_ds_fromWire rdata_in_a_fromWire rdata_in_aaaa_fromWire
 EXTRA_DIST += rdata_mx_fromWire rdata_mx_toWire1 rdata_mx_toWire2
diff --git a/src/lib/dns/tests/testdata/rdata_dnskey_empty_keydata_fromWire b/src/lib/dns/tests/testdata/rdata_dnskey_empty_keydata_fromWire
new file mode 100644 (file)
index 0000000..cd07bae
--- /dev/null
@@ -0,0 +1,7 @@
+# RDLENGTH = 4 bytes
+ 00 04
+# DNSKEY, flags 257
+ 01 01
+# protocol 3, algorithm 5
+ 03 05
+# no keydata