Commit ded9dbb8 by Gary Benson Committed by Gary Benson

re PR libgcj/28340 (gij ignores -Djava.security.manager)

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
parent da0f0334
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,
......
......@@ -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 \
......
......@@ -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@
......
......@@ -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"));
......
......@@ -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();
}
// 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment