You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Arvīds Grabovskis <ar...@gmail.com> on 2013/09/11 15:33:32 UTC

NullPointerException for conditions in compiled JSPs

Hi,

If JSP includes a line "<c:if test="${nonExisting}">Hello,world!</c:if>"
where "nonExisting" is attribute that does not exist, then
NullPointerException will be thrown. The cause is at
http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/jasper/compiler/JspUtil.java
at
line #421 which generates something like:
((java.lang.Boolean)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${nonExisting}",
java.lang.Boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context,
null, false)).booleanValue()

The result of proprietaryEvaluate() is null (because of EL 3.0 changes
regarding coercing), hence calling booleanValue() will throw NPE. The
latest changes in EL specification does require guarding against such null
pointer access (otherwise it will break lots of existing applications). I
really hope that this is not intended behavior.

Double checked the existence of error with Tomcat v8.0.0-RC1 (the same
problem affects the Glassfish v4, but they have a forked version of JSPC

-- Arvīds

Re: NullPointerException for conditions in compiled JSPs

Posted by Christopher Schultz <ch...@christopherschultz.net>.
Arvīds,

On 9/11/13 11:07 AM, Arvīds Grabovskis wrote:
> 2013/9/11 Konstantin Kolinko <knst.kolinko@gmail.com
> <ma...@gmail.com>>
> 
>     2013/9/11 Arvīds Grabovskis <arvids.grabovskis@gmail.com
>     <ma...@gmail.com>>:
>     > Hi,
>     >
>     > If JSP includes a line "<c:if
>     test="${nonExisting}">Hello,world!</c:if>"
>     > where "nonExisting" is attribute that does not exist, then
>     > NullPointerException will be thrown. The cause is at
>     >
>     http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/jasper/compiler/JspUtil.java
>     > at
>     > line #421 which generates something like:
>     > ((java.lang.Boolean)
>     >
>     org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${nonExisting}",
>     > java.lang.Boolean.class,
>     (javax.servlet.jsp.PageContext)_jspx_page_context,
>     > null, false)).booleanValue()
>     >
>     > The result of proprietaryEvaluate() is null (because of EL 3.0 changes
>     > regarding coercing), hence calling booleanValue() will throw NPE. The
>     > latest changes in EL specification does require guarding against
>     such null
>     > pointer access (otherwise it will break lots of existing
>     applications). I
>     > really hope that this is not intended behavior.
>     >
>     > Double checked the existence of error with Tomcat v8.0.0-RC1 (the same
>     > problem affects the Glassfish v4, but they have a forked version
>     of JSPC
>     >
> 
>     1. Why does it try to convert to "boolean" and not to "Boolean"?
> 
>     2. Yes, a null cannot be converted to primitive boolean value, so an
>     NPE is the correct behaviour here. So the generated code is correct.
> 
>     So the question is why EL expression "${nonExisting}" or "${null}" was
>     not evaluated to Boolean.FALSE.
> 
>     What version of JSTL are you using?
>     Are you sure that you are using EL-aware versions of the tags
>     (JSTL 1.1+) instead of older JSTL 1.0 ones?
> 
>     What are the steps to reproduce the issue on a clear installation?
>     What is your version of Tomcat?
>     What is you stacktrace?
> 
> 
>     Best regards,
>     Konstantin Kolinko
> 
>     ---------------------------------------------------------------------
>     To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
>     <ma...@tomcat.apache.org>
>     For additional commands, e-mail: dev-help@tomcat.apache.org
>     <ma...@tomcat.apache.org>
> 
> 
> Konstantin,
> 
> 1. Manual unboxing does solve potential NPE problems in other parts
> (where auto-unboxing would throw NPE)... so this is not the real
> problem... imho.
> 
> 2. As far as I understand, this is direct result of incompatibility
> between EL 3.0
> (http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html)
> and 2.2 as stated in EL spec this is intended behavior of EL. Here's the
> citation (Section A.4):
> "The default coercion for nulls to non-primitive types (except String)
> returns 
> nulls. For instance, a null coerced to Boolean now returns a null, while a 
> null coerced to boolean returns false."
> 
> Environment:
> * JSTL 1.2+
> * Tomcat version 8.0.0-RC1 (as previously stated)
> * JDK 1.7.0_21
> 
> I also added a demo application (I hope that mail client won't block it)
> - just drop it in fresh Tomcat v8 and you'll get the error.

The mailing list blocks it. I would recommend filing a bug in bugzilla,
posting your original explanation, the stack trace below, and attaching
your demo application.

-chris

> here's the stack trace:
> java.lang.NullPointerException
> org.apache.jsp.index_jsp._jspx_meth_c_005fif_005f0(index_jsp.java:109)
> org.apache.jsp.index_jsp._jspService(index_jsp.java:81)
> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
> javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
> org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
> org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
> javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
> org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)
> 
> -- Arvīds
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
> 


Re: NullPointerException for conditions in compiled JSPs

Posted by Arvīds Grabovskis <ar...@gmail.com>.
2013/9/11 Konstantin Kolinko <kn...@gmail.com>

> 2013/9/11 Arvīds Grabovskis <ar...@gmail.com>:
> > Hi,
> >
> > If JSP includes a line "<c:if test="${nonExisting}">Hello,world!</c:if>"
> > where "nonExisting" is attribute that does not exist, then
> > NullPointerException will be thrown. The cause is at
> >
> http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/jasper/compiler/JspUtil.java
> > at
> > line #421 which generates something like:
> > ((java.lang.Boolean)
> >
> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${nonExisting}",
> > java.lang.Boolean.class,
> (javax.servlet.jsp.PageContext)_jspx_page_context,
> > null, false)).booleanValue()
> >
> > The result of proprietaryEvaluate() is null (because of EL 3.0 changes
> > regarding coercing), hence calling booleanValue() will throw NPE. The
> > latest changes in EL specification does require guarding against such
> null
> > pointer access (otherwise it will break lots of existing applications). I
> > really hope that this is not intended behavior.
> >
> > Double checked the existence of error with Tomcat v8.0.0-RC1 (the same
> > problem affects the Glassfish v4, but they have a forked version of JSPC
> >
>
> 1. Why does it try to convert to "boolean" and not to "Boolean"?
>
> 2. Yes, a null cannot be converted to primitive boolean value, so an
> NPE is the correct behaviour here. So the generated code is correct.
>
> So the question is why EL expression "${nonExisting}" or "${null}" was
> not evaluated to Boolean.FALSE.
>
> What version of JSTL are you using?
> Are you sure that you are using EL-aware versions of the tags
> (JSTL 1.1+) instead of older JSTL 1.0 ones?
>
> What are the steps to reproduce the issue on a clear installation?
> What is your version of Tomcat?
> What is you stacktrace?
>
>
> Best regards,
> Konstantin Kolinko
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>
Konstantin,

1. Manual unboxing does solve potential NPE problems in other parts (where
auto-unboxing would throw NPE)... so this is not the real problem... imho.

2. As far as I understand, this is direct result of incompatibility between
EL 3.0 (
http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html) and
2.2 as stated in EL spec this is intended behavior of EL. Here's the
citation (Section A.4):
"The default coercion for nulls to non-primitive types (except String)
returns
nulls. For instance, a null coerced to Boolean now returns a null, while a
null coerced to boolean returns false."

Environment:
* JSTL 1.2+
* Tomcat version 8.0.0-RC1 (as previously stated)
* JDK 1.7.0_21

I also added a demo application (I hope that mail client won't block it) -
just drop it in fresh Tomcat v8 and you'll get the error.

here's the stack trace:
java.lang.NullPointerException
org.apache.jsp.index_jsp._jspx_meth_c_005fif_005f0(index_jsp.java:109)
 org.apache.jsp.index_jsp._jspService(index_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)

-- Arvīds

Re: NullPointerException for conditions in compiled JSPs

Posted by Konstantin Kolinko <kn...@gmail.com>.
2013/9/11 Arvīds Grabovskis <ar...@gmail.com>:
> Hi,
>
> If JSP includes a line "<c:if test="${nonExisting}">Hello,world!</c:if>"
> where "nonExisting" is attribute that does not exist, then
> NullPointerException will be thrown. The cause is at
> http://svn.apache.org/repos/asf/tomcat/trunk/java/org/apache/jasper/compiler/JspUtil.java
> at
> line #421 which generates something like:
> ((java.lang.Boolean)
> org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${nonExisting}",
> java.lang.Boolean.class, (javax.servlet.jsp.PageContext)_jspx_page_context,
> null, false)).booleanValue()
>
> The result of proprietaryEvaluate() is null (because of EL 3.0 changes
> regarding coercing), hence calling booleanValue() will throw NPE. The
> latest changes in EL specification does require guarding against such null
> pointer access (otherwise it will break lots of existing applications). I
> really hope that this is not intended behavior.
>
> Double checked the existence of error with Tomcat v8.0.0-RC1 (the same
> problem affects the Glassfish v4, but they have a forked version of JSPC
>

1. Why does it try to convert to "boolean" and not to "Boolean"?

2. Yes, a null cannot be converted to primitive boolean value, so an
NPE is the correct behaviour here. So the generated code is correct.

So the question is why EL expression "${nonExisting}" or "${null}" was
not evaluated to Boolean.FALSE.

What version of JSTL are you using?
Are you sure that you are using EL-aware versions of the tags
(JSTL 1.1+) instead of older JSTL 1.0 ones?

What are the steps to reproduce the issue on a clear installation?
What is your version of Tomcat?
What is you stacktrace?


Best regards,
Konstantin Kolinko

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