You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bb...@apache.org on 2019/01/11 21:08:09 UTC

[geode-native] branch develop updated: GEODE-5962: Fix putAll crash with null values (#408)

This is an automated email from the ASF dual-hosted git repository.

bbender pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new 8be03f1  GEODE-5962: Fix putAll crash with null values (#408)
8be03f1 is described below

commit 8be03f13b37d17c7b59e33d255b8144ead5db45f
Author: Michael Martell <mm...@pivotal.io>
AuthorDate: Fri Jan 11 13:08:05 2019 -0800

    GEODE-5962: Fix putAll crash with null values (#408)
    
    - Add nullValue test
    - Update the test to catch the cache server exception.
    - Add TcrMessage:: scope to PUT_DATA_ERROR
    - Replace try/catch in test with EXPECT_THROW
    
    Co-authored-by: Mike Martell <mm...@pivotal.io>
    Co-authored-by: Blake Bender <bb...@pivotal.io>
    Co-authored-by: Michael Oleske <mo...@pivotal.io>
---
 cppcache/integration/test/RegionPutGetAllTest.cpp | 26 +++++++++++++++++++++++
 cppcache/src/TcrMessage.cpp                       | 20 ++++++++++++++++-
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/cppcache/integration/test/RegionPutGetAllTest.cpp b/cppcache/integration/test/RegionPutGetAllTest.cpp
index 16ca0e7..910566d 100644
--- a/cppcache/integration/test/RegionPutGetAllTest.cpp
+++ b/cppcache/integration/test/RegionPutGetAllTest.cpp
@@ -37,6 +37,7 @@ namespace {
 
 using apache::geode::client::Cache;
 using apache::geode::client::CacheableInt32;
+using apache::geode::client::CacheServerException;
 using apache::geode::client::HashMapOfCacheable;
 using apache::geode::client::Region;
 using apache::geode::client::RegionShortcut;
@@ -198,4 +199,29 @@ TEST(RegionPutGetAllTest, variousPdxTypes) {
   assert_eq(putAllMap, getAllMap);
 }
 
+TEST(RegionPutGetAllTest, nullValue) {
+  Cluster cluster{LocatorCount{1}, ServerCount{2}};
+  cluster.getGfsh()
+      .create()
+      .region()
+      .withName("region")
+      .withType("REPLICATE")
+      .execute();
+
+  auto cache = cluster.createCache();
+  auto region = setupRegion(cache);
+
+  setupPdxTypes(cache);
+
+  HashMapOfCacheable map;
+
+  // Add a null value
+  map.emplace(CacheableInt32::create(PdxTypesHelper1::index),
+              std::shared_ptr<PdxTypesHelper1::type>());
+
+  auto keys = to_keys(map);
+
+  ASSERT_THROW(region->putAll(map), CacheServerException);
+}
+
 }  // namespace
diff --git a/cppcache/src/TcrMessage.cpp b/cppcache/src/TcrMessage.cpp
index 81f69d8..eb9ba29 100644
--- a/cppcache/src/TcrMessage.cpp
+++ b/cppcache/src/TcrMessage.cpp
@@ -54,6 +54,8 @@ namespace {
 uint32_t g_headerLen = 17;
 }  // namespace
 
+extern void setThreadLocalExceptionMessage(const char*);
+
 // AtomicInc TcrMessage::m_transactionId = 0;
 uint8_t* TcrMessage::m_keepalive = nullptr;
 const int TcrMessage::m_flag_empty = 0x01;
@@ -839,12 +841,28 @@ void TcrMessage::processChunk(const uint8_t* bytes, int32_t len,
       }
       break;
     }
+    case TcrMessage::PUT_DATA_ERROR: {
+      chunkSecurityHeader(1, bytes, len, isLastChunkAndisSecurityHeader);
+      if (nullptr != bytes) {
+        auto input =
+            m_tcdm->getConnectionManager().getCacheImpl()->createDataInput(
+                bytes, len);
+        auto errorString = readStringPart(input);
+
+        if (!errorString.empty()) {
+          setThreadLocalExceptionMessage(errorString.c_str());
+        }
+
+        _GEODE_SAFE_DELETE_ARRAY(bytes);
+      }
+      break;
+    }
     case TcrMessage::GET_ALL_DATA_ERROR: {
       chunkSecurityHeader(1, bytes, len, isLastChunkAndisSecurityHeader);
       if (bytes != nullptr) {
         _GEODE_SAFE_DELETE_ARRAY(bytes);
       }
-      // nothing else to done since this will be taken care of at higher level
+
       break;
     }
     default: {