--- src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java (revision 1837169) +++ src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java (date 1533220150178) @@ -250,6 +250,9 @@ 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); --- src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java (revision 1837169) +++ src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java (date 1533219964426) @@ -1090,6 +1090,21 @@ 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);