This is an automated email from the ASF dual-hosted git repository. mzhu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 071bd9e1b770026381640d4f9b25e19ee040af7b Author: Meng Zhu <[email protected]> AuthorDate: Sat Jan 5 13:28:27 2019 -0800 Disallowed nan, inf and so on when parsing Value::Scalar. Scalar values are intended to be finite numbers. This patch checks `nan`, `inf` and so on when parsing `Value::Scalar`. Only normal or zero numbers (as defined in `std::fpclassify()`) are allowed. Also added related tests. Review: https://reviews.apache.org/r/69673 --- src/common/values.cpp | 15 +++++++++++++++ src/tests/values_tests.cpp | 9 +++++++++ src/v1/values.cpp | 15 +++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/common/values.cpp b/src/common/values.cpp index f04d115..c788302 100644 --- a/src/common/values.cpp +++ b/src/common/values.cpp @@ -707,6 +707,21 @@ Try<Value> parse(const string& text) } else if (index == string::npos) { Try<double> value_ = numify<double>(temp); if (!value_.isError()) { + Option<Error> error = [value_]() -> Option<Error> { + switch (std::fpclassify(value_.get())) { + case FP_NORMAL: return None(); + case FP_ZERO: return None(); + case FP_INFINITE: return Error("Infinite values not supported"); + case FP_NAN: return Error("NaN not supported"); + case FP_SUBNORMAL: return Error("Subnormal values not supported"); + default: return Error("Unknown error"); + } + }(); + + if (error.isSome()) { + return Error("Invalid scalar value '" + temp + "':" + error->message); + } + // This is a scalar. Value::Scalar* scalar = value.mutable_scalar(); value.set_type(Value::SCALAR); diff --git a/src/tests/values_tests.cpp b/src/tests/values_tests.cpp index e4fcf98..d67e4eb 100644 --- a/src/tests/values_tests.cpp +++ b/src/tests/values_tests.cpp @@ -89,6 +89,15 @@ TEST(ValuesTest, InvalidInput) // Test when giving empty string. EXPECT_ERROR(parse(" ")); + + EXPECT_ERROR(parse("nan")); + EXPECT_ERROR(parse("-nan")); + + EXPECT_ERROR(parse("inf")); + EXPECT_ERROR(parse("-inf")); + + EXPECT_ERROR(parse("infinity")); + EXPECT_ERROR(parse("-infinity")); } diff --git a/src/v1/values.cpp b/src/v1/values.cpp index 1be9945..5fd9dc5 100644 --- a/src/v1/values.cpp +++ b/src/v1/values.cpp @@ -735,6 +735,21 @@ Try<Value> parse(const string& text) } else if (index == string::npos) { Try<double> value_ = numify<double>(temp); if (!value_.isError()) { + Option<Error> error = [value_]() -> Option<Error> { + switch (std::fpclassify(value_.get())) { + case FP_NORMAL: return None(); + case FP_ZERO: return None(); + case FP_INFINITE: return Error("Infinite values not supported"); + case FP_NAN: return Error("NaN not supported"); + case FP_SUBNORMAL: return Error("Subnormal values not supported"); + default: return Error("Unknown error"); + } + }(); + + if (error.isSome()) { + return Error("Invalid scalar value '" + temp + "':" + error->message); + } + // This is a scalar. Value::Scalar* scalar = value.mutable_scalar(); value.set_type(Value::SCALAR);
