[ https://issues.apache.org/jira/browse/WW-4062?focusedWorklogId=929502&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-929502 ]
ASF GitHub Bot logged work on WW-4062: -------------------------------------- Author: ASF GitHub Bot Created on: 09/Aug/24 09:55 Start Date: 09/Aug/24 09:55 Worklog Time Spent: 10m Work Description: kusalk opened a new pull request, #1013: URL: https://github.com/apache/struts/pull/1013 WW-4062 -- Issue Time Tracking ------------------- Worklog Id: (was: 929502) Remaining Estimate: 0h Time Spent: 10m > Invalid OGNL expressions are not cached > --------------------------------------- > > Key: WW-4062 > URL: https://issues.apache.org/jira/browse/WW-4062 > Project: Struts 2 > Issue Type: Bug > Components: Value Stack > Affects Versions: 2.3.14 > Reporter: Saulius Tvarijonas > Priority: Major > Fix For: 6.7.0 > > Attachments: WW-4062.PNG > > Time Spent: 10m > Remaining Estimate: 0h > > I am using velocity to render results page. During performance optimizations > I noticed significant memory usage from > *com.opensymphony.xwork2.ognl.OgnlUtil#compile*. There is caching implemented > in OgnlUtil, but if expression compilation fails, it is not cached. > I am not really sure if this problem is in struts or velocity engine. But > situation is following: > # In velocity template trying to render string *<p>$!foo</p>* > # If value is null, velocity calls > *org.apache.velocity.runtime.parser.node.ASTReference#getNullString* > # Internally there is call to *context.get(".literal." + nullString)* > # And this ".literal." expression always reaches *OgnlUtil#compile* and > compilation fails. > Below is stacktrace for more details: > {code} > at com.opensymphony.xwork2.ognl.OgnlUtil.compile(OgnlUtil.java:248) > at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:236) > at > com.opensymphony.xwork2.ognl.OgnlValueStack.getValueUsingOgnl(OgnlValueStack.java:291) > at > com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:274) > at > com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:256) > at > com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:236) > at > com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:298) > at > org.apache.struts2.dispatcher.StrutsRequestWrapper.getAttribute(StrutsRequestWrapper.java:82) > at org.apache.velocity.tools.view.context.ChainedContext.getAttribute(Unknown > Source:-1) > at org.apache.velocity.tools.view.context.ChainedContext.internalGet(Unknown > Source:-1) > at org.apache.velocity.context.AbstractContext.get(AbstractContext.java:193) > at > org.apache.velocity.context.InternalContextAdapterImpl.get(InternalContextAdapterImpl.java:267) > at > org.apache.velocity.runtime.parser.node.ASTReference.getNullString(ASTReference.java:510) > at > org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:465) > at > org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) > at > org.apache.velocity.runtime.parser.node.ASTStringLiteral.value(ASTStringLiteral.java:330) > at > org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71) > at > org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142) > at > org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) > at org.apache.velocity.runtime.directive.Parse.render(Parse.java:260) > at > org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207) > at > org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) > at org.apache.velocity.Template.merge(Template.java:356) > at org.apache.velocity.Template.merge(Template.java:260) > at > org.apache.struts2.dispatcher.VelocityResult.doExecute(VelocityResult.java:156) > at > org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)