mirror of
https://github.com/OpenHFT/Chronicle-Map.git
synced 2021-09-13 01:26:12 +00:00
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
This commit is contained in:
+30
-21
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user