Hi Pavel,

> On Jul 25, 2019, at 12:43 PM, Pavel Rappo <pavel.ra...@oracle.com> wrote:
> 
> Thanks a lot for picking up a bug I filled back in 2015. This looks like a 
> good
> cleanup!

Thanks for looking at it.

> I'm a bit concerned though with the added `finally` block in L98. Could that
> lead to a subtle behavioral change for (an unlikely) case where a `read` 
> method
> exhausts the current stream, then tries to close it, fails (`close` throws
> IOException) and then jumps over to the next stream instead of staying on the
> current one?
> 
> Previously, `read` would be tripping over a closed stream forever.

This concern would be fixed by changing the proposed patch as

--- a/src/java.base/share/classes/java/io/SequenceInputStream.java
+++ b/src/java.base/share/classes/java/io/SequenceInputStream.java
@@ -91,13 +91,10 @@
      * Continues reading in the next stream if an EOF is reached.
      */
     final void nextStream() throws IOException {
-        try {
-            if (in != null) {
-                in.close();
-            }
-        } finally {
-            peekNextStream();
+        if (in != null) {
+            in.close();
         }
+        peekNextStream();
     }
 
     private void peekNextStream() {
@@ -233,6 +230,7 @@
                 } else {
                     ioe.addSuppressed(e);
                 }
+                peekNextStream();
             }
         } while (in != null);
         if (ioe != null) {

That is to say reverting the nextStream() change and adding peekNextStream() in 
the catch branch of close(). I actually had it this way in a version I did not 
post.

The scenario you suggest however would seem to be somewhat of a coding error by 
the caller. I would think that once a sequence stream were created the 
component streams should not be used.

> Theoretically speaking, we might have a case of a "non-sticky" error in the
> InputStream. Try to read, fail, try to read again -- you might get lucky.

Thanks,

Brian

Reply via email to