Description
The following failure was observed while loading PNG images:
java.lang.OutOfMemoryError: Java heap space
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.loadMip(PNGImageLoader2.java:539)
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.load(PNGImageLoader2.java:582)
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.load(PNGImageLoader2.java:659)
javafx.graphics/com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:366)
javafx.graphics/com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:274)
javafx.graphics/com.sun.javafx.tk.quantum.PrismImageLoader2.loadAll(PrismImageLoader2.java:142)
javafx.graphics/com.sun.javafx.tk.quantum.PrismImageLoader2.(PrismImageLoader2.java:77)
javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.loadImage(QuantumToolkit.java:752)
javafx.graphics/javafx.scene.image.Image.loadImage(Image.java:1060)
javafx.graphics/javafx.scene.image.Image.initialize(Image.java:799)
javafx.graphics/javafx.scene.image.Image.(Image.java:702)
In Method loadMip the "scanLineSize" is calculated with values from the input file, however an upper limit is not enforced before the array allocation:
private void loadMip(byte image[], InputStream data, int mip) throws IOException {
int mipWidth = mipSize(width, mip, starting_x, increment_x);
int mipHeight = mipSize(height, mip, starting_y, increment_y);
int scanLineSize = (mipWidth * bitDepth * numBandsPerColorType[colorType] + 7) / 8;
==> byte scanLine0[] = new byte[scanLineSize];
byte scanLine1[] = new byte[scanLineSize];
https://github.com/openjdk/jfx/blob/c6069d6845df4b90cca226e2b3dff49e3b48d8ac/modules/javafx.graphics/src/main/java/com/sun/javafx/iio/png/PNGImageLoader2.java#L538
java.lang.OutOfMemoryError: Java heap space
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.loadMip(PNGImageLoader2.java:539)
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.load(PNGImageLoader2.java:582)
javafx.graphics/com.sun.javafx.iio.png.PNGImageLoader2.load(PNGImageLoader2.java:659)
javafx.graphics/com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:366)
javafx.graphics/com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:274)
javafx.graphics/com.sun.javafx.tk.quantum.PrismImageLoader2.loadAll(PrismImageLoader2.java:142)
javafx.graphics/com.sun.javafx.tk.quantum.PrismImageLoader2.(PrismImageLoader2.java:77)
javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.loadImage(QuantumToolkit.java:752)
javafx.graphics/javafx.scene.image.Image.loadImage(Image.java:1060)
javafx.graphics/javafx.scene.image.Image.initialize(Image.java:799)
javafx.graphics/javafx.scene.image.Image.(Image.java:702)
In Method loadMip the "scanLineSize" is calculated with values from the input file, however an upper limit is not enforced before the array allocation:
private void loadMip(byte image[], InputStream data, int mip) throws IOException {
int mipWidth = mipSize(width, mip, starting_x, increment_x);
int mipHeight = mipSize(height, mip, starting_y, increment_y);
int scanLineSize = (mipWidth * bitDepth * numBandsPerColorType[colorType] + 7) / 8;
==> byte scanLine0[] = new byte[scanLineSize];
byte scanLine1[] = new byte[scanLineSize];
https://github.com/openjdk/jfx/blob/c6069d6845df4b90cca226e2b3dff49e3b48d8ac/modules/javafx.graphics/src/main/java/com/sun/javafx/iio/png/PNGImageLoader2.java#L538