From 6c5a2de640d6c46c7afc2cfb792d59b82a507294 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Tue, 18 Dec 2018 23:55:58 +0000 Subject: [PATCH] #62886 - Regression extracting text from corrupted docx files git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1849252 13f79535-47bb-0310-9956-ffa450edef68 --- .../util/ZipArchiveThresholdInputStream.java | 3 +++ .../org/apache/poi/xwpf/TestXWPFBugs.java | 17 ++++++++++++++--- test-data/document/truncated62886.docx | Bin 0 -> 19785 bytes 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 test-data/document/truncated62886.docx diff --git a/src/ooxml/java/org/apache/poi/openxml4j/util/ZipArchiveThresholdInputStream.java b/src/ooxml/java/org/apache/poi/openxml4j/util/ZipArchiveThresholdInputStream.java index 725c7a4835..728bf9849a 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/util/ZipArchiveThresholdInputStream.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/util/ZipArchiveThresholdInputStream.java @@ -20,6 +20,7 @@ package org.apache.poi.openxml4j.util; import static org.apache.poi.openxml4j.util.ZipSecureFile.MAX_ENTRY_SIZE; import static org.apache.poi.openxml4j.util.ZipSecureFile.MIN_INFLATE_RATIO; +import java.io.EOFException; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; @@ -144,6 +145,8 @@ public class ZipArchiveThresholdInputStream extends FilterInputStream { "No valid entries or contents found, this is not a valid OOXML (Office Open XML) file", ze); } throw ze; + } catch (EOFException e) { + return null; } } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java b/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java index 42d675c28c..a77eedc999 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/TestXWPFBugs.java @@ -43,13 +43,24 @@ import org.junit.Test; import org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument; public class TestXWPFBugs { + private static final POIDataSamples samples = POIDataSamples.getDocumentInstance(); + + @Test + public void truncatedDocx() throws Exception { + try (InputStream fis = samples.openResourceAsStream("truncated62886.docx"); + OPCPackage opc = OPCPackage.open(fis); + XWPFWordExtractor ext = new XWPFWordExtractor(opc)) { + assertNotNull(ext.getText()); + } + } + /** * A word document that's encrypted with non-standard * Encryption options, and no cspname section. See bug 53475 */ @Test public void bug53475NoCSPName() throws Exception { - File file = POIDataSamples.getDocumentInstance().getFile("bug53475-password-is-solrcell.docx"); + File file = samples.getFile("bug53475-password-is-solrcell.docx"); POIFSFileSystem filesystem = new POIFSFileSystem(file, true); // Check the encryption details @@ -84,7 +95,7 @@ public class TestXWPFBugs { int maxKeyLen = Cipher.getMaxAllowedKeyLength("AES"); Assume.assumeTrue("Please install JCE Unlimited Strength Jurisdiction Policy files for AES 256", maxKeyLen == 2147483647); - File file = POIDataSamples.getDocumentInstance().getFile("bug53475-password-is-pass.docx"); + File file = samples.getFile("bug53475-password-is-pass.docx"); POIFSFileSystem filesystem = new POIFSFileSystem(file, true); // Check the encryption details @@ -117,7 +128,7 @@ public class TestXWPFBugs { public void bug59058() throws IOException, XmlException { String files[] = { "bug57031.docx", "bug59058.docx" }; for (String f : files) { - ZipFile zf = new ZipFile(POIDataSamples.getDocumentInstance().getFile(f)); + ZipFile zf = new ZipFile(samples.getFile(f)); ZipArchiveEntry entry = zf.getEntry("word/document.xml"); DocumentDocument document = DocumentDocument.Factory.parse(zf.getInputStream(entry)); assertNotNull(document); diff --git a/test-data/document/truncated62886.docx b/test-data/document/truncated62886.docx new file mode 100644 index 0000000000000000000000000000000000000000..4998b45ad6b4de4604a2bf9d924225bf21dd2a9f GIT binary patch literal 19785 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