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
This commit is contained in:
Dominik Stadler 2020-01-03 13:11:41 +00:00
parent 578d78da37
commit 4aa8334e3b
8 changed files with 76 additions and 43 deletions

View File

@ -317,6 +317,7 @@ public class TestAllFiles {
"spreadsheet/poc-shared-strings.xlsx", // contains shared-string-entity-expansion "spreadsheet/poc-shared-strings.xlsx", // contains shared-string-entity-expansion
"document/61612a.docx", "document/61612a.docx",
"document/word2.doc", "document/word2.doc",
"spreadsheet/xlsx-corrupted.xlsx",
// old Excel files, which we only support simple text extraction of // old Excel files, which we only support simple text extraction of
"spreadsheet/testEXCEL_2.xls", "spreadsheet/testEXCEL_2.xls",

View File

@ -43,8 +43,9 @@ class EMFHandler extends MFProxy {
@Override @Override
public void parse(File file) throws IOException { public void parse(File file) throws IOException {
// stream needs to be kept open // stream needs to be kept open until the instance is closed
parse(file.toURI().toURL().openStream()); is = file.toURI().toURL().openStream();
parse(is);
} }
@Override @Override
@ -66,7 +67,6 @@ class EMFHandler extends MFProxy {
// } // }
} }
} }
} }
protected String getContentType() { protected String getContentType() {

View File

@ -17,6 +17,9 @@
package org.apache.poi.xssf; 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.util.MemoryLeakVerifier;
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFRow;
@ -27,12 +30,14 @@ import org.junit.Test;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
/** /**
* A test which uses {@link MemoryLeakVerifier} to ensure that certain * A test which uses {@link MemoryLeakVerifier} to ensure that certain
@ -141,4 +146,24 @@ public class XSSFMemoryLeakTests {
wb1.close(); 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");
}
}
}
} }

View File

@ -113,17 +113,17 @@ public class TestXSSFBEventBasedExcelExtractor {
extractor.setIncludeCellComments(true); extractor.setIncludeCellComments(true);
String[] rows = extractor.getText().split("[\r\n]+"); String[] rows = extractor.getText().split("[\r\n]+");
assertEquals(283, rows.length); assertEquals(283, rows.length);
BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(), try (BufferedReader reader = Files.newBufferedReader(XSSFTestDataSamples.getSampleFile("62815.xlsb.txt").toPath(),
StandardCharsets.UTF_8); StandardCharsets.UTF_8)) {
String line = reader.readLine(); String line = reader.readLine();
for (String row : rows) { for (String row : rows) {
assertEquals(line, row); assertEquals(line, row);
line = reader.readLine();
while (line != null && line.startsWith("#")) {
line = reader.readLine(); line = reader.readLine();
while (line != null && line.startsWith("#")) {
line = reader.readLine();
}
} }
} }
} }
} }
} }

View File

@ -27,6 +27,7 @@ import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
@ -233,11 +234,12 @@ public final class TestSharedStringsTable {
Path path = XSSFTestDataSamples.getSampleFile("48936-strings.txt").toPath(); Path path = XSSFTestDataSamples.getSampleFile("48936-strings.txt").toPath();
List<String> lst = Files Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);
.lines(path, StandardCharsets.UTF_8) List<String> lst = lines
.map(String::trim) .map(String::trim)
.filter(((Predicate<String>)String::isEmpty).negate()) .filter(((Predicate<String>)String::isEmpty).negate())
.collect(Collectors.toList()); .collect(Collectors.toList());
lines.close();
for (String str : lst) { for (String str : lst) {
s.createRow(i++).createCell(0).setCellValue(str); s.createRow(i++).createCell(0).setCellValue(str);

View File

@ -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");
}
}
} }

View File

@ -2914,43 +2914,40 @@ public final class TestBugs extends BaseTestBugzillaIssues {
@Test @Test
public void test46515() throws IOException { public void test46515() throws IOException {
Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls"); try (Workbook wb = HSSFTestDataSamples.openSampleWorkbook("46515.xls")) {
// Get structure from webservice // Get structure from webservice
String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg"; String urlString = "http://poi.apache.org/components/spreadsheet/images/calendar.jpg";
URL structURL = new URL(urlString); URL structURL = new URL(urlString);
BufferedImage bimage; BufferedImage bimage;
try { try {
bimage = ImageIO.read(structURL); bimage = ImageIO.read(structURL);
} catch (IOException e) { } catch (IOException e) {
Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e); Assume.assumeNoException("Downloading a jpg from poi.apache.org should work", e);
return; return;
} finally { }
wb.close();
}
// Convert BufferedImage to byte[] // Convert BufferedImage to byte[]
ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream(); ByteArrayOutputStream imageBAOS = new ByteArrayOutputStream();
ImageIO.write(bimage, "jpeg", imageBAOS); ImageIO.write(bimage, "jpeg", imageBAOS);
imageBAOS.flush(); imageBAOS.flush();
byte[] imageBytes = imageBAOS.toByteArray(); byte[] imageBytes = imageBAOS.toByteArray();
imageBAOS.close(); imageBAOS.close();
// Pop structure into Structure HSSFSheet // Pop structure into Structure HSSFSheet
int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG); int pict = wb.addPicture(imageBytes, HSSFWorkbook.PICTURE_TYPE_JPEG);
Sheet sheet = wb.getSheet("Structure"); Sheet sheet = wb.getSheet("Structure");
assertNotNull("Did not find sheet", sheet); assertNotNull("Did not find sheet", sheet);
HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch(); HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch();
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 10, 22);
anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE); anchor.setAnchorType(AnchorType.MOVE_DONT_RESIZE);
patriarch.createPicture(anchor, pict); patriarch.createPicture(anchor, pict);
// Write out destination file // Write out destination file
// FileOutputStream fileOut = new FileOutputStream("/tmp/46515.xls"); // FileOutputStream fileOut = new FileOutputStream("/tmp/46515.xls");
// wb.write(fileOut); // wb.write(fileOut);
// fileOut.close(); // fileOut.close();
}
wb.close();
} }
@Test @Test

Binary file not shown.