costin      01/08/20 21:48:35

  Modified:    src/share/org/apache/tomcat/util/depend
                        DependClassLoader.java
  Added:       src/share/org/apache/tomcat/util/depend
                        DependClassLoader12.java
  Log:
  A much more serious problem here. We recently fixed DependClassLoader - it needs
  to use defineClass() itself, it it relys on the parent the other classes which
  depend on the loaded class will be loaded with the parent loader.
  
  This change had a side effect - since defineClass() was used with 3 parms, without
  the protection domain.
  
  The first fix was required to fix reloading, this one is required to fix sandboxing.
  I reproduced the same tricks we used in jasper to maintain compatibility with JDK1.1
  ( however, I may need to add one more method ). This is not finalized, and is
  possible it'll brake JDK1.1 compilation ( not difficult to fix, but I have few other
  changes to commit).
  
  Revision  Changes    Path
  1.6       +17 -3     
jakarta-tomcat/src/share/org/apache/tomcat/util/depend/DependClassLoader.java
  
  Index: DependClassLoader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/depend/DependClassLoader.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DependClassLoader.java    2001/08/16 00:22:17     1.5
  +++ DependClassLoader.java    2001/08/21 04:48:35     1.6
  @@ -89,13 +89,15 @@
       
       final static int debug=0;
       DependManager dependM;
  +    protected Object pd;
       static Jdk11Compat jdkCompat=Jdk11Compat.getJdkCompat();
       
  -    public DependClassLoader( DependManager depM, ClassLoader parent ) {
  +    public DependClassLoader( DependManager depM, ClassLoader parent, Object pd ) {
        super(); // will check permissions
        this.parent=parent;
        this.parent2=jdkCompat.getParentLoader( parent );
        dependM=depM;
  +     this.pd=pd;
       }
   
       // debug only
  @@ -119,7 +121,13 @@
       protected synchronized Class loadClass(String name, boolean resolve)
           throws ClassNotFoundException
       {
  -        if( debug>0) log( "loadClass() " + name + " " + resolve);
  +     return loadClassInternal( name, resolve );
  +    }
  +
  +    protected Class loadClassInternal( String name, boolean resolve )
  +     throws ClassNotFoundException
  +    {
  +     if( debug>0) log( "loadClass() " + name + " " + resolve);
        // The class object that will be returned.
           Class c = null;
   
  @@ -165,7 +173,7 @@
        if( data==null ) 
            throw new ClassNotFoundException( name + " lenght==0");
   
  -     c=defineClass(data, 0, data.length);
  +     c=defineClassCompat( name, data, 0, data.length, res );
        dependency( c, res );
        
        if (resolve) resolveClass(c);
  @@ -173,6 +181,12 @@
        return c;
       }
   
  +    protected Class defineClassCompat( String name, byte data[], int s, int end, 
URL res )
  +     throws ClassNotFoundException
  +    {
  +     return defineClass(data, s, end);
  +    }
  +    
       public URL getResource(String name) {
        return parent.getResource(name);
       }
  
  
  
  1.1                  
jakarta-tomcat/src/share/org/apache/tomcat/util/depend/DependClassLoader12.java
  
  Index: DependClassLoader12.java
  ===================================================================
  /*
   * Copyright (c) 1997-1999 The Java Apache Project.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *
   * 4. The names "Apache JServ", "Apache JServ Servlet Engine" and 
   *    "Java Apache Project" must not be used to endorse or promote products 
   *    derived from this software without prior written permission.
   *
   * 5. Products derived from this software may not be called "Apache JServ"
   *    nor may "Apache" nor "Apache JServ" appear in their names without 
   *    prior written permission of the Java Apache Project.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Java Apache 
   *    Project for use in the Apache JServ servlet engine project
   *    <http://java.apache.org/>."
   *    
   * THIS SOFTWARE IS PROVIDED BY THE JAVA APACHE PROJECT "AS IS" AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE JAVA APACHE PROJECT OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Java Apache Group. For more information
   * on the Java Apache Project and the Apache JServ Servlet Engine project,
   * please see <http://java.apache.org/>.
   *
   */
  
  package org.apache.tomcat.util.depend;
  
  import java.io.*;
  import java.lang.*;
  import java.net.*;
  import java.text.*;
  import java.util.*;
  import java.util.zip.*;
  import java.security.*;
  
  import org.apache.tomcat.util.compat.*;
  
  /** 
   * 1.2 support for DependClassLoader
   * 
   */
  public class DependClassLoader12 extends DependClassLoader {
  
      public DependClassLoader12( DependManager depM, ClassLoader parent, Object pd ) {
        super(depM, parent, pd);
      }
  
      protected synchronized Class loadClass(String name, boolean resolve)
          throws ClassNotFoundException
      {
        final String lname=name;
        final boolean lresolve=resolve;
        try {
            return (Class)AccessController.doPrivileged( new 
PrivilegedExceptionAction() {
                    public Object run() throws Exception {
                        return loadClassInternal( lname, lresolve );
                    }
                });
        } catch( Exception ex ) {
            if( ex instanceof ClassNotFoundException )
                throw (ClassNotFoundException)ex;
            ex.printStackTrace();
            throw new ClassNotFoundException( name );
        }
      }
  
      
      protected Class defineClassCompat( String name, byte data[], int s, int end, URL 
res )
        throws ClassNotFoundException
      {
        // JDK1.2 - XXX need to fix for JDK1.1 compat 
        //      CodeSource cs=new CodeSource( res , null);
        //      PermissionCollection perms=Policy.getPolicy().getPermissions(cs);
        //      ProtectionDomain pd=new ProtectionDomain( cs,perms);
        //      System.out.println("XXX " + name + ": " + cs + "\n" + perms );
        return defineClass(name, data, s, end, (ProtectionDomain)pd);
      }
  }
  
  
  

Reply via email to