Patch: New Thread functions
Tom Tromey
tromey@cygnus.com
Sun Nov 26 11:31:00 GMT 2000
This patch adds java.lang.RuntimePermission and updates the new Thread
functions to use it correctly.
Anthony, does this look good to you?
I made these methods synchronized as well, to avoid races.
2000-11-26 Tom Tromey <tromey@cygnus.com>
* Makefile.in: Rebuilt.
* Makefile.am (core_java_source_files): Added
RuntimePermission.java.
* java/lang/RuntimePermission.java: Imported from Classpath.
* java/lang/Thread.java (getContextClassLoader): Now
synchronized. Added security code.
(setContextClassLoader): Likewise.
Tom
Index: java/lang/RuntimePermission.java
===================================================================
RCS file: RuntimePermission.java
diff -N RuntimePermission.java
--- /dev/null Tue May 5 13:32:27 1998
+++ RuntimePermission.java Sun Nov 26 11:29:32 2000
@@ -0,0 +1,153 @@
+/* RuntimePermission.java
+ Copyright (C) 1998 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
+
+
+package java.lang;
+
+import java.security.*;
+
+/**
+ * A <code>RuntimePermission</code> contains a permission name, but no
+ * actions list. This means you either have the permission or you don't.
+ *
+ * Permission names have the follow the hierarchial property naming
+ * convention. In addition, an asterisk may appear at the end of a
+ * name if following a period or by itself.
+ *
+ * <table border=1>
+ * <tr><th>Valid names</th><th>Invalid names</th></tr>
+ * <tr><td>"accessClassInPackage.*","*"</td>
+ * <td>"**", "*x", "*.a"</td></tr>
+ * </table>
+ * <br>
+ *
+ * The following table provides a list of all the possible RuntimePermission
+ * permission names with a description of what that permission allows.
+ * <br>
+ * <table border=1>
+ * <tr><th>Permission Name</th><th>Permission Allows</th></tr>
+ * <tr>
+ * <td><code>createClassLoader</code></td>
+ * <td>creation of a class loader</td></tr>
+ * <tr>
+ * <td><code>getClassLoader</code></td>
+ * <td>retrieval of the class loader for the calling class</td></tr>
+ * <tr>
+ * <td><code>setContextClassLoader</code></td>
+ * <td>allows the setting of the context class loader used by a
+ * thread including system threads</td></tr>
+ * <tr>
+ * <td><code>setSecurityManager</code></td>
+ * <td>allows the application to replace the security manager with
+ * another, possibly less restrictive one.</td></tr>
+ * <tr>
+ * <td><code>createSecurityManager</code></td>
+ * <td>allows the application to create a new security manager</td></tr>
+ * <tr>
+ * <td><code>exitVM</code></td>
+ * <td>allows the application to halt the virtual machine</td></tr>
+ * <tr>
+ * <td><code>setFactory</code></td>
+ * <td>allows the application to set the socket factory for socket,
+ * server socket, stream handler, or RMI socket factory.</td></tr>
+ * <tr>
+ * <td><code>setIO</code></td>
+ * <td>allows the application to set System.out, System.in, and
+ * System.err</td></tr>
+ * <tr>
+ * <td><code>modifyThread</code></td>
+ * <td>allows the application to modify any thread in the virtual machine
+ * using any of the methods <code>stop</code>, <code>resume</code>,
+ * <code>suspend</code>, <code>setPriority</code>, and
+ * <code>setName</code> of classs <code>Thread</code></td></tr>
+ * <tr>
+ * <td><code>stopThread</code></td>
+ * <td>allows the application to <code>stop</code> any thread it has
+ * access to in the system</td></tr>
+ * <tr>
+ * <td><code>modifyThreadGroup</td>
+ * <td>allows the application to modify thread groups using any of the
+ * methods <code>destroy</code>, <code>resume</code>,
+ * <code>setDaemon</code>, <code>setMaxPriority</code>,
+ * <code>stop</code>, and <code>suspend</code> of the class
+ * <code>ThreadGroup</code></td></tr>
+ * <tr>
+ * <td><code>getProtectionDomain</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>readFileDescriptor</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>writeFileDescriptor</code</td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>loadLibrary.{library name}</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>accessClassInPackage.{package name}</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>defineClassInPackage.{package name}</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>accessDeclaredMembers</code></td>
+ * <td></td></tr>
+ * <tr>
+ * <td><code>queuePrintJob</code></td>
+ * <td></td></tr>
+ * </table>
+ *
+ * @since JDK 1.2
+ *
+ * @author Brian Jones
+ */
+public class RuntimePermission extends java.security.BasicPermission
+{
+ /**
+ *
+ * @param permissionName the name of the granted permission
+ *
+ * @throws IllegalArgumentException thrown if the name contains an invalid
+ * wildcard character
+ */
+ public RuntimePermission(String permissionName)
+ {
+ this(permissionName, null);
+ }
+
+ /**
+ *
+ * @param permissionName the name of the granted permission
+ * @param actions this should always be null
+ *
+ * @throws IllegalArgumentException throw if the name contains an invalid
+ * wildcard character
+ */
+ public RuntimePermission(String permissionName, String actions)
+ {
+ super(permissionName, actions);
+ }
+}
Index: java/lang/Thread.java
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/lang/Thread.java,v
retrieving revision 1.14
diff -u -r1.14 Thread.java
--- Thread.java 2000/11/26 03:58:55 1.14
+++ Thread.java 2000/11/26 19:29:32
@@ -145,21 +145,37 @@
daemon_flag = status;
}
- public ClassLoader getContextClassLoader()
+ public synchronized ClassLoader getContextClassLoader()
{
if (context_class_loader == null)
+ context_class_loader = ClassLoader.getSystemClassLoader ();
+
+ SecurityManager s = System.getSecurityManager();
+ // FIXME: we can't currently find the caller's class loader.
+ ClassLoader callers = null;
+ if (s != null && callers != null)
{
- context_class_loader = ClassLoader.getSystemClassLoader ();
- return context_class_loader;
+ // See if the caller's class loader is the same as or an
+ // ancestor of this thread's class loader.
+ while (callers != null && callers != context_class_loader)
+ {
+ // FIXME: should use some internal version of getParent
+ // that avoids security checks.
+ callers = callers.getParent ();
+ }
+
+ if (callers != context_class_loader)
+ s.checkPermission (new RuntimePermission ("getClassLoader"));
}
- // FIXME: Add security manager stuff here.
return context_class_loader;
}
- public void setContextClassLoader(ClassLoader cl)
+ public synchronized void setContextClassLoader(ClassLoader cl)
{
- // FIXME: Add security manager stuff here.
+ SecurityManager s = System.getSecurityManager ();
+ if (s != null)
+ s.checkPermission (new RuntimePermission ("setContextClassLoader"));
context_class_loader = cl;
}
More information about the Java-patches
mailing list