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

henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git


The following commit(s) were added to refs/heads/master by this push:
     new 9fc51924 JEXL-436: control left-hand side nullability for 
self-assignment operators in strict mode;
9fc51924 is described below

commit 9fc51924b13b62e73e7e4ee0e90e7c99dc2ea2c9
Author: Henrib <hbies...@gmail.com>
AuthorDate: Wed Jan 29 23:00:50 2025 +0100

    JEXL-436: control left-hand side nullability for self-assignment operators 
in strict mode;
---
 RELEASE-NOTES.txt                                  |  1 +
 src/changes/changes.xml                            |  3 +++
 .../apache/commons/jexl3/internal/Operator.java    |  2 ++
 .../org/apache/commons/jexl3/Issues400Test.java    | 30 +++++++++++++++++++++-
 4 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index bf65c646..a6b1e892 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -53,6 +53,7 @@ New Features in 3.4.1:
 
 Bugs Fixed in 3.4.1:
 ====================
+* JEXL-436:     The increment (decrement) operator does not check for null 
operand
 * JEXL-435:     Changed behavior of empty operator overloading
 * JEXL-434:     The safe-access array operator is not safe
 * JEXL-433:     Debugger does not accept empty return statement
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b0d341d6..587b3830 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -29,6 +29,9 @@
     <body>
         <release version="3.4.1" date="YYYY-MM-DD" description="This is a 
feature and maintenance release. Java 8 or later is required.">
           <!-- FIX -->
+            <action dev="henrib" type="fix" issue="JEXL-435" due-to="Vincent 
Bussol">
+                The increment (decrement) operator does not check for null 
operand
+            </action>
             <action dev="henrib" type="fix" issue="JEXL-435" due-to="Vincent 
Bussol">
                 Changed behavior of empty operator overloading Action.
             </action>
diff --git a/src/main/java/org/apache/commons/jexl3/internal/Operator.java 
b/src/main/java/org/apache/commons/jexl3/internal/Operator.java
index 967db164..e4abbd33 100644
--- a/src/main/java/org/apache/commons/jexl3/internal/Operator.java
+++ b/src/main/java/org/apache/commons/jexl3/internal/Operator.java
@@ -429,6 +429,8 @@ public final class Operator implements 
JexlOperator.Uberspect {
         }
         Object result = JexlEngine.TRY_FAILED;
         try {
+            // if the operator is strict, the left-hand side can not be null
+            controlNullOperands(arithmetic, operator, args[0]);
             // attempt assignment operator overload
             if (overloads(operator)) {
                 result = tryOverload(node, operator, arguments(operator, 
args));
diff --git a/src/test/java/org/apache/commons/jexl3/Issues400Test.java 
b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
index b86fc6e9..7dffef67 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues400Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues400Test.java
@@ -571,7 +571,7 @@ public class Issues400Test {
     }
 
     @Test
-    void test() {
+    void test435() {
         JexlArithmetic arithmetic = new Arithmetic435(true);
         JexlEngine jexl = new JexlBuilder().arithmetic(arithmetic).create();
         final String src = "empty('list')";
@@ -580,4 +580,32 @@ public class Issues400Test {
         final Object result = script.execute(null);
         assertInstanceOf(List.class, result);
     }
+
+    @Test
+    void test436a() {
+        String[] srcs = {"let i = null; ++i", "let i; ++i;", "let i; i--;",  
"let i; i++;"};
+        run436(null, srcs);
+    }
+
+    @Test
+    void test436b() {
+        String[] srcs = {"var i = null; ++i", "var i; ++i;", "var i; i--;",  
"var i; i++;"};
+        run436(null, srcs);
+    }
+
+    @Test
+    void test436c() {
+        JexlContext ctxt = new MapContext();
+        ctxt.set("i", null);
+        String[] srcs = {"++i", "++i;", "i--;",  "i++;"};
+        run436(null, srcs);
+    }
+
+    void run436(JexlContext ctxt, String[] srcs) {
+        final JexlEngine jexl = new JexlBuilder().create();
+        for(String src : srcs) {
+            JexlScript script = jexl.createScript(src);
+            assertThrows(JexlException.Operator.class, () -> 
script.execute(ctxt));
+        }
+    }
 }

Reply via email to