JDK-8193372 : "BufferedImage ImageIO.read(File input)" fails, throwing ArrayIndexOutOfBoundsException exception
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.imageio
  • Affected Version: 8,9,10
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2017-12-08
  • Updated: 2018-01-10
  • Resolved: 2018-01-10
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11
11Resolved
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.17.10.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Ubuntu 17.10

A DESCRIPTION OF THE PROBLEM :
For certain inputs, ImageIO read fails:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.ArrayList.elementData(ArrayList.java:422)
	at java.util.ArrayList.get(ArrayList.java:435)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:378)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:492)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:613)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1070)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1050)
	at javax.imageio.ImageIO.read(ImageIO.java:1448)
	at javax.imageio.ImageIO.read(ImageIO.java:1308)
	at image_io_write.Main.main(Main.java:17)



STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Create a file with the following binary input (hexdump output):
d8ff d8d8 d8d8 d8d8 d8d8 d8d8 d8d8 d8d8
d8d8 d8d8 d8d8 d8d8 d8d8 d8d8 d8d8 d8d8
d8d8 d8d8 d8d8 d8d8 d8d8 d8d8 7fd8 ffff

Execute the following code, where "file" is a File object, with its content described above:

BufferedImage img = null;
try {
    img = ImageIO.read(file);
} catch (IOException e) {
} 

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
read should fail by returning null, or by throwing an IOException, as described in the official documentation.
ACTUAL -
fails, throwing ArrayIndexOutOfBoundsException exception

ERROR MESSAGES/STACK TRACES THAT OCCUR :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.ArrayList.elementData(ArrayList.java:422)
	at java.util.ArrayList.get(ArrayList.java:435)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:378)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:492)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:613)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1070)
	at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1050)
	at javax.imageio.ImageIO.read(ImageIO.java:1448)
	at javax.imageio.ImageIO.read(ImageIO.java:1308)
	at image_io_write.Main.main(Main.java:17)

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
byte[] bytes = {(byte)0xFF,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0x7F,(byte)0xFF,(byte)0xFF};
    	
    	File file = new File("testfile");    	
    	FileOutputStream fos;
		try {
			fos = new FileOutputStream(file);

	    	fos.write(bytes);
	    	fos.flush();
	    	fos.close();
	    	

	    	BufferedImage img = null;
	    	try {
	    	    img = ImageIO.read(file);
	    	} catch (IOException e) {
	    	}
	    	System.out.println(img);
	    	
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
---------- END SOURCE ----------


Comments
Changes present in JDK-8191073 resolved this issue also. Root cause is same for both the issues.
10-01-2018

Easy way to reproduce the IndexOutOfBoundsException is to use byte stream directly like : Begin Source: import java.io.ByteArrayInputStream; import java.io.IOException; import javax.imageio.ImageIO; public class EasyReproduceTest { public static void main(String[] args) throws IOException { byte[] input = {(byte)0xFF,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8, (byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0xD8,(byte)0x7F,(byte)0xFF, (byte)0xFF}; ImageIO.read(new ByteArrayInputStream(input)); } } End Source
13-12-2017

I tried reproducing this issue in latest JDK10 using the Main.java and using testfile as testfile.txt input. But i got IndexOutOfBoundsException and not ArrayIndexOutOfBoundsException as follows : Exception in thread "main" java.lang.IndexOutOfBoundsException: Index -1 out-of-bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:372) at java.base/java.util.ArrayList.get(ArrayList.java:440) at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:378) at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:493) at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:716) at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1173) at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1153) at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1468) at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1315) at Main.main(Main.java:16) [~pardesha] Could you please clarify the same from your side or am i reproducing it wrong way?
13-12-2017

Reported with: OpenJDK 8u151 Linux Ubuntu 17.10 Checked this with Oracle JDK binaries and could confirm the issue as reported with test created using binary input provided in the description. Results: ======= 7u80: FAIL 8: FAIL 8u151: FAIL 9: FAIL 9.0.1: FAIL 10: FAIL To verify, run the attached test case with respective JDK versions. Run with JDK 8u151: ======================== >java Main Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.ArrayList.elementData(ArrayList.java:422) at java.util.ArrayList.get(ArrayList.java:435) at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:378) at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:492) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:613) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1070) at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1050) at javax.imageio.ImageIO.read(ImageIO.java:1448) at javax.imageio.ImageIO.read(ImageIO.java:1308) at Main.main(Main.java:15) ===========================
12-12-2017