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)); + } + } }