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();
+    }
+}