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 2010/07/01 03:24:35 UTC

svn commit: r959483 - in /cassandra/trunk: src/java/org/apache/cassandra/dht/ src/java/org/apache/cassandra/utils/ test/unit/org/apache/cassandra/utils/

Author: jbellis
Date: Thu Jul  1 01:24:35 2010
New Revision: 959483

URL: http://svn.apache.org/viewvc?rev=959483&view=rev
Log:
validate UTF8 keys in legacy OPP and COPP.  patch by Nick Bailey; reviewed by Stu Hood and jbellis

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
    cassandra/trunk/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java?rev=959483&r1=959482&r2=959483&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/CollatingOrderPreservingPartitioner.java Thu Jul  1 01:24:35 2010
@@ -19,6 +19,7 @@
 package org.apache.cassandra.dht;
 
 import java.math.BigInteger;
+import java.nio.charset.CharacterCodingException;
 import java.text.Collator;
 import java.util.Arrays;
 import java.util.Comparator;
@@ -39,7 +40,16 @@ public class CollatingOrderPreservingPar
     {
         if (key.length == 0)
             return MINIMUM;
-        String skey = new String(key, FBUtilities.UTF8);
+
+        String skey;
+        try
+        {
+            skey = FBUtilities.decodeToUTF8(key);
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new RuntimeException("The provided key was not UTF8 encoded.", e);
+        }
         return new BytesToken(collator.getCollationKey(skey).toByteArray());
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java?rev=959483&r1=959482&r2=959483&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java Thu Jul  1 01:24:35 2010
@@ -20,6 +20,7 @@ package org.apache.cassandra.dht;
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigInteger;
+import java.nio.charset.CharacterCodingException;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Random;
@@ -163,6 +164,15 @@ public class OrderPreservingPartitioner 
 
     public StringToken getToken(byte[] key)
     {
-        return new StringToken(new String(key, FBUtilities.UTF8));
+        String skey;
+        try
+        {
+            skey = FBUtilities.decodeToUTF8(key);
+        }
+        catch (CharacterCodingException e)
+        {
+            throw new RuntimeException("The provided key was not UTF8 encoded.", e);
+        }
+        return new StringToken(skey);
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=959483&r1=959482&r2=959483&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Thu Jul  1 01:24:35 2010
@@ -27,7 +27,9 @@ import java.net.InetAddress;
 import java.net.URL;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
 import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
 import java.security.MessageDigest;
 import java.util.Arrays;
 import java.util.Collections;
@@ -37,6 +39,7 @@ import java.util.concurrent.atomic.Atomi
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
+import com.google.common.base.Charsets;
 import org.apache.commons.collections.iterators.CollatingIterator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,6 +66,7 @@ public class FBUtilities
     private static volatile InetAddress localInetAddress_;
 
     public static final int MAX_UNSIGNED_SHORT = 0xFFFF;
+    public static final CharsetDecoder utf8Decoder = Charsets.UTF_8.newDecoder();
 
     public static Charset UTF8;
     static
@@ -480,6 +484,11 @@ public class FBUtilities
         return utflen;
     }
 
+    public static String decodeToUTF8(byte[] bytes) throws CharacterCodingException
+    {
+        return utf8Decoder.decode(ByteBuffer.wrap(bytes)).toString();
+    }
+
     /**
      * Test if a particular bit is set using a bit mask.
      *

Modified: cassandra/trunk/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java?rev=959483&r1=959482&r2=959483&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java Thu Jul  1 01:24:35 2010
@@ -21,6 +21,8 @@ package org.apache.cassandra.utils;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
+import java.io.IOException;
+import java.nio.charset.CharacterCodingException;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.cassandra.db.IClock;
@@ -80,4 +82,11 @@ public class FBUtilitiesTest 
         FBUtilities.atomicSetMax(atomicClock, new TimestampClock(3L));
         assert ((TimestampClock)atomicClock.get()).timestamp() == 9L;
     } 
+
+    @Test(expected=CharacterCodingException.class)
+    public void testDecode() throws IOException
+    {
+        byte[] bytes = new byte[]{(byte)0xff, (byte)0xfe};
+        FBUtilities.decodeToUTF8(bytes);
+    } 
 }