From 636cc8366581619065229fe45dccb70ff7fd1a42 Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Mon, 10 Feb 2020 17:38:29 +0000 Subject: [PATCH] Bug 64130 -- handle empty worksheet names in OldSheetRecord more robustly. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1873863 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/TestAllFiles.java | 1 + .../poi/hssf/record/OldSheetRecord.java | 20 ++++++++++-------- .../poi/hssf/dev/TestBiffDrawingToXml.java | 1 + .../apache/poi/hssf/dev/TestBiffViewer.java | 1 + .../apache/poi/hssf/dev/TestEFBiffViewer.java | 1 + .../poi/hssf/dev/TestFormulaViewer.java | 1 + .../org/apache/poi/hssf/dev/TestReSave.java | 1 + .../apache/poi/hssf/dev/TestRecordLister.java | 2 +- .../hssf/extractor/TestOldExcelExtractor.java | 15 +++++++++++++ test-data/spreadsheet/64130.xls | Bin 0 -> 7168 bytes 10 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 test-data/spreadsheet/64130.xls diff --git a/src/integrationtest/org/apache/poi/TestAllFiles.java b/src/integrationtest/org/apache/poi/TestAllFiles.java index 8f9ba82a4c..7a573981b5 100644 --- a/src/integrationtest/org/apache/poi/TestAllFiles.java +++ b/src/integrationtest/org/apache/poi/TestAllFiles.java @@ -327,6 +327,7 @@ public class TestAllFiles { "spreadsheet/testEXCEL_95.xls", "spreadsheet/59074.xls", "spreadsheet/60284.xls", + "spreadsheet/64130.xls", // OOXML Strict is not yet supported, see bug #57699 "spreadsheet/SampleSS.strict.xlsx", diff --git a/src/java/org/apache/poi/hssf/record/OldSheetRecord.java b/src/java/org/apache/poi/hssf/record/OldSheetRecord.java index 6c0e81c6fb..2abec6cb8c 100644 --- a/src/java/org/apache/poi/hssf/record/OldSheetRecord.java +++ b/src/java/org/apache/poi/hssf/record/OldSheetRecord.java @@ -47,15 +47,17 @@ public final class OldSheetRecord { field_2_visibility = in.readUByte(); field_3_type = in.readUByte(); int field_4_sheetname_length = in.readUByte(); - in.mark(1); - byte b = in.readByte(); - // if the sheet name starts with a 0, we need to skip one byte, otherwise the following records will - // fail with a LeftOverDataException - if (b != 0) { - try { - in.reset(); - } catch (IOException e) { - throw new RecordFormatException(e); + if (field_4_sheetname_length > 0) { + in.mark(1); + byte b = in.readByte(); + // if the sheet name starts with a 0, we need to skip one byte, otherwise the following records will + // fail with a LeftOverDataException + if (b != 0) { + try { + in.reset(); + } catch (IOException e) { + throw new RecordFormatException(e); + } } } field_5_sheetname = IOUtils.safelyAllocate(field_4_sheetname_length, MAX_RECORD_LENGTH); diff --git a/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java b/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java index f493036cf3..17b43f0da1 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestBiffDrawingToXml.java @@ -45,6 +45,7 @@ public class TestBiffDrawingToXml extends BaseXLSIteratingTest { EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); EXCLUDED.put("61300.xls", RecordFormatException.class); + EXCLUDED.put("64130.xls", OldExcelFormatException.class); // BIFF 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java index a62431bc55..82a46327b9 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestBiffViewer.java @@ -54,6 +54,7 @@ public class TestBiffViewer extends BaseXLSIteratingTest { EXCLUDED.put("50833.xls", IllegalArgumentException.class); // "Name is too long" when setting username EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" EXCLUDED.put("61300.xls", RecordFormatException.class); + EXCLUDED.put("64130.xls", OldExcelFormatException.class); //Biff 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java index 3daf938d5c..a24b4967f7 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestEFBiffViewer.java @@ -47,6 +47,7 @@ public class TestEFBiffViewer extends BaseXLSIteratingTest { EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" EXCLUDED.put("61300.xls", RecordFormatException.class); + EXCLUDED.put("64130.xls", OldExcelFormatException.class); //Biff 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java b/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java index e94d55ddfb..ec69abb4cb 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestFormulaViewer.java @@ -47,6 +47,7 @@ public class TestFormulaViewer extends BaseXLSIteratingTest { EXCLUDED.put("43493.xls", RecordInputStream.LeftoverDataException.class); // HSSFWorkbook cannot open it as well EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); EXCLUDED.put("61300.xls", RecordFormatException.class); + EXCLUDED.put("64130.xls", OldExcelFormatException.class); //Biff 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestReSave.java b/src/testcases/org/apache/poi/hssf/dev/TestReSave.java index a8d59873e1..97b84e21ac 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestReSave.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestReSave.java @@ -51,6 +51,7 @@ public class TestReSave extends BaseXLSIteratingTest { EXCLUDED.put("44958_1.xls", RecordInputStream.LeftoverDataException.class); EXCLUDED.put("XRefCalc.xls", RuntimeException.class); // "Buffer overrun" EXCLUDED.put("61300.xls", RecordFormatException.class); + EXCLUDED.put("64130.xls", OldExcelFormatException.class); //Biff 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java b/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java index ec7cd8c087..f15801390b 100644 --- a/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java +++ b/src/testcases/org/apache/poi/hssf/dev/TestRecordLister.java @@ -38,7 +38,7 @@ public class TestRecordLister extends BaseXLSIteratingTest { EXCLUDED.put("60284.xls", OldExcelFormatException.class); // Biff 5 / Excel 5 EXCLUDED.put("testEXCEL_95.xls", OldExcelFormatException.class); // Biff 5 / Excel 95 EXCLUDED.put("61300.xls", RecordFormatException.class); - + EXCLUDED.put("64130.xls", OldExcelFormatException.class); //Biff 5 } @Override diff --git a/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java b/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java index 1ce8a92c22..6403fe4e74 100644 --- a/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java +++ b/src/testcases/org/apache/poi/hssf/extractor/TestOldExcelExtractor.java @@ -267,6 +267,10 @@ public final class TestOldExcelExtractor { @Test public void testInputStreamNPOIHeader() throws IOException { + //TODO: the worksheet names are currently mangled. They're treated + //as if UTF-16, but they're just ascii. Need to fix this. + //Is it possible that the leading 0 byte in the worksheet name is a signal + //that these worksheet names should be interpreted as ascii/1252? File file = HSSFTestDataSamples.getSampleFile("FormulaRefs.xls"); try (InputStream stream = new FileInputStream(file); OldExcelExtractor extractor = new OldExcelExtractor(stream)) { @@ -350,6 +354,17 @@ public final class TestOldExcelExtractor { } } + @Test + public void testSheetWithNoName() throws IOException { + File file = HSSFTestDataSamples.getSampleFile("64130.xls"); + + try (OldExcelExtractor ex = new OldExcelExtractor(file)) { + assertEquals(5, ex.getBiffVersion()); + assertEquals(5, ex.getFileType()); + assertContains(ex.getText(), "Dawn"); + } + } + private static class NoExitSecurityManager extends SecurityManager { @Override public void checkPermission(Permission perm) { diff --git a/test-data/spreadsheet/64130.xls b/test-data/spreadsheet/64130.xls new file mode 100644 index 0000000000000000000000000000000000000000..9d7d42d0e40e3feae1bebfd10750c7b773410575 GIT binary patch literal 7168 zcmeHMYiv|S6#nkLTiAuI+(PA1UP~!-yM;b@RG^l&O93$=uNo1mr9dl1Y@t*PQe}TY z;t!&zvA_ILjE^6p34w?xF&h)3Au-ehVr7;k^xer7P1;W07I#*OhokCt0i%Vf;w4uo^3{#CaIRbp%XfINNC((xte^ zt*G_arrR*3o}c<?WU5!^~Qj|cSpE#dfA{V%bSN!&(^B4h~bm>9!+ zHgP*KmKaBjCngX%#6)5eF`1Y`OeF$@w9j?#dA!dcW)k^CkSHKRL?JPYm`xNB#Y72F zO3WeV67z`pL>X}hv4B`eEF#K@JBbQnF;PiW5!(Knr$-0&CVC!}(LS3Uv76Y$&U{)r zG$j>sQpl5up`SD`%}#AAs>puB6=az)f6^RgRdJ26(^Yl^Z!T7 zXK;$L`1=)?v5VnWjYf3fWulS!E`DB|d;>$uMmOGN7?~<8g?yr82_4|WHdT@tOJ99NH5)o~3{nwC(*lQ^X`i58u2W`NF$YY=9i_6~KZvVJ)`u$4ACoE^M(^I6`c zfrG-vr?h?pHulS{%KGKrhb;1mcN*1Qo;7zCxliH54Y*ZVzud(xm+*BkUyK@;JE*jt zGHzo}$YdZX#V4vv`&-?=JpQMC7XM5ChFoURBw9jPqck-eYv^gMA*o+giRM-JAKr?` zkLC?3o+ia5oI!q)MMtx-ffHUbpOPf_LhK5vH}6tyBrmb&cvr`rOkhbo^u%l@&S;Oa zi*YCMoQGEs#s`cdAFN@^8(SLpG{|zn;uP%T6v)Y%i;cq9OFcCWkGC+F;WtY;drI4G zPH~seOnWY%+FR4GcSrNX+uB*j>$euLlGMp0MolA@AgH`p^ zFpKkVL47c>RVa|yBos)hU%_w1qC`cG<;l8~Q3>iQD|;2r;|HNMu28p*>(ot^+TM1h zT=Soh{@Q<7HWR?N?$=5RK9j;HBBz*pU2l~VXp!N7retT^(2>oIEUYV$-vLv1Hc>K<1i)IDjVIyIJ|2S zmAnc>B8Wz#yhVr@B7sc|+bFtvdawx*#3)B3$~ye2$+P?<%L`lZCt|r$cs7P+%6nox zERNu{Ge6-clL)l}aGr$`>WlB;s>fl&@YRiNTN+#1 zEhTb=Qn9Df5job1Bv4!Bh!k;?N~SAP+>WTE>VBKc`3m;7Kl9vZJ72neF*lcnL9s0K zm6r86Z_oYh4)gt!N_Y%kX-2A@1izJ|~A zC>t2aq^o(};l7`g7;cH=O_k@F2=gi!SXa7XxN7BSDsnb`BnP8#FRNJFT za-MjAe)y67d7cn;tL$u!4ilfVY(2{^Q~nK+O?he(=SZ6g97}S{kekrOqmV~UCT7?< zFiofH-s8{|Xr5z98nsm4WxN8tfyd(t>XJZ^bd4;1yGJXKfbTo3gh%5>_B}T~(IZN2 z!o{&nITiVwMP#JLVw%@E1Qc5hd}h&sGA~J@D|G0^$()k(uJJ~%I3=l{~<=`@$Y8g(ZHgGU0bcoaL`bMSQ9C)UyD-$IwJ{%Nec!6gZ+|3A35 q9b}UKA7nbv(Vh;?bXMByo}(Fj?;SiU7;F;#T6endUrl9t`uhX^v5B1k literal 0 HcmV?d00001 -- 2.39.5