From: Marcin Siodelski Date: Fri, 16 Aug 2013 14:38:10 +0000 (+0200) Subject: [3036] Test creating on-wire data from an option with empty domain name. X-Git-Tag: bind10-1.2.0beta1-release~257^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a8dfa35d56e421fa565efb4de12bff2ee2813aa5;p=thirdparty%2Fkea.git [3036] Test creating on-wire data from an option with empty domain name. --- diff --git a/src/lib/dhcp/option6_client_fqdn.cc b/src/lib/dhcp/option6_client_fqdn.cc index c5fe419c03..ff2efe6908 100644 --- a/src/lib/dhcp/option6_client_fqdn.cc +++ b/src/lib/dhcp/option6_client_fqdn.cc @@ -437,11 +437,14 @@ Option6ClientFqdn::toText(int indent) { uint16_t Option6ClientFqdn::len() { - // If domain name is partial, the NULL terminating character - // is not included and the option length have to be adjusted. - uint16_t domain_name_length = impl_->domain_name_type_ == FULL ? - impl_->domain_name_->getLength() : impl_->domain_name_->getLength() - 1; - + uint16_t domain_name_length = 0; + if (impl_->domain_name_) { + // If domain name is partial, the NULL terminating character + // is not included and the option. Length has to be adjusted. + domain_name_length = impl_->domain_name_type_ == FULL ? + impl_->domain_name_->getLength() : + impl_->domain_name_->getLength() - 1; + } return (getHeaderLen() + FLAG_FIELD_LEN + domain_name_length); } diff --git a/src/lib/dhcp/tests/option6_client_fqdn_unittest.cc b/src/lib/dhcp/tests/option6_client_fqdn_unittest.cc index 64bd525d96..d644a2e662 100644 --- a/src/lib/dhcp/tests/option6_client_fqdn_unittest.cc +++ b/src/lib/dhcp/tests/option6_client_fqdn_unittest.cc @@ -622,6 +622,34 @@ TEST(Option6ClientFqdnTest, packPartial) { EXPECT_EQ(0, memcmp(ref_data, buf.getData(), buf.getLength())); } +// This test verifies that it is possible to encode the option which carries +// empty domain-name in the wire format. +TEST(Option6ClientFqdnTest, packEmpty) { + // Create option instance. Check that constructor doesn't throw. + const uint8_t flags = Option6ClientFqdn::FLAG_S; + boost::scoped_ptr option; + ASSERT_NO_THROW( + option.reset(new Option6ClientFqdn(flags)) + ); + ASSERT_TRUE(option); + + // Prepare on-wire format of the option. + isc::util::OutputBuffer buf(5); + ASSERT_NO_THROW(option->pack(buf)); + + // Prepare reference data. + const uint8_t ref_data[] = { + 0, 39, 0, 1, // header + Option6ClientFqdn::FLAG_S // flags + }; + size_t ref_data_size = sizeof(ref_data) / sizeof(ref_data[0]); + + // Check if the buffer has the same length as the reference data, + // so as they can be compared directly. + ASSERT_EQ(ref_data_size, buf.getLength()); + EXPECT_EQ(0, memcmp(ref_data, buf.getData(), buf.getLength())); +} + // This test verifies that on-wire option data holding fully qualified domain // name is parsed correctly. TEST(Option6ClientFqdnTest, unpack) {