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:
leventov
2014-12-13 21:13:00 +07:00
parent ad22ea0bea
commit 4c0daf1169
@@ -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);