OSDN Git Service

2004-01-06 Michael Koch <konqueror@gmx.de>
authormkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Jan 2004 08:34:58 +0000 (08:34 +0000)
committermkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Jan 2004 08:34:58 +0000 (08:34 +0000)
* java/lang/Package.java
(getPackage): Get the current class loader directly.
* java/lang/SecurityManager.java
(currentLoadedClass): Dont iterate over class contexts.
(classLoaderDepth): Don't check class loaders if everything is allowed.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75465 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/lang/Package.java
libjava/java/lang/SecurityManager.java

index f19dd30..c97afbc 100644 (file)
@@ -1,3 +1,11 @@
+2004-01-06  Michael Koch  <konqueror@gmx.de>
+
+       * java/lang/Package.java
+       (getPackage): Get the current class loader directly.
+       * java/lang/SecurityManager.java
+       (currentLoadedClass): Dont iterate over class contexts.
+       (classLoaderDepth): Don't check class loaders if everything is allowed.
+
 2004-01-05  Thomas Fitzsimmons  <fitzsim@redhat.com>
 
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
index f09814b..3045b50 100644 (file)
@@ -269,8 +269,7 @@ public class Package
   public static Package getPackage(String name)
   {
     // Get the caller's classloader
-    Class c = VMSecurityManager.getClassContext()[1];
-    ClassLoader cl = c.getClassLoader();
+    ClassLoader cl = VMSecurityManager.currentClassLoader();
     return cl != null ? cl.getPackage(name) : null;
   }
 
index e54ebc6..bec39de 100644 (file)
@@ -207,11 +207,8 @@ public class SecurityManager
    */
   protected Class currentLoadedClass()
   {
-    Class[] c = getClassContext();
-    for (int i = 0; i < c.length; i++)
-      if (c[i].getClassLoader() != null)
-       return c[i];
-    return null;
+    int i = classLoaderDepth();
+    return i >= 0 ? getClassContext()[i] : null;
   }
 
   /**
@@ -247,10 +244,18 @@ public class SecurityManager
    */
   protected int classLoaderDepth()
   {
-    Class[] c = getClassContext();
-    for (int i = 0; i < c.length; i++)
-      if (c[i].getClassLoader() != null)
-       return i;
+    try
+      {
+        checkPermission(new AllPermission());
+      }
+    catch (SecurityException e)
+      {
+        Class[] c = getClassContext();
+        for (int i = 0; i < c.length; i++)
+          if (c[i].getClassLoader() != null)
+            // XXX Check if c[i] is AccessController, or a system class.
+            return i;
+      }
     return -1;
   }
 
@@ -1016,6 +1021,7 @@ public class SecurityManager
         for (int index = list.indexOf(packageName);
              index != -1; index = list.indexOf(packageName, index + 1))
           {
+            // Exploit package visibility for speed.
            int packageNameCount = packageName.length();
             if (index + packageNameCount == list.length()
                 || list.charAt(index + packageNameCount) == ',')