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]

Reply via email to