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 9ee10865..87dd6004 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 @@ -101,8 +101,18 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { segments.add(segment); } else { - int length = stream.readUnsignedShort(); // Length including length field itself - segment = new Segment(marker, realPosition, segment.end(), 2 + length); + long length; + + if (marker == JPEG.SOS) { + // Treat rest of stream as a single segment (scanning for EOI is too much work) + length = Long.MAX_VALUE - realPosition; + } + else { + // Length including length field itself + length = stream.readUnsignedShort() + 2; + } + + segment = new Segment(marker, realPosition, segment.end(), length); segments.add(segment); } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index f9c1a61d..6fa34246 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -276,6 +276,22 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase