neilg       2003/02/19 07:04:05

  Modified:    java/src/org/apache/xerces/util ObjectFactory.java
                        SecuritySupport.java SecuritySupport12.java
  Log:
  additional fix for bug 16674; thanks again to Igor Malinin
  
  Revision  Changes    Path
  1.13      +48 -17    xml-xerces/java/src/org/apache/xerces/util/ObjectFactory.java
  
  Index: ObjectFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/ObjectFactory.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ObjectFactory.java        17 Feb 2003 21:43:21 -0000      1.12
  +++ ObjectFactory.java        19 Feb 2003 15:04:04 -0000      1.13
  @@ -282,7 +282,7 @@
       /**
        * Figure out which ClassLoader to use.  For JDK 1.2 and later use
        * the context ClassLoader.
  -     */           
  +     */
       public static ClassLoader findClassLoader()
           throws ConfigurationError
       { 
  @@ -290,22 +290,53 @@
   
           // Figure out which ClassLoader to use for loading the provider
           // class.  If there is a Context ClassLoader then use it.
  -        ClassLoader cl = ss.getContextClassLoader();
  -        if (cl == null || cl == ss.getSystemClassLoader()) {
  -            // Assert: we are on JDK 1.1 or we have no Context ClassLoader
  -            // so use the current ClassLoader or we have default (system)
  -            // Context ClassLoader so extend to current ClassLoader (normal
  -            // classloader will delegate back to system ClassLoader first)
  -            cl = ObjectFactory.class.getClassLoader();
  -        }
  -
  -        if (cl == null) {
  -            // Assert: we are on JDK 1.1 or we are on JDK 1.2 and loaded
  -            // by bootstrap ClassLoader so extend to System ClassLoader
  -            cl = ss.getSystemClassLoader();
  -        }
  +        ClassLoader context = ss.getContextClassLoader();
  +        ClassLoader system = ss.getSystemClassLoader();
   
  -        return cl;
  +        ClassLoader chain = system;
  +        while (true) {
  +            if (context == chain) {
  +                // Assert: we are on JDK 1.1 or we have no Context ClassLoader
  +                // or any Context ClassLoader in chain of system classloader
  +                // (including extension ClassLoader) so extend to widest
  +                // ClassLoader (always look in system ClassLoader if Xerces
  +                // is in boot/extension/system classpath and in current
  +                // ClassLoader otherwise); normal classloaders delegate
  +                // back to system ClassLoader first so this widening doesn't
  +                // change the fact that context ClassLoader will be consulted
  +                ClassLoader current = ObjectFactory.class.getClassLoader();
  +
  +                chain = system;
  +                while (true) {
  +                    if (current == chain) {
  +                        // Assert: Current ClassLoader in chain of
  +                        // boot/extension/system ClassLoaders
  +                        return system;
  +                    }
  +                    if (chain == null) {
  +                        break;
  +                    }
  +                    chain = ss.getParentClassLoader(chain);
  +                }
  +
  +                // Assert: Current ClassLoader not in chain of
  +                // boot/extension/system ClassLoaders
  +                return current;
  +            }
  +
  +            if (chain == null) {
  +                // boot ClassLoader reached
  +                break;
  +            }
  +
  +            // Check for any extension ClassLoaders in chain up to
  +            // boot ClassLoader
  +            chain = ss.getParentClassLoader(chain);
  +        };
  +
  +        // Assert: Context ClassLoader not in chain of
  +        // boot/extension/system ClassLoaders
  +        return context;
       } // findClassLoader():ClassLoader
   
       /**
  
  
  
  1.4       +4 -0      xml-xerces/java/src/org/apache/xerces/util/SecuritySupport.java
  
  Index: SecuritySupport.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/SecuritySupport.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SecuritySupport.java      17 Feb 2003 21:43:21 -0000      1.3
  +++ SecuritySupport.java      19 Feb 2003 15:04:04 -0000      1.4
  @@ -120,6 +120,10 @@
           return null;
       }
   
  +    public ClassLoader getParentClassLoader(ClassLoader cl) {
  +        return null;
  +    }
  +
       public String getSystemProperty(String propName) {
           return System.getProperty(propName);
       }
  
  
  
  1.4       +16 -0     
xml-xerces/java/src/org/apache/xerces/util/SecuritySupport12.java
  
  Index: SecuritySupport12.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/util/SecuritySupport12.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SecuritySupport12.java    17 Feb 2003 21:43:21 -0000      1.3
  +++ SecuritySupport12.java    19 Feb 2003 15:04:04 -0000      1.4
  @@ -93,6 +93,22 @@
               });
       }
   
  +    public ClassLoader getParentClassLoader(final ClassLoader cl) {
  +        return (ClassLoader)
  +            AccessController.doPrivileged(new PrivilegedAction() {
  +                public Object run() {
  +                    ClassLoader parent = null;
  +                    try {
  +                        parent = cl.getParent();
  +                    } catch (SecurityException ex) {}
  +
  +                    // eliminate loops in case of the boot
  +                    // ClassLoader returning itself as a parent
  +                    return (parent == cl) ? null : parent;
  +                }
  +            });
  +    }
  +
       public String getSystemProperty(final String propName) {
        return (String)
               AccessController.doPrivileged(new PrivilegedAction() {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to