From d31151d150dd510da9edb18fcabff5b3867de912 Mon Sep 17 00:00:00 2001
From: Christopher Dunn <cdunn2001@gmail.com>
Date: Thu, 5 Mar 2015 16:44:41 -0600
Subject: [PATCH 1/2] test get(key, default)

---
 src/lib_json/json_value.cpp | 2 +-
 src/test_lib_json/main.cpp  | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index 1ade74a..cefd05e 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -1037,7 +1037,7 @@ Value Value::get(char const* key, Value const& defaultValue) const
 }
 Value Value::get(std::string const& key, Value const& defaultValue) const
 {
-  return get(key.c_str(), defaultValue);
+  return get(key.data(), key.data() + key.length(), defaultValue);
 }
 
 
diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp
index 25a334b..a52cc78 100644
--- a/src/test_lib_json/main.cpp
+++ b/src/test_lib_json/main.cpp
@@ -1578,6 +1578,7 @@ JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
     JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
     JSONTEST_ASSERT(!root.isMember("hi"));
     JSONTEST_ASSERT(root.isMember(binary));
+    JSONTEST_ASSERT_STRING_EQUAL("there", root.get(binary, Json::Value::nullRef).asString());
     Json::Value removed;
     bool did;
     did = root.removeMember(binary.data(), binary.data() + binary.length(),
@@ -1588,6 +1589,8 @@ JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
         &removed);
     JSONTEST_ASSERT(!did);
     JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
+    JSONTEST_ASSERT(!root.isMember(binary));
+    JSONTEST_ASSERT_STRING_EQUAL("", root.get(binary, Json::Value::nullRef).asString());
   }
 }
 

From 0fd2875a44818c5d1f381846e3077640ffd7d9a1 Mon Sep 17 00:00:00 2001
From: Christopher Dunn <cdunn2001@gmail.com>
Date: Thu, 5 Mar 2015 16:38:43 -0600
Subject: [PATCH 2/2] fix get() for embedded zeroes in key

This method had been overlooked.
---
 include/json/value.h        | 4 ++++
 src/lib_json/json_value.cpp | 6 +++---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/json/value.h b/include/json/value.h
index 443f446..cf9703b 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -404,15 +404,19 @@ Json::Value obj_value(Json::objectValue); // {}
   const Value& operator[](const CppTL::ConstString& key) const;
 #endif
   /// Return the member named key if it exist, defaultValue otherwise.
+  /// \note deep copy
   Value get(const char* key, const Value& defaultValue) const;
   /// Return the member named key if it exist, defaultValue otherwise.
+  /// \note deep copy
   /// \param key may contain embedded nulls.
   Value get(const char* key, const char* end, const Value& defaultValue) const;
   /// Return the member named key if it exist, defaultValue otherwise.
+  /// \note deep copy
   /// \param key may contain embedded nulls.
   Value get(const std::string& key, const Value& defaultValue) const;
 #ifdef JSON_USE_CPPTL
   /// Return the member named key if it exist, defaultValue otherwise.
+  /// \note deep copy
   Value get(const CppTL::ConstString& key, const Value& defaultValue) const;
 #endif
   /// Most general and efficient version of isMember()const, get()const,
diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index cefd05e..6d68002 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -1028,8 +1028,8 @@ Value& Value::append(const Value& value) { return (*this)[size()] = value; }
 
 Value Value::get(char const* key, char const* end, Value const& defaultValue) const
 {
-  const Value* value = &((*this)[key]);
-  return value == &nullRef ? defaultValue : *value;
+  Value const* found = find(key, end);
+  return !found ? defaultValue : *found;
 }
 Value Value::get(char const* key, Value const& defaultValue) const
 {
@@ -1104,7 +1104,7 @@ bool Value::removeIndex(ArrayIndex index, Value* removed) {
 #ifdef JSON_USE_CPPTL
 Value Value::get(const CppTL::ConstString& key,
                  const Value& defaultValue) const {
-  return get(key.c_str(), defaultValue);
+  return get(key.c_str(), key.end_c_str(), defaultValue);
 }
 #endif