https://issues.apache.org/bugzilla/show_bug.cgi?id=56334

Markus <p...@chamaeleon.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
         Resolution|FIXED                       |---

--- Comment #15 from Markus <p...@chamaeleon.de> ---
While some \\ in EL-strings work now, some others are still broken (in 7.0.54).

For example, the following fragment works now:

<set data-value="${'\\?resize'}" />

This also works:

<set data-content="${fn:escapeXml('\\?resize=.+')}" />

But this throws an Exception during JSP compiling:

<set data-content="${fn:contains(some_value, '\\?resize=.+')}" />

Full stack trace:

org.apache.jasper.JasperException: /page.jspx (line: 14, column: 68)
"${fn:contains(some_value, '\\?resize=.+')}" contains invalid expression(s):
javax.el.ELException: Failed to parse the expression [${fn:contains(some_value,
'\\?resize=.+')}]
    at
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:199)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.Validator$ValidateVisitor.getJspAttribute(Validator.java:1420)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:772)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$UninterpretedTag.accept(Node.java:1251)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:895)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1538)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:529)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$JspRoot.accept(Node.java:564)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2429)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2435)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Root.accept(Node.java:474)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2377)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1841)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:217)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
~[jasper.jar:7.0.54]
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
~[jasper.jar:7.0.54]
    at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
~[jasper.jar:7.0.54]
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
~[jasper.jar:7.0.54]
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
~[jasper.jar:7.0.54]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
~[servlet-api.jar:na]
    at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
~[catalina.jar:7.0.54]
    at
org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
~[catalina.jar:7.0.54]
    at
org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
~[catalina.jar:7.0.54]
    at a.b.c.d.webdav.Request.include(Request.java:206) ~[na:3.6.235]
    at a.b.c.d.e.render.RenderingFile.generate(RenderingFile.java:494)
~[na:3.6.235]
    at a.b.c.d.e.render.RenderingFile.getContent(RenderingFile.java:139)
~[na:3.6.235]
    at a.b.c.d.e.render.RenderingFile.getContent(RenderingFile.java:103)
~[na:3.6.235]
    at a.b.c.d.file.FileWrapper.getContent(FileWrapper.java:173) ~[na:3.6.235]
    at a.b.c.d.file.FileWrapper.getContent(FileWrapper.java:173) ~[na:3.6.235]
    at a.b.c.d.file.FileWrapper.getContent(FileWrapper.java:173) ~[na:3.6.235]
    at a.b.c.d.webdav.method.GET.run(GET.java:152) ~[na:3.6.235]
    at
a.b.c.d.webdav.method.AbstractMethodHandler.handleRequest(AbstractMethodHandler.java:52)
~[na:3.6.235]
    at a.b.c.d.engine.Manager.handleRequest(Manager.java:361) [na:3.6.235]
    at a.b.c.d.engine.Manager.doFilter(Manager.java:283) [na:3.6.235]
    at a.b.d.w.i.ManagerWrapper.doFilter(ManagerWrapper.java:64)
[ManagerWrapper.class:na]
    at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
[catalina.jar:7.0.54]
    at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
[catalina.jar:7.0.54]
    at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
[catalina.jar:7.0.54]
    at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
[catalina.jar:7.0.54]
    at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
[catalina.jar:7.0.54]
    at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
[tomcat-coyote.jar:7.0.54]
    at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
[tomcat-coyote.jar:7.0.54]
    at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
[tomcat-coyote.jar:7.0.54]
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
[na:1.7.0_03]
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
[na:1.7.0_03]
    at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
[tomcat-coyote.jar:7.0.54]
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0_03]

The really funny part here is that in Eclipse's Console view I am unable to
copy+paste the Exception message (Eclipse Kepler, Win7), the copied area always
stops right after the comma in "fn:contains(some_value,", so it looks like
there's something weird going on. There seem to be two blanks at that location
in console view at this location.

Analyzing this further proves that when this Exception is constructed
(DefaultErrorHandler.java line 43), the string errMsg passed to this method
contains a NUL-char (\u0000) at index 26 (right after the comma):

errMsg.getBytes() ->
    (byte[]) [34, 36, 123, 102, 110, 58, 99, 111, 110, 116, 97, 105, 110, 115,
40, 115, 111, 109, 101, 95, 118, 97, 108, 117, 101, 44, 0, 32, 39, 92, 92, 63,
...

This NUL is taken from the ELException that is catched and rethrown in
Validator.java line 1420.

This Exception is thrown in ExpressionBuilder.java line 145, and the Exception
details there are interesting: the EL parser fails at the NUL char in expr, and
the Exception message there is:
org.apache.el.parser.ParseException: Encountered " <ILLEGAL_CHARACTER> " "" at
line 1, column 26.
Was expecting one of:
    <INTEGER_LITERAL> ...

This NUL char ist NOT in 'value' in Validator$ValidateVisitor.visit()
(Validator.java line 773), this means that it is added inside
getJspAttribute(). Stepping through the code shows that this happens around
line 1403 of the same file:
XmlEscapeNonELVisitor v = new XmlEscapeNonELVisitor(

pageInfo.isDeferredSyntaxAllowedAsLiteral());
el.visit(v);
value = v.getText();

So basically something inside XmlEscapeNonELVisitor is causing this error. And
I think this happens in ELParser.java, 'quote' is initialized to 0 (the string
literal starts with a blank, not with the ' in my example expression - it is
not trimmed), and this char 0 is appended to 'output' in line 320.

Regards
Markus

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to