aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Stadler <centic@apache.org>2020-01-03 13:11:41 +0000
committerDominik Stadler <centic@apache.org>2020-01-03 13:11:41 +0000
commit4aa8334e3b695cc34a2bfb035b9cc35dc9271e73 (patch)
treeac0456d10bab67b938d560fbaa1cf0067422145f
parent578d78da37fd4b2035e865d746e40471f417c116 (diff)
downloadpoi-4aa8334e3b695cc34a2bfb035b9cc35dc9271e73.tar.gz
poi-4aa8334e3b695cc34a2bfb035b9cc35dc9271e73.zip
Fix some additional file-handle-leaks reported by unit-tests via an enhanced version of the file-leak-detector
Also add a test for Bug 64045 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872287 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/integrationtest/org/apache/poi/TestAllFiles.java1
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/util/EMFHandler.java6
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/XSSFMemoryLeakTests.java25
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFBEventBasedExcelExtractor.java16
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java6
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java8
-rw-r--r--src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java63
-rw-r--r--test-data/spreadsheet/xlsx-corrupted.xlsxbin0 -> 6842 bytes
8 files changed, 79 insertions, 46 deletions
diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java
index 2374c9e6d4..8f9ba82a4c 100644
--- a/src/integrationtest/org/apache/poi/TestAllFiles.java
+++ b/src/integrationtest/org/apache/poi/TestAllFiles.java
@@ -317,6 +317,7 @@ public class TestAllFiles {
"spreadsheet/poc-shared-strings.xlsx", // contains shared-string-entity-expansion
"document/61612a.docx",
"document/word2.doc",
+ "spreadsheet/xlsx-corrupted.xlsx",
// old Excel files, which we only support simple text extraction of
"spreadsheet/testEXCEL_2.xls",
diff --git a/src/ooxml/java/org/apache/poi/xslf/util/EMFHandler.java b/src/ooxml/java/org/apache/poi/xslf/util/EMFHandler.java
index 94fb64447e..9d7e620bb4 100644
--- a/src/ooxml/java/org/apache/poi/xslf/util/EMFHandler.java
+++ b/src/ooxml/java/org/apache/poi/xslf/util/EMFHandler.java
@@ -43,8 +43,9 @@ class EMFHandler extends MFProxy {
@Override
public void parse(File file) throws IOException {
- // stream needs to be kept open
- parse(file.toURI().toURL().openStream());
+ // stream needs to be kept open until the instance is closed
+ is = file.toURI().toURL().openStream();
+ parse(is);
}
@Override
@@ -66,7 +67,6 @@ class EMFHandler extends MFProxy {
// }
}
}
-
}
protected String getContentType() {
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/XSSFMemoryLeakTests.java b/src/ooxml/testcases/org/apache/poi/xssf/XSSFMemoryLeakTests.java
index 958e54554c..c987e4a91b 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/XSSFMemoryLeakTests.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/XSSFMemoryLeakTests.java
@@ -17,6 +17,9 @@
package org.apache.poi.xssf;
+import org.apache.poi.ooxml.POIXMLException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.MemoryLeakVerifier;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
@@ -27,12 +30,14 @@ import org.junit.Test;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
/**
* A test which uses {@link MemoryLeakVerifier} to ensure that certain
@@ -141,4 +146,24 @@ public class XSSFMemoryLeakTests {
wb1.close();
}
+
+ @Test(expected = POIXMLException.class)
+ public void testFileLeak() throws IOException, InvalidFormatException {
+ File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
+ verifier.addObject(file);
+ try (XSSFWorkbook ignored = new XSSFWorkbook(file)) {
+ fail("Should catch exception as the file is corrupted");
+ }
+ }
+
+ @Test(expected = POIXMLException.class)
+ public void testFileLeak2() throws IOException, InvalidFormatException {
+ File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
+ verifier.addObject(file);
+ try (OPCPackage pkg = OPCPackage.open(file)) {
+ try (XSSFWorkbook ignored = new XSSFWorkbook(pkg)) {
+ fail("Should catch exception as the file is corrupted");
+ }
+ }
+ }
}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFBEventBasedExcelExtractor.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFBEventBasedExcelExtractor.java
index 226a76ead6..025cf49dc8 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFBEventBasedExcelExtractor.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFBEventBasedExcelExtractor.java
@@ -113,17 +113,17 @@ public class TestXSSFBEventBasedExcelExtractor {
extractor.setIncludeCellComments(true);
String[] rows = extractor.getText().split("[\r\n]+");
assertEquals(283, rows.length);
- BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(),
- StandardCharsets.UTF_8);
- String line = reader.readLine();
- for (String row : rows) {
- assertEquals(line, row);
- line = reader.readLine();
- while (line != null && line.startsWith("#")) {
+ try (BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(),
+ StandardCharsets.UTF_8)) {
+ String line = reader.readLine();
+ for (String row : rows) {
+ assertEquals(line, row);
line = reader.readLine();
+ while (line != null && line.startsWith("#")) {
+ line = reader.readLine();
+ }
}
}
}
}
-
}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java b/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java
index f78af2f044..0963a27798 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/model/TestSharedStringsTable.java
@@ -27,6 +27,7 @@ import java.nio.file.Path;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
@@ -233,11 +234,12 @@ public final class TestSharedStringsTable {
Path path = XSSFTestDataSamples.getSampleFile("48936-strings.txt").toPath();
- List<String> lst = Files
- .lines(path, StandardCharsets.UTF_8)
+ Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
+ List<String> lst = lines
.map(String::trim)
.filter(((Predicate<String>)String::isEmpty).negate())
.collect(Collectors.toList());
+ lines.close();
for (String str : lst) {
s.createRow(i++).createCell(0).setCellValue(str);
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
index 9eb2ed9dc7..65eaa7f173 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
@@ -3455,4 +3455,12 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
}*/
}
}
+
+ @Test(expected = POIXMLException.class)
+ public void test64045() throws IOException, InvalidFormatException {
+ File file = XSSFTestDataSamples.getSampleFile("xlsx-corrupted.xlsx");
+ try (XSSFWorkbook ignored = new XSSFWorkbook(file)) {
+ fail("Should catch exception as the file is corrupted");
+ }
+ }
}
diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
index 29f6e22f19..060f665bc7 100644
--- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
+++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
@@ -2914,43 +2914,40 @@ public final class TestBugs extends BaseTestBugzillaIssues {
@Test
public void test46515() throws IOException {
- Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls");
-
- // Get structure from webservice
- String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg";
- URL structURL = new URL(urlString);
- BufferedImage bimage;
- try {
- bimage = ImageIO.read(structURL);
- } catch (IOException e) {
- Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e);
- return;
- } finally {
- wb.close();
- }
+ try (Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls")) {
+
+ // Get structure from webservice
+ String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg";
+ URL structURL = new URL(urlString);
+ BufferedImage bimage;
+ try {
+ bimage = ImageIO.read(structURL);
+ } catch (IOException e) {
+ Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e);
+ return;
+ }
- // Convert BufferedImage to byte[]
- ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream();
- ImageIO.write(bimage, "jpeg", imageBAOS);
- imageBAOS.flush();
- byte[] imageBytes = imageBAOS.toByteArray();
- imageBAOS.close();
-
- // Pop structure into Structure HSSFSheet
- int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
- Sheet sheet = wb.getSheet("Structure");
- assertNotNull("Did not find sheet", sheet);
- HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
- HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22);
- anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);
- patriarch.createPicture(anchor, pict);
-
- // Write out destination file
+ // Convert BufferedImage to byte[]
+ ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream();
+ ImageIO.write(bimage, "jpeg", imageBAOS);
+ imageBAOS.flush();
+ byte[] imageBytes = imageBAOS.toByteArray();
+ imageBAOS.close();
+
+ // Pop structure into Structure HSSFSheet
+ int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
+ Sheet sheet = wb.getSheet("Structure");
+ assertNotNull("Did not find sheet", sheet);
+ HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
+ HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22);
+ anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);
+ patriarch.createPicture(anchor, pict);
+
+ // Write out destination file
// FileOutputStream fileOut = new FileOutputStream("/tmp/46515.xls");
// wb.write(fileOut);
// fileOut.close();
-
- wb.close();
+ }
}
@Test
diff --git a/test-data/spreadsheet/xlsx-corrupted.xlsx b/test-data/spreadsheet/xlsx-corrupted.xlsx
new file mode 100644
index 0000000000..0e363e7fed
--- /dev/null
+++ b/test-data/spreadsheet/xlsx-corrupted.xlsx
Binary files differ