diff --git a/lib/base/perfdatavalue.cpp b/lib/base/perfdatavalue.cpp index aca8c0f3a..217167e01 100644 --- a/lib/base/perfdatavalue.cpp +++ b/lib/base/perfdatavalue.cpp @@ -259,6 +259,10 @@ PerfdataValue::Ptr PerfdataValue::Parse(const String& perfdata) double value = Convert::ToDouble(tokens[0].SubStr(0, pos)); + if (!std::isfinite(value)) { + BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid performance data value: " + perfdata + " is outside of any reasonable range")); + } + bool counter = false; String unit; Value warn, crit, min, max; diff --git a/test/icinga-perfdata.cpp b/test/icinga-perfdata.cpp index 1318c08af..68d0ea277 100644 --- a/test/icinga-perfdata.cpp +++ b/test/icinga-perfdata.cpp @@ -336,6 +336,10 @@ BOOST_AUTO_TEST_CASE(invalid) BOOST_CHECK_THROW(PerfdataValue::Parse("test=1;1;123,456;1;1"), boost::exception); BOOST_CHECK_THROW(PerfdataValue::Parse("test=1;1;1;123,456;1"), boost::exception); BOOST_CHECK_THROW(PerfdataValue::Parse("test=1;1;1;1;123,456"), boost::exception); + BOOST_CHECK_THROW(PerfdataValue::Parse("test=inf"), boost::exception); + BOOST_CHECK_THROW(PerfdataValue::Parse("test=Inf"), boost::exception); + BOOST_CHECK_THROW(PerfdataValue::Parse("test=-inf"), boost::exception); + BOOST_CHECK_THROW(PerfdataValue::Parse("test=-Inf"), boost::exception); } BOOST_AUTO_TEST_CASE(multi)