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/09 02:25:01 UTC

[mesos] 02/06: 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 1.5.x
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit bfcf849ca7fd0815fe16228944cef8b164f67c66
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 afe4137..648967b 100644
--- a/src/common/values.cpp
+++ b/src/common/values.cpp
@@ -612,6 +612,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 f7e6fa7..e91ed69 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 d2c31f6..c047404 100644
--- a/src/v1/values.cpp
+++ b/src/v1/values.cpp
@@ -640,6 +640,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);