Hi, Committed.
Regards, Jeroen 2006-08-24 Jeroen Frijters <[EMAIL PROTECTED]> * java/security/SecureClassLoader.java (protectionDomainCache): Changed to HashMap. (SecureClassLoader): Removed redundant security check. (defineClass(String,byte[],int,int,CodeSource): Moved protection domain lookup/construction to new method. (defineClass(String,ByteBuffer,CodeSource): New method. (getProtectionDomain): New method.
Index: java/security/SecureClassLoader.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/security/SecureClassLoader.java,v retrieving revision 1.13 diff -u -r1.13 SecureClassLoader.java --- java/security/SecureClassLoader.java 2 Jul 2005 20:32:40 -0000 1.13 +++ java/security/SecureClassLoader.java 24 Aug 2006 04:52:06 -0000 @@ -1,5 +1,5 @@ /* SecureClassLoader.java --- A Secure Class Loader - Copyright (C) 1999, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2004, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,6 +37,9 @@ package java.security; +import java.nio.ByteBuffer; +import java.util.HashMap; + /** * A Secure Class Loader for loading classes with additional * support for specifying code source and permissions when @@ -48,21 +51,15 @@ */ public class SecureClassLoader extends ClassLoader { - java.util.WeakHashMap protectionDomainCache = new java.util.WeakHashMap(); + private final HashMap protectionDomainCache = new HashMap(); protected SecureClassLoader(ClassLoader parent) { super(parent); - SecurityManager sm = System.getSecurityManager(); - if(sm != null) - sm.checkCreateClassLoader(); } protected SecureClassLoader() { - SecurityManager sm = System.getSecurityManager(); - if(sm != null) - sm.checkCreateClassLoader(); } /** @@ -82,10 +79,35 @@ protected final Class defineClass(String name, byte[] b, int off, int len, CodeSource cs) { + return super.defineClass(name, b, off, len, getProtectionDomain(cs)); + } + + /** + * Creates a class using an ByteBuffer and a + * CodeSource. + * + * @param name the name to give the class. null if unknown. + * @param b the data representing the classfile, in classfile format. + * @param cs the CodeSource for the class or null when unknown. + * + * @return the class that was defined and optional CodeSource. + * + * @exception ClassFormatError if the byte array is not in proper classfile format. + * + * @since 1.5 + */ + protected final Class defineClass(String name, ByteBuffer b, CodeSource cs) + { + return super.defineClass(name, b, getProtectionDomain(cs)); + } + + /* Lookup or create a protection domain for the CodeSource, + * if CodeSource is null it will return null. */ + private ProtectionDomain getProtectionDomain(CodeSource cs) + { + ProtectionDomain protectionDomain = null; if (cs != null) { - ProtectionDomain protectionDomain; - synchronized (protectionDomainCache) { protectionDomain = (ProtectionDomain)protectionDomainCache.get(cs); @@ -105,10 +127,8 @@ protectionDomain = domain; } } - return super.defineClass(name, b, off, len, protectionDomain); - } - else - return super.defineClass(name, b, off, len); + } + return protectionDomain; } /** @@ -117,7 +137,7 @@ * java.security.Policy.getPermissions. * * This method is called by defineClass that takes a CodeSource - * arguement to build a proper ProtectionDomain for the class + * argument to build a proper ProtectionDomain for the class * being defined. */ protected PermissionCollection getPermissions(CodeSource cs)