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) {

Reply via email to