re PR libgcj/28340 (gij ignores -Djava.security.manager)
authorGary Benson <gbenson@redhat.com>
Mon, 7 Aug 2006 14:48:59 +0000 (14:48 +0000)
committerGary Benson <gary@gcc.gnu.org>
Mon, 7 Aug 2006 14:48:59 +0000 (14:48 +0000)
2006-08-07  Gary Benson  <gbenson@redhat.com>

PR libgcj/28340:
* java/lang/ClassLoader.java (clinit): Install a default
security manager if java.security.manager is defined.
(getParent, getSystemClassLoader): Use the correct stack
frame during security checks.
* java/net/URLClassLoader.java (findClass): Avoid calling
this.toString() during VM initialization.
(runtimeInitialized): New method.
* java/net/natURLClassLoader.cc: New file.
* Makefile.am (nat_source_files): Added the above.
* Makefile.in: Rebuilt.

From-SVN: r115999

libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/java/lang/ClassLoader.java
libjava/java/net/URLClassLoader.java
libjava/java/net/natURLClassLoader.cc [new file with mode: 0644]

index 9436ff9..7176d1b 100644 (file)
@@ -1,4 +1,18 @@
 2006-08-07  Gary Benson  <gbenson@redhat.com>
+
+       PR libgcj/28340:
+       * java/lang/ClassLoader.java (clinit): Install a default
+       security manager if java.security.manager is defined.
+       (getParent, getSystemClassLoader): Use the correct stack
+       frame during security checks.
+       * java/net/URLClassLoader.java (findClass): Avoid calling
+       this.toString() during VM initialization.
+       (runtimeInitialized): New method.
+       * java/net/natURLClassLoader.cc: New file.
+       * Makefile.am (nat_source_files): Added the above.
+       * Makefile.in: Rebuilt.
+
+2006-08-07  Gary Benson  <gbenson@redhat.com>
            Casey Marshall <csm@gnu.org>
 
        * java/lang/SecurityManager.java (getSecurityContext,
index bf9f7a0..83ef094 100644 (file)
@@ -825,6 +825,7 @@ java/lang/reflect/natField.cc \
 java/lang/reflect/natMethod.cc \
 java/net/natVMNetworkInterface.cc \
 java/net/natInetAddress.cc \
+java/net/natURLClassLoader.cc \
 java/nio/channels/natVMChannels.cc \
 java/nio/natDirectByteBufferImpl.cc \
 java/security/natVMAccessController.cc \
index 57649f0..5818459 100644 (file)
@@ -289,6 +289,7 @@ am__libgcj_la_SOURCES_DIST = prims.cc jni.cc jvmti.cc exception.cc \
        java/lang/reflect/natConstructor.cc \
        java/lang/reflect/natField.cc java/lang/reflect/natMethod.cc \
        java/net/natVMNetworkInterface.cc java/net/natInetAddress.cc \
+       java/net/natURLClassLoader.cc \
        java/nio/channels/natVMChannels.cc \
        java/nio/natDirectByteBufferImpl.cc \
        java/security/natVMAccessController.cc \
@@ -334,6 +335,7 @@ am__objects_2 = gnu/classpath/natSystemProperties.lo \
        java/lang/reflect/natConstructor.lo \
        java/lang/reflect/natField.lo java/lang/reflect/natMethod.lo \
        java/net/natVMNetworkInterface.lo java/net/natInetAddress.lo \
+       java/net/natURLClassLoader.lo \
        java/nio/channels/natVMChannels.lo \
        java/nio/natDirectByteBufferImpl.lo \
        java/security/natVMAccessController.lo \
@@ -624,6 +626,7 @@ bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
 build_cpu = @build_cpu@
+build_libsubdir = @build_libsubdir@
 build_os = @build_os@
 build_subdir = @build_subdir@
 build_vendor = @build_vendor@
@@ -7144,6 +7147,7 @@ java/lang/reflect/natField.cc \
 java/lang/reflect/natMethod.cc \
 java/net/natVMNetworkInterface.cc \
 java/net/natInetAddress.cc \
+java/net/natURLClassLoader.cc \
 java/nio/channels/natVMChannels.cc \
 java/nio/natDirectByteBufferImpl.cc \
 java/security/natVMAccessController.cc \
@@ -7633,6 +7637,8 @@ java/net/natVMNetworkInterface.lo: java/net/$(am__dirstamp) \
        java/net/$(DEPDIR)/$(am__dirstamp)
 java/net/natInetAddress.lo: java/net/$(am__dirstamp) \
        java/net/$(DEPDIR)/$(am__dirstamp)
+java/net/natURLClassLoader.lo: java/net/$(am__dirstamp) \
+       java/net/$(DEPDIR)/$(am__dirstamp)
 java/nio/channels/$(am__dirstamp):
        @$(mkdir_p) java/nio/channels
        @: > java/nio/channels/$(am__dirstamp)
@@ -7958,6 +7964,8 @@ mostlyclean-compile:
        -rm -f java/lang/reflect/natMethod.lo
        -rm -f java/net/natInetAddress.$(OBJEXT)
        -rm -f java/net/natInetAddress.lo
+       -rm -f java/net/natURLClassLoader.$(OBJEXT)
+       -rm -f java/net/natURLClassLoader.lo
        -rm -f java/net/natVMNetworkInterface.$(OBJEXT)
        -rm -f java/net/natVMNetworkInterface.lo
        -rm -f java/nio/channels/natVMChannels.$(OBJEXT)
@@ -8082,6 +8090,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natField.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@java/lang/reflect/$(DEPDIR)/natMethod.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natInetAddress.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natURLClassLoader.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@java/net/$(DEPDIR)/natVMNetworkInterface.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@java/nio/$(DEPDIR)/natDirectByteBufferImpl.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@java/nio/channels/$(DEPDIR)/natVMChannels.Plo@am__quote@
index 13d8ca6..bcbfc29 100644 (file)
@@ -38,6 +38,7 @@ exception statement from your version. */
 
 package java.lang;
 
+import gnu.classpath.SystemProperties;
 import gnu.java.util.DoubleEnumeration;
 import gnu.java.util.EmptyEnumeration;
 
@@ -156,6 +157,39 @@ public abstract class ClassLoader
   static final ClassLoader systemClassLoader =
     VMClassLoader.getSystemClassLoader();
 
+  static
+  {
+    // Find out if we have to install a default security manager. Note
+    // that this is done here because we potentially need the system
+    // class loader to load the security manager and note also that we
+    // don't need the security manager until the system class loader
+    // is created.  If the runtime chooses to use a class loader that
+    // doesn't have the system class loader as its parent, it is
+    // responsible for setting up a security manager before doing so.
+    String secman = SystemProperties.getProperty("java.security.manager");
+    if (secman != null && SecurityManager.current == null)
+    {
+      if (secman.equals("") || secman.equals("default"))
+      {
+       SecurityManager.current = new SecurityManager();
+      }
+      else
+      {
+       try
+       {
+         Class cl = Class.forName(secman, false, systemClassLoader);
+         SecurityManager.current = (SecurityManager) cl.newInstance();
+       }
+       catch (Exception x)
+       {
+         throw (InternalError)
+           new InternalError("Unable to create SecurityManager")
+               .initCause(x);
+       }
+      }
+    }
+  }
+
   /**
    * The default protection domain, used when defining a class with a null
    * paramter for the domain.
@@ -496,7 +530,7 @@ public abstract class ClassLoader
     SecurityManager sm = System.getSecurityManager();
     if (sm != null)
       {
-        Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
+        Class c = VMSecurityManager.getClassContext(ClassLoader.class)[0];
         ClassLoader cl = c.getClassLoader();
        if (cl != null && ! cl.isAncestorOf(this))
           sm.checkPermission(new RuntimePermission("getClassLoader"));
@@ -739,7 +773,7 @@ public abstract class ClassLoader
     SecurityManager sm = System.getSecurityManager();
     if (sm != null)
       {
-       Class c = VMSecurityManager.getClassContext(ClassLoader.class)[1];
+       Class c = VMSecurityManager.getClassContext(ClassLoader.class)[0];
        ClassLoader cl = c.getClassLoader();
        if (cl != null && cl != systemClassLoader)
          sm.checkPermission(new RuntimePermission("getClassLoader"));
index ada4b63..06db7d5 100644 (file)
@@ -1078,7 +1078,12 @@ public class URLClassLoader extends SecureClassLoader
        resource = loader.getResource(resourceName);
       }
     if (resource == null)
-      throw new ClassNotFoundException(className + " not found in " + this);
+      {
+       String message = className + " not found";
+       if (runtimeInitialized())
+         message += " in " + this;
+       throw new ClassNotFoundException(message);
+      }
 
     // Try to read the class data, create the CodeSource, Package and
     // construct the class (and watch out for those nasty IOExceptions)
@@ -1437,4 +1442,11 @@ public class URLClassLoader extends SecureClassLoader
         return loader;
       }
   }
+
+  /**
+   * Tell whether runtime initialization is complete.
+   *
+   * @return whether runtime initialization is complete.
+   */
+  private static native boolean runtimeInitialized();  
 }
diff --git a/libjava/java/net/natURLClassLoader.cc b/libjava/java/net/natURLClassLoader.cc
new file mode 100644 (file)
index 0000000..ead0db4
--- /dev/null
@@ -0,0 +1,22 @@
+// natURLClassLoader.cc -- Native part of the URLClassLoader class.
+
+/* Copyright (C) 2006 Free Software Foundation, Inc.
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+#include <config.h>
+
+#include <gcj/cni.h>
+#include <jvm.h>
+
+#include <java/net/URLClassLoader.h>
+
+jboolean
+java::net::URLClassLoader::runtimeInitialized ()
+{
+  return gcj::runtimeInitialized;
+}