From d6f32e4fc08031d4235a9209c745600bf070907b Mon Sep 17 00:00:00 2001 From: Sylvain Lebresne Date: Thu, 8 May 2014 18:03:08 +0200 Subject: [PATCH] Fix potential NumberFormatException when deserializing IntegerType patch by slebresne; reviewed by jbellis for CASSANDRA-7088 --- CHANGES.txt | 1 + src/java/org/apache/cassandra/db/marshal/AbstractType.java | 3 +-- .../apache/cassandra/serializers/InetAddressSerializer.java | 2 +- .../org/apache/cassandra/serializers/IntegerSerializer.java | 6 +++--- .../org/apache/cassandra/serializers/LongSerializer.java | 2 +- .../apache/cassandra/serializers/TimestampSerializer.java | 2 +- .../org/apache/cassandra/serializers/UUIDSerializer.java | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 0acf740241..a6cbc18092 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,7 @@ * return all cpu values from BackgroundActivityMonitor.readAndCompute (CASSANDRA-7183) * fix c* launch issues on Russian os's due to output of linux 'free' cmd (CASSANDRA-6162) * Fix disabling autocompaction (CASSANDRA-7187) + * Fix potential NumberFormatException when deserializing IntegerType (CASSANDRA-7088) 2.0.8 * Correctly delete scheduled range xfers (CASSANDRA-7143) diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index ffba9184bf..a38733c5ba 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -153,8 +153,7 @@ public abstract class AbstractType implements Comparator TypeSerializer serializer = getSerializer(); serializer.validate(bytes); - T value = serializer.deserialize(bytes); - return value == null ? "null" : serializer.toString(value); + return serializer.toString(serializer.deserialize(bytes)); } /** get a byte representation of the given string. */ diff --git a/src/java/org/apache/cassandra/serializers/InetAddressSerializer.java b/src/java/org/apache/cassandra/serializers/InetAddressSerializer.java index f5406f2d9f..3014753f30 100644 --- a/src/java/org/apache/cassandra/serializers/InetAddressSerializer.java +++ b/src/java/org/apache/cassandra/serializers/InetAddressSerializer.java @@ -65,7 +65,7 @@ public class InetAddressSerializer implements TypeSerializer public String toString(InetAddress value) { - return value.getHostAddress(); + return value == null ? "" : value.getHostAddress(); } public Class getType() diff --git a/src/java/org/apache/cassandra/serializers/IntegerSerializer.java b/src/java/org/apache/cassandra/serializers/IntegerSerializer.java index b028cd4458..9d9505da35 100644 --- a/src/java/org/apache/cassandra/serializers/IntegerSerializer.java +++ b/src/java/org/apache/cassandra/serializers/IntegerSerializer.java @@ -29,12 +29,12 @@ public class IntegerSerializer implements TypeSerializer public BigInteger deserialize(ByteBuffer bytes) { - return new BigInteger(ByteBufferUtil.getArray(bytes)); + return bytes.hasRemaining() ? new BigInteger(ByteBufferUtil.getArray(bytes)) : null; } public ByteBuffer serialize(BigInteger value) { - return ByteBuffer.wrap(value.toByteArray()); + return value == null ? ByteBufferUtil.EMPTY_BYTE_BUFFER : ByteBuffer.wrap(value.toByteArray()); } public void validate(ByteBuffer bytes) throws MarshalException @@ -44,7 +44,7 @@ public class IntegerSerializer implements TypeSerializer public String toString(BigInteger value) { - return value.toString(10); + return value == null ? "" : value.toString(10); } public Class getType() diff --git a/src/java/org/apache/cassandra/serializers/LongSerializer.java b/src/java/org/apache/cassandra/serializers/LongSerializer.java index 277c395227..e5ab43a631 100644 --- a/src/java/org/apache/cassandra/serializers/LongSerializer.java +++ b/src/java/org/apache/cassandra/serializers/LongSerializer.java @@ -44,7 +44,7 @@ public class LongSerializer implements TypeSerializer public String toString(Long value) { - return String.valueOf(value); + return value == null ? "" : String.valueOf(value); } public Class getType() diff --git a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java index 620342747c..f2a40f1316 100644 --- a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java +++ b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java @@ -72,7 +72,7 @@ public class TimestampSerializer implements TypeSerializer public String toString(Date value) { - return FORMATTER.get().format(value); + return value == null ? "" : FORMATTER.get().format(value); } public Class getType() diff --git a/src/java/org/apache/cassandra/serializers/UUIDSerializer.java b/src/java/org/apache/cassandra/serializers/UUIDSerializer.java index 0e64fcad0c..f8e2582ec9 100644 --- a/src/java/org/apache/cassandra/serializers/UUIDSerializer.java +++ b/src/java/org/apache/cassandra/serializers/UUIDSerializer.java @@ -46,7 +46,7 @@ public class UUIDSerializer implements TypeSerializer public String toString(UUID value) { - return value.toString(); + return value == null ? "" : value.toString(); } public Class getType()