This is an automated email from the ASF dual-hosted git repository. centic9 pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/poi.git
commit 2dc218645c7f291f90645ef4f087b60c9337a485 Author: Dominik Stadler <[email protected]> AuthorDate: Sun Mar 8 09:11:05 2026 +0100 Avoid NPE when parsing Formula --- .../org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java | 7 ++++++- poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java | 4 ++++ poi/src/main/java/org/apache/poi/ss/formula/SheetIdentifier.java | 5 +++++ .../test/java/org/apache/poi/hssf/model/TestFormulaParser.java | 8 +++++++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java index efd766b1d0..f53bcf2648 100644 --- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java +++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java @@ -27,6 +27,7 @@ import org.apache.poi.ss.formula.EvaluationSheet; import org.apache.poi.ss.formula.EvaluationWorkbook; import org.apache.poi.ss.formula.FormulaParsingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook; +import org.apache.poi.ss.formula.NameIdentifier; import org.apache.poi.ss.formula.SheetIdentifier; import org.apache.poi.ss.formula.SheetRangeIdentifier; import org.apache.poi.ss.formula.ptg.Area3DPtg; @@ -277,7 +278,11 @@ public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E extIx = -1; } else { String workbookName = sheetIden.getBookName(); - String firstSheetName = sheetIden.getSheetIdentifier().getName(); + NameIdentifier sheetIdentifier = sheetIden.getSheetIdentifier(); + if (sheetIdentifier == null) { + throw new IllegalStateException("Did not have a sheet identifier for formula evaluation of book " + sheetIden.getBookName()); + } + String firstSheetName = sheetIdentifier.getName(); String lastSheetName = firstSheetName; if (sheetIden instanceof SheetRangeIdentifier) { diff --git a/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java b/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java index 3c070d16e8..ecb3586de6 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java @@ -488,6 +488,10 @@ public final class FormulaParser { throw new FormulaParseException("Cell reference or Named Range " + "expected after sheet name at index " + _pointer + "."); } + if (_book == null) { + throw new FormulaParseException("Cannot access name '" + name + + "' for sheet " + sheetIden.asFormulaString() + " without workbook"); + } Ptg nameXPtg = _book.getNameXPtg(name, sheetIden); if (nameXPtg == null) { throw new FormulaParseException("Specified name '" + name + diff --git a/poi/src/main/java/org/apache/poi/ss/formula/SheetIdentifier.java b/poi/src/main/java/org/apache/poi/ss/formula/SheetIdentifier.java index fd8bc0618b..b29662ddd8 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/SheetIdentifier.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/SheetIdentifier.java @@ -32,9 +32,14 @@ public class SheetIdentifier { return _sheetIdentifier; } protected void asFormulaString(StringBuilder sb) { + if (_sheetIdentifier == null) { + return; + } + if (_bookName != null) { sb.append(" [").append(_sheetIdentifier.getName()).append("]"); } + if (_sheetIdentifier.isQuoted()) { sb.append('\'').append(_sheetIdentifier.getName()).append("'"); } else { diff --git a/poi/src/test/java/org/apache/poi/hssf/model/TestFormulaParser.java b/poi/src/test/java/org/apache/poi/hssf/model/TestFormulaParser.java index ac878d06aa..3ccedacf49 100644 --- a/poi/src/test/java/org/apache/poi/hssf/model/TestFormulaParser.java +++ b/poi/src/test/java/org/apache/poi/hssf/model/TestFormulaParser.java @@ -266,7 +266,7 @@ final class TestFormulaParser { String value = " hi "; Ptg[] ptgs = parseFormula("\"" + value + "\""); confirmTokenClasses(ptgs, StringPtg.class); - assertEquals(((StringPtg) ptgs[0]).getValue(), value, "ptg0 contains exact value"); + assertEquals(value, ((StringPtg) ptgs[0]).getValue(), "ptg0 contains exact value"); } @Test @@ -1573,4 +1573,10 @@ final class TestFormulaParser { wb.close(); } + + @Test + void testNPE() { + assertThrows(FormulaParseException.class, + () -> parseFormula("[\f]!E鈩")); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
