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/03 19:52:04 UTC

svn commit: r1906360 - in /poi/trunk: poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/ poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/ poi-scratchpad/src/main/java/org/apache/po...

Author: centic
Date: Tue Jan  3 19:52:03 2023
New Revision: 1906360

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

This mostly only makes thrown runtime-exceptions a bit more consistent and
improves information in exceptions.

Modified:
    poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XmlVisioDocument.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ExObjList.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSheet.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.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/hwpf/model/StyleSheet.java
    poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java
    poi/trunk/poi/src/main/java/org/apache/poi/ddf/EscherBSERecord.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
    poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java
    poi/trunk/poi/src/main/java/org/apache/poi/poifs/property/PropertyTable.java

Modified: poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XmlVisioDocument.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XmlVisioDocument.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XmlVisioDocument.java (original)
+++ poi/trunk/poi-ooxml/src/main/java/org/apache/poi/xdgf/usermodel/XmlVisioDocument.java Tue Jan  3 19:52:03 2023
@@ -122,11 +122,13 @@ public class XmlVisioDocument extends PO
      * @return pages ordered by page number
      */
     public Collection<XDGFPage> getPages() {
+        if (_pages == null) {
+            throw new IllegalStateException("No page-information available");
+        }
         return _pages.getPageList();
     }
 
     public XDGFStyleSheet getStyleById(long id) {
         return _document.getStyleById(id);
     }
-
 }

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ExObjList.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ExObjList.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ExObjList.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/record/ExObjList.java Tue Jan  3 19:52:03 2023
@@ -117,7 +117,8 @@ public class ExObjList extends RecordCon
         for (Record child : _children) {
             if (child instanceof ExHyperlink) {
                 ExHyperlink rec = (ExHyperlink) child;
-                if (rec.getExHyperlinkAtom().getNumber() == id) {
+                if (rec.getExHyperlinkAtom() != null &&
+                        rec.getExHyperlinkAtom().getNumber() == id) {
                     return rec;
                 }
             }

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFShapeFactory.java Tue Jan  3 19:52:03 2023
@@ -63,7 +63,11 @@ public final class HSLFShapeFactory {
 
     public static HSLFGroupShape createShapeGroup(EscherContainerRecord spContainer, ShapeContainer<HSLFShape,HSLFTextParagraph> parent){
         boolean isTable = false;
-        EscherContainerRecord ecr = (EscherContainerRecord)spContainer.getChild(0);
+        EscherRecord child = spContainer.getChild(0);
+        if (!(child instanceof EscherContainerRecord)) {
+            throw new RecordFormatException("Did not have a EscherContainerRecord: " + child);
+        }
+        EscherContainerRecord ecr = (EscherContainerRecord) child;
         EscherRecord opt = HSLFShape.getEscherChild(ecr, EscherRecordTypes.USER_DEFINED);
 
         if (opt != null) {

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSheet.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSheet.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSheet.java Tue Jan  3 19:52:03 2023
@@ -172,6 +172,9 @@ public abstract class HSLFSheet implemen
                 continue;
             }
 
+            if (!(r instanceof EscherContainerRecord)) {
+                throw new IllegalArgumentException("Did not have a EscherContainerRecord: " + r);
+            }
             EscherContainerRecord sp = (EscherContainerRecord)r;
             HSLFShape sh = HSLFShapeFactory.createShape(sp, null);
             sh.setSheet(this);

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hslf/usermodel/HSLFSlideShowEncrypted.java Tue Jan  3 19:52:03 2023
@@ -120,11 +120,17 @@ public class HSLFSlideShowEncrypted impl
             recordMap.put(encOffset, r);
         }
 
+        if (!(r instanceof DocumentEncryptionAtom)) {
+            throw new EncryptedPowerPointFileException("Did not have a DocumentEncryptionAtom: " + r);
+        }
         this.dea = (DocumentEncryptionAtom)r;
 
         String pass = Biff8EncryptionKey.getCurrentUserPassword();
         EncryptionInfo ei = getEncryptionInfo();
         try {
+            if (ei == null || ei.getDecryptor() == null) {
+                throw new IllegalStateException("Invalid encryption-info: " + ei);
+            }
             if(!ei.getDecryptor().verifyPassword(pass != null ? pass : Decryptor.DEFAULT_PASSWORD)) {
                 throw new EncryptedPowerPointFileException("PowerPoint file is encrypted. The correct password needs to be set via Biff8EncryptionKey.setCurrentUserPassword()");
             }

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=1906360&r1=1906359&r2=1906360&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 Tue Jan  3 19:52:03 2023
@@ -310,10 +310,11 @@ public final class HSLFSlideShowImpl ext
 
     private void initRecordOffsets(byte[] docstream, int usrOffset, NavigableMap<Integer, Record> recordMap, Map<Integer, Integer> offset2id) {
         while (usrOffset != 0) {
-            UserEditAtom usr = (UserEditAtom) Record.buildRecordAtOffset(docstream, usrOffset);
-            if (usr == null) {
-                throw new CorruptPowerPointFileException("Powerpoint document contains no user edit atom");
+            Record builtRecord = Record.buildRecordAtOffset(docstream, usrOffset);
+            if (!(builtRecord instanceof UserEditAtom)) {
+                throw new CorruptPowerPointFileException("Did not have a user edit atom: " + builtRecord);
             }
+            UserEditAtom usr = (UserEditAtom) builtRecord;
 
             recordMap.put(usrOffset, usr);
 
@@ -500,6 +501,9 @@ public final class HSLFSlideShowImpl ext
         //  records share an offset.
         Map<Integer, List<EscherBSERecord>> unmatchedRecords = new HashMap<>();
         for (EscherRecord child : blipStore) {
+            if (!(child instanceof EscherBSERecord)) {
+                throw new CorruptPowerPointFileException("Did not have a EscherBSERecord: " + child);
+            }
             EscherBSERecord record = (EscherBSERecord) child;
             unmatchedRecords.computeIfAbsent(record.getOffset(), k -> new ArrayList<>()).add(record);
         }
@@ -984,7 +988,13 @@ public final class HSLFSlideShowImpl ext
     private EscherContainerRecord getBlipStore() {
         Document documentRecord = null;
         for (Record record : _records) {
+            if (record == null) {
+                throw new CorruptPowerPointFileException("Did not have a valid record: " + record);
+            }
             if (record.getRecordType() == RecordTypes.Document.typeID) {
+                if (!(record instanceof Document)) {
+                    throw new CorruptPowerPointFileException("Did not have a Document: " + record);
+                }
                 documentRecord = (Document) record;
                 break;
             }

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/StyleSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/StyleSheet.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/StyleSheet.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/StyleSheet.java Tue Jan  3 19:52:03 2023
@@ -62,7 +62,7 @@ public final class StyleSheet {
     /**
      * General information about a stylesheet
      */
-    private Stshif _stshif;
+    private final Stshif _stshif;
 
     StyleDescription[] _styleDescriptions;
 
@@ -205,6 +205,10 @@ public final class StyleSheet {
     @Deprecated
     private void createPap(int istd) {
         StyleDescription sd = _styleDescriptions[istd];
+        if (sd == null) {
+            throw new IllegalStateException("Cannot create Pap, empty styleDescription, had : " + _styleDescriptions.length + " descriptions");
+        }
+
         ParagraphProperties pap = sd.getPAP();
         byte[] papx = sd.getPAPX();
         int baseIndex = sd.getBaseStyle();
@@ -212,7 +216,11 @@ public final class StyleSheet {
             ParagraphProperties parentPAP = new ParagraphProperties();
             if (baseIndex != NIL_STYLE) {
 
-                parentPAP = _styleDescriptions[baseIndex].getPAP();
+                StyleDescription styleDescription = _styleDescriptions[baseIndex];
+                if (styleDescription == null) {
+                    throw new IllegalStateException("Cannot create Pap, empty styleDescription, had : " + _styleDescriptions.length + " descriptions");
+                }
+                parentPAP = styleDescription.getPAP();
                 if (parentPAP == null) {
                     if (baseIndex == istd) {
                         // Oh dear, style claims that it is its own parent
@@ -220,7 +228,7 @@ public final class StyleSheet {
                     }
                     // Create the parent style
                     createPap(baseIndex);
-                    parentPAP = _styleDescriptions[baseIndex].getPAP();
+                    parentPAP = styleDescription.getPAP();
                 }
 
             }
@@ -247,6 +255,10 @@ public final class StyleSheet {
     @Deprecated
     private void createChp(int istd) {
         StyleDescription sd = _styleDescriptions[istd];
+        if (sd == null) {
+            throw new IllegalStateException("Cannot create Chp, empty styleDescription, had : " + _styleDescriptions.length + " descriptions");
+        }
+
         CharacterProperties chp = sd.getCHP();
         byte[] chpx = sd.getCHPX();
         int baseIndex = sd.getBaseStyle();
@@ -263,10 +275,15 @@ public final class StyleSheet {
         if (chp == null && chpx != null) {
             CharacterProperties parentCHP = new CharacterProperties();
             if (baseIndex != NIL_STYLE) {
-                parentCHP = _styleDescriptions[baseIndex].getCHP();
+                StyleDescription styleDescription = _styleDescriptions[baseIndex];
+                if (styleDescription == null) {
+                    throw new IllegalStateException("Cannot create Chp, empty styleDescription, had : " + _styleDescriptions.length + " descriptions");
+                }
+
+                parentCHP = styleDescription.getCHP();
                 if (parentCHP == null) {
                     createChp(baseIndex);
-                    parentCHP = _styleDescriptions[baseIndex].getCHP();
+                    parentCHP = styleDescription.getCHP();
                 }
                 if (parentCHP == null) {
                     parentCHP = new CharacterProperties();

Modified: poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java (original)
+++ poi/trunk/poi-scratchpad/src/main/java/org/apache/poi/hwpf/sprm/TableSprmUncompressor.java Tue Jan  3 19:52:03 2023
@@ -285,6 +285,9 @@ public final class TableSprmUncompressor
 
         for (int c = itcFirst; c < itcLim; c++) {
           TableCellDescriptor tableCellDescriptor = newTAP.getRgtc()[c];
+          if (tableCellDescriptor == null) {
+            throw new IllegalStateException("Cannot unCompress TAP, empty table cell descriptor, had : " + newTAP.getRgtc().length + " Rgtc");
+          }
 
           if ((grfbrc & 0x01) != 0) {
             tableCellDescriptor.setFtsCellPaddingTop(ftsWidth);

Modified: poi/trunk/poi/src/main/java/org/apache/poi/ddf/EscherBSERecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ddf/EscherBSERecord.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ddf/EscherBSERecord.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ddf/EscherBSERecord.java Tue Jan  3 19:52:03 2023
@@ -111,8 +111,13 @@ public final class EscherBSERecord exten
 
         int bytesRead = 0;
         if (bytesRemaining > 0) {
+            EscherRecord record = recordFactory.createRecord(data, pos + 36);
+            if (!(record instanceof EscherBlipRecord)) {
+                throw new IllegalArgumentException("Did not have a EscherBlipRecord: " + record);
+            }
+
             // Some older escher formats skip this last record
-            field_12_blipRecord = (EscherBlipRecord) recordFactory.createRecord( data, pos + 36 );
+            field_12_blipRecord = (EscherBlipRecord) record;
             bytesRead = field_12_blipRecord.fillFields( data, pos + 36, recordFactory );
         }
         pos += 36 + bytesRead;

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java Tue Jan  3 19:52:03 2023
@@ -44,6 +44,7 @@ import org.apache.poi.hssf.record.Record
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.poifs.filesystem.DirectoryNode;
 import org.apache.poi.poifs.filesystem.DocumentNode;
+import org.apache.poi.poifs.filesystem.Entry;
 import org.apache.poi.poifs.filesystem.FileMagic;
 import org.apache.poi.poifs.filesystem.NotOLE2FileException;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@@ -149,14 +150,18 @@ public class OldExcelExtractor implement
     private void open(DirectoryNode directory) throws IOException {
         DocumentNode book;
         try {
-            book = (DocumentNode)directory.getEntry(OLD_WORKBOOK_DIR_ENTRY_NAME);
+            Entry entry = directory.getEntry(OLD_WORKBOOK_DIR_ENTRY_NAME);
+            if (!(entry instanceof DocumentNode)) {
+                throw new IllegalArgumentException("Did not have an Excel 5/95 Book stream: " + entry);
+            }
+            book = (DocumentNode) entry;
         } catch (FileNotFoundException | IllegalArgumentException e) {
             // some files have "Workbook" instead
-            book = (DocumentNode)directory.getEntry(WORKBOOK_DIR_ENTRY_NAMES.get(0));
-        }
-
-        if (book == null) {
-            throw new IOException("No Excel 5/95 Book stream found");
+            Entry entry = directory.getEntry(WORKBOOK_DIR_ENTRY_NAMES.get(0));
+            if (!(entry instanceof DocumentNode)) {
+                throw new IllegalArgumentException("Did not have an Excel 5/95 Book stream: " + entry);
+            }
+            book = (DocumentNode) entry;
         }
 
         ris = new RecordInputStream(directory.createDocumentInputStream(book));

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/model/InternalWorkbook.java Tue Jan  3 19:52:03 2023
@@ -830,7 +830,11 @@ public final class InternalWorkbook {
 
         xfptr += index;
 
-        return ( ExtendedFormatRecord ) records.get(xfptr);
+        Record record = records.get(xfptr);
+        if (!(record instanceof ExtendedFormatRecord)) {
+            throw new IllegalStateException("Did not have a ExtendedFormatRecord: " + record);
+        }
+        return (ExtendedFormatRecord) record;
     }
 
     /**

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/record/aggregates/CFRecordsAggregate.java Tue Jan  3 19:52:03 2023
@@ -125,7 +125,11 @@ public final class CFRecordsAggregate ex
 
         CFRuleBase[] rules = new CFRuleBase[nRules];
         for (int i = 0; i < rules.length; i++) {
-            rules[i] = (CFRuleBase) rs.getNext();
+            Record record = rs.getNext();
+            if (!(record instanceof CFRuleBase)) {
+                throw new IllegalArgumentException("Did not have a CFRuleBase: " + record);
+            }
+            rules[i] = (CFRuleBase) record;
         }
 
         return new CFRecordsAggregate(header, rules);

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java Tue Jan  3 19:52:03 2023
@@ -32,6 +32,7 @@ import org.apache.poi.ddf.EscherContaine
 import org.apache.poi.ddf.EscherDgRecord;
 import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherProperty;
+import org.apache.poi.ddf.EscherRecord;
 import org.apache.poi.ddf.EscherSpRecord;
 import org.apache.poi.ddf.EscherSpgrRecord;
 import org.apache.poi.hssf.model.DrawingManager2;
@@ -80,9 +81,24 @@ public final class HSSFPatriarch impleme
     HSSFPatriarch(HSSFSheet sheet, EscherAggregate boundAggregate) {
         _sheet = sheet;
         _boundAggregate = boundAggregate;
+
+        if (_boundAggregate == null || _boundAggregate.getEscherContainer() == null) {
+            throw new IllegalArgumentException("Could not read mainSpgrContainer from " + _boundAggregate);
+        }
+
         _mainSpgrContainer = _boundAggregate.getEscherContainer().getChildContainers().get(0);
-        EscherContainerRecord spContainer = (EscherContainerRecord) _boundAggregate.getEscherContainer()
-                .getChildContainers().get(0).getChild(0);
+
+        if (_mainSpgrContainer == null) {
+            throw new IllegalArgumentException("Could not read mainSpgrContainer from " + _boundAggregate);
+        }
+
+        EscherRecord child = _mainSpgrContainer.getChild(0);
+
+        if (!(child instanceof EscherContainerRecord)) {
+            throw new IllegalArgumentException("Did not have a EscherContainerRecord: " + child);
+        }
+
+        EscherContainerRecord spContainer = (EscherContainerRecord) child;
         _spgrRecord = spContainer.getChildById(EscherSpgrRecord.RECORD_ID);
         buildShapeTree();
     }
@@ -171,10 +187,10 @@ public final class HSSFPatriarch impleme
     /**
      * Creates a simple shape.  This includes such shapes as lines, rectangles,
      * and ovals.
-     * 
-     * Note: Microsoft Excel seems to sometimes disallow 
-     * higher y1 than y2 or higher x1 than x2 in the anchor, you might need to 
-     * reverse them and draw shapes vertically or horizontally flipped! 
+     *
+     * Note: Microsoft Excel seems to sometimes disallow
+     * higher y1 than y2 or higher x1 than x2 in the anchor, you might need to
+     * reverse them and draw shapes vertically or horizontally flipped!
      *
      * @param anchor the client anchor describes how this group is attached
      *               to the sheet.
@@ -234,14 +250,14 @@ public final class HSSFPatriarch impleme
         ftCmo.setReserved2(0);
         ftCmo.setReserved3(0);
         obj.addSubRecord(ftCmo);
-        
-        // FtCf (pictFormat) 
+
+        // FtCf (pictFormat)
         FtCfSubRecord ftCf = new FtCfSubRecord();
         HSSFPictureData pictData = getSheet().getWorkbook().getAllPictures().get(pictureIndex-1);
         switch (pictData.getFormat()) {
             case Workbook.PICTURE_TYPE_WMF:
             case Workbook.PICTURE_TYPE_EMF:
-                // this needs patch #49658 to be applied to actually work 
+                // this needs patch #49658 to be applied to actually work
                 ftCf.setFlags(FtCfSubRecord.METAFILE_BIT);
                 break;
             case Workbook.PICTURE_TYPE_DIB:
@@ -258,12 +274,12 @@ public final class HSSFPatriarch impleme
         FtPioGrbitSubRecord ftPioGrbit = new FtPioGrbitSubRecord();
         ftPioGrbit.setFlagByBit(FtPioGrbitSubRecord.AUTO_PICT_BIT, true);
         obj.addSubRecord(ftPioGrbit);
-        
+
         EmbeddedObjectRefSubRecord ftPictFmla = new EmbeddedObjectRefSubRecord();
         ftPictFmla.setUnknownFormulaData(new byte[]{2, 0, 0, 0, 0});
         ftPictFmla.setOleClassname("Paket");
         ftPictFmla.setStorageId(storageId);
-        
+
         obj.addSubRecord(ftPictFmla);
         obj.addSubRecord(new EndSubRecord());
 
@@ -278,22 +294,22 @@ public final class HSSFPatriarch impleme
         } catch (FileNotFoundException e) {
             throw new IllegalStateException("trying to add ole shape without actually adding data first - use HSSFWorkbook.addOlePackage first", e);
         }
-        
+
         // create picture shape, which need to be minimal modified for oleshapes
         HSSFPicture shape = new HSSFPicture(null, (HSSFClientAnchor)anchor);
         shape.setPictureIndex(pictureIndex);
         EscherContainerRecord spContainer = shape.getEscherContainer();
         EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
         spRecord.setFlags(spRecord.getFlags() |  EscherSpRecord.FLAG_OLESHAPE);
-        
-        HSSFObjectData oleShape = new HSSFObjectData(spContainer, obj, oleRoot); 
+
+        HSSFObjectData oleShape = new HSSFObjectData(spContainer, obj, oleRoot);
         addShape(oleShape);
         onCreate(oleShape);
-        
-        
+
+
         return oleShape;
     }
-    
+
     /**
      * Creates a polygon
      *

Modified: poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java?rev=1906360&r1=1906359&r2=1906360&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java (original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java Tue Jan  3 19:52:03 2023
@@ -69,12 +69,22 @@ public class HSSFShapeFactory {
 
             for (EscherRecord record : container) {
                 switch (EscherRecordTypes.forTypeID(record.getRecordId())) {
-                    case CLIENT_DATA:
-                        objRecord = (ObjRecord) shapeToObj.get(record);
+                    case CLIENT_DATA: {
+                        Record subRecord = shapeToObj.get(record);
+                        if (!(subRecord instanceof ObjRecord)) {
+                            throw new RecordFormatException("Did not have a ObjRecord: " + subRecord);
+                        }
+                        objRecord = (ObjRecord) subRecord;
                         break;
-                    case CLIENT_TEXTBOX:
-                        txtRecord = (TextObjectRecord) shapeToObj.get(record);
+                    }
+                    case CLIENT_TEXTBOX: {
+                        Record subRecord = shapeToObj.get(record);
+                        if (!(subRecord instanceof TextObjectRecord)) {
+                            throw new RecordFormatException("Did not have a TextObjRecord: " + subRecord);
+                        }
+                        txtRecord = (TextObjectRecord) subRecord;
                         break;
+                    }
                     default:
                         break;
                 }

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=1906360&r1=1906359&r2=1906360&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 Tue Jan  3 19:52:03 2023
@@ -140,7 +140,13 @@ public final class PropertyTable impleme
      */
     public RootProperty getRoot() {
         // it's always the first element in the List
-        return ( RootProperty ) _properties.get(0);
+        Property property = _properties.get(0);
+        if (property instanceof RootProperty) {
+            return (RootProperty) property;
+        } else {
+            throw new IllegalStateException("Invalid format, cannot convert property " +
+                    property + " to RootProperty");
+        }
     }
 
     /**



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