diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java index a5f11ecb..f7a2a727 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java @@ -240,16 +240,21 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { private void streamInit() throws IOException { stream.seek(0); - int soi = stream.readUnsignedShort(); - if (soi != JPEG.SOI) { - throw new IIOException(String.format("Not a JPEG stream (starts with: 0x%04x, expected SOI: 0x%04x)", soi, JPEG.SOI)); - } - else { + try { + int soi = stream.readUnsignedShort(); + + if (soi != JPEG.SOI) { + throw new IIOException(String.format("Not a JPEG stream (starts with: 0x%04x, expected SOI: 0x%04x)", soi, JPEG.SOI)); + } + segment = new Segment(soi, 0, 0, 2); segments.add(segment); currentSegment = segments.size() - 1; // 0 } + catch (EOFException eof) { + throw new IIOException(String.format("Not a JPEG stream (short stream. expected SOI: 0x%04x)", JPEG.SOI), eof); + } } static boolean isAppSegmentMarker(final int marker) { diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStreamTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStreamTest.java index f6af554b..2def2e06 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStreamTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStreamTest.java @@ -74,6 +74,24 @@ public class JPEGSegmentImageInputStreamTest { stream.read(); } + @Test(expected = IIOException.class) + public void testStreamNonJPEGArray() throws IOException { + ImageInputStream stream = new JPEGSegmentImageInputStream(ImageIO.createImageInputStream(new ByteArrayInputStream(new byte[] {42, 42, 0, 0, 77, 99}))); + stream.readFully(new byte[1]); + } + + @Test(expected = IIOException.class) + public void testStreamEmpty() throws IOException { + ImageInputStream stream = new JPEGSegmentImageInputStream(ImageIO.createImageInputStream(new ByteArrayInputStream(new byte[0]))); + stream.read(); + } + + @Test(expected = IIOException.class) + public void testStreamEmptyArray() throws IOException { + ImageInputStream stream = new JPEGSegmentImageInputStream(ImageIO.createImageInputStream(new ByteArrayInputStream(new byte[0]))); + stream.readFully(new byte[1]); + } + @Test public void testStreamRealData() throws IOException { ImageInputStream stream = new JPEGSegmentImageInputStream(ImageIO.createImageInputStream(getClassLoaderResource("/jpeg/invalid-icc-duplicate-sequence-numbers-rgb-internal-kodak-srgb-jfif.jpg")));