mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-05 12:35:29 -04:00
TMI-120: Fix IIOOBE when file has no image. Will throw exceptions when trying to read or get metadata.
This commit is contained in:
parent
11f33741d4
commit
406ae28da7
@ -49,6 +49,7 @@ import javax.imageio.event.IIOReadUpdateListener;
|
|||||||
import javax.imageio.event.IIOReadWarningListener;
|
import javax.imageio.event.IIOReadWarningListener;
|
||||||
import javax.imageio.metadata.IIOMetadata;
|
import javax.imageio.metadata.IIOMetadata;
|
||||||
import javax.imageio.metadata.IIOMetadataFormatImpl;
|
import javax.imageio.metadata.IIOMetadataFormatImpl;
|
||||||
|
import javax.imageio.metadata.IIOMetadataNode;
|
||||||
import javax.imageio.spi.ImageReaderSpi;
|
import javax.imageio.spi.ImageReaderSpi;
|
||||||
import javax.imageio.stream.ImageInputStream;
|
import javax.imageio.stream.ImageInputStream;
|
||||||
import javax.imageio.stream.MemoryCacheImageInputStream;
|
import javax.imageio.stream.MemoryCacheImageInputStream;
|
||||||
@ -100,6 +101,7 @@ import java.util.List;
|
|||||||
public class JPEGImageReader extends ImageReaderBase {
|
public class JPEGImageReader extends ImageReaderBase {
|
||||||
// TODO: Allow automatic rotation based on EXIF rotation field?
|
// TODO: Allow automatic rotation based on EXIF rotation field?
|
||||||
// TODO: Create a simplified native metadata format that is closer to the actual JPEG stream AND supports EXIF in a sensible way
|
// TODO: Create a simplified native metadata format that is closer to the actual JPEG stream AND supports EXIF in a sensible way
|
||||||
|
// TODO: As we already parse the SOF segments, maybe we should stop delegating getWidth/getHeight etc?
|
||||||
|
|
||||||
final static boolean DEBUG = "true".equalsIgnoreCase(System.getProperty("com.twelvemonkeys.imageio.plugins.jpeg.debug"));
|
final static boolean DEBUG = "true".equalsIgnoreCase(System.getProperty("com.twelvemonkeys.imageio.plugins.jpeg.debug"));
|
||||||
|
|
||||||
@ -197,7 +199,13 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNumImages(boolean allowSearch) throws IOException {
|
public int getNumImages(boolean allowSearch) throws IOException {
|
||||||
return delegate.getNumImages(allowSearch);
|
try {
|
||||||
|
return delegate.getNumImages(allowSearch);
|
||||||
|
}
|
||||||
|
catch (ArrayIndexOutOfBoundsException ignore) {
|
||||||
|
// This will happen if we find a "tables only" image, with no more images in stream.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1086,7 +1094,11 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
}
|
}
|
||||||
catch (IndexOutOfBoundsException knownIssue) {
|
catch (IndexOutOfBoundsException knownIssue) {
|
||||||
// TMI-101: com.sun.imageio.plugins.jpeg.JPEGBuffer doesn't do proper sanity check of input data.
|
// TMI-101: com.sun.imageio.plugins.jpeg.JPEGBuffer doesn't do proper sanity check of input data.
|
||||||
throw new IIOException("Corrupt JPEG data: Bad segment offset/length", knownIssue);
|
throw new IIOException("Corrupt JPEG data: Bad segment length", knownIssue);
|
||||||
|
}
|
||||||
|
catch (NegativeArraySizeException knownIssue) {
|
||||||
|
// Most likely from com.sun.imageio.plugins.jpeg.SOSMarkerSegment
|
||||||
|
throw new IIOException("Corrupt JPEG data: Bad component count", knownIssue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (imageMetadata != null && Arrays.asList(imageMetadata.getMetadataFormatNames()).contains(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0)) {
|
if (imageMetadata != null && Arrays.asList(imageMetadata.getMetadataFormatNames()).contains(JPEGImage10MetadataCleaner.JAVAX_IMAGEIO_JPEG_IMAGE_1_0)) {
|
||||||
@ -1400,6 +1412,14 @@ public class JPEGImageReader extends ImageReaderBase {
|
|||||||
|
|
||||||
reader.setInput(input);
|
reader.setInput(input);
|
||||||
|
|
||||||
|
// For a tables-only image, we can't read image, but we should get metadata.
|
||||||
|
if (reader.getNumImages(true) == 0) {
|
||||||
|
IIOMetadata streamMetadata = reader.getStreamMetadata();
|
||||||
|
IIOMetadataNode streamNativeTree = (IIOMetadataNode) streamMetadata.getAsTree(streamMetadata.getNativeMetadataFormatName());
|
||||||
|
new XMLSerializer(System.out, System.getProperty("file.encoding")).serialize(streamNativeTree, false);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ImageReadParam param = reader.getDefaultReadParam();
|
ImageReadParam param = reader.getDefaultReadParam();
|
||||||
// if (args.length > 1) {
|
// if (args.length > 1) {
|
||||||
|
@ -1360,6 +1360,22 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
return sortedNodes;
|
return sortedNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetNumImagesBogusDataPrepended() throws IOException {
|
||||||
|
// The JPEGImageReader (incorrectly) interprets this image to be a "tables only" image.
|
||||||
|
|
||||||
|
JPEGImageReader reader = createReader();
|
||||||
|
|
||||||
|
try {
|
||||||
|
reader.setInput(ImageIO.createImageInputStream(getClassLoaderResource("/broken-jpeg/broken-bogus-data-prepended-real-jfif-start-at-4801.jpg")));
|
||||||
|
assertEquals(-1, reader.getNumImages(false)); // Ok
|
||||||
|
assertEquals(0, reader.getNumImages(true)); // Should throw IIOException or return 0
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
reader.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNegativeSOSComponentCount() throws IOException {
|
public void testNegativeSOSComponentCount() throws IOException {
|
||||||
// The data in the stream looks like this:
|
// The data in the stream looks like this:
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 530 KiB |
Loading…
x
Reference in New Issue
Block a user