From 4c0daf11694227c676f36fddab9feb1b171988fd Mon Sep 17 00:00:00 2001 From: leventov Date: Sat, 13 Dec 2014 21:13:00 +0700 Subject: [PATCH] JLANG-39 fixed bug in DataValueBytesMarshallers -- should zero out possible gaps in CharSequence fields, because if there is garbage in them, it could affect hashing results --- .../internal/DataValueBytesMarshallers.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java b/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java index 3cf898023..1128424d7 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/internal/DataValueBytesMarshallers.java @@ -311,23 +311,17 @@ public final class DataValueBytesMarshallers { if (model.isArray()) { read.append(" for (int i = 0; i < ") .append(model.indexSize().value()).append("; i++) {\n"); - if (CharSequence.class.isAssignableFrom(type)) - read.append(" long pos = bytes.position();\n"); + saveCharSequencePosition(read, type); read.append(" toReuse.").append(defaultSetter.getName()) .append("(i, bytes.read").append(bytesType(type)).append("());\n"); - if (CharSequence.class.isAssignableFrom(type)) - read.append(" bytes.position(pos + ") - .append(fieldSize(model)).append(");\n"); + updateCharSequencePosition(read, model, type); read.append(" }\n"); } else { read.append(" {\n"); - if (CharSequence.class.isAssignableFrom(type)) - read.append(" long pos = bytes.position();\n"); + saveCharSequencePosition(read, type); read.append(" toReuse.").append(defaultSetter.getName()) .append("(bytes.read").append(bytesType(type)).append("());\n"); - if (CharSequence.class.isAssignableFrom(type)) - read.append(" bytes.position(pos + ") - .append(fieldSize(model)).append(");\n"); + updateCharSequencePosition(read, model, type); read.append(" }\n"); } } @@ -335,6 +329,13 @@ public final class DataValueBytesMarshallers { return read; } + private static void updateCharSequencePosition(StringBuilder read, FieldModel model, + Class type) { + if (CharSequence.class.isAssignableFrom(type)) + read.append(" bytes.position(pos + ") + .append(fieldSize(model)).append(");\n"); + } + private static String generateBytesWriter(Class tClass) { DataValueModel dvModel = DataValueModels.acquireModel(tClass); @@ -449,24 +450,17 @@ public final class DataValueBytesMarshallers { if (model.isArray()) { write.append(" for (int i = 0; i < ") .append(model.indexSize().value()).append("; i++) {\n"); - if (CharSequence.class.isAssignableFrom(type)) - write.append(" long pos = bytes.position();\n"); + saveCharSequencePosition(write, type); write.append(" bytes.write").append(bytesType(type)) .append("(e.").append(defaultGetter.getName()).append("(i));\n"); - if (CharSequence.class.isAssignableFrom(type)) - write.append(" bytes.position(pos + ") - .append(fieldSize(model)).append(");\n"); - + zeroOutRemainingCharSequenceBytesAndUpdatePosition(write, model, type); write.append(" }\n"); } else { write.append(" {\n"); - if (CharSequence.class.isAssignableFrom(type)) - write.append(" long pos = bytes.position();\n"); + saveCharSequencePosition(write, type); write.append(" bytes.write").append(bytesType(type)) .append("(e.").append(defaultGetter.getName()).append("());\n"); - if (CharSequence.class.isAssignableFrom(type)) - write.append(" bytes.position(pos + ") - .append(fieldSize(model)).append(");\n"); + zeroOutRemainingCharSequenceBytesAndUpdatePosition(write, model, type); write.append(" }\n"); } } @@ -474,6 +468,21 @@ public final class DataValueBytesMarshallers { return write.toString(); } + private static void saveCharSequencePosition(StringBuilder write, Class type) { + if (CharSequence.class.isAssignableFrom(type)) + write.append(" long pos = bytes.position();\n"); + } + + private static void zeroOutRemainingCharSequenceBytesAndUpdatePosition( + StringBuilder write, FieldModel model, Class type) { + if (CharSequence.class.isAssignableFrom(type)) { + write.append(" long newPos = pos + ").append(fieldSize(model)) + .append(";\n"); + write.append(" bytes.zeroOut(bytes.position(), newPos);\n"); + write.append(" bytes.position(newPos);\n"); + } + } + private static void generateRead(StringBuilder read, StringBuilder sb, String simpleName, Class cl) { appendOverride(sb);