You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2023/01/01 15:59:32 UTC

svn commit: r1906322 - in /poi/trunk: poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/ poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/ poi-scratchpad/src/main/java/org/apache/poi/...

Author: centic
Date: Sun Jan  1 15:59:32 2023
New Revision: 1906322

URL: http://svn.apache.org/viewvc?rev=1906322&view=rev
Log:
Avoid some NullPointerExceptions and ClassCastExceptions found when fuzzing Apache POI

This mostly only makes thrown exceptions a bit more consistent
or may allow some broken documents to be still read.

Modified:
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/HDGFDiagram.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/SlideAtomLayout.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hsmf/extractor/OutlookTextExtractor.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/Sttb.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java
    poi/trunk/poi/src/main/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java
    poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java
    poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java
    poi/trunk/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java Sun Jan  1 15:59:32 2023
@@ -224,6 +224,9 @@ public class ReadOnlySharedStringsTable
 
     @Override
     public RichTextString getItemAt(int idx) {
+        if (strings == null || idx >= strings.size()) {
+            throw new IllegalStateException("Cannot get item at " + idx + " with strings: " + strings);
+        }
         return new XSSFRichTextString(strings.get(idx));
     }
 

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java Sun Jan  1 15:59:32 2023
@@ -300,6 +300,9 @@ public class XSSFReader {
          * @throws IOException if there is an I/O issue reading the data
          */
         protected SheetIterator(PackagePart wb) throws IOException, InvalidFormatException {
+            if (wb == null) {
+                throw new InvalidFormatException("Cannot create sheet-iterator with missing package part for workbook");
+            }
 
             /*
              * The order of sheets is defined by the order of CTSheet elements in workbook.xml

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Sun Jan  1 15:59:32 2023
@@ -3751,6 +3751,10 @@ public class XSSFSheet extends POIXMLDoc
     }
 
     protected void write(OutputStream out) throws IOException {
+        if (worksheet == null) {
+            throw new POIXMLException("Cannot write invalid sheet, internal data is missing");
+        }
+
         boolean setToNull = false;
         if(worksheet.sizeOfColsArray() == 1) {
             CTCols col = worksheet.getColsArray(0);

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java Sun Jan  1 15:59:32 2023
@@ -59,6 +59,10 @@ public class XWPFComments extends POIXML
      */
     public XWPFComments(POIXMLDocumentPart parent, PackagePart part) {
         super(parent, part);
+
+        if (!(getParent() instanceof XWPFDocument)) {
+            throw new IllegalStateException("Parent is not a XWPFDocuemnt: " + getParent());
+        }
         this.document = (XWPFDocument) getParent();
 
         if (this.document == null) {

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java Sun Jan  1 15:59:32 2023
@@ -32,6 +32,11 @@ public class XWPFPicture {
     public XWPFPicture(CTPicture ctPic, XWPFRun run) {
         this.run = run;
         this.ctPic = ctPic;
+
+        if (ctPic == null || ctPic.getNvPicPr() == null || ctPic.getNvPicPr().getCNvPr() == null) {
+            throw new IllegalArgumentException("Found missing data while reading picture data from " + ctPic);
+        }
+
         description = ctPic.getNvPicPr().getCNvPr().getDescr();
     }
 

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/HDGFDiagram.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/HDGFDiagram.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/HDGFDiagram.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hdgf/HDGFDiagram.java Sun Jan  1 15:59:32 2023
@@ -82,8 +82,11 @@ public final class HDGFDiagram extends P
         trailerPointer = ptrFactory.createPointer(_docstream, 0x24);
 
         // Now grab the trailer
-        trailer = (TrailerStream)
-            Stream.createStream(trailerPointer, _docstream, chunkFactory, ptrFactory);
+        Stream stream = Stream.createStream(trailerPointer, _docstream, chunkFactory, ptrFactory);
+        if (!(stream instanceof TrailerStream)) {
+            throw new IllegalStateException("Stream is not a TrailerStream: " + stream);
+        }
+        trailer = (TrailerStream)stream;
 
         // Finally, find all our streams
         trailer.findChildren(_docstream);

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/model/textproperties/HSLFTabStopPropCollection.java Sun Jan  1 15:59:32 2023
@@ -82,9 +82,8 @@ public class HSLFTabStopPropCollection e
         leo.writeShort(count);
         for (HSLFTabStop ts : tabStops) {
             leo.writeShort(ts.getPosition());
-            leo.writeShort(ts.getType().nativeId);
+            leo.writeShort(ts.getType() == null ? TabStopType.LEFT.nativeId : ts.getType().nativeId);
         }
-
     }
 
     @Override

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/SlideAtomLayout.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/SlideAtomLayout.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/SlideAtomLayout.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/SlideAtomLayout.java Sun Jan  1 15:59:32 2023
@@ -128,7 +128,7 @@ public class SlideAtomLayout implements
     public void writeOut(OutputStream out) throws IOException {
         // Write the geometry
         byte[] buf = new byte[4];
-        LittleEndian.putInt(buf, 0, geometry.getNativeId());
+        LittleEndian.putInt(buf, 0, geometry == null ? 0 : geometry.getNativeId());
         out.write(buf);
         // Write the placeholder IDs
         out.write(placeholderIDs);

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowImpl.java Sun Jan  1 15:59:32 2023
@@ -318,10 +318,14 @@ public final class HSLFSlideShowImpl ext
             recordMap.put(usrOffset, usr);
 
             int psrOffset = usr.getPersistPointersOffset();
-            PersistPtrHolder ptr = (PersistPtrHolder) Record.buildRecordAtOffset(docstream, psrOffset);
-            if (ptr == null) {
+            Record record = Record.buildRecordAtOffset(docstream, psrOffset);
+            if (record == null) {
                 throw new CorruptPowerPointFileException("Powerpoint document is missing a PersistPtrHolder at " + psrOffset);
             }
+            if (!(record instanceof PersistPtrHolder)) {
+                throw new CorruptPowerPointFileException("Record is not a PersistPtrHolder: " + record + " at " + psrOffset);
+            }
+            PersistPtrHolder ptr = (PersistPtrHolder) record;
             recordMap.put(psrOffset, ptr);
 
             for (Map.Entry<Integer, Integer> entry : ptr.getSlideLocationsLookup().entrySet()) {
@@ -609,6 +613,9 @@ public final class HSLFSlideShowImpl ext
         CountingOS cos = new CountingOS();
         for (Record record : _records) {
             // all top level records are position dependent
+            if (!(record instanceof PositionDependentRecord)) {
+                throw new CorruptPowerPointFileException("Record is not a position dependent record: " + record);
+            }
             PositionDependentRecord pdr = (PositionDependentRecord) record;
             int oldPos = pdr.getLastOnDiskOffset();
             int newPos = cos.size();
@@ -987,6 +994,10 @@ public final class HSLFSlideShowImpl ext
             throw new CorruptPowerPointFileException("Document record is missing");
         }
 
+        if (documentRecord.getPPDrawingGroup() == null) {
+            throw new CorruptPowerPointFileException("Drawing group is missing");
+        }
+
         EscherContainerRecord blipStore;
 
         EscherContainerRecord dggContainer = documentRecord.getPPDrawingGroup().getDggContainer();

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hsmf/extractor/OutlookTextExtractor.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hsmf/extractor/OutlookTextExtractor.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hsmf/extractor/OutlookTextExtractor.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hsmf/extractor/OutlookTextExtractor.java Sun Jan  1 15:59:32 2023
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.Locale;
 
@@ -127,7 +128,7 @@ public class OutlookTextExtractor implem
             // First try via the proper chunk
             SimpleDateFormat f = new SimpleDateFormat("E, d MMM yyyy HH:mm:ss Z", Locale.ROOT);
             f.setTimeZone(LocaleUtil.getUserTimeZone());
-            s.append("Date: ").append(f.format(msg.getMessageDate().getTime())).append("\n");
+            s.append("Date: ").append(f.format(msg.getMessageDate() == null ? new Date(0) : msg.getMessageDate().getTime())).append("\n");
         } catch (ChunkNotFoundException e) {
             try {
                 // Failing that try via the raw headers

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/Sttb.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/Sttb.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/Sttb.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/Sttb.java Sun Jan  1 15:59:32 2023
@@ -142,7 +142,7 @@ public class Sttb
                 // cchData
                 size += LittleEndianConsts.SHORT_SIZE;
                 // data
-                size += 2 * data.length();
+                size += 2 * (data == null ? 0 : data.length());
             }
         }
         else
@@ -152,7 +152,7 @@ public class Sttb
                 // cchData
                 size += LittleEndianConsts.BYTE_SIZE;
                 // data
-                size += data.length();
+                size += (data == null ? 0 : data.length());
             }
         }
 

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java Sun Jan  1 15:59:32 2023
@@ -81,7 +81,12 @@ final class LinkTable {
             int nCRNs = _countRecord.getNumberOfCRNs();
             CRNRecord[] crns = new CRNRecord[nCRNs];
             for (int i = 0; i < crns.length; i++) {
-                crns[i] = (CRNRecord) rs.getNext();
+                Record record = rs.getNext();
+                if (!(record instanceof CRNRecord)) {
+                    throw new IllegalStateException("Record is not a CRNRecord: " +
+                            (record == null ? "<null>" : record.getClass() + ": " + record) );
+                }
+                crns[i] = (CRNRecord) record;
             }
             _crns = crns;
         }

Modified: poi/trunk/poi/src/main/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/poifs/crypt/agile/AgileEncryptionVerifier.java Sun Jan  1 15:59:32 2023
@@ -44,7 +44,7 @@ public class AgileEncryptionVerifier ext
             }
         }
 
-        if (keyData == null) {
+        if (keyData == null || keyData.getHashSize() == null) {
             throw new IllegalArgumentException("encryptedKey not set");
         }
 

Modified: poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java Sun Jan  1 15:59:32 2023
@@ -105,12 +105,16 @@ public final class PropertyTable impleme
             PropertyFactory.convertToProperties(data, _properties);
         }
 
-        if (_properties.get(0) != null) {
-            populatePropertyTree((DirectoryProperty) _properties.get(0));
+        Property property = _properties.get(0);
+        if (property != null) {
+            if (property instanceof DirectoryProperty) {
+                populatePropertyTree((DirectoryProperty) property);
+            } else {
+                throw new IOException("Invalid format, cannot convert property " + property + " to DirectoryProperty");
+            }
         }
     }
 
-
     /**
      * Add a property to the list of properties we manage
      *

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/usermodel/DataFormatter.java Sun Jan  1 15:59:32 2023
@@ -371,6 +371,10 @@ public class DataFormatter {
     }
 
     private Format getFormat(double cellValue, int formatIndex, String formatStrIn, boolean use1904Windowing) {
+        if (formatStrIn == null) {
+            throw new IllegalArgumentException("Missing input format for value " + cellValue + " and index " + formatIndex);
+        }
+
         checkForLocaleChange();
 
         // Might be better to separate out the n p and z formats, falling back to p when n and z are not set.

Modified: poi/trunk/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java?rev=1906322&r1=1906321&r2=1906322&view=diff
==============================================================================
--- poi/trunk/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java (original)
+++ poi/trunk/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java Sun Jan  1 15:59:32 2023
@@ -22,8 +22,11 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -32,6 +35,7 @@ import java.util.Map;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.record.BOFRecord;
+import org.apache.poi.hssf.record.CRNCountRecord;
 import org.apache.poi.hssf.record.CountryRecord;
 import org.apache.poi.hssf.record.EOFRecord;
 import org.apache.poi.hssf.record.ExternSheetRecord;
@@ -39,11 +43,13 @@ import org.apache.poi.hssf.record.Extern
 import org.apache.poi.hssf.record.NameCommentRecord;
 import org.apache.poi.hssf.record.NameRecord;
 import org.apache.poi.hssf.record.Record;
+import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.SSTRecord;
 import org.apache.poi.hssf.record.SupBookRecord;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.formula.ptg.NameXPtg;
+import org.apache.poi.util.LittleEndian;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -51,7 +57,7 @@ import org.junit.jupiter.api.Test;
  */
 final class TestLinkTable {
 
-    /**
+    /*
      * The example file attached to bugzilla 45046 is a clear example of Name records being present
      * without an External Book (SupBook) record.  Excel has no trouble reading this file.<br>
      * TODO get OOO documentation updated to reflect this (that EXTERNALBOOK is optional).
@@ -59,61 +65,64 @@ final class TestLinkTable {
      * It's not clear what exact steps need to be taken in Excel to create such a workbook
      */
     @Test
-    void testLinkTableWithoutExternalBookRecord_bug45046() {
+    void testLinkTableWithoutExternalBookRecord_bug45046() throws IOException {
         // Bug 45046 b: DEFINEDNAME is part of LinkTable
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45046-21984.xls");
-        // some other sanity checks
-        assertEquals(3, wb.getNumberOfSheets());
-        String formula = wb.getSheetAt(0).getRow(4).getCell(13).getCellFormula();
-
-        // The reported symptom of this bugzilla is an earlier bug (already fixed)
-        // This is observable in version 3.0
-        assertNotEquals("ipcSummenproduktIntern($P5,N$6,$A$9,N$5)", formula);
+        try (HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45046-21984.xls")) {
+            // some other sanity checks
+            assertEquals(3, wb.getNumberOfSheets());
+            String formula = wb.getSheetAt(0).getRow(4).getCell(13).getCellFormula();
+
+            // The reported symptom of this bugzilla is an earlier bug (already fixed)
+            // This is observable in version 3.0
+            assertNotEquals("ipcSummenproduktIntern($P5,N$6,$A$9,N$5)", formula);
 
-        assertEquals("ipcSummenproduktIntern($C5,N$2,$A$9,N$1)", formula);
+            assertEquals("ipcSummenproduktIntern($C5,N$2,$A$9,N$1)", formula);
+        }
     }
 
     @Test
-    void testMultipleExternSheetRecords_bug45698() {
+    void testMultipleExternSheetRecords_bug45698() throws IOException {
         // Bug: Extern sheet is part of LinkTable
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45698-22488.xls");
-        // some other sanity checks
-        assertEquals(7, wb.getNumberOfSheets());
+        try (HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45698-22488.xls")) {
+            // some other sanity checks
+            assertEquals(7, wb.getNumberOfSheets());
+        }
     }
 
     @Test
-    void testExtraSheetRefs_bug45978() {
-        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45978-extraLinkTableSheets.xls");
-        /*
-        ex45978-extraLinkTableSheets.xls is a cut-down version of attachment 22561.
-        The original file produces the same error.
-
-        This bug was caused by a combination of invalid sheet indexes in the EXTERNSHEET
-        record, and eager initialisation of the extern sheet references. Note - the workbook
-        has 2 sheets, but the EXTERNSHEET record refers to sheet indexes 0, 1 and 2.
-
-        Offset 0x3954 (14676)
-        recordid = 0x17, size = 32
-        [EXTERNSHEET]
-           numOfRefs     = 5
-        refrec       #0: extBook=0 firstSheet=0 lastSheet=0
-        refrec       #1: extBook=1 firstSheet=2 lastSheet=2
-        refrec       #2: extBook=2 firstSheet=1 lastSheet=1
-        refrec       #3: extBook=0 firstSheet=-1 lastSheet=-1
-        refrec       #4: extBook=0 firstSheet=1 lastSheet=1
-        [/EXTERNSHEET]
-
-        As it turns out, the formula in question doesn't even use externSheetIndex #1 - it
-        uses #4, which resolves to sheetIndex 1 -> 'Data'.
-
-        It is not clear exactly what externSheetIndex #4 would refer to.  Excel seems to
-        display such a formula as "''!$A2", but then complains of broken link errors.
-        */
-
-        HSSFCell cell = wb.getSheetAt(0).getRow(1).getCell(1);
-        // Bug: IndexOutOfBoundsException - Index: 2, Size: 2
-        String cellFormula = cell.getCellFormula();
-        assertEquals("Data!$A2", cellFormula);
+    void testExtraSheetRefs_bug45978() throws IOException {
+        try (HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex45978-extraLinkTableSheets.xls")) {
+            /*
+            ex45978-extraLinkTableSheets.xls is a cut-down version of attachment 22561.
+            The original file produces the same error.
+
+            This bug was caused by a combination of invalid sheet indexes in the EXTERNSHEET
+            record, and eager initialisation of the extern sheet references. Note - the workbook
+            has 2 sheets, but the EXTERNSHEET record refers to sheet indexes 0, 1 and 2.
+
+            Offset 0x3954 (14676)
+            recordid = 0x17, size = 32
+            [EXTERNSHEET]
+               numOfRefs     = 5
+            refrec       #0: extBook=0 firstSheet=0 lastSheet=0
+            refrec       #1: extBook=1 firstSheet=2 lastSheet=2
+            refrec       #2: extBook=2 firstSheet=1 lastSheet=1
+            refrec       #3: extBook=0 firstSheet=-1 lastSheet=-1
+            refrec       #4: extBook=0 firstSheet=1 lastSheet=1
+            [/EXTERNSHEET]
+
+            As it turns out, the formula in question doesn't even use externSheetIndex #1 - it
+            uses #4, which resolves to sheetIndex 1 -> 'Data'.
+
+            It is not clear exactly what externSheetIndex #4 would refer to.  Excel seems to
+            display such a formula as "''!$A2", but then complains of broken link errors.
+            */
+
+            HSSFCell cell = wb.getSheetAt(0).getRow(1).getCell(1);
+            // Bug: IndexOutOfBoundsException - Index: 2, Size: 2
+            String cellFormula = cell.getCellFormula();
+            assertEquals("Data!$A2", cellFormula);
+        }
     }
 
     /**
@@ -122,7 +131,6 @@ final class TestLinkTable {
      */
     @Test
     void testMissingExternSheetRecord_bug47001b() {
-
         Record[] recs = {
                 SupBookRecord.createAddInFunctions(),
                 new SSTRecord(),
@@ -136,8 +144,30 @@ final class TestLinkTable {
     }
 
     @Test
-    void testNameCommentRecordBetweenNameRecords() {
+    void testCRNCountRecordInvalid() {
+        byte[] data = new byte[22];
+        LittleEndian.putShort(data, 0, CRNCountRecord.sid);
+        LittleEndian.putShort(data, 2, (short)18);
+        LittleEndian.putShort(data, 4, (short)55);
+        LittleEndian.putInt(data, 6, 56);
+
+        RecordInputStream in = new RecordInputStream(new ByteArrayInputStream(data));
+        in.nextRecord();
 
+        Record[] recs = {
+                SupBookRecord.createAddInFunctions(),
+                new CRNCountRecord(in),
+                new SSTRecord(),
+        };
+        List<org.apache.poi.hssf.record.Record> recList = Arrays.asList(recs);
+        WorkbookRecordList wrl = new WorkbookRecordList();
+
+        assertThrows(IllegalStateException.class,
+                () -> new LinkTable(recList, 0, wrl, Collections.emptyMap()));
+    }
+
+    @Test
+    void testNameCommentRecordBetweenNameRecords() {
         final Record[] recs = {
         new NameRecord(),
         new NameCommentRecord("name1", "comment1"),
@@ -251,6 +281,5 @@ final class TestLinkTable {
 
         assertEquals(0, tbl.resolveNameXIx(namex2.getSheetRefIndex(), namex2.getNameIndex()));
         assertEquals("ISEVEN", tbl.resolveNameXText(namex2.getSheetRefIndex(), namex2.getNameIndex(), null));
-
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org