From 4e640dda51807c49e9d9b73ae0965a1411e5e566 Mon Sep 17 00:00:00 2001 From: Oliver Schmidtmer Date: Wed, 7 Jun 2017 13:44:49 +0200 Subject: [PATCH] Fix for erroneous encoded ccitt lines The ccitt tiff is missing a terminating huffman code on a line end. The following EOL is misinterpreted and the codestream read till an ArrayIndexOutOfBoundsException occurs. Now reading the line is aborted as soon as an EOL is found. --- .../plugins/tiff/CCITTFaxDecoderStream.java | 7 ++++-- .../tiff/CCITTFaxDecoderStreamTest.java | 20 ++++++++++++++++++ .../src/test/resources/tiff/ccitt/g3aoe.tif | Bin 0 -> 31339 bytes 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 imageio/imageio-tiff/src/test/resources/tiff/ccitt/g3aoe.tif diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java index 7ca032a2..68a10284 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStream.java @@ -355,11 +355,14 @@ final class CCITTFaxDecoderStream extends FilterInputStream { if (n.isLeaf) { total += n.value; - if (n.value < 64) { + if (n.value >= 64) { + n = tree.root; + } + else if (n.value >= 0) { return total; } else { - n = tree.root; + return columns; } } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStreamTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStreamTest.java index d5ded55a..0f72542e 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStreamTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/CCITTFaxDecoderStreamTest.java @@ -261,4 +261,24 @@ public class CCITTFaxDecoderStreamTest { byte decoded = (byte) inputStream.read(); assertEquals((byte) 0b10101010, decoded); } + + @Test + public void testG3AOE() throws IOException { + InputStream inputStream = getClass().getResourceAsStream("/tiff/ccitt/g3aoe.tif"); + + // Skip until StripOffsets: 8 + for (int i = 0; i < 8; i++) { + inputStream.read(); + } + + // Read until StripByteCounts: 20050 + byte[] data = new byte[20050]; + new DataInputStream(inputStream).readFully(data); + + InputStream stream = new CCITTFaxDecoderStream(new ByteArrayInputStream(data), + 1728, TIFFExtension.COMPRESSION_CCITT_T4, 1, TIFFExtension.GROUP3OPT_FILLBITS); + + byte[] bytes = new byte[216 * 1168]; // 1728 x 1168 pixel, 1 bpp => 216 bytes * 1168 + new DataInputStream(stream).readFully(bytes); + } } diff --git a/imageio/imageio-tiff/src/test/resources/tiff/ccitt/g3aoe.tif b/imageio/imageio-tiff/src/test/resources/tiff/ccitt/g3aoe.tif new file mode 100644 index 0000000000000000000000000000000000000000..b7596f7e354c036ae7aecac2b4ce1e0839cf9ed2 GIT binary patch literal 31339 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 ZFo0PE<{=u8E(Ev`Ob3ki0Q%5>{|m)!4@>|6 literal 0 HcmV?d00001