This is an automated email from the ASF dual-hosted git repository.
ddekany pushed a commit to branch 3
in repository https://gitbox.apache.org/repos/asf/freemarker.git
The following commit(s) were added to refs/heads/3 by this push:
new 32e6a4d Forward ported from 2.3-gae: FREEMARKER-165: Fixed bug where
where if the namespace expression in a block assignment (like <#assign x in
someNamespace>...</#assign>) refers to a missing variable, or has the wrong
type, FreeMarker has thrown NullPointerException or ClassCastException, instead
of InvalidReferenceException and NonNamespaceException with proper helpful
message.
32e6a4d is described below
commit 32e6a4d82905b3993065e9fd76a8eff0aeb8189e
Author: ddekany <[email protected]>
AuthorDate: Sat Nov 28 15:16:24 2020 +0100
Forward ported from 2.3-gae: FREEMARKER-165: Fixed bug where where if the
namespace expression in a block assignment (like <#assign x in
someNamespace>...</#assign>) refers to a missing variable, or has the wrong
type, FreeMarker has thrown NullPointerException or ClassCastException, instead
of InvalidReferenceException and NonNamespaceException with proper helpful
message.
---
.../apache/freemarker/core/MiscErrorMessagesTest.java | 14 +++++++++++++-
.../org/apache/freemarker/core/ASTDirAssignment.java | 6 +++---
.../freemarker/core/ASTDirCapturingAssignment.java | 17 +++++++++++++++--
3 files changed, 31 insertions(+), 6 deletions(-)
diff --git
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
index c43cef2..ae8b5ae 100644
---
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
+++
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
@@ -60,5 +60,17 @@ public class MiscErrorMessagesTest extends TemplateTest {
assertErrorContains("<#global x += 2>", "\"x\"", "+=", "global scope");
assertErrorContains("<#macro m><#local x--></#macro><@m/>", "\"x\"",
"--", "local scope");
}
-
+
+ @Test
+ public void assignmentNamespaceChecks() {
+ assertErrorContains("<#assign x = 1 in noSuchVar>",
InvalidReferenceException.class, "noSuchVar");
+ assertErrorContains("<#assign x =1 in 'notANamespace'>", "namespace",
"string", "notANamespace");
+ }
+
+ @Test
+ public void blockAssignmentNamespaceChecks() {
+ assertErrorContains("<#assign x in noSuchVar>1</#assign>",
InvalidReferenceException.class, "noSuchVar");
+ assertErrorContains("<#assign x in 'notANamespace'>1</#assign>",
"namespace", "string", "notANamespace");
+ }
+
}
diff --git
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
index aba716d..514acdd 100644
---
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
+++
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
@@ -119,12 +119,12 @@ final class ASTDirAssignment extends ASTDirective {
throw new BugException("Unexpected scope type: " + scope);
}
} else {
- TemplateModel namespaceTM = namespaceExp.eval(env);
+ TemplateModel uncheckedNamespace = namespaceExp.eval(env);
try {
- namespace = (Environment.Namespace) namespaceTM;
+ namespace = (Environment.Namespace) uncheckedNamespace;
} catch (ClassCastException e) {
throw MessageUtils.newUnexpectedOperandTypeException(
- namespaceExp, namespaceTM,
+ namespaceExp, uncheckedNamespace,
"namespace",
new Class[] { Environment.Namespace.class },
null, env);
diff --git
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
index f151ba5..e257a3c 100644
---
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
+++
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
@@ -66,8 +66,21 @@ final class ASTDirCapturingAssignment extends ASTDirective {
}
if (namespaceExp != null) {
- Environment.Namespace ns = (Environment.Namespace)
namespaceExp.eval(env);
- ns.put(varName, capturedValue);
+ final Environment.Namespace namespace;
+ TemplateModel uncheckedNamespace = namespaceExp.eval(env);
+ try {
+ namespace = (Environment.Namespace) uncheckedNamespace;
+ } catch (ClassCastException e) {
+ throw MessageUtils.newUnexpectedOperandTypeException(
+ namespaceExp, uncheckedNamespace,
+ "namespace",
+ new Class[] { Environment.Namespace.class },
+ null, env);
+ }
+ if (namespace == null) {
+ throw InvalidReferenceException.getInstance(namespaceExp, env);
+ }
+ namespace.put(varName, capturedValue);
} else if (scope == ASTDirAssignment.NAMESPACE) {
env.setVariable(varName, capturedValue);
} else if (scope == ASTDirAssignment.GLOBAL) {