This is an automated email from the ASF dual-hosted git repository.

centic pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git

commit 18ef01295d6dc846c5d755c0c3711763862fca7b
Author: Dominik Stadler <[email protected]>
AuthorDate: Sun Jan 11 19:24:55 2026 +0100

    Avoid some NPEs when handling LinkTables
---
 .../java/org/apache/poi/hssf/model/LinkTable.java  | 25 +++++++++++++++-------
 .../org/apache/poi/hssf/model/TestLinkTable.java   |  3 +++
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java 
b/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java
index fe5848ca53..79ec7f0b9f 100644
--- a/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java
+++ b/poi/src/main/java/org/apache/poi/hssf/model/LinkTable.java
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.model;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -248,8 +247,9 @@ final class LinkTable {
 
         int nItems = temp.size();
         if (nItems < 1) {
+            Class<? extends Record> nextClass = rs.peekNextClass();
             throw new IllegalStateException("Expected an EXTERNSHEET record 
but got ("
-                    + rs.peekNextClass().getName() + ")");
+                    + (nextClass == null ? "<null>" : nextClass.getName()) + 
")");
         }
         if (nItems == 1) {
             // this is the normal case. There should be just one 
ExternSheetRecord
@@ -368,6 +368,10 @@ final class LinkTable {
     }
 
     public String[] getExternalBookAndSheetName(int extRefIndex) {
+        if (_externSheetRecord == null) {
+            throw new IllegalStateException("ExternSheetRecord is not set");
+        }
+
         int ebIx = _externSheetRecord.getExtbookIndexFromRefIndex(extRefIndex);
         SupBookRecord ebr = _externalBookBlocks[ebIx].getExternalBookRecord();
         if (!ebr.isExternalReferences()) {
@@ -378,11 +382,12 @@ final class LinkTable {
         int shIx2 = 
_externSheetRecord.getLastSheetIndexFromRefIndex(extRefIndex);
         String firstSheetName = null;
         String lastSheetName = null;
-        if (shIx1 >= 0) {
-            firstSheetName = ebr.getSheetNames()[shIx1];
+        String[] sheetNames = ebr.getSheetNames();
+        if (shIx1 >= 0 && sheetNames != null) {
+            firstSheetName = sheetNames[shIx1];
         }
-        if (shIx2 >= 0) {
-            lastSheetName = ebr.getSheetNames()[shIx2];
+        if (shIx2 >= 0 && sheetNames != null) {
+            lastSheetName = sheetNames[shIx2];
         }
         if (shIx1 == shIx2) {
             return new String[]{
@@ -452,8 +457,12 @@ final class LinkTable {
         }
         SupBookRecord ebrTarget = 
_externalBookBlocks[externalBookIndex].getExternalBookRecord();
 
-        int firstSheetIndex = getSheetIndex(ebrTarget.getSheetNames(), 
firstSheetName);
-        int lastSheetIndex = getSheetIndex(ebrTarget.getSheetNames(), 
lastSheetName);
+        String[] sheetNames = ebrTarget.getSheetNames();
+        if (sheetNames == null) {
+            throw new IllegalStateException("Sheet names are not available for 
the ExternalBookRecord");
+        }
+        int firstSheetIndex = getSheetIndex(sheetNames, firstSheetName);
+        int lastSheetIndex = getSheetIndex(sheetNames, lastSheetName);
 
         // Find or add the external sheet record definition for this
         int result = _externSheetRecord.getRefIxForSheet(externalBookIndex, 
firstSheetIndex, lastSheetIndex);
diff --git a/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java 
b/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java
index 57355c3de5..be862dd1aa 100644
--- a/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java
+++ b/poi/src/test/java/org/apache/poi/hssf/model/TestLinkTable.java
@@ -141,6 +141,9 @@ final class TestLinkTable {
         // Bug 47001b: Expected an EXTERNSHEET record but got 
(org.apache.poi.hssf.record.SSTRecord)
         LinkTable lt = new LinkTable(recList, 0, wrl, Collections.emptyMap());
         assertNotNull(lt);
+
+        assertThrows(IllegalStateException.class,
+                () -> lt.getExternalBookAndSheetName(0));
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to