You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by al...@apache.org on 2018/04/22 20:21:17 UTC

[3/3] mesos git commit: Stout: Ensured exceptions are caught for `picojson::parse()`.

Stout: Ensured exceptions are caught for `picojson::parse()`.

`picojson::parse()` might throw in some cases, including when a parsed
number is out of bounds. This patch captures possible exceptions at
the call site and converts them to `Error`s.

Review: https://reviews.apache.org/r/66091


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2d7b7ef6
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2d7b7ef6
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2d7b7ef6

Branch: refs/heads/master
Commit: 2d7b7ef6d17e81395214741a613a68a6fb86483f
Parents: d6552b0
Author: Alexander Rukletsov <al...@apache.org>
Authored: Tue Mar 13 13:37:49 2018 +0100
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Sun Apr 22 22:20:23 2018 +0200

----------------------------------------------------------------------
 3rdparty/stout/include/stout/json.hpp | 21 +++++++++++++++++----
 3rdparty/stout/tests/json_tests.cpp   | 14 ++++++++++++++
 2 files changed, 31 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/2d7b7ef6/3rdparty/stout/include/stout/json.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/include/stout/json.hpp b/3rdparty/stout/include/stout/json.hpp
index 102cd99..5e738cf 100644
--- a/3rdparty/stout/include/stout/json.hpp
+++ b/3rdparty/stout/include/stout/json.hpp
@@ -890,13 +890,26 @@ inline Try<Value> parse(const std::string& s)
   // Because PicoJson supports repeated parsing of multiple objects/arrays in a
   // stream, it will quietly ignore trailing non-whitespace characters. We would
   // rather throw an error, however, so use `last_char` to check for this.
+  //
+  // TODO(alexr): Address cases when `s` is empty or consists only of whitespace
+  // characters.
   const char* lastVisibleChar =
     parseBegin + s.find_last_not_of(strings::WHITESPACE);
 
-  // Parse the string, returning a pointer to the character
-  // immediately following the last one parsed.
-  const char* parseEnd =
-    picojson::parse(value, parseBegin, parseBegin + s.size(), &error);
+  // Parse the string, returning a pointer to the character immediately
+  // following the last one parsed. Convert exceptions to `Error`s.
+  //
+  // TODO(alexr): Remove `try-catch` wrapper once picojson stops throwing
+  // on parsing, see https://github.com/kazuho/picojson/issues/94
+  const char* parseEnd;
+  try {
+    parseEnd =
+      picojson::parse(value, parseBegin, parseBegin + s.size(), &error);
+  } catch (const std::overflow_error&) {
+    return Error("Value out of range");
+  } catch (...) {
+    return Error("Unknown JSON parse error");
+  }
 
   if (!error.empty()) {
     return Error(error);

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d7b7ef6/3rdparty/stout/tests/json_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/tests/json_tests.cpp b/3rdparty/stout/tests/json_tests.cpp
index af00e42..508d843 100644
--- a/3rdparty/stout/tests/json_tests.cpp
+++ b/3rdparty/stout/tests/json_tests.cpp
@@ -270,6 +270,20 @@ TEST(JsonTest, ParseError)
     " ";
 
   EXPECT_ERROR(JSON::parse<JSON::Object>(jsonString));
+
+  jsonString = R"~(
+    {
+      "double1": 123123123121231231231231321312312312123123122E112312387129381723\x0d\x0a\x0d\x0a\x0d\x0a\x0d
+    })~";
+
+  EXPECT_ERROR(JSON::parse<JSON::Object>(jsonString));
+
+  jsonString = R"~(
+    {
+      "double2": -332861120361594135E400
+    })~";
+
+  EXPECT_ERROR(JSON::parse<JSON::Object>(jsonString));
 }