From 3167201e500b24b0ec50e14b6bb58205384f0906 Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Mon, 5 Aug 2019 09:48:39 +0200 Subject: [PATCH] dnsdist: Add a unit test for large EDNS option codes --- pdns/test-dnsdist_cc.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pdns/test-dnsdist_cc.cc b/pdns/test-dnsdist_cc.cc index 100dd47109..b81b4ab36b 100644 --- a/pdns/test-dnsdist_cc.cc +++ b/pdns/test-dnsdist_cc.cc @@ -1451,6 +1451,7 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { ecsOpts.source = Netmask(ComboAddress("127.0.0.1"), ECSSourcePrefixV4); const string ecsOptionStr = makeEDNSSubnetOptsString(ecsOpts); const size_t sizeOfECSContent = ecsOptionStr.size(); + const size_t sizeOfECSOption = /* option code */ 2 + /* option length */ 2 + sizeOfECSContent; EDNSCookiesOpt cookiesOpt; cookiesOpt.client = string("deadbeef"); cookiesOpt.server = string("deadbeef"); @@ -1563,6 +1564,28 @@ BOOST_AUTO_TEST_CASE(test_isEDNSOptionInOpt) { query.resize(query.size() - 1); BOOST_CHECK_THROW(locateEDNSOption(query, EDNSOptionCode::ECS, &optContentStart, &optContentLen), std::range_error); } + + { + /* valid EDNS, one 65002 after an ECS */ + vector query; + DNSPacketWriter pw(query, qname, qtype, qclass, 0); + DNSPacketWriter::optvect_t opts; + opts.push_back(make_pair(EDNSOptionCode::ECS, ecsOptionStr)); + opts.push_back(make_pair(65535, cookiesOptionStr)); + pw.addOpt(512, 0, 0, opts); + pw.commit(); + + bool found = locateEDNSOption(query, 65535, &optContentStart, &optContentLen); + BOOST_CHECK_EQUAL(found, true); + if (found == true) { + BOOST_CHECK_EQUAL(optContentStart, optRDExpectedOffset + sizeof(uint16_t) /* RD len */ + sizeOfECSOption + /* option code */ 2 + /* option length */ 2); + BOOST_CHECK_EQUAL(optContentLen, cookiesOptionStr.size()); + } + + /* truncated packet */ + query.resize(query.size() - 1); + BOOST_CHECK_THROW(locateEDNSOption(query, 65002, &optContentStart, &optContentLen), std::range_error); + } } BOOST_AUTO_TEST_SUITE_END(); -- 2.47.2