From: Tim Allison Date: Wed, 8 Aug 2018 16:06:18 +0000 (+0000) Subject: bug 62592 -- prevent StackOverflowError on corrupt thmx X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=070e8151099fafcdb2added80f0de71a89d85e7d;p=poi.git bug 62592 -- prevent StackOverflowError on corrupt thmx git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1837658 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java index 40fc2139f5..975e21d981 100644 --- a/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java +++ b/src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java @@ -250,6 +250,9 @@ public final class ZipPackage extends OPCPackage { final ZipArchiveEntry contentTypeEntry = zipArchive.getEntry(CONTENT_TYPES_PART_NAME); if (contentTypeEntry != null) { + if (this.contentTypeManager != null) { + throw new InvalidFormatException("ContentTypeManager can only be created once. This must be a cyclic relation?"); + } try { this.contentTypeManager = new ZipContentTypeManager( zipArchive.getInputStream(contentTypeEntry), this); diff --git a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java index a92906b765..ad7fe80c84 100644 --- a/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java +++ b/src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java @@ -1090,6 +1090,21 @@ public final class TestPackage { openInvalidFile("SampleSS.txt", true); } + @Test(expected = InvalidFormatException.class) + public void testBug62592() throws Exception { + InputStream is = OpenXML4JTestDataSamples.openSampleStream("62592.thmx"); + OPCPackage p = OPCPackage.open(is); + } + + @Test + public void testBug62592SequentialCallsToGetParts() throws Exception { + //make absolutely certain that sequential calls don't throw InvalidFormatExceptions + String originalFile = OpenXML4JTestDataSamples.getSampleFileName("TestPackageCommon.docx"); + OPCPackage p2 = OPCPackage.open(originalFile, PackageAccess.READ); + p2.getParts(); + p2.getParts(); + } + @Test public void testDoNotCloseStream() throws IOException { OutputStream os = Mockito.mock(OutputStream.class); diff --git a/test-data/openxml4j/62592.thmx b/test-data/openxml4j/62592.thmx new file mode 100644 index 0000000000..74489e3475 Binary files /dev/null and b/test-data/openxml4j/62592.thmx differ