8078891: java.io.SequenceInputStream.close is not atomic and not idempotent

Brian Burkhalter brian.burkhalter at oracle.com
Thu Jul 25 20:01:54 UTC 2019


Hi Pavel,

> On Jul 25, 2019, at 12:43 PM, Pavel Rappo <pavel.rappo at 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



More information about the core-libs-dev mailing list