You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by lu...@apache.org on 2003/09/02 22:41:00 UTC

cvs commit: jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime JspFactoryImpl.java

luehe       2003/09/02 13:41:00

  Modified:    jasper2/src/share/org/apache/jasper/runtime
                        JspFactoryImpl.java
  Log:
  Fixed Bugtraq 4863026 ("JSP error page mechanism fails intermittently
  to display contents of error page")
  
  Problem was caused by the fact that one of the tests in the suite
  (JspFactoryTest.jsp) released a custom page context (of type
  com.sun.ts.tests.jsp.common.util.SimpleContext), like this:
  
    SimpleContext context = new SimpleContext();
    factory.releasePageContext(context);
  
  The implementation of
  org.apache.jasper.runtime.JspFactoryImpl.releasePageContext would add
  the page context back to the pool of page contexts. Page contexts
  would be retrieved from the pool as follows:
  
    pc = (PageContextImpl) pool.get()
  
  Clearly, if the page context returned was an instance of
  com.sun.ts.tests.jsp.common.util.SimpleContext, the above assignment
  would result in a ClassCastException.
  
  The fix is to return only those page contexts that are instances of
  org.apache.jasper.runtime.PageContextImpl to the pool, since we don't
  have any control over the implementation of custom page contexts
  
  Revision  Changes    Path
  1.4       +6 -6      jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspFactoryImpl.java
  
  Index: JspFactoryImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/runtime/JspFactoryImpl.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JspFactoryImpl.java	22 Jan 2003 21:13:51 -0000	1.3
  +++ JspFactoryImpl.java	2 Sep 2003 20:41:00 -0000	1.4
  @@ -139,12 +139,12 @@
           try {
   	    PageContext pc;
   	    if( USE_POOL ) {
  -		pc=(PageContextImpl)pool.get();
  +                pc = (PageContext) pool.get();
   		if( pc == null ) {
   		    pc= new PageContextImpl(this);
   		}
   	    } else {
  -		pc =  new PageContextImpl(this);
  +		pc = new PageContextImpl(this);
   	    }
   	    pc.initialize(servlet, request, response, errorPageURL, 
                             needsSession, bufferSize, autoflush);
  @@ -158,7 +158,7 @@
   
       private void internalReleasePageContext(PageContext pc) {
           pc.release();
  -	if( USE_POOL) {
  +	if (USE_POOL && (pc instanceof PageContextImpl)) {
   	    pool.put( pc );
   	}
       }