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]
