TMI-105: Handle (ignore) empty JFIF segment without throwing EOFException.
@ -560,11 +560,13 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
switch (adobeDCT.getTransform()) {
|
switch (adobeDCT.getTransform()) {
|
||||||
case AdobeDCTSegment.YCC:
|
case AdobeDCTSegment.YCC:
|
||||||
if (startOfFrame.components.length != 3) {
|
if (startOfFrame.components.length != 3) {
|
||||||
|
// This probably means the Adobe marker is bogus
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return JPEGColorSpace.YCbCr;
|
return JPEGColorSpace.YCbCr;
|
||||||
case AdobeDCTSegment.YCCK:
|
case AdobeDCTSegment.YCCK:
|
||||||
if (startOfFrame.components.length != 4) {
|
if (startOfFrame.components.length != 4) {
|
||||||
|
// This probably means the Adobe marker is bogus
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return JPEGColorSpace.YCCK;
|
return JPEGColorSpace.YCCK;
|
||||||
@ -789,7 +791,13 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
if (!jfif.isEmpty()) {
|
if (!jfif.isEmpty()) {
|
||||||
JPEGSegment segment = jfif.get(0);
|
JPEGSegment segment = jfif.get(0);
|
||||||
return JFIFSegment.read(segment.data());
|
|
||||||
|
if (segment.length() >= 9) {
|
||||||
|
return JFIFSegment.read(segment.data());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
processWarningOccurred("Bogus JFIF segment, ignoring");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@ -800,7 +808,12 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
if (!jfxx.isEmpty()) {
|
if (!jfxx.isEmpty()) {
|
||||||
JPEGSegment segment = jfxx.get(0);
|
JPEGSegment segment = jfxx.get(0);
|
||||||
return JFXXSegment.read(segment.data(), segment.length());
|
if (segment.length() >= 1) {
|
||||||
|
return JFXXSegment.read(segment.data(), segment.length());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
processWarningOccurred("Bogus JFXX segment, ignoring");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -88,7 +88,8 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
new TestData(getClassLoaderResource("/jpeg/cmyk-sample-multiple-chunk-icc.jpg"), new Dimension(2707, 3804)),
|
new TestData(getClassLoaderResource("/jpeg/cmyk-sample-multiple-chunk-icc.jpg"), new Dimension(2707, 3804)),
|
||||||
new TestData(getClassLoaderResource("/jpeg/jfif-jfxx-thumbnail-olympus-d320l.jpg"), new Dimension(640, 480)),
|
new TestData(getClassLoaderResource("/jpeg/jfif-jfxx-thumbnail-olympus-d320l.jpg"), new Dimension(640, 480)),
|
||||||
new TestData(getClassLoaderResource("/jpeg/jfif-padded-segments.jpg"), new Dimension(20, 45)),
|
new TestData(getClassLoaderResource("/jpeg/jfif-padded-segments.jpg"), new Dimension(20, 45)),
|
||||||
new TestData(getClassLoaderResource("/jpeg/0x00-to-0xFF-between-segments.jpg"), new Dimension(16, 16))
|
new TestData(getClassLoaderResource("/jpeg/0x00-to-0xFF-between-segments.jpg"), new Dimension(16, 16)),
|
||||||
|
new TestData(getClassLoaderResource("/jpeg/jfif-bogus-empty-jfif-segment.jpg"), new Dimension(942, 714))
|
||||||
);
|
);
|
||||||
|
|
||||||
// More test data in specific tests below
|
// More test data in specific tests below
|
||||||
@ -96,9 +97,9 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
|
|
||||||
protected List<TestData> getBrokenTestData() {
|
protected List<TestData> getBrokenTestData() {
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
new TestData(getClassLoaderResource("/jpeg/broken-bogus-segment-length.jpg"), new Dimension(467, 612)),
|
new TestData(getClassLoaderResource("/broken-jpeg/broken-bogus-segment-length.jpg"), new Dimension(467, 612)),
|
||||||
new TestData(getClassLoaderResource("/jpeg/broken-adobe-marker-bad-length.jpg"), new Dimension(1800, 1200)),
|
new TestData(getClassLoaderResource("/broken-jpeg/broken-adobe-marker-bad-length.jpg"), new Dimension(1800, 1200)),
|
||||||
new TestData(getClassLoaderResource("/jpeg/broken-invalid-adobe-ycc-gray.jpg"), new Dimension(11, 440))
|
new TestData(getClassLoaderResource("/broken-jpeg/broken-invalid-adobe-ycc-gray.jpg"), new Dimension(11, 440))
|
||||||
);
|
);
|
||||||
|
|
||||||
// More test data in specific tests below
|
// More test data in specific tests below
|
||||||
@ -493,7 +494,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
JPEGImageReader reader = createReader();
|
JPEGImageReader reader = createReader();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/jpeg/broken-bogus-segment-length.jpg")));
|
reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/broken-jpeg/broken-bogus-segment-length.jpg")));
|
||||||
|
|
||||||
assertEquals(467, reader.getWidth(0));
|
assertEquals(467, reader.getWidth(0));
|
||||||
assertEquals(612, reader.getHeight(0));
|
assertEquals(612, reader.getHeight(0));
|
||||||
@ -509,9 +510,9 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
}
|
}
|
||||||
catch (IOException e) {
|
catch (IOException e) {
|
||||||
// Even if we get an exception here, the image should contain 10-15% of the image
|
// Even if we get an exception here, the image should contain 10-15% of the image
|
||||||
assertEquals(0xffffffff, image.getRGB(0, 0)); // white area
|
assertRGBEquals(0xffffffff, image.getRGB(0, 0)); // white area
|
||||||
assertEquals(0xff0000ff, image.getRGB(67, 22)); // blue area
|
assertRGBEquals(0xff0000ff, image.getRGB(67, 22)); // blue area
|
||||||
assertEquals(0xffff00ff, image.getRGB(83, 22)); // purple area
|
assertRGBEquals(0xffff00ff, image.getRGB(83, 22)); // purple area
|
||||||
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 228 KiB |
Before Width: | Height: | Size: 687 B After Width: | Height: | Size: 687 B |
After Width: | Height: | Size: 102 KiB |