From: Dominik Stadler Date: Fri, 3 Jan 2020 13:11:41 +0000 (+0000) Subject: Fix some additional file-handle-leaks reported by unit-tests via an enhanced version... X-Git-Tag: REL_4_1_2~49 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4aa8334e3b695cc34a2bfb035b9cc35dc9271e73;p=poi.git 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 --- 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 lst = Files - .lines(path, StandardCharsets.UTF_8) + Stream lines = Files.lines(path, StandardCharsets.UTF_8); + List lst = lines .map(String::trim) .filter(((Predicate)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 Binary files /dev/null and b/test-data/spreadsheet/xlsx-corrupted.xlsx differ