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