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); } }