TMI-107: JPEGSegmentImageInputStream now recovers from EOFException while parsing segments.

This commit is contained in:
Harald Kuhr 2015-03-07 21:41:38 +01:00
parent 34efe84e5a
commit 2b2dd2fb40
3 changed files with 44 additions and 6 deletions

View File

@ -74,7 +74,9 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
if (streamPos >= segment.end()) {
// Go forward in cache
while (++currentSegment < segments.size()) {
int cachedSegment = currentSegment;
while (++cachedSegment < segments.size()) {
currentSegment = cachedSegment;
segment = segments.get(currentSegment);
if (streamPos >= segment.start && streamPos < segment.end()) {
@ -157,7 +159,9 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
}
else if (streamPos < segment.start) {
// Go back in cache
while (--currentSegment >= 0) {
int cachedSegment = currentSegment;
while (--cachedSegment >= 0) {
currentSegment = cachedSegment;
segment = segments.get(currentSegment);
if (streamPos >= segment.start && streamPos < segment.end()) {

View File

@ -417,19 +417,52 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
@Ignore("Known issue in com.sun...JPEGMetadata")
@Test
public void testExifStandardMetadataColorSpaceTypeYCbCr() {
// These reports RGB (by Exif non-presence?), while the data is really YCbCr
// These reports RGB in standard metadata, while the data is really YCbCr
fail("/jpeg/exif-jpeg-thumbnail-sony-dsc-p150-inverted-colors.jpg");
fail("/jpeg/exif-pspro-13-inverted-colors.jpg");
fail("/jpeg/no-jfif-ycbcr.jpg");
}
@Test
public void testBrokenReadRasterAfterGetMetadataException() throws IOException {
// See issue 107, from PDFBox team
JPEGImageReader reader = createReader();
try {
for (TestData broken : getBrokenTestData()) {
reader.setInput(broken.getInputStream());
try {
reader.getImageMetadata(0);
}
catch (IOException ignore) {
// Expected IOException here, due to broken file
// ignore.printStackTrace();
}
try {
reader.readRaster(0, null);
}
catch (IOException expected) {
// Should not throw anything other than IOException here
if (!(expected instanceof EOFException)) {
assertNotNull(expected.getMessage());
}
}
}
}
finally {
reader.dispose();
}
}
@Test
public void testBrokenRead() throws IOException {
JPEGImageReader reader = createReader();
try {
for (TestData broken : getBrokenTestData()) {
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
reader.setInput(broken.getInputStream());
try {
reader.read(0);
@ -455,7 +488,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
try {
for (TestData broken : getBrokenTestData()) {
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
reader.setInput(broken.getInputStream());
Dimension exptectedSize = broken.getDimension(0);
@ -484,7 +517,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
try {
for (TestData broken : getBrokenTestData()) {
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
reader.setInput(broken.getInputStream());
try {
reader.getImageMetadata(0);

View File

@ -56,6 +56,7 @@ import static org.junit.Assert.*;
public class JPEGSegmentImageInputStreamTest {
static {
IIORegistry.getDefaultInstance().registerServiceProvider(new URLImageInputStreamSpi());
ImageIO.setUseCache(false);
}
protected URL getClassLoaderResource(final String pName) {