diff --git a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp index 224d7c1b581..43c4c322b1e 100644 --- a/src/cpp/rtps/participant/RTPSParticipantImpl.cpp +++ b/src/cpp/rtps/participant/RTPSParticipantImpl.cpp @@ -150,14 +150,14 @@ static void set_builtin_transports_from_env_var( if (std::regex_search(env_value, mr, msg_size_regex, std::regex_constants::match_not_null)) { std::string value = mr[2]; - std::string unit = (mr[3] == "") ? "B" : mr[3].str(); + std::string unit = mr[3].str(); options.maxMessageSize = eprosima::fastdds::dds::utils::parse_value_and_units(value, unit); } // Sockets_size parser if (std::regex_search(env_value, mr, sockets_size_regex, std::regex_constants::match_not_null)) { std::string value = mr[2]; - std::string unit = (mr[3] == "") ? "B" : mr[3].str(); + std::string unit = mr[3].str(); options.sockets_buffer_size = eprosima::fastdds::dds::utils::parse_value_and_units(value, unit); } // Non-blocking-send parser diff --git a/src/cpp/rtps/xmlparser/XMLElementParser.cpp b/src/cpp/rtps/xmlparser/XMLElementParser.cpp index ff7d2fc2f41..1dcdd03c6b3 100644 --- a/src/cpp/rtps/xmlparser/XMLElementParser.cpp +++ b/src/cpp/rtps/xmlparser/XMLElementParser.cpp @@ -4767,7 +4767,7 @@ XMLP_ret XMLParser::getXMLBuiltinTransports( if (std::regex_search(temp, mr, msg_size_regex, std::regex_constants::match_not_null)) { std::string value = mr[1]; - std::string unit = (mr[2] == "") ? "B" : mr[2].str(); + std::string unit = mr[2].str(); bt_opts->maxMessageSize = eprosima::fastdds::dds::utils::parse_value_and_units(value, unit); } } @@ -4799,7 +4799,7 @@ XMLP_ret XMLParser::getXMLBuiltinTransports( if (std::regex_search(temp, mr, sockets_size_regex, std::regex_constants::match_not_null)) { std::string value = mr[1]; - std::string unit = (mr[2] == "") ? "B" : mr[2].str(); + std::string unit = mr[2].str(); bt_opts->sockets_buffer_size = eprosima::fastdds::dds::utils::parse_value_and_units(value, unit); } } diff --git a/src/cpp/utils/UnitsParser.cpp b/src/cpp/utils/UnitsParser.cpp index 7c46d2fb460..ec399ce56a7 100644 --- a/src/cpp/utils/UnitsParser.cpp +++ b/src/cpp/utils/UnitsParser.cpp @@ -55,6 +55,7 @@ uint32_t parse_value_and_units( std::string units) { static const std::map magnitudes = { + {"", 1}, {"B", 1}, {"KB", 1000}, {"MB", 1000 * 1000}, @@ -64,16 +65,29 @@ uint32_t parse_value_and_units( {"GIB", 1024 * 1024 * 1024}, }; - uint64_t num = std::stoull(value); + uint64_t num = 0; + try + { + num = std::stoull(value); + } + catch (std::out_of_range&) + { + throw std::invalid_argument("Failed to parse value from string." \ + " The number is too large to be converted to bytes (Max: (2^32)-1 Bytes)."); + } + to_uppercase(units); - std::regex pattern(R"(([kibmgKIBMG]{1,3})|(\d+))"); - if (!std::regex_match(units, pattern)) + uint32_t magnitude = 0; + try + { + magnitude = magnitudes.at(units); + } + catch (std::out_of_range&) { throw std::invalid_argument( "The units are not in the expected format. Use: {B, KB, MG, GB, KIB, MIB, GIB}."); } - const auto magnitude = magnitudes.at(units); // Check whether the product of number * magnitude overflows if (num > std::numeric_limits::max() / magnitude) diff --git a/test/unittest/xmlparser/XMLParserTests.cpp b/test/unittest/xmlparser/XMLParserTests.cpp index f1ff71f7f09..62c92b535ab 100644 --- a/test/unittest/xmlparser/XMLParserTests.cpp +++ b/test/unittest/xmlparser/XMLParserTests.cpp @@ -72,6 +72,8 @@ TEST_F(XMLParserTests, regressions) EXPECT_EQ(XMLP_ret::XML_OK, XMLParser::loadXML("regressions/simple_participant_profiles_ok.xml", root)); EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParser::loadXML("regressions/20186_profile_bin.xml", root)); EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParser::loadXML("regressions/20187_profile_bin.xml", root)); + EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParser::loadXML("regressions/20608_profile_bin.xml", root)); + EXPECT_EQ(XMLP_ret::XML_ERROR, XMLParser::loadXML("regressions/20610_profile_bin.xml", root)); } TEST_F(XMLParserTests, NoFile) diff --git a/test/unittest/xmlparser/regressions/20608_profile_bin.xml b/test/unittest/xmlparser/regressions/20608_profile_bin.xml new file mode 100644 index 00000000000..2cab7c3754b --- /dev/null +++ b/test/unittest/xmlparser/regressions/20608_profile_bin.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/unittest/xmlparser/regressions/20610_profile_bin.xml b/test/unittest/xmlparser/regressions/20610_profile_bin.xml new file mode 100644 index 00000000000..7f3f518e439 --- /dev/null +++ b/test/unittest/xmlparser/regressions/20610_profile_bin.xml @@ -0,0 +1 @@ + \ No newline at end of file