]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2881] do not serialize data in EMPTY options with suboptions
authorRazvan Becheriu <razvan@isc.org>
Thu, 31 Aug 2023 19:39:01 +0000 (22:39 +0300)
committerRazvan Becheriu <razvan@isc.org>
Fri, 13 Oct 2023 23:49:45 +0000 (02:49 +0300)
src/bin/dhcp4/tests/get_config_unittest.cc
src/lib/dhcpsrv/cfg_option.cc
src/lib/dhcpsrv/tests/dhcp_parsers_unittest.cc

index 8495a9e6d920ac25fd60e87cffa093f4793105e5..e67c5a13c396b3469f19e02c0e0f68687db4762e 100644 (file)
@@ -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"
index e7380236eb3eff54b133f9e1b5713bc8be3ef855..1014b3c36622f07cc56b7ac7a52fa6194a469128 100644 (file)
@@ -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<uint8_t> 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<uint8_t> 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
index 737700d00f0045adec2e857adc57cb7c3bb2ec5b..aa7de06b498bfd5b6af31abe377d1bbc0db09432 100644 (file)
@@ -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.