Fix security bug with use of thread context class loader.
diff --git a/build/solaris/makefiles/Defs.gmk b/build/solaris/makefiles/Defs.gmk
index 3028ac7..6a041b7 100644
--- a/build/solaris/makefiles/Defs.gmk
+++ b/build/solaris/makefiles/Defs.gmk
@@ -29,9 +29,9 @@
# Default JAVAHOME
#
ifeq ($(ARCH), sparc)
- _JAVAHOME = /java/re/jdk/1.4.2/archive/fcs/binaries/solaris-sparc
+ _JAVAHOME = /java/re/jdk/1.5.0/archive/fcs/binaries/solaris-sparc
else
- _JAVAHOME = /java/re/jdk/1.4.2/archive/fcs/binaries/solaris-i586
+ _JAVAHOME = /java/re/jdk/1.5.0/archive/fcs/binaries/solaris-i586
endif
#
@@ -183,7 +183,7 @@
#
# Invoking the Java compiler
#
-JAVAC_CMD = $(JAVAC) -source 1.4
+JAVAC_CMD = $(JAVAC) -source 1.5
#
# Set opt level to ALT_OPT if set otherwise _OPT
diff --git a/src/share/classes/javax/activation/CommandMap.java b/src/share/classes/javax/activation/CommandMap.java
index 7da1e2a..79a2cbc 100644
--- a/src/share/classes/javax/activation/CommandMap.java
+++ b/src/share/classes/javax/activation/CommandMap.java
@@ -40,6 +40,9 @@
package javax.activation;
+import java.util.Map;
+import java.util.WeakHashMap;
+
/**
* The CommandMap class provides an interface to a registry of
@@ -51,6 +54,8 @@
*/
public abstract class CommandMap {
private static CommandMap defaultCommandMap = null;
+ private static Map<ClassLoader,CommandMap> map =
+ new WeakHashMap<ClassLoader,CommandMap>();
/**
* Get the default CommandMap.
@@ -69,11 +74,18 @@
*
* @return the CommandMap
*/
- public static CommandMap getDefaultCommandMap() {
- if (defaultCommandMap == null)
- defaultCommandMap = new MailcapCommandMap();
+ public static synchronized CommandMap getDefaultCommandMap() {
+ if (defaultCommandMap != null)
+ return defaultCommandMap;
- return defaultCommandMap;
+ // fetch per-thread-context-class-loader default
+ ClassLoader tccl = SecuritySupport.getContextClassLoader();
+ CommandMap def = map.get(tccl);
+ if (def == null) {
+ def = new MailcapCommandMap();
+ map.put(tccl, def);
+ }
+ return def;
}
/**
@@ -84,7 +96,7 @@
* @exception SecurityException if the caller doesn't have permission
* to change the default
*/
- public static void setDefaultCommandMap(CommandMap commandMap) {
+ public static synchronized void setDefaultCommandMap(CommandMap commandMap) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
@@ -92,13 +104,16 @@
security.checkSetFactory();
} catch (SecurityException ex) {
// otherwise, we also allow it if this code and the
- // factory come from the same class loader (e.g.,
+ // factory come from the same (non-system) class loader (e.g.,
// the JAF classes were loaded with the applet classes).
- if (CommandMap.class.getClassLoader() !=
+ if (CommandMap.class.getClassLoader() == null ||
+ CommandMap.class.getClassLoader() !=
commandMap.getClass().getClassLoader())
throw ex;
}
}
+ // remove any per-thread-context-class-loader CommandMap
+ map.remove(SecuritySupport.getContextClassLoader());
defaultCommandMap = commandMap;
}
diff --git a/src/share/classes/javax/activation/DataHandler.java b/src/share/classes/javax/activation/DataHandler.java
index 901a93f..22b941d 100644
--- a/src/share/classes/javax/activation/DataHandler.java
+++ b/src/share/classes/javax/activation/DataHandler.java
@@ -381,7 +381,10 @@
// if it's not set, set it...
if (transferFlavors == emptyFlavors)
transferFlavors = getDataContentHandler().getTransferDataFlavors();
- return transferFlavors;
+ if (transferFlavors == emptyFlavors)
+ return transferFlavors;
+ else
+ return (DataFlavor[])transferFlavors.clone();
}
/**
diff --git a/src/share/classes/javax/activation/FileTypeMap.java b/src/share/classes/javax/activation/FileTypeMap.java
index 8b7079e..1050590 100644
--- a/src/share/classes/javax/activation/FileTypeMap.java
+++ b/src/share/classes/javax/activation/FileTypeMap.java
@@ -41,6 +41,8 @@
package javax.activation;
import java.io.File;
+import java.util.Map;
+import java.util.WeakHashMap;
/**
* The FileTypeMap is an abstract class that provides a data typing
@@ -61,6 +63,8 @@
public abstract class FileTypeMap {
private static FileTypeMap defaultMap = null;
+ private static Map<ClassLoader,FileTypeMap> map =
+ new WeakHashMap<ClassLoader,FileTypeMap>();
/**
* The default constructor.
@@ -95,7 +99,7 @@
* @exception SecurityException if the caller doesn't have permission
* to change the default
*/
- public static void setDefaultFileTypeMap(FileTypeMap map) {
+ public static synchronized void setDefaultFileTypeMap(FileTypeMap map) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
@@ -103,9 +107,10 @@
security.checkSetFactory();
} catch (SecurityException ex) {
// otherwise, we also allow it if this code and the
- // factory come from the same class loader (e.g.,
+ // factory come from the same (non-system) class loader (e.g.,
// the JAF classes were loaded with the applet classes).
- if (FileTypeMap.class.getClassLoader() !=
+ if (FileTypeMap.class.getClassLoader() == null ||
+ FileTypeMap.class.getClassLoader() !=
map.getClass().getClassLoader())
throw ex;
}
@@ -122,10 +127,17 @@
* @return The default FileTypeMap
* @see javax.activation.FileTypeMap#setDefaultFileTypeMap
*/
- public static FileTypeMap getDefaultFileTypeMap() {
- // XXX - probably should be synchronized
- if (defaultMap == null)
- defaultMap = new MimetypesFileTypeMap();
- return defaultMap;
+ public static synchronized FileTypeMap getDefaultFileTypeMap() {
+ if (defaultMap != null)
+ return defaultMap;
+
+ // fetch per-thread-context-class-loader default
+ ClassLoader tccl = SecuritySupport.getContextClassLoader();
+ FileTypeMap def = map.get(tccl);
+ if (def == null) {
+ def = new MimetypesFileTypeMap();
+ map.put(tccl, def);
+ }
+ return def;
}
}
diff --git a/src/share/classes/javax/activation/MailcapCommandMap.java b/src/share/classes/javax/activation/MailcapCommandMap.java
index 5f2c319..2c83938 100644
--- a/src/share/classes/javax/activation/MailcapCommandMap.java
+++ b/src/share/classes/javax/activation/MailcapCommandMap.java
@@ -133,11 +133,7 @@
public class MailcapCommandMap extends CommandMap {
/*
* We manage a collection of databases, searched in order.
- * The default database is shared between all instances
- * of this class.
- * XXX - Can we safely share more databases between instances?
*/
- private static MailcapFile defDB = null;
private MailcapFile[] DB;
private static final int PROG = 0; // programmatically added entries
@@ -177,14 +173,10 @@
loadAllResources(dbv, "META-INF/mailcap");
LogSupport.log("MailcapCommandMap: load DEF");
- synchronized (MailcapCommandMap.class) {
- // see if another instance has created this yet.
- if (defDB == null)
- defDB = loadResource("/META-INF/mailcap.default");
- }
+ mf = loadResource("/META-INF/mailcap.default");
- if (defDB != null)
- dbv.add(defDB);
+ if (mf != null)
+ dbv.add(mf);
DB = new MailcapFile[dbv.size()];
DB = (MailcapFile[])dbv.toArray(DB);
diff --git a/src/share/classes/javax/activation/MimetypesFileTypeMap.java b/src/share/classes/javax/activation/MimetypesFileTypeMap.java
index eef6c5f..0d9fbd4 100644
--- a/src/share/classes/javax/activation/MimetypesFileTypeMap.java
+++ b/src/share/classes/javax/activation/MimetypesFileTypeMap.java
@@ -82,11 +82,7 @@
public class MimetypesFileTypeMap extends FileTypeMap {
/*
* We manage a collection of databases, searched in order.
- * The default database is shared between all instances
- * of this class.
- * XXX - Can we safely share more databases between instances?
*/
- private static MimeTypeFile defDB = null;
private MimeTypeFile[] DB;
private static final int PROG = 0; // programmatically added entries
@@ -127,14 +123,10 @@
loadAllResources(dbv, "META-INF/mime.types");
LogSupport.log("MimetypesFileTypeMap: load DEF");
- synchronized (MimetypesFileTypeMap.class) {
- // see if another instance has created this yet.
- if (defDB == null)
- defDB = loadResource("/META-INF/mimetypes.default");
- }
+ mf = loadResource("/META-INF/mimetypes.default");
- if (defDB != null)
- dbv.addElement(defDB);
+ if (mf != null)
+ dbv.addElement(mf);
DB = new MimeTypeFile[dbv.size()];
dbv.copyInto(DB);