On Fri, 15 Dec 2023 08:23:58 GMT, Markus KARG <d...@openjdk.org> wrote:
> Fixes JDK-8322141 > > As suggested by @vlsi and documented by @bplb this PR does not return, but > only sets the maximum result value. src/java.base/share/classes/java/io/SequenceInputStream.java line 249: > 247: transferred = Math.addExact(transferred, > in.transferTo(out)); > 248: } catch (ArithmeticException ignore) { > 249: transferred = Long.MAX_VALUE; Hello Markus, looking at this code, even with this change, I think we still have a bug here. Once the `transferred` becomes `Long.MAX_VALUE`, if there is a `nextStream()` available, then when we continue in this `while` loop, then this check: if (transferred < Long.MAX_VALUE) { will prevent it from transfering to the output stream, the next input stream's content and thus ignoring the next stream's content. I think what we might want here is something like: diff --git a/src/java.base/share/classes/java/io/SequenceInputStream.java b/src/java.base/share/classes/java/io/SequenceInputStream.java index de3fafc884d..b89d9ca80b0 100644 --- a/src/java.base/share/classes/java/io/SequenceInputStream.java +++ b/src/java.base/share/classes/java/io/SequenceInputStream.java @@ -242,11 +242,14 @@ public long transferTo(OutputStream out) throws IOException { if (getClass() == SequenceInputStream.class) { long transferred = 0; while (in != null) { + long numTransferred = in.transferTo(out); + // increment the total transferred byte count + // only if we haven't already reached the Long.MAX_VALUE if (transferred < Long.MAX_VALUE) { try { - transferred = Math.addExact(transferred, in.transferTo(out)); + transferred = Math.addExact(transferred, numTransferred); } catch (ArithmeticException ignore) { - return Long.MAX_VALUE; + transferred = Long.MAX_VALUE; } } nextStream(); (I haven't tested it) ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/17119#discussion_r1427766162