You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/02/05 20:38:36 UTC

svn commit: r1067490 - in /cassandra/branches/cassandra-0.7: src/java/org/apache/cassandra/cli/ src/java/org/apache/cassandra/db/ src/java/org/apache/cassandra/db/marshal/ src/java/org/apache/cassandra/dht/ src/java/org/apache/cassandra/utils/ test/uni...

Author: jbellis
Date: Sat Feb  5 19:38:35 2011
New Revision: 1067490

URL: http://svn.apache.org/viewvc?rev=1067490&view=rev
Log:
Make BBU.string validate input for the desired Charset
patch by jbellis; reviewed by slebresne for CASSANDRA-2091

Modified:
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/HintedHandOffManager.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
    cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/FBUtilities.java
    cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/TableTest.java
    cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/cli/CliClient.java Sat Feb  5 19:38:35 2011
@@ -19,6 +19,7 @@ package org.apache.cassandra.cli;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.util.*;
 
 import com.google.common.base.Charsets;
@@ -936,7 +937,7 @@ public class CliClient extends CliUserHe
     }
 
     private void executeList(Tree statement)
-        throws TException, InvalidRequestException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, UnavailableException, TimedOutException
+            throws TException, InvalidRequestException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, UnavailableException, TimedOutException, CharacterCodingException
     {
         if (!CliMain.isConnected() || !hasKeySpace())
             return;
@@ -1896,7 +1897,7 @@ public class CliClient extends CliUserHe
      * @throws NoSuchFieldException - column not found
      */
     private void printSliceList(CfDef columnFamilyDef, List<KeySlice> slices)
-            throws NotFoundException, TException, IllegalAccessException, InstantiationException, NoSuchFieldException
+            throws NotFoundException, TException, IllegalAccessException, InstantiationException, NoSuchFieldException, CharacterCodingException
     {
         AbstractType validator;
         String columnFamilyName = columnFamilyDef.getName();

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/HintedHandOffManager.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/HintedHandOffManager.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/HintedHandOffManager.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/HintedHandOffManager.java Sat Feb  5 19:38:35 2011
@@ -23,6 +23,7 @@ import java.lang.management.ManagementFa
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeoutException;
@@ -229,12 +230,17 @@ public class HintedHandOffManager implem
         int index = ByteBufferUtil.lastIndexOf(joined, SEPARATOR.getBytes()[0], joined.limit());
 
         if (index == -1 || index < (joined.position() + 1))
-            throw new RuntimeException("Corrupted hint name " + ByteBufferUtil.string(joined));
+            throw new RuntimeException("Corrupted hint name " + ByteBufferUtil.bytesToHex(joined));
 
-        return new String[] {
-                                ByteBufferUtil.string(joined, joined.position(), index - joined.position()),
-                                ByteBufferUtil.string(joined, index + 1, joined.limit() - (index + 1))
-                            };
+        try
+        {
+            return new String[] { ByteBufferUtil.string(joined, joined.position(), index - joined.position()),
+                                  ByteBufferUtil.string(joined, index + 1, joined.limit() - (index + 1)) };
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new RuntimeException(e);
+        }
     }
 
     private int waitForSchemaAgreement(InetAddress endpoint) throws InterruptedException

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/AsciiType.java Sat Feb  5 19:38:35 2011
@@ -22,6 +22,7 @@ package org.apache.cassandra.db.marshal;
 
 
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 
 import com.google.common.base.Charsets;
 
@@ -36,7 +37,14 @@ public class AsciiType extends BytesType
     @Override
     public String getString(ByteBuffer bytes)
     {
-        return ByteBufferUtil.string(bytes, Charsets.US_ASCII);
+        try
+        {
+            return ByteBufferUtil.string(bytes, Charsets.US_ASCII);
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new MarshalException("Invalid ascii bytes " + ByteBufferUtil.bytesToHex(bytes));
+        }
     }
 
     public ByteBuffer fromString(String source)

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/db/marshal/UTF8Type.java Sat Feb  5 19:38:35 2011
@@ -22,12 +22,10 @@ package org.apache.cassandra.db.marshal;
 
 import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
-import java.util.Arrays;
 
 import com.google.common.base.Charsets;
 
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
 
 public class UTF8Type extends BytesType
 {
@@ -39,11 +37,11 @@ public class UTF8Type extends BytesType
     {
         try
         {
-            return FBUtilities.decodeToUTF8(bytes);
+            return ByteBufferUtil.string(bytes, Charsets.UTF_8);
         }
         catch (CharacterCodingException e)
         {
-            throw new MarshalException("invalid UTF8 bytes " + ByteBufferUtil.string(bytes));
+            throw new MarshalException("invalid UTF8 bytes " + ByteBufferUtil.bytesToHex(bytes));
         }
     }
 

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java Sat Feb  5 19:38:35 2011
@@ -25,7 +25,9 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-import org.apache.cassandra.utils.FBUtilities;
+import com.google.common.base.Charsets;
+
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 public class CollatingOrderPreservingPartitioner extends AbstractByteOrderedPartitioner
 {
@@ -39,7 +41,7 @@ public class CollatingOrderPreservingPar
         String skey;
         try
         {
-            skey = FBUtilities.decodeToUTF8(key);
+            skey = ByteBufferUtil.string(key, Charsets.UTF_8);
         }
         catch (CharacterCodingException e)
         {

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java Sat Feb  5 19:38:35 2011
@@ -123,7 +123,14 @@ public class OrderPreservingPartitioner 
 
         public Token<String> fromByteArray(ByteBuffer bytes)
         {
-            return new StringToken(ByteBufferUtil.string(bytes, Charsets.UTF_8));
+            try
+            {
+                return new StringToken(ByteBufferUtil.string(bytes, Charsets.UTF_8));
+            }
+            catch (CharacterCodingException e)
+            {
+                throw new RuntimeException(e);
+            }
         }
 
         public String toString(Token<String> stringToken)
@@ -152,7 +159,7 @@ public class OrderPreservingPartitioner 
         String skey;
         try
         {
-            skey = FBUtilities.decodeToUTF8(key);
+            skey = ByteBufferUtil.string(key, Charsets.UTF_8);
         }
         catch (CharacterCodingException e)
         {

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/dht/RandomPartitioner.java Sat Feb  5 19:38:35 2011
@@ -21,6 +21,7 @@ package org.apache.cassandra.dht;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.util.*;
 
 import org.apache.cassandra.db.DecoratedKey;
@@ -61,7 +62,15 @@ public class RandomPartitioner implement
         assert splitPoint != -1;
 
         // and decode the token and key
-        String token = ByteBufferUtil.string(fromdisk, fromdisk.position(), splitPoint - fromdisk.position(), UTF_8);
+        String token = null;
+        try
+        {
+            token = ByteBufferUtil.string(fromdisk, fromdisk.position(), splitPoint - fromdisk.position(), UTF_8);
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new RuntimeException(e);
+        }
         ByteBuffer key = fromdisk.duplicate();
         key.position(splitPoint + 1);
         return new DecoratedKey<BigIntegerToken>(new BigIntegerToken(token), key);

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/ByteBufferUtil.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/ByteBufferUtil.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/ByteBufferUtil.java Sat Feb  5 19:38:35 2011
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.nio.charset.Charset;
 import java.util.Arrays;
 
@@ -100,28 +101,27 @@ public class ByteBufferUtil
         return compareUnsigned(o1, ByteBuffer.wrap(o2));
     }
 
-    public static String string(ByteBuffer buffer)
+    public static String string(ByteBuffer buffer) throws CharacterCodingException
     {
         return string(buffer, Charset.defaultCharset());
     }
 
-    public static String string(ByteBuffer buffer, Charset charset)
+    public static String string(ByteBuffer buffer, int offset, int length) throws CharacterCodingException
     {
-        return string(buffer, buffer.position(), buffer.remaining(), charset);
+        return string(buffer, offset, length, Charset.defaultCharset());
     }
 
-    public static String string(ByteBuffer buffer, int offset, int length)
+    public static String string(ByteBuffer buffer, int offset, int length, Charset charset) throws CharacterCodingException
     {
-        return string(buffer, offset, length, Charset.defaultCharset());
+        ByteBuffer copy = buffer.duplicate();
+        copy.position(buffer.position() + offset);
+        copy.limit(copy.position() + length);
+        return string(buffer, charset);
     }
 
-    public static String string(ByteBuffer buffer, int offset, int length, Charset charset)
+    public static String string(ByteBuffer buffer, Charset charset) throws CharacterCodingException
     {
-        if (buffer.hasArray())
-            return new String(buffer.array(), buffer.arrayOffset() + offset, length, charset);
-
-        byte[] buff = getArray(buffer, offset, length);
-        return new String(buff, charset);
+        return charset.newDecoder().decode(buffer.duplicate()).toString();
     }
 
     /**

Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/FBUtilities.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/utils/FBUtilities.java Sat Feb  5 19:38:35 2011
@@ -398,11 +398,6 @@ public class FBUtilities
         return utflen;
     }
 
-    public static String decodeToUTF8(ByteBuffer bytes) throws CharacterCodingException
-    {
-        return Charsets.UTF_8.newDecoder().decode(bytes.duplicate()).toString();
-    }
-
     public static ByteBuffer toByteBuffer(long n)
     {
         byte[] bytes = new byte[8];

Modified: cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/TableTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/TableTest.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/TableTest.java (original)
+++ cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/db/TableTest.java Sat Feb  5 19:38:35 2011
@@ -19,6 +19,7 @@
 package org.apache.cassandra.db;
 
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.*;
@@ -511,7 +512,14 @@ public class TableTest extends CleanupHe
         List<String> L = new ArrayList<String>();
         for (IColumn column : columns)
         {
-            L.add(ByteBufferUtil.string(column.name()));
+            try
+            {
+                L.add(ByteBufferUtil.string(column.name()));
+            }
+            catch (CharacterCodingException e)
+            {
+                throw new AssertionError(e);
+            }
         }
 
         List<String> names = new ArrayList<String>(columnNames.length);

Modified: cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java?rev=1067490&r1=1067489&r2=1067490&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java (original)
+++ cassandra/branches/cassandra-0.7/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java Sat Feb  5 19:38:35 2011
@@ -26,6 +26,7 @@ import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.util.Arrays;
 
+import com.google.common.base.Charsets;
 import org.junit.Test;
 
 public class FBUtilitiesTest 
@@ -89,6 +90,6 @@ public class FBUtilitiesTest 
     public void testDecode() throws IOException
     {
         ByteBuffer bytes = ByteBuffer.wrap(new byte[]{(byte)0xff, (byte)0xfe});
-        FBUtilities.decodeToUTF8(bytes);
+        ByteBufferUtil.string(bytes, Charsets.UTF_8);
     } 
 }