You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2013/04/21 23:32:41 UTC

svn commit: r1470351 - in /commons/proper/io/trunk/src: main/java/org/apache/commons/io/input/CharSequenceInputStream.java test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java

Author: sebb
Date: Sun Apr 21 21:32:41 2013
New Revision: 1470351

URL: http://svn.apache.org/r1470351
Log:
IO-356 Fix infinite loop; check that buffer size is large enough to hold any character in the charset

Modified:
    commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java
    commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java

Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java?rev=1470351&r1=1470350&r2=1470351&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java (original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java Sun Apr 21 21:32:41 2013
@@ -55,12 +55,18 @@ public class CharSequenceInputStream ext
      * @param cs the input character sequence
      * @param charset the character set name to use
      * @param bufferSize the buffer size to use.
+     * @throws IllegalArgumentException if the buffer is not large enough to hold a complete character
      */
     public CharSequenceInputStream(final CharSequence cs, final Charset charset, final int bufferSize) {
         super();
         this.encoder = charset.newEncoder()
             .onMalformedInput(CodingErrorAction.REPLACE)
             .onUnmappableCharacter(CodingErrorAction.REPLACE);
+        // Ensure that buffer is long enough to hold a complete character
+        final float maxBytesPerChar = encoder.maxBytesPerChar();
+        if (bufferSize < maxBytesPerChar) {
+            throw new IllegalArgumentException("Buffer size " + bufferSize + " is less than maxBytesPerChar " + maxBytesPerChar);
+        }
         this.bbuf = ByteBuffer.allocate(bufferSize);
         this.bbuf.flip();
         this.cbuf = CharBuffer.wrap(cs);
@@ -73,6 +79,7 @@ public class CharSequenceInputStream ext
      * @param cs the input character sequence
      * @param charset the character set name to use
      * @param bufferSize the buffer size to use.
+     * @throws IllegalArgumentException if the buffer is not large enough to hold a complete character
      */
     public CharSequenceInputStream(final CharSequence cs, final String charset, final int bufferSize) {
         this(cs, Charset.forName(charset), bufferSize);
@@ -84,6 +91,7 @@ public class CharSequenceInputStream ext
      * 
      * @param cs the input character sequence
      * @param charset the character set name to use
+     * @throws IllegalArgumentException if the buffer is not large enough to hold a complete character
      */
     public CharSequenceInputStream(final CharSequence cs, final Charset charset) {
         this(cs, charset, BUFFER_SIZE);
@@ -95,6 +103,7 @@ public class CharSequenceInputStream ext
      * 
      * @param cs the input character sequence
      * @param charset the character set name to use
+     * @throws IllegalArgumentException if the buffer is not large enough to hold a complete character
      */
     public CharSequenceInputStream(final CharSequence cs, final String charset) {
         this(cs, charset, BUFFER_SIZE);
@@ -112,9 +121,6 @@ public class CharSequenceInputStream ext
         if (result.isError()) {
             result.throwException();
         }
-//        if (result.isUnderflow()) {
-//            result.throwException();
-//        }
         this.bbuf.flip();
     }
     

Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java
URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java?rev=1470351&r1=1470350&r2=1470351&view=diff
==============================================================================
--- commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java (original)
+++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java Sun Apr 21 21:32:41 2013
@@ -197,8 +197,8 @@ public class CharSequenceInputStreamTest
         testIO_356(10, 20, 0, "UTF-8");
     }
 
-    private void testIO_356_Loop(final String csName) throws Exception {
-        for (int bufferSize = 1; bufferSize <= 10; bufferSize++) {
+    private void testIO_356_Loop(final String csName, final int maxBytesPerChar) throws Exception {
+        for (int bufferSize = maxBytesPerChar; bufferSize <= 10; bufferSize++) {
             for (int dataSize = 1; dataSize <= 20; dataSize++) {
                 testIO_356(bufferSize, dataSize, 0, csName);
             }
@@ -206,16 +206,13 @@ public class CharSequenceInputStreamTest
     }
 
     @Test
-    @Ignore
-    // Infinite loop
     public void testIO_356_Loop_UTF16() throws Exception {
-        testIO_356_Loop("UTF-16");
+        testIO_356_Loop("UTF-16", 4);
     }
 
     @Test
-    @Ignore
     public void testIO_356_Loop_UTF8() throws Exception {
-        testIO_356_Loop("UTF-8");
+        testIO_356_Loop("UTF-8", 4);
     }
 
     @Test