Skip to content

Commit 752ccdf

Browse files
committed
Fix bugs in msgpack-jackson3
- MessagePackParser.unpackString: use UTF-8 for short strings (<=64 bytes) to match the long-string path; platform default charset was used before - MessagePackGenerator.writeNumber(String): try BigInteger before Double to avoid precision loss for large integer strings - MessagePackGenerator.writeString(Reader, int): handle len=-1 (unknown length) by reading until EOF instead of throwing NegativeArraySizeException
1 parent bbc4de9 commit 752ccdf

3 files changed

Lines changed: 30 additions & 17 deletions

File tree

msgpack-jackson3/src/main/java/org/msgpack/jackson/dataformat/MessagePackGenerator.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -598,16 +598,29 @@ public JsonGenerator writeString(char[] text, int offset, int len) throws Jackso
598598
public JsonGenerator writeString(Reader reader, int len) throws JacksonException
599599
{
600600
try {
601-
char[] buf = new char[len];
602-
int totalRead = 0;
603-
while (totalRead < len) {
604-
int read = reader.read(buf, totalRead, len - totalRead);
605-
if (read < 0) {
606-
break;
601+
if (len < 0) {
602+
StringBuilder sb = new StringBuilder();
603+
char[] tmpBuf = new char[1024];
604+
int read;
605+
while ((read = reader.read(tmpBuf)) >= 0) {
606+
sb.append(tmpBuf, 0, read);
607607
}
608-
totalRead += read;
608+
char[] chars = new char[sb.length()];
609+
sb.getChars(0, chars.length, chars, 0);
610+
writeCharArrayTextValue(chars, 0, chars.length);
611+
}
612+
else {
613+
char[] buf = new char[len];
614+
int totalRead = 0;
615+
while (totalRead < len) {
616+
int read = reader.read(buf, totalRead, len - totalRead);
617+
if (read < 0) {
618+
break;
619+
}
620+
totalRead += read;
621+
}
622+
writeCharArrayTextValue(buf, 0, totalRead);
609623
}
610-
writeCharArrayTextValue(buf, 0, totalRead);
611624
}
612625
catch (IOException e) {
613626
throw _wrapIOFailure(e);
@@ -797,16 +810,16 @@ public JsonGenerator writeNumber(String encodedValue) throws JacksonException
797810
}
798811

799812
try {
800-
double d = Double.parseDouble(encodedValue);
801-
addValueNode(d);
813+
BigInteger bi = new BigInteger(encodedValue);
814+
addValueNode(bi);
802815
return this;
803816
}
804817
catch (NumberFormatException ignored) {
805818
}
806819

807820
try {
808-
BigInteger bi = new BigInteger(encodedValue);
809-
addValueNode(bi);
821+
double d = Double.parseDouble(encodedValue);
822+
addValueNode(d);
810823
return this;
811824
}
812825
catch (NumberFormatException ignored) {

msgpack-jackson3/src/main/java/org/msgpack/jackson/dataformat/MessagePackParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private String unpackString(MessageUnpacker messageUnpacker) throws IOException
143143
int strLen = messageUnpacker.unpackRawStringHeader();
144144
if (strLen <= tempBytes.length) {
145145
messageUnpacker.readPayload(tempBytes, 0, strLen);
146-
return new String(tempBytes, 0, strLen);
146+
return new String(tempBytes, 0, strLen, StandardCharsets.UTF_8);
147147
}
148148
else {
149149
byte[] bytes = messageUnpacker.readPayload(strLen);

msgpack-jackson3/src/test/java/org/msgpack/jackson/dataformat/MessagePackGeneratorTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -881,8 +881,8 @@ public void serializeStringAsBigDecimal()
881881

882882
BigDecimal bd = BigDecimal.valueOf(Long.MAX_VALUE).add(BigDecimal.ONE);
883883
assertThat(
884-
MessagePack.newDefaultUnpacker(objectMapper.writeValueAsBytes(bd)).unpackDouble(),
885-
is(bd.doubleValue()));
884+
MessagePack.newDefaultUnpacker(objectMapper.writeValueAsBytes(bd)).unpackBigInteger(),
885+
is(bd.toBigIntegerExact()));
886886
}
887887

888888
public static class BigIntegerSerializerStoringAsString
@@ -906,8 +906,8 @@ public void serializeStringAsBigInteger()
906906

907907
BigInteger bi = BigInteger.valueOf(Long.MAX_VALUE).add(BigInteger.ONE);
908908
assertThat(
909-
MessagePack.newDefaultUnpacker(objectMapper.writeValueAsBytes(bi)).unpackDouble(),
910-
is(bi.doubleValue()));
909+
MessagePack.newDefaultUnpacker(objectMapper.writeValueAsBytes(bi)).unpackBigInteger(),
910+
is(bi));
911911
}
912912

913913
@Test

0 commit comments

Comments
 (0)