Bug 54260 - JSP unloading - NullPointerException when using ".tag" files
JSP unloading - NullPointerException when using ".tag" files
Status: RESOLVED FIXED
Product: Tomcat 7
Classification: Unclassified
Component: Jasper
7.0.33
PC All
: P2 normal (vote)
: ---
Assigned To: Tomcat Developers Mailing List
:
Depends on:
Blocks:
  Show dependency tree
 
Reported: 2012-12-07 17:58 UTC by Laszlo Keszthelyi
Modified: 2013-01-03 14:20 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Laszlo Keszthelyi 2012-12-07 17:58:25 UTC
Since Tomcat 7.0.30 (currently using version 7.0.33) we are faced with the
following NullPointerException:

Dec 7, 2012 2:10:28 PM
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor
processChildren
SEVERE: Exception invoking periodic operation:
java.lang.NullPointerException
        at
org.apache.jasper.util.FastRemovalDequeue$Entry.access$700(FastRemovalDe
queue.java:254)
        at
org.apache.jasper.util.FastRemovalDequeue.remove(FastRemovalDequeue.java
:177)
        at
org.apache.jasper.compiler.JspRuntimeContext.checkUnload(JspRuntimeConte
xt.java:610)
        at
org.apache.jasper.servlet.JspServlet.periodicEvent(JspServlet.java:360)
        at
org.apache.catalina.core.StandardWrapper.backgroundProcess(StandardWrapp
er.java:709)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.proc
essChildren(ContainerBase.java:1530)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.proc
essChildren(ContainerBase.java:1540)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.proc
essChildren(ContainerBase.java:1540)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.proc
essChildren(ContainerBase.java:1540)
        at
org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(
ContainerBase.java:1519)
        at java.lang.Thread.run(Thread.java:662)



Investigation results:

I was able to debug and trace the exception and found that the Excpetion
is caused by a '.tag', I'm including in my JSP, which has no
UnloadHandle assigned when processed in
org.apache.jasper.compiler.JspRuntimeContext.checkUnload() line 610:
jspQueue.remove(jsw.getUnloadHandle());

Because jsw.getUnloadHandle() returns null, jspQueue.remove() fails and
is throwing the NullPointerException everytime, aborting the "unload".



Reproducing the exceptiopn:

It looks like the exception appears only when "maxLoadedJsps" and " jspIdleTimeout" are set to a value >0 in tomcat/conf/web.xml and ".tag" files are used with jsp-scriptlets.

Web.xml changes:
        <init-param>
            <param-name>maxLoadedJsps</param-name>
            <param-value>1000</param-value>
        </init-param>
        <init-param>
            <param-name>jspIdleTimeout</param-name>
            <param-value>5</param-value>
        </init-param>


The exception can be observed in the example "Tag Files" -> "Display Products Example" but you have to edit the WEB-INF/tags/displayProducts.tag and append the following example scriptlet:

<%
 String test = "this is =";
 if (normalPrice != null)
  test = test + normalPrice + " something";
 else
  test = test + onSale + "=";
 StringBuilder tags=new StringBuilder(test);
 tags.append(".").append(test).append("..."); // change here
 test = tags.toString();
 request.setAttribute("test", test);
%>
<%=test %>

Start Tomcat and invoke the example jsp http://localhost:8080/examples/jsp/jsp2/tagfiles/products.jsp

Wait and observe the catalina.out (or tomcat output) for exceptions. Normaly the exception won't appear. Now edit the previously added scriplet in WEB-INF/tags/displayProducts.tag modifying any string in one of the append statements.
Call the example jsp again, tomcat should recompile the tag, wait and observe again your tomcat output.
Do not shutdown or restart tomcat between these steps! Tomcat should recompile the tag on the fly.

We were able to reproduce the exception on Tomcat 7.0.30, 7.0.32 and 7.0.33 on different machines using the described steps.
Comment 1 Konstantin Kolinko 2012-12-09 21:03:41 UTC
Confirming: I am able to reproduce this issue in 7.0.34 with the provided recipe.

Once the problem occurs, the same exception starts to be printed every 10 seconds.
Comment 2 Mark Thomas 2013-01-03 14:20:31 UTC
Thanks for the report and the easy to reproduce test case.

The problem has been fixed in trunk and 7.0.x and will be included in 7.0.35 onwards.