diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReader.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReader.java index 18ceaf34..4262e0b7 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReader.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReader.java @@ -153,7 +153,10 @@ public final class TIFFReader extends MetadataReader { CompoundDirectory next = (CompoundDirectory) readDirectory(pInput, nextOffset, true); for (int i = 0; i < next.directoryCount(); i++) { - ifds.add((IFD) next.getDirectory(i)); + if(next.getDirectory(i).size() > 0) { + // Linked directories might be empty if nextOffset is after EOF, so skip them + ifds.add((IFD) next.getDirectory(i)); + } } } } diff --git a/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReaderTest.java b/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReaderTest.java index eeb7f36c..0ba7813f 100644 --- a/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReaderTest.java +++ b/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/tiff/TIFFReaderTest.java @@ -311,4 +311,13 @@ public class TIFFReaderTest extends MetadataReaderAbstractTest { assertTrue(directory.getEntryById(32934).getValue() instanceof EOFException); } } + + @Test + public void testReadIDFPointerBeyondEOF() throws IOException { + try (ImageInputStream stream = ImageIO.createImageInputStream(getResource("/tiff/ifd-end-pointer.tif"))) { + CompoundDirectory directory = (CompoundDirectory) createReader().read(stream); + assertEquals(1, directory.directoryCount()); + assertEquals(15, directory.size()); + } + } } diff --git a/imageio/imageio-metadata/src/test/resources/tiff/ifd-end-pointer.tif b/imageio/imageio-metadata/src/test/resources/tiff/ifd-end-pointer.tif new file mode 100644 index 00000000..dc6feba7 Binary files /dev/null and b/imageio/imageio-metadata/src/test/resources/tiff/ifd-end-pointer.tif differ