Fix [JACKSON-803] for 1.9[.6]
diff --git a/src/smile/java/org/codehaus/jackson/smile/SmileParser.java b/src/smile/java/org/codehaus/jackson/smile/SmileParser.java
index 0f95a8a..0d2c4bb 100644
--- a/src/smile/java/org/codehaus/jackson/smile/SmileParser.java
+++ b/src/smile/java/org/codehaus/jackson/smile/SmileParser.java
@@ -1557,24 +1557,36 @@
int q = 0;
while (true) {
+ if (_inputPtr >= _inputEnd) {
+ loadMoreGuaranteed();
+ }
byte b = inBuf[_inputPtr++];
if (BYTE_MARKER_END_OF_STRING == b) {
bytes = 0;
break;
}
q = ((int) b) & 0xFF;
+ if (_inputPtr >= _inputEnd) {
+ loadMoreGuaranteed();
+ }
b = inBuf[_inputPtr++];
if (BYTE_MARKER_END_OF_STRING == b) {
bytes = 1;
break;
}
q = (q << 8) | (b & 0xFF);
+ if (_inputPtr >= _inputEnd) {
+ loadMoreGuaranteed();
+ }
b = inBuf[_inputPtr++];
if (BYTE_MARKER_END_OF_STRING == b) {
bytes = 2;
break;
}
q = (q << 8) | (b & 0xFF);
+ if (_inputPtr >= _inputEnd) {
+ loadMoreGuaranteed();
+ }
b = inBuf[_inputPtr++];
if (BYTE_MARKER_END_OF_STRING == b) {
bytes = 3;
diff --git a/src/test/org/codehaus/jackson/smile/SmileTestBase.java b/src/test/org/codehaus/jackson/smile/SmileTestBase.java
index 9b018ea..cc0e870 100644
--- a/src/test/org/codehaus/jackson/smile/SmileTestBase.java
+++ b/src/test/org/codehaus/jackson/smile/SmileTestBase.java
@@ -1,7 +1,6 @@
package org.codehaus.jackson.smile;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+import java.io.*;
import org.junit.Assert;
@@ -29,17 +28,33 @@
return _smileParser(input, false);
}
+ protected SmileParser _smileParser(InputStream input) throws IOException {
+ return _smileParser(input, false);
+ }
+
protected SmileParser _smileParser(byte[] input, boolean requireHeader) throws IOException
{
SmileFactory f = smileFactory(requireHeader, false, false);
return _smileParser(f, input);
}
+ protected SmileParser _smileParser(InputStream input, boolean requireHeader) throws IOException
+ {
+ SmileFactory f = smileFactory(requireHeader, false, false);
+ return _smileParser(f, input);
+ }
+
protected SmileParser _smileParser(SmileFactory f, byte[] input)
throws IOException
{
return f.createJsonParser(input);
}
+
+ protected SmileParser _smileParser(SmileFactory f, InputStream input)
+ throws IOException
+ {
+ return f.createJsonParser(input);
+ }
protected SmileFactory smileFactory(boolean requireHeader,
boolean writeHeader, boolean writeEndMarker)
diff --git a/src/test/org/codehaus/jackson/smile/TestSmileParserNames.java b/src/test/org/codehaus/jackson/smile/TestSmileParserNames.java
new file mode 100644
index 0000000..d26aaab
--- /dev/null
+++ b/src/test/org/codehaus/jackson/smile/TestSmileParserNames.java
@@ -0,0 +1,66 @@
+package org.codehaus.jackson.smile;
+
+import java.io.*;
+import java.util.Random;
+
+import org.codehaus.jackson.*;
+
+public class TestSmileParserNames extends SmileTestBase
+{
+ public void testLongNames() throws IOException
+ {
+ _testWithName(generateName(5000));
+ }
+
+ public void testJsonBinForLargeObjects() throws Exception
+ {
+ StringBuilder nameBuf = new StringBuilder("longString");
+ int minLength = 9000;
+ for (int i = 1; nameBuf.length() < minLength; ++i) {
+ nameBuf.append("." + i);
+ }
+ String name = nameBuf.toString();
+ _testWithName(name);
+ }
+
+ /*
+ /**********************************************************
+ /* Helper methods
+ /**********************************************************
+ */
+
+ private void _testWithName(String name) throws IOException
+ {
+ byte[] data = _smileDoc("{"+quote(name)+":13}");
+ // important: MUST use InputStream to enforce buffer boundaries!
+ SmileParser p = _smileParser(new ByteArrayInputStream(data));
+ assertNull(p.getCurrentToken());
+ assertToken(JsonToken.START_OBJECT, p.nextToken());
+ assertToken(JsonToken.FIELD_NAME, p.nextToken());
+ assertEquals(name, p.getCurrentName());
+ assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
+ assertEquals(13, p.getIntValue());
+ assertEquals(name, p.getCurrentName());
+ assertToken(JsonToken.END_OBJECT, p.nextToken());
+ assertNull(p.nextToken());
+ p.close();
+ }
+
+
+ private String generateName(int minLen)
+ {
+ StringBuilder sb = new StringBuilder();
+ Random rnd = new Random(123);
+ while (sb.length() < minLen) {
+ int ch = rnd.nextInt(96);
+ if (ch < 32) { // ascii (single byte)
+ sb.append((char) (48 + ch));
+ } else if (ch < 64) { // 2 byte
+ sb.append((char) (128 + ch));
+ } else { // 3 byte
+ sb.append((char) (4000 + ch));
+ }
+ }
+ return sb.toString();
+ }
+}