Repository: cassandra
Updated Branches:
  refs/heads/trunk 7ab241e96 -> 47886dff3


UnbufferedDataOutputstreamPlus.writeUTF fails for 0 length and > 8190 length 
strings

patch by Ariel Weisberg; reviewed by Robert Stupp for CASSANDRA-10203


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

Branch: refs/heads/trunk
Commit: 27bc7a5202761bcb8a12f7f7c7fba65ae1a19934
Parents: bc25ca1
Author: Ariel Weisberg <ariel.weisb...@datastax.com>
Authored: Thu Aug 27 00:52:03 2015 +0200
Committer: Robert Stupp <sn...@snazy.de>
Committed: Thu Aug 27 00:52:03 2015 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../io/util/UnbufferedDataOutputStreamPlus.java | 10 ++++-
 .../io/util/BufferedDataOutputStreamTest.java   | 44 ++++++++++++++++++++
 3 files changed, 53 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/27bc7a52/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index f9d9ae1..ea11489 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.1
+ * Fix broken UnbufferedDataOutputStreamPlus.writeUTF (CASSANDRA-10203)
  * (cqlsh) add CLEAR command (CASSANDRA-10086)
  * Support string literals as Role names for compatibility (CASSANDRA-10135)
  * Allow count(*) and count(1) to be use as normal aggregation 
(CASSANDRA-10114)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/27bc7a52/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java 
b/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
index d8036ff..10aefa6 100644
--- a/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
+++ b/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
@@ -23,7 +23,6 @@ import java.io.UTFDataFormatException;
 import java.nio.ByteBuffer;
 import java.nio.channels.WritableByteChannel;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.utils.memory.MemoryUtil;
 
 import com.google.common.base.Function;
@@ -38,6 +37,8 @@ import com.google.common.base.Function;
  */
 public abstract class UnbufferedDataOutputStreamPlus extends 
DataOutputStreamPlus
 {
+    private static final byte[] zeroBytes = new byte[2];
+
     protected UnbufferedDataOutputStreamPlus()
     {
         super();
@@ -253,6 +254,12 @@ public abstract class UnbufferedDataOutputStreamPlus 
extends DataOutputStreamPlu
     public static void writeUTF(String str, DataOutput out) throws IOException
     {
         int length = str.length();
+        if (length == 0)
+        {
+            out.write(zeroBytes);
+            return;
+        }
+
         int utfCount = 0;
         int maxSize = 2;
         for (int i = 0 ; i < length ; i++)
@@ -284,7 +291,6 @@ public abstract class UnbufferedDataOutputStreamPlus 
extends DataOutputStreamPlu
                 for (int i = firstIndex ; i < runLength; i++)
                     utfBytes[i] = (byte) str.charAt(offset + i);
                 out.write(utfBytes, 0, runLength);
-                offset += firstIndex;
                 firstIndex = 0;
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/27bc7a52/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java 
b/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
index d0819fe..ffe9cb9 100644
--- a/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
+++ b/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
@@ -1,6 +1,11 @@
 package org.apache.cassandra.io.util;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.UTFDataFormatException;
@@ -442,4 +447,43 @@ public class BufferedDataOutputStreamTest
         }
         return count;
     }
+
+    @Test
+    public void testWriteUTF() throws Exception
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutput dataOut = new DataOutputStream(baos);
+
+        StringBuilder sb = new StringBuilder(65535);
+        for (int ii = 0; ii < 1 << 16; ii++)
+        {
+            String s = sb.toString();
+            UnbufferedDataOutputStreamPlus.writeUTF(s, dataOut);
+            DataInput dataIn = new DataInputStream(new 
ByteArrayInputStream(baos.toByteArray()));
+            assertEquals(s, dataIn.readUTF());
+            baos.reset();
+            sb.append("a");
+        }
+    }
+
+    @Test
+    public void testWriteUTFBigChar() throws Exception
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        DataOutput dataOut = new DataOutputStream(baos);
+
+        StringBuilder sb = new StringBuilder(65535);
+        for (int ii = 0; ii < 1 << 15; ii++)
+        {
+            String s = sb.toString();
+            UnbufferedDataOutputStreamPlus.writeUTF(s, dataOut);
+            DataInput dataIn = new DataInputStream(new 
ByteArrayInputStream(baos.toByteArray()));
+            assertEquals(s, dataIn.readUTF());
+            baos.reset();
+            if (ii == (1 << 15) - 1)
+                sb.append("a");
+            else
+                sb.append(twoByte);
+        }
+    }
 }

Reply via email to