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 893935ed [IO-811] StreamIterator fails to close its internal Stream
893935ed is described below

commit 893935edde49e1c240dac6bb92c1504948ceb4a0
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Mon Oct 2 08:33:50 2023 -0400

    [IO-811] StreamIterator fails to close its internal Stream
    
    Test PR coming next
---
 src/changes/changes.xml                                 |  3 +++
 src/main/java/org/apache/commons/io/StreamIterator.java | 10 ++++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c3c893bf..b42898b0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -63,6 +63,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="fix" issue="IO-811" due-to="Adam Rauch, 
Gary Gregory">
         FileUtils.iterateFiles(File, String[], boolean) fails to close its 
internal Stream.
       </action>
+      <action dev="ggregory" type="fix" issue="IO-811" due-to="Adam Rauch, 
Gary Gregory">
+        StreamIterator fails to close its internal Stream.
+      </action>
     </release>
     <release version="2.14.0" date="2023-09-24" description="Java 8 is 
required.">
       <!-- FIX -->
diff --git a/src/main/java/org/apache/commons/io/StreamIterator.java 
b/src/main/java/org/apache/commons/io/StreamIterator.java
index eedcf706..0f7e7839 100644
--- a/src/main/java/org/apache/commons/io/StreamIterator.java
+++ b/src/main/java/org/apache/commons/io/StreamIterator.java
@@ -45,15 +45,16 @@ final class StreamIterator<E> implements Iterator<E>, 
Closeable {
      * @param stream The stream iterate.
      * @return A new iterator.
      */
-    @SuppressWarnings("resource") // Caller MUST close or iterate to the end.
     public static <T> Iterator<T> iterator(final Stream<T> stream) {
-        return new StreamIterator<>(stream).iterator;
+        return new StreamIterator<>(stream);
     }
 
     private final Iterator<E> iterator;
 
     private final Stream<E> stream;
 
+    private boolean closed;
+
     private StreamIterator(final Stream<E> stream) {
         this.stream = Objects.requireNonNull(stream, "stream");
         this.iterator = stream.iterator();
@@ -64,11 +65,16 @@ final class StreamIterator<E> implements Iterator<E>, 
Closeable {
      */
     @Override
     public void close() {
+        closed = true;
         stream.close();
     }
 
     @Override
     public boolean hasNext() {
+        if (closed) {
+            // Calling Iterator#hasNext() on a closed 
java.nio.file.FileTreeIterator causes an IllegalStateException.
+            return false;
+        }
         final boolean hasNext = iterator.hasNext();
         if (!hasNext) {
             close();

Reply via email to