You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/09/26 15:27:16 UTC

[commons-io] branch master updated: [IO-716] ReaderInputStream enter infinite loop for too small buffer sizes.

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f22162  [IO-716] ReaderInputStream enter infinite loop for too small buffer sizes.
5f22162 is described below

commit 5f22162d13b5d4972181491e6bd943b334e09cf7
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Sep 26 11:27:14 2021 -0400

    [IO-716] ReaderInputStream enter infinite loop for too small buffer
    sizes.
---
 src/changes/changes.xml                                 |  3 +++
 .../org/apache/commons/io/input/ReaderInputStream.java  | 17 ++++++++++++-----
 .../apache/commons/io/input/ReaderInputStreamTest.java  | 15 ++++++++++++++-
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index ff5fda0..da2dee0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -95,6 +95,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action issue="IO-717" dev="ggregory" type="fix" due-to="Marcono1234, Gary Gregory">
         Infinite loop in ReaderInputStream instead of throwing exception for CodingErrorAction.REPORT.
       </action>
+      <action issue="IO-716" dev="ggregory" type="fix" due-to="Marcono1234, Gary Gregory">
+        ReaderInputStream enter infinite loop for too small buffer sizes.
+      </action>
       <!-- ADD -->
       <action dev="ggregory" type="add" due-to="Gary Gregory">
         Add BrokenReader.INSTANCE.
diff --git a/src/main/java/org/apache/commons/io/input/ReaderInputStream.java b/src/main/java/org/apache/commons/io/input/ReaderInputStream.java
index 860043f..de20bcb 100644
--- a/src/main/java/org/apache/commons/io/input/ReaderInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/ReaderInputStream.java
@@ -86,7 +86,14 @@ import java.util.Objects;
 public class ReaderInputStream extends InputStream {
     private static final int DEFAULT_BUFFER_SIZE = 1024;
 
+    private static int checkBufferSize(int bufferSize) {
+        if (bufferSize < 2) {
+            throw new IllegalArgumentException("Buffer size < 2");
+        }
+        return bufferSize;
+    }
     private final Reader reader;
+
     private final CharsetEncoder encoder;
 
     /**
@@ -101,8 +108,8 @@ public class ReaderInputStream extends InputStream {
      * buffer provided by the caller.
      */
     private final ByteBuffer encoderOut;
-
     private CoderResult lastCoderResult;
+
     private boolean endOfInput;
 
     /**
@@ -131,9 +138,9 @@ public class ReaderInputStream extends InputStream {
     /**
      * Constructs a new {@link ReaderInputStream}.
      *
-     * @param reader the target {@link Reader}
-     * @param charset the charset encoding
-     * @param bufferSize the size of the input buffer in number of characters
+     * @param reader the target {@link Reader}.
+     * @param charset the charset encoding.
+     * @param bufferSize the size of the input buffer in number of characters.
      */
     public ReaderInputStream(final Reader reader, final Charset charset, final int bufferSize) {
         // @formatter:off
@@ -141,7 +148,7 @@ public class ReaderInputStream extends InputStream {
              charset.newEncoder()
                     .onMalformedInput(CodingErrorAction.REPLACE)
                     .onUnmappableCharacter(CodingErrorAction.REPLACE),
-             bufferSize);
+             checkBufferSize(bufferSize));
         // @formatter:on
     }
 
diff --git a/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java
index 0dbe868..5c985da 100644
--- a/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java
@@ -17,8 +17,8 @@
 package org.apache.commons.io.input;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.CharArrayReader;
 import java.io.IOException;
@@ -50,6 +50,19 @@ public class ReaderInputStreamTest {
 
     private final Random random = new Random();
 
+    @Test
+    public void testBufferTooSmall() throws IOException {
+        assertThrows(IllegalArgumentException.class, () -> new ReaderInputStream(new StringReader("\uD800"), StandardCharsets.UTF_8, 1));
+    }
+    
+    @Test
+    @Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
+    public void testBufferSmallest() throws IOException {
+        try (InputStream in = new ReaderInputStream(new StringReader("\uD800"), StandardCharsets.UTF_8, 2)) {
+            in.read();
+        }
+    }
+    
     /*
      * Tests https://issues.apache.org/jira/browse/IO-277
      */