]> source.dussan.org Git - poi.git/commitdiff
try to close resources when RuntimeExceptions happen
authorPJ Fanning <fanningpj@apache.org>
Sat, 18 Dec 2021 18:04:52 +0000 (18:04 +0000)
committerPJ Fanning <fanningpj@apache.org>
Sat, 18 Dec 2021 18:04:52 +0000 (18:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1896140 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/ooxml/POIXMLDocumentPart.java
poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/ZipPackage.java
poi-ooxml/src/main/java/org/apache/poi/poifs/crypt/temp/AesZipFileZipEntrySource.java

index d676373cca39b9eaaf151b747fb5dd885052e67d..3d289ebab734746a8c1285600132e132acd46fe5 100644 (file)
@@ -739,24 +739,31 @@ public class POIXMLDocumentPart {
      * Since POI 4.1.2 - pkg is closed if this method throws an exception
      */
     private static PackagePart getPartFromOPCPackage(OPCPackage pkg, String coreDocumentRel) {
-        PackageRelationship coreRel = pkg.getRelationshipsByType(coreDocumentRel).getRelationship(0);
+        try {
+            PackageRelationship coreRel = pkg.getRelationshipsByType(coreDocumentRel).getRelationship(0);
+
+            if (coreRel != null) {
+                PackagePart pp = pkg.getPart(coreRel);
+                if (pp == null) {
+                    IOUtils.closeQuietly(pkg);
+                    throw new POIXMLException("OOXML file structure broken/invalid - core document '" + coreRel.getTargetURI() + "' not found.");
+                }
+                return pp;
+            }
 
-        if (coreRel != null) {
-            PackagePart pp = pkg.getPart(coreRel);
-            if (pp == null) {
+            coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
+            if (coreRel != null) {
                 IOUtils.closeQuietly(pkg);
-                throw new POIXMLException("OOXML file structure broken/invalid - core document '" + coreRel.getTargetURI() + "' not found.");
+                throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
             }
-            return pp;
-        }
 
-        coreRel = pkg.getRelationshipsByType(PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0);
-        if (coreRel != null) {
             IOUtils.closeQuietly(pkg);
-            throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699");
+            throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
+        } catch (POIXMLException e) {
+            throw e;
+        } catch (RuntimeException e) {
+            IOUtils.closeQuietly(pkg);
+            throw new POIXMLException("OOXML file structure broken/invalid", e);
         }
-
-        IOUtils.closeQuietly(pkg);
-        throw new POIXMLException("OOXML file structure broken/invalid - no core document found!");
     }
 }
index 8feaf8125293a07e6d9ee642e4687c37d7a67511..af1a4c07b1343aff5ba2e5088aa5c5a14101a5b4 100644 (file)
@@ -130,7 +130,7 @@ public final class ZipPackage extends OPCPackage {
         ZipArchiveThresholdInputStream zis = ZipHelper.openZipStream(in); // NOSONAR
         try {
             this.zipArchive = new ZipInputStreamZipEntrySource(zis);
-        } catch (final IOException e) {
+        } catch (final IOException | RuntimeException e) {
             IOUtils.closeQuietly(zis);
             throw e;
         }
index f38be63ce4af29b9e512c9438ab79b3525bac0f0..7582d323a01351623e8935bf9153b72d7e88cbd2 100644 (file)
@@ -105,14 +105,17 @@ public final class AesZipFileZipEntrySource implements ZipEntrySource {
     }
 
     public static AesZipFileZipEntrySource createZipEntrySource(InputStream is) throws IOException {
-        // generate session key
-        byte[] ivBytes = new byte[16], keyBytes = new byte[16];
-        RandomSingleton.getInstance().nextBytes(ivBytes);
-        RandomSingleton.getInstance().nextBytes(keyBytes);
-        final File tmpFile = TempFile.createTempFile("protectedXlsx", ".zip");
-        copyToFile(is, tmpFile, keyBytes, ivBytes);
-        IOUtils.closeQuietly(is);
-        return fileToSource(tmpFile, keyBytes, ivBytes);
+        try {
+            // generate session key
+            byte[] ivBytes = new byte[16], keyBytes = new byte[16];
+            RandomSingleton.getInstance().nextBytes(ivBytes);
+            RandomSingleton.getInstance().nextBytes(keyBytes);
+            final File tmpFile = TempFile.createTempFile("protectedXlsx", ".zip");
+            copyToFile(is, tmpFile, keyBytes, ivBytes);
+            return fileToSource(tmpFile, keyBytes, ivBytes);
+        } finally {
+            IOUtils.closeQuietly(is);
+        }
     }
 
     private static void copyToFile(InputStream is, File tmpFile, byte[] keyBytes, byte[] ivBytes) throws IOException {