summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/amazon/carbonado/raw/DataDecoder.java11
-rw-r--r--src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java5
-rw-r--r--src/main/java/com/amazon/carbonado/raw/KeyDecoder.java10
3 files changed, 17 insertions, 9 deletions
diff --git a/src/main/java/com/amazon/carbonado/raw/DataDecoder.java b/src/main/java/com/amazon/carbonado/raw/DataDecoder.java
index 407df0c..11fa4c7 100644
--- a/src/main/java/com/amazon/carbonado/raw/DataDecoder.java
+++ b/src/main/java/com/amazon/carbonado/raw/DataDecoder.java
@@ -648,7 +648,7 @@ public class DataDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * DataEncoder#encodeSingle}.
+ * DataEncoder#encodeSingle}. Always returns a new byte array instance.
*
* @param prefixPadding amount of extra bytes to skip from start of encoded byte array
* @param suffixPadding amount of extra bytes to skip at end of encoded byte array
@@ -662,7 +662,8 @@ public class DataDecoder {
return EMPTY_BYTE_ARRAY;
}
if (prefixPadding <= 0 && suffixPadding <= 0) {
- return src;
+ // Always return a new byte array instance
+ return src.clone();
}
byte[] dst = new byte[length];
System.arraycopy(src, prefixPadding, dst, 0, length);
@@ -674,7 +675,8 @@ public class DataDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * DataEncoder#encodeSingleNullable}.
+ * DataEncoder#encodeSingleNullable}. Always returns a new byte array
+ * instance.
*/
public static byte[] decodeSingleNullable(byte[] src) throws CorruptEncodingException {
return decodeSingleNullable(src, 0, 0);
@@ -682,7 +684,8 @@ public class DataDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * DataEncoder#encodeSingleNullable}.
+ * DataEncoder#encodeSingleNullable}. Always returns a new byte array
+ * instance.
*
* @param prefixPadding amount of extra bytes to skip from start of encoded byte array
* @param suffixPadding amount of extra bytes to skip at end of encoded byte array
diff --git a/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java b/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java
index b7356d7..dcc8d45 100644
--- a/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java
+++ b/src/main/java/com/amazon/carbonado/raw/GenericEncodingStrategy.java
@@ -1906,7 +1906,10 @@ public class GenericEncodingStrategy<S extends Storable> {
a.invokeStatic(DataDecoder.class.getName(), "decodeSingle",
byteArrayType, params);
} else {
- // Just store raw property value.
+ // Always clone the byte array as some implementations
+ // reuse the byte array (e.g. iterating using a cursor).
+ a.invokeVirtual(TypeDesc.OBJECT, "clone", TypeDesc.OBJECT, null);
+ a.checkCast(byteArrayType);
}
storePropertyValue(a, info, useWriteMethods, instanceVar, adapterInstanceClass);
diff --git a/src/main/java/com/amazon/carbonado/raw/KeyDecoder.java b/src/main/java/com/amazon/carbonado/raw/KeyDecoder.java
index a14a1a3..01fb627 100644
--- a/src/main/java/com/amazon/carbonado/raw/KeyDecoder.java
+++ b/src/main/java/com/amazon/carbonado/raw/KeyDecoder.java
@@ -830,7 +830,7 @@ public class KeyDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * KeyEncoder#encodeSingleDesc}.
+ * KeyEncoder#encodeSingleDesc}. Always returns a new byte array instance.
*/
public static byte[] decodeSingleDesc(byte[] src) throws CorruptEncodingException {
return decodeSingleDesc(src, 0, 0);
@@ -838,7 +838,7 @@ public class KeyDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * KeyEncoder#encodeSingleDesc}.
+ * KeyEncoder#encodeSingleDesc}. Always returns a new byte array instance.
*
* @param prefixPadding amount of extra bytes to skip from start of encoded byte array
* @param suffixPadding amount of extra bytes to skip at end of encoded byte array
@@ -863,7 +863,8 @@ public class KeyDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * KeyEncoder#encodeSingleNullableDesc}.
+ * KeyEncoder#encodeSingleNullableDesc}. Always returns a new byte array
+ * instance.
*/
public static byte[] decodeSingleNullableDesc(byte[] src) throws CorruptEncodingException {
return decodeSingleNullableDesc(src, 0, 0);
@@ -871,7 +872,8 @@ public class KeyDecoder {
/**
* Decodes the given byte array which was encoded by {@link
- * KeyEncoder#encodeSingleNullableDesc}.
+ * KeyEncoder#encodeSingleNullableDesc}. Always returns a new byte array
+ * instance.
*
* @param prefixPadding amount of extra bytes to skip from start of encoded byte array
* @param suffixPadding amount of extra bytes to skip at end of encoded byte array