-
Bug
-
Resolution: Fixed
-
Critical
-
3.9.1
-
Security Level: Jean
-
None
Steps to Reproduce
run the attached example stack-overflow.zul
Current Result
After several seconds a StackOverflowError occurs:
java.lang.StackOverflowError at org.dom4j.io.SAXHelper.createXMLReader(SAXHelper.java:83) at org.dom4j.io.SAXReader.createXMLReader(SAXReader.java:894) at org.dom4j.io.SAXReader.getXMLReader(SAXReader.java:715) at org.dom4j.io.SAXReader.read(SAXReader.java:435) at org.dom4j.io.SAXReader.read(SAXReader.java:343) at org.zkoss.poi.openxml4j.opc.internal.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:377) at org.zkoss.poi.openxml4j.opc.internal.ContentTypeManager.<init>(ContentTypeManager.java:105) at org.zkoss.poi.openxml4j.opc.internal.ZipContentTypeManager.<init>(ZipContentTypeManager.java:56) at org.zkoss.poi.openxml4j.opc.ZipPackage.getPartsImpl(ZipPackage.java:168) at org.zkoss.poi.openxml4j.opc.OPCPackage.getParts(OPCPackage.java:662) at org.zkoss.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:269) at org.zkoss.poi.util.PackageHelper.open(PackageHelper.java:39) at org.zkoss.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:307) at org.zkoss.zss.range.impl.imexp.ExcelXlsxImporter.createPoiBook(ExcelXlsxImporter.java:89) at org.zkoss.zss.range.impl.imexp.AbstractExcelImporter.imports(AbstractExcelImporter.java:129) at org.zkoss.zss.range.impl.imexp.ExcelImportAdapter.imports(ExcelImportAdapter.java:46) at org.zkoss.zss.range.impl.imexp.AbstractImporter.imports(AbstractImporter.java:54) at org.zkoss.zss.ui.Spreadsheet.getSBook(Spreadsheet.java:653) at org.zkoss.zss.ui.Spreadsheet.deleteSelfEditorFocus(Spreadsheet.java:709) at org.zkoss.zss.ui.Spreadsheet.cleanSelectedSheet(Spreadsheet.java:5311) at org.zkoss.zss.ui.Spreadsheet.initBook0(Spreadsheet.java:785) at org.zkoss.zss.ui.Spreadsheet.initBook(Spreadsheet.java:686) at org.zkoss.zss.ui.Spreadsheet.getSBook(Spreadsheet.java:655) at org.zkoss.zss.ui.Spreadsheet.deleteSelfEditorFocus(Spreadsheet.java:709) at org.zkoss.zss.ui.Spreadsheet.cleanSelectedSheet(Spreadsheet.java:5311) at org.zkoss.zss.ui.Spreadsheet.initBook0(Spreadsheet.java:785) at org.zkoss.zss.ui.Spreadsheet.initBook(Spreadsheet.java:686) at org.zkoss.zss.ui.Spreadsheet.getSBook(Spreadsheet.java:655) at org.zkoss.zss.ui.Spreadsheet.deleteSelfEditorFocus(Spreadsheet.java:709) at org.zkoss.zss.ui.Spreadsheet.cleanSelectedSheet(Spreadsheet.java:5311) at org.zkoss.zss.ui.Spreadsheet.initBook0(Spreadsheet.java:785) at org.zkoss.zss.ui.Spreadsheet.initBook(Spreadsheet.java:686) at org.zkoss.zss.ui.Spreadsheet.getSBook(Spreadsheet.java:655) ... repeat the last 5 methods
Expected Result
no StackOverflowError and rather a RuntimeException indicating some unavailable resources
Debug Info
Choosing a larger .xlsx file delays the StackOverflowError even more since it will import the book with every iteration over the 5 method loop.
Especially with large files that results in vast memory and CPU usage for a long time (+1000x before the Stack is full)
Root Cause
calling getBook/getSBook after the Session/Desktop is gone results in this recursive loop since the internal _book property is null while _src *still contains a path (triggering the re-import of the .xlsx file) at the same time *_selectedSheet is not NULL causing a nestes call to getSBook when trying to reset it.
Workaround
apply the attached patch class Spreadsheet_Patch_ZK1329.java
<spreadsheet use="zk.support.Spreadsheet_Patch_ZK1329" ...