You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by mz...@apache.org on 2019/01/07 17:20:45 UTC
[mesos] 01/05: Disallowed nan,
inf and so on when parsing Value::Scalar.
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 <mz...@mesosphere.io>
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);