From: Razvan Becheriu Date: Thu, 31 Aug 2023 19:39:01 +0000 (+0300) Subject: [#2881] do not serialize data in EMPTY options with suboptions X-Git-Tag: Kea-2.5.3~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=173a178a6989c75606df4b13f150446537bfa2bc;p=thirdparty%2Fkea.git [#2881] do not serialize data in EMPTY options with suboptions --- diff --git a/src/bin/dhcp4/tests/get_config_unittest.cc b/src/bin/dhcp4/tests/get_config_unittest.cc index 8495a9e6d9..e67c5a13c3 100644 --- a/src/bin/dhcp4/tests/get_config_unittest.cc +++ b/src/bin/dhcp4/tests/get_config_unittest.cc @@ -6958,7 +6958,7 @@ const char* UNPARSED_CONFIGS[] = { " \"always-send\": false,\n" " \"code\": 43,\n" " \"csv-format\": false,\n" -" \"data\": \"0104000004D20204C0A80201\",\n" +" \"data\": \"\",\n" " \"name\": \"vendor-encapsulated-options\",\n" " \"never-send\": false,\n" " \"space\": \"dhcp4\"\n" diff --git a/src/lib/dhcpsrv/cfg_option.cc b/src/lib/dhcpsrv/cfg_option.cc index e7380236eb..1014b3c366 100644 --- a/src/lib/dhcpsrv/cfg_option.cc +++ b/src/lib/dhcpsrv/cfg_option.cc @@ -479,13 +479,23 @@ CfgOption::toElementWithMetadata(const bool include_metadata) const { // Set the data item if (!opt.formatted_value_.empty()) { map->set("csv-format", Element::create(true)); - map->set("data", Element::create(opt.formatted_value_)); + if (def && def->getType() == OPT_EMPTY_TYPE && + def->getEncapsulatedSpace() != def->getOptionSpaceName()) { + map->set("data", Element::create("")); + } else { + map->set("data", Element::create(opt.formatted_value_)); + } } else { std::vector bin = opt.option_->toBinary(); if (!opt.cancelled_ || !bin.empty()) { map->set("csv-format", Element::create(false)); - std::string repr = util::encode::encodeHex(bin); - map->set("data", Element::create(repr)); + if (def && def->getType() == OPT_EMPTY_TYPE && + def->getEncapsulatedSpace() != def->getOptionSpaceName()) { + map->set("data", Element::create("")); + } else { + std::string repr = util::encode::encodeHex(bin); + map->set("data", Element::create(repr)); + } } } // Set the persistency flag @@ -531,13 +541,23 @@ CfgOption::toElementWithMetadata(const bool include_metadata) const { // Set the data item if (!opt.formatted_value_.empty()) { map->set("csv-format", Element::create(true)); - map->set("data", Element::create(opt.formatted_value_)); + if (def && def->getType() == OPT_EMPTY_TYPE && + def->getEncapsulatedSpace() != def->getOptionSpaceName()) { + map->set("data", Element::create("")); + } else { + map->set("data", Element::create(opt.formatted_value_)); + } } else { std::vector bin = opt.option_->toBinary(); if (!opt.cancelled_ || !bin.empty()) { map->set("csv-format", Element::create(false)); - std::string repr = util::encode::encodeHex(bin); - map->set("data", Element::create(repr)); + if (def && def->getType() == OPT_EMPTY_TYPE && + def->getEncapsulatedSpace() != def->getOptionSpaceName()) { + map->set("data", Element::create("")); + } else { + std::string repr = util::encode::encodeHex(bin); + map->set("data", Element::create(repr)); + } } } // Set the persistency flag diff --git a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc index 737700d00f..aa7de06b49 100644 --- a/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc +++ b/src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc @@ -3482,7 +3482,7 @@ TEST_F(ParseConfigTest, invalidSubnetPdAllocator6) { // is detected. TEST_F(ParseConfigTest, selfEncapsulationTest) { // Verify that the option definition can be retrieved. - OptionDefinitionPtr def = LibDHCP::getOptionDef(DHCP6_OPTION_SPACE, 45); + OptionDefinitionPtr def = LibDHCP::getOptionDef(DHCP6_OPTION_SPACE, D6O_CLIENT_DATA); ASSERT_TRUE(def); // Configuration string.