-
Bug
-
Resolution: Fixed
-
P2
-
19
-
b11
-
Not verified
The following program crashes with a java.io.EOFException after the fix for JDK-8281962 (Avoid unnecessary native calls in InflaterInputStream). Is this an expected result of that change, or a potential regression?
The repro creates an InflaterInputStream for the included byte array. Reading the entire stream using readAllBytes works, and I think the input is well-formed.
Reading the first 128 bytes, and then doing a second read, causes a crash.
$ java B
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.base/java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:245)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
at B.main(B.java:29)
===
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
import static java.nio.charset.StandardCharsets.UTF_8;
public class B {
public static void main(String[] args) throws IOException {
byte[] bytes = {
85, -115, 49, 14, -125, 48, 12, 0, -9, -68, 2, 49, -63, 98, -87, 93, 89, 90, -47, -103, 14,
-99, 58, -102, 96, 5, -89, 36, -74, -120, -123, -44, -33, -61, 8, -21, -23, 78, -9, 120, -113,
-111, -68, -15, 70, -3, -128, -119, -102, -6, -11, 29, 62, 79, -27, -70, 117, -118, -2, -121,
-127, 42, 47, 9, -126, 72, 88, 8, 80, -75, -64, -12, -49, -104, -40, 8, -74, 27, -108, 25, 87,
-102, 14, -50, -99, 115, -100, 84, 86, 59, -5, -15, 46, 99, -12, -128, 57, -117, -95, -79,
-28, 2, -41, -33, 81, -19,
};
// using readAllBytes succeeds, the underlying gzip data seems to be well-formed
byte[] inflated =
new InflaterInputStream(new ByteArrayInputStream(bytes), new Inflater(/*nowrap=*/ true))
.readAllBytes();
// a 128 byte read followed by a 512 byte read fails afterJDK-8281962
InflaterInputStream is =
new InflaterInputStream(new ByteArrayInputStream(bytes), new Inflater(/*nowrap=*/ true));
byte[] buf = new byte[512];
is.read(buf, 0, 128);
is.read(buf, 0, 512); // Unexpected end of ZLIB input stream
}
}
===
The repro creates an InflaterInputStream for the included byte array. Reading the entire stream using readAllBytes works, and I think the input is well-formed.
Reading the first 128 bytes, and then doing a second read, causes a crash.
$ java B
Exception in thread "main" java.io.EOFException: Unexpected end of ZLIB input stream
at java.base/java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:245)
at java.base/java.util.zip.InflaterInputStream.read(InflaterInputStream.java:159)
at B.main(B.java:29)
===
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
import static java.nio.charset.StandardCharsets.UTF_8;
public class B {
public static void main(String[] args) throws IOException {
byte[] bytes = {
85, -115, 49, 14, -125, 48, 12, 0, -9, -68, 2, 49, -63, 98, -87, 93, 89, 90, -47, -103, 14,
-99, 58, -102, 96, 5, -89, 36, -74, -120, -123, -44, -33, -61, 8, -21, -23, 78, -9, 120, -113,
-111, -68, -15, 70, -3, -128, -119, -102, -6, -11, 29, 62, 79, -27, -70, 117, -118, -2, -121,
-127, 42, 47, 9, -126, 72, 88, 8, 80, -75, -64, -12, -49, -104, -40, 8, -74, 27, -108, 25, 87,
-102, 14, -50, -99, 115, -100, 84, 86, 59, -5, -15, 46, 99, -12, -128, 57, -117, -95, -79,
-28, 2, -41, -33, 81, -19,
};
// using readAllBytes succeeds, the underlying gzip data seems to be well-formed
byte[] inflated =
new InflaterInputStream(new ByteArrayInputStream(bytes), new Inflater(/*nowrap=*/ true))
.readAllBytes();
// a 128 byte read followed by a 512 byte read fails after
InflaterInputStream is =
new InflaterInputStream(new ByteArrayInputStream(bytes), new Inflater(/*nowrap=*/ true));
byte[] buf = new byte[512];
is.read(buf, 0, 128);
is.read(buf, 0, 512); // Unexpected end of ZLIB input stream
}
}
===
- relates to
-
JDK-8292427 Improve specification of InflaterInputStream.fill()
- Resolved
-
JDK-8292487 Back out the fix forJDK-8281962 from jdk19u
- Closed
-
JDK-8281962 Avoid unnecessary native calls in InflaterInputStream
- Resolved