Repository: cassandra
Updated Branches:
  refs/heads/trunk fc9c6faa2 -> babf30dd1


Avoid NPE when serializing ErrorMessage with null msg

Patch by Tyler Hobbs; reviewed by Carl Yeksigian for CASSANDRA-11167


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

Branch: refs/heads/trunk
Commit: 50095947e25f630ce48ee24d10ff3e1f3fd91183
Parents: c8c8cf6
Author: Tyler Hobbs <tylerlho...@gmail.com>
Authored: Tue Feb 23 11:28:17 2016 -0600
Committer: Tyler Hobbs <tylerlho...@gmail.com>
Committed: Tue Feb 23 11:28:17 2016 -0600

----------------------------------------------------------------------
 CHANGES.txt                                       |  1 +
 .../transport/messages/ErrorMessage.java          |  6 ++++--
 .../cassandra/transport/ProtocolErrorTest.java    | 18 ++++++++++++++++++
 3 files changed, 23 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/50095947/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 767eb8a..01e7b3d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.6
+ * Avoid NPE when serializing ErrorMessage with null message (CASSANDRA-11167)
  * Replacing an aggregate with a new version doesn't reset INITCOND 
(CASSANDRA-10840)
  * (cqlsh) cqlsh cannot be called through symlink (CASSANDRA-11037)
  * fix ohc and java-driver pom dependencies in build.xml (CASSANDRA-10793)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/50095947/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java 
b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
index 222e833..021db5a 100644
--- a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
@@ -151,7 +151,8 @@ public class ErrorMessage extends Message.Response
         {
             final TransportException err = 
getBackwardsCompatibleException(msg, version);
             dest.writeInt(err.code().value);
-            CBUtil.writeString(err.getMessage(), dest);
+            String errorString = err.getMessage() == null ? "" : 
err.getMessage();
+            CBUtil.writeString(errorString, dest);
 
             switch (err.code())
             {
@@ -212,7 +213,8 @@ public class ErrorMessage extends Message.Response
         public int encodedSize(ErrorMessage msg, int version)
         {
             final TransportException err = 
getBackwardsCompatibleException(msg, version);
-            int size = 4 + CBUtil.sizeOfString(err.getMessage());
+            String errorString = err.getMessage() == null ? "" : 
err.getMessage();
+            int size = 4 + CBUtil.sizeOfString(errorString);
             switch (err.code())
             {
                 case UNAVAILABLE:

http://git-wip-us.apache.org/repos/asf/cassandra/blob/50095947/test/unit/org/apache/cassandra/transport/ProtocolErrorTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/transport/ProtocolErrorTest.java 
b/test/unit/org/apache/cassandra/transport/ProtocolErrorTest.java
index 11b0ebd..fc8c41c 100644
--- a/test/unit/org/apache/cassandra/transport/ProtocolErrorTest.java
+++ b/test/unit/org/apache/cassandra/transport/ProtocolErrorTest.java
@@ -113,4 +113,22 @@ public class ProtocolErrorTest {
             Assert.assertTrue(e.getMessage().contains("Request is too big"));
         }
     }
+
+    @Test
+    public void testErrorMessageWithNullString() throws Exception
+    {
+        // test for CASSANDRA-11167
+        ErrorMessage msg = ErrorMessage.fromException(new ServerError((String) 
null));
+        assert msg.toString().endsWith("null") : msg.toString();
+        int size = ErrorMessage.codec.encodedSize(msg, Server.CURRENT_VERSION);
+        ByteBuf buf = Unpooled.buffer(size);
+        ErrorMessage.codec.encode(msg, buf, Server.CURRENT_VERSION);
+
+        ByteBuf expected = Unpooled.wrappedBuffer(new byte[]{
+                0x00, 0x00, 0x00, 0x00,  // int error code
+                0x00, 0x00               // short message length
+        });
+
+        Assert.assertEquals(expected, buf);
+    }
 }

Reply via email to