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