summaryrefslogtreecommitdiff
path: root/java/openjdk7/files/patch-7u55-b31
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk7/files/patch-7u55-b31')
-rw-r--r--java/openjdk7/files/patch-7u55-b3117206
1 files changed, 17206 insertions, 0 deletions
diff --git a/java/openjdk7/files/patch-7u55-b31 b/java/openjdk7/files/patch-7u55-b31
new file mode 100644
index 000000000000..3ad355a0eb09
--- /dev/null
+++ b/java/openjdk7/files/patch-7u55-b31
@@ -0,0 +1,17206 @@
+--- ./.hgtags Thu Dec 19 09:00:36 2013 -0800
++++ ./.hgtags Tue Mar 18 12:29:21 2014 -0700
+@@ -378,6 +378,9 @@
+ f0cdb08a4624a623bdd178b04c4bf5a2fa4dc39a jdk7u45-b18
+ 82f1f76c44124c31cb1151833fc15c13547ab280 jdk7u45-b30
+ f4373de4b75ba8d7f7a5d9c1f77e7884d9064b7e jdk7u45-b31
++b73c006b5d81528dfb4104a79b994b56675bf75d jdk7u45-b33
++05742477836cb30235328181c8e6cae5d4bb06fd jdk7u45-b34
++d0d5badd77abce0469830466ff7b910d3621d847 jdk7u45-b35
+ f2479abad143d2d9f33b6c872890ca0c5dd52530 jdk7u51-b00
+ c5822e1d1baa9625ee4e54b8e83a9bf529c883fc jdk7u51-b01
+ f750621fb31b8f6462b803b47bbf84f05cd5174a jdk7u51-b02
+@@ -392,3 +395,22 @@
+ 573c4cfca7dda548463bb84330bddfd07fe1183f jdk7u51-b11
+ df53ec7eb789e7dec375a685dce1fa5cf63618b4 jdk7u51-b12
+ 6c778574d87336a2e55156544af92ce2de799696 jdk7u51-b13
++d2eeac0235eda77d0a6c72c7235a6e96bc9ad4fb jdk7u51-b30
++626e76f127a44ba0118a545d37410f80000db8fb jdk7u51-b31
++472d67871307433bf3e2687c48237c48ffbf068e jdk7u51-b33
++503f1d094a1bbbd94386f5c3342130dc5f4ba6ee jdk7u51-b34
++df53ec7eb789e7dec375a685dce1fa5cf63618b4 jdk7u55-b00
++15bc13cd7f5d0bb06ab59935e25944fa7cb15bc8 jdk7u55-b01
++b829c5947c6cd473f42cadfe2c61399fb67c2da6 jdk7u55-b02
++a72b902cdd39d9f2f2d353d5ad629e543cbc01ae jdk7u55-b03
++6a8ee38075621564dd276e8ed7be576d637acf79 jdk7u55-b04
++92ac508efb9e00d88b04a2bd79ab8a55f450a048 jdk7u55-b05
++6c7cd2146f69cf0823765b3cf84c338c1dc7157c jdk7u55-b06
++5cad0f56c685a0673944dbc5632ea9ae7b9340c7 jdk7u55-b07
++f617c33f98e1941875457c5c227198c52917942e jdk7u55-b08
++1f02b1889f7098c1e6fdd271ef74c62a2e346b28 jdk7u55-b09
++736c951b19b9562830f61d5ebbad78775f200e94 jdk7u55-b09
++2a55bbab15f6c866281003dcf48708a9d8c145e9 jdk7u55-b10
++f4ace62029de00d2497058c3c0e1d26e019cde30 jdk7u55-b11
++de268da51b54a4f36bcc1a9af60faea285e94330 jdk7u55-b12
++d972a2d9e4f3f864d26c33ccfdacd8269e0f29a8 jdk7u55-b13
+--- ./corba/.hgtags Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/.hgtags Tue Mar 18 12:29:47 2014 -0700
+@@ -381,6 +381,9 @@
+ 80f65a8f58500ef5d93ddf4426d9c1909b79fadf jdk7u45-b18
+ a15e4a54504471f1e34a494ed66235870722a0f5 jdk7u45-b30
+ b7fb35bbe70d88eced3725b6e9070ad0b5b621ad jdk7u45-b31
++d641ac83157ec86219519c0cbaf3122bdc997136 jdk7u45-b33
++aa24e046a2da95637257c9effeaabe254db0aa0b jdk7u45-b34
++fab1423e6ab8ecf36da8b6bf2e454156ec701e8a jdk7u45-b35
+ b1f069eb48edfa6fb7428dc045a53e287215ef4a jdk7u51-b00
+ 8d884cf2e8cce92d532950de2c7283d9804f9e58 jdk7u51-b01
+ 327035fbb0433927c1b1af2bc0bcb84e7827f1b9 jdk7u51-b02
+@@ -395,3 +398,22 @@
+ a26d0e8ab1027e70ae1ded8ede0086a0a4a10256 jdk7u51-b11
+ 55a509ccc0e4ed49e311c7ecf2ed29a908bc1d6b jdk7u51-b12
+ e2f0036f712aa636cfd55334ac21ea7ca2587a7b jdk7u51-b13
++6563d12c48c92af39a27ca46b4515fad8e994667 jdk7u51-b30
++0ad990211737fe1b1e2737a3498ab266146d2c53 jdk7u51-b31
++ee7d9f5d18fb67564e88a10f1bd682660db60aa2 jdk7u51-b33
++65ef96a075a43e9201866d1c9b8ee3138ebcc424 jdk7u51-b34
++55a509ccc0e4ed49e311c7ecf2ed29a908bc1d6b jdk7u55-b00
++aabfdc799c0799837dcbbf9ea8d6df1511978b1f jdk7u55-b01
++db2e6d87bade9d2061646ff9a6b39b5159fba0ec jdk7u55-b02
++02ff18f156bd3382fe22e4758b138370f5238e97 jdk7u55-b03
++6a88a170331fb38af5046e54bf75f38176af5c41 jdk7u55-b04
++a8d27c3fc4e4e6cd99fa164f04c30a71f474a2d6 jdk7u55-b05
++af7f1808106bf4e9b4680d943677299829245d08 jdk7u55-b06
++44801796d42bebc90e8c4c7fb5bd79db04b10b75 jdk7u55-b07
++aa98fb8dc3608a30ac593635b21aca2105aaab20 jdk7u55-b08
++2a4842e7ca0b2228017542cea0fed3b8d4f4491a jdk7u55-b09
++5805c3291eb3a82cd75e95ac06eb13daa7f92866 jdk7u55-b09
++b9dae31c56a2bf69fc5932cc490cd80fccc1e0fd jdk7u55-b10
++cbd5b4b07e0c8a5f61eff396b7622e7b04d2a164 jdk7u55-b11
++3cce2a49d18d93dfca2634db32368486ebbb1590 jdk7u55-b12
++8efa6e66c13a5329c312d1a521ffab75d9a330e3 jdk7u55-b13
+--- ./corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java Tue Mar 18 12:29:47 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -52,6 +52,7 @@
+ import java.io.DataOutputStream;
+ import java.io.ByteArrayOutputStream;
+ import java.io.InvalidClassException;
++import java.io.Externalizable;
+ import java.io.Serializable;
+
+ import java.util.Arrays;
+@@ -82,15 +83,15 @@
+ public static final long kDefaultUID = -1;
+
+ private static Object noArgsList[] = {};
+- private static Class noTypesList[] = {};
++ private static Class<?> noTypesList[] = {};
+
+ /** true if represents enum type */
+ private boolean isEnum;
+
+ private static final Bridge bridge =
+- (Bridge)AccessController.doPrivileged(
+- new PrivilegedAction() {
+- public Object run() {
++ AccessController.doPrivileged(
++ new PrivilegedAction<Bridge>() {
++ public Bridge run() {
+ return Bridge.get() ;
+ }
+ }
+@@ -100,7 +101,7 @@
+ * is returned if the specified class does not implement
+ * java.io.Serializable or java.io.Externalizable.
+ */
+- static final ObjectStreamClass lookup(Class cl)
++ static final ObjectStreamClass lookup(Class<?> cl)
+ {
+ ObjectStreamClass desc = lookupInternal(cl);
+ if (desc.isSerializable() || desc.isExternalizable())
+@@ -112,7 +113,7 @@
+ * Find the class descriptor for the specified class.
+ * Package access only so it can be called from ObjectIn/OutStream.
+ */
+- static ObjectStreamClass lookupInternal(Class cl)
++ static ObjectStreamClass lookupInternal(Class<?> cl)
+ {
+ /* Synchronize on the hashtable so no two threads will do
+ * this at the same time.
+@@ -123,14 +124,14 @@
+ desc = findDescriptorFor(cl);
+ if (desc == null) {
+ /* Check if it's serializable */
+- boolean serializable = classSerializable.isAssignableFrom(cl);
++ boolean serializable = Serializable.class.isAssignableFrom(cl);
+
+ /* If the class is only Serializable,
+ * lookup the descriptor for the superclass.
+ */
+ ObjectStreamClass superdesc = null;
+ if (serializable) {
+- Class superclass = cl.getSuperclass();
++ Class<?> superclass = cl.getSuperclass();
+ if (superclass != null)
+ superdesc = lookup(superclass);
+ }
+@@ -143,7 +144,7 @@
+ if (serializable) {
+ externalizable =
+ ((superdesc != null) && superdesc.isExternalizable()) ||
+- classExternalizable.isAssignableFrom(cl);
++ Externalizable.class.isAssignableFrom(cl);
+ if (externalizable) {
+ serializable = false;
+ }
+@@ -187,7 +188,7 @@
+ * that have evolved from a common root class and agree to be serialized
+ * and deserialized using a common format.
+ */
+- public static final long getSerialVersionUID( java.lang.Class clazz) {
++ public static final long getSerialVersionUID( java.lang.Class<?> clazz) {
+ ObjectStreamClass theosc = ObjectStreamClass.lookup( clazz );
+ if( theosc != null )
+ {
+@@ -221,7 +222,7 @@
+ /**
+ * Return the actual (computed) serialVersionUID for this class.
+ */
+- public static final long getActualSerialVersionUID( java.lang.Class clazz )
++ public static final long getActualSerialVersionUID( java.lang.Class<?> clazz )
+ {
+ ObjectStreamClass theosc = ObjectStreamClass.lookup( clazz );
+ if( theosc != null )
+@@ -251,7 +252,7 @@
+ * Return the class in the local VM that this version is mapped to.
+ * Null is returned if there is no corresponding local class.
+ */
+- public final Class forClass() {
++ public final Class<?> forClass() {
+ return ofClass;
+ }
+
+@@ -351,7 +352,7 @@
+ * Create a new ObjectStreamClass from a loaded class.
+ * Don't call this directly, call lookup instead.
+ */
+- private ObjectStreamClass(java.lang.Class cl, ObjectStreamClass superdesc,
++ private ObjectStreamClass(java.lang.Class<?> cl, ObjectStreamClass superdesc,
+ boolean serial, boolean extern)
+ {
+ ofClass = cl; /* created from this class */
+@@ -390,7 +391,7 @@
+
+ PersistentFieldsValue() { }
+
+- ObjectStreamField[] get(Class type) {
++ ObjectStreamField[] get(Class<?> type) {
+ Object value = map.get(type);
+ if (value == null) {
+ value = computeValue(type);
+@@ -448,7 +449,7 @@
+ if (initialized)
+ return;
+
+- final Class cl = ofClass;
++ final Class<?> cl = ofClass;
+
+ if (!serializable ||
+ externalizable ||
+@@ -576,9 +577,9 @@
+ * will call it as necessary.
+ */
+ writeObjectMethod = getPrivateMethod( cl, "writeObject",
+- new Class[] { java.io.ObjectOutputStream.class }, Void.TYPE ) ;
++ new Class<?>[] { java.io.ObjectOutputStream.class }, Void.TYPE ) ;
+ readObjectMethod = getPrivateMethod( cl, "readObject",
+- new Class[] { java.io.ObjectInputStream.class }, Void.TYPE ) ;
++ new Class<?>[] { java.io.ObjectInputStream.class }, Void.TYPE ) ;
+ }
+ return null;
+ }
+@@ -604,9 +605,9 @@
+ * class, or null if none found. Access checks are disabled on the
+ * returned method (if any).
+ */
+- private static Method getPrivateMethod(Class cl, String name,
+- Class[] argTypes,
+- Class returnType)
++ private static Method getPrivateMethod(Class<?> cl, String name,
++ Class<?>[] argTypes,
++ Class<?> returnType)
+ {
+ try {
+ Method meth = cl.getDeclaredMethod(name, argTypes);
+@@ -667,7 +668,7 @@
+ * Fill in the reflected Fields that will be used
+ * for reading.
+ */
+- final void setClass(Class cl) throws InvalidClassException {
++ final void setClass(Class<?> cl) throws InvalidClassException {
+
+ if (cl == null) {
+ localClassDesc = null;
+@@ -934,9 +935,9 @@
+ * Access checks are disabled on the returned constructor (if any), since
+ * the defining class may still be non-public.
+ */
+- private static Constructor getExternalizableConstructor(Class cl) {
++ private static Constructor getExternalizableConstructor(Class<?> cl) {
+ try {
+- Constructor cons = cl.getDeclaredConstructor(new Class[0]);
++ Constructor cons = cl.getDeclaredConstructor(new Class<?>[0]);
+ cons.setAccessible(true);
+ return ((cons.getModifiers() & Modifier.PUBLIC) != 0) ?
+ cons : null;
+@@ -950,15 +951,15 @@
+ * superclass, or null if none found. Access checks are disabled on the
+ * returned constructor (if any).
+ */
+- private static Constructor getSerializableConstructor(Class cl) {
+- Class initCl = cl;
++ private static Constructor getSerializableConstructor(Class<?> cl) {
++ Class<?> initCl = cl;
+ while (Serializable.class.isAssignableFrom(initCl)) {
+ if ((initCl = initCl.getSuperclass()) == null) {
+ return null;
+ }
+ }
+ try {
+- Constructor cons = initCl.getDeclaredConstructor(new Class[0]);
++ Constructor cons = initCl.getDeclaredConstructor(new Class<?>[0]);
+ int mods = cons.getModifiers();
+ if ((mods & Modifier.PRIVATE) != 0 ||
+ ((mods & (Modifier.PUBLIC | Modifier.PROTECTED)) == 0 &&
+@@ -1063,7 +1064,7 @@
+ * items to the hash accumulating in the digest stream.
+ * Fold the hash into a long. Use the SHA secure hash function.
+ */
+- private static long _computeSerialVersionUID(Class cl) {
++ private static long _computeSerialVersionUID(Class<?> cl) {
+ if (DEBUG_SVUID)
+ msg( "Computing SerialVersionUID for " + cl ) ;
+ ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
+@@ -1117,7 +1118,7 @@
+ * them from its computation.
+ */
+
+- Class interfaces[] = cl.getInterfaces();
++ Class<?> interfaces[] = cl.getInterfaces();
+ Arrays.sort(interfaces, compareClassByName);
+
+ for (int i = 0; i < interfaces.length; i++) {
+@@ -1247,7 +1248,7 @@
+ return h;
+ }
+
+- private static long computeStructuralUID(com.sun.corba.se.impl.io.ObjectStreamClass osc, Class cl) {
++ private static long computeStructuralUID(com.sun.corba.se.impl.io.ObjectStreamClass osc, Class<?> cl) {
+ ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
+
+ long h = 0;
+@@ -1267,7 +1268,7 @@
+ DataOutputStream data = new DataOutputStream(mdo);
+
+ // Get SUID of parent
+- Class parent = cl.getSuperclass();
++ Class<?> parent = cl.getSuperclass();
+ if ((parent != null))
+ // SerialBug 1; acc. to spec the one for
+ // java.lang.object
+@@ -1323,10 +1324,10 @@
+ /**
+ * Compute the JVM signature for the class.
+ */
+- static String getSignature(Class clazz) {
++ static String getSignature(Class<?> clazz) {
+ String type = null;
+ if (clazz.isArray()) {
+- Class cl = clazz;
++ Class<?> cl = clazz;
+ int dimensions = 0;
+ while (cl.isArray()) {
+ dimensions++;
+@@ -1372,7 +1373,7 @@
+
+ sb.append("(");
+
+- Class[] params = meth.getParameterTypes(); // avoid clone
++ Class<?>[] params = meth.getParameterTypes(); // avoid clone
+ for (int j = 0; j < params.length; j++) {
+ sb.append(getSignature(params[j]));
+ }
+@@ -1389,7 +1390,7 @@
+
+ sb.append("(");
+
+- Class[] params = cons.getParameterTypes(); // avoid clone
++ Class<?>[] params = cons.getParameterTypes(); // avoid clone
+ for (int j = 0; j < params.length; j++) {
+ sb.append(getSignature(params[j]));
+ }
+@@ -1409,7 +1410,7 @@
+ * The entries are extended from java.lang.ref.SoftReference so the
+ * gc will be able to free them if needed.
+ */
+- private static ObjectStreamClass findDescriptorFor(Class cl) {
++ private static ObjectStreamClass findDescriptorFor(Class<?> cl) {
+
+ int hash = cl.hashCode();
+ int index = (hash & 0x7FFFFFFF) % descriptorFor.length;
+@@ -1456,7 +1457,7 @@
+ descriptorFor[index] = e;
+ }
+
+- private static Field[] getDeclaredFields(final Class clz) {
++ private static Field[] getDeclaredFields(final Class<?> clz) {
+ return (Field[]) AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ return clz.getDeclaredFields();
+@@ -1490,7 +1491,7 @@
+ /*
+ * Class that is a descriptor for in this virtual machine.
+ */
+- private Class ofClass;
++ private Class<?> ofClass;
+
+ /*
+ * True if descriptor for a proxy class.
+@@ -1562,30 +1563,17 @@
+ * Returns true if the given class defines a static initializer method,
+ * false otherwise.
+ */
+- private static boolean hasStaticInitializer(Class cl) {
++ private static boolean hasStaticInitializer(Class<?> cl) {
+ if (hasStaticInitializerMethod == null) {
+- Class classWithThisMethod = null;
++ Class<?> classWithThisMethod = null;
+
+ try {
+- try {
+- // When using rip-int with Merlin or when this is a Merlin
+- // workspace, the method we want is in sun.misc.ClassReflector
+- // and absent from java.io.ObjectStreamClass.
+- //
+- // When compiling rip-int with JDK 1.3.x, we have to get it
+- // from java.io.ObjectStreamClass.
+- classWithThisMethod = Class.forName("sun.misc.ClassReflector");
+- } catch (ClassNotFoundException cnfe) {
+- // Do nothing. This is either not a Merlin workspace,
+- // or rip-int is being compiled with something other than
+- // Merlin, probably JDK 1.3. Fall back on java.io.ObjectStreaClass.
+- }
+ if (classWithThisMethod == null)
+ classWithThisMethod = java.io.ObjectStreamClass.class;
+
+ hasStaticInitializerMethod =
+ classWithThisMethod.getDeclaredMethod("hasStaticInitializer",
+- new Class[] { Class.class });
++ new Class<?>[] { Class.class });
+ } catch (NoSuchMethodException ex) {
+ }
+
+@@ -1610,22 +1598,6 @@
+ }
+
+
+- /* The Class Object for java.io.Serializable */
+- private static Class classSerializable = null;
+- private static Class classExternalizable = null;
+-
+- /*
+- * Resolve java.io.Serializable at load time.
+- */
+- static {
+- try {
+- classSerializable = Class.forName("java.io.Serializable");
+- classExternalizable = Class.forName("java.io.Externalizable");
+- } catch (Throwable e) {
+- System.err.println("Could not load java.io.Serializable or java.io.Externalizable.");
+- }
+- }
+-
+ /** use serialVersionUID from JDK 1.1. for interoperability */
+ private static final long serialVersionUID = -6120832682080437368L;
+
+@@ -1663,8 +1635,8 @@
+
+ private static class CompareClassByName implements Comparator {
+ public int compare(Object o1, Object o2) {
+- Class c1 = (Class)o1;
+- Class c2 = (Class)o2;
++ Class<?> c1 = (Class)o1;
++ Class<?> c2 = (Class)o2;
+ return (c1.getName()).compareTo(c2.getName());
+ }
+ }
+@@ -1778,12 +1750,12 @@
+ *
+ * Copied from the Merlin java.io.ObjectStreamClass.
+ */
+- private static Method getInheritableMethod(Class cl, String name,
+- Class[] argTypes,
+- Class returnType)
++ private static Method getInheritableMethod(Class<?> cl, String name,
++ Class<?>[] argTypes,
++ Class<?> returnType)
+ {
+ Method meth = null;
+- Class defCl = cl;
++ Class<?> defCl = cl;
+ while (defCl != null) {
+ try {
+ meth = defCl.getDeclaredMethod(name, argTypes);
+@@ -1815,7 +1787,7 @@
+ *
+ * Copied from the Merlin java.io.ObjectStreamClass.
+ */
+- private static boolean packageEquals(Class cl1, Class cl2) {
++ private static boolean packageEquals(Class<?> cl1, Class<?> cl2) {
+ Package pkg1 = cl1.getPackage(), pkg2 = cl2.getPackage();
+ return ((pkg1 == pkg2) || ((pkg1 != null) && (pkg1.equals(pkg2))));
+ }
+--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java Tue Mar 18 12:29:47 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -94,7 +94,7 @@
+ });
+ }
+
+- public static long computeStructuralUID(boolean hasWriteObject, Class cl) {
++ public static long computeStructuralUID(boolean hasWriteObject, Class<?> cl) {
+ ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
+
+ long h = 0;
+@@ -119,7 +119,7 @@
+ // Object method in there
+
+ // Get SUID of parent
+- Class parent = cl.getSuperclass();
++ Class<?> parent = cl.getSuperclass();
+ if ((parent != null) && (parent != java.lang.Object.class)) {
+ boolean hasWriteObjectFlag = false;
+ Class [] args = {java.io.ObjectOutputStream.class};
+@@ -503,19 +503,6 @@
+ Class classWithThisMethod = null;
+
+ try {
+- try {
+- // When using rip-int with Merlin or when this is a Merlin
+- // workspace, the method we want is in sun.misc.ClassReflector
+- // and absent from java.io.ObjectStreamClass.
+- //
+- // When compiling rip-int with JDK 1.3.x, we have to get it
+- // from java.io.ObjectStreamClass.
+- classWithThisMethod = Class.forName("sun.misc.ClassReflector");
+- } catch (ClassNotFoundException cnfe) {
+- // Do nothing. This is either not a Merlin workspace,
+- // or rip-int is being compiled with something other than
+- // Merlin, probably JDK 1.3. Fall back on java.io.ObjectStreaClass.
+- }
+ if (classWithThisMethod == null)
+ classWithThisMethod = java.io.ObjectStreamClass.class;
+
+--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java Tue Mar 18 12:29:47 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -53,6 +53,7 @@
+ import java.io.ByteArrayOutputStream;
+ import java.io.InvalidClassException;
+ import java.io.Serializable;
++import java.io.Externalizable;
+
+ import java.util.Arrays;
+ import java.util.Comparator;
+@@ -88,7 +89,7 @@
+ public static final long kDefaultUID = -1;
+
+ private static Object noArgsList[] = {};
+- private static Class noTypesList[] = {};
++ private static Class<?> noTypesList[] = {};
+
+ private static Hashtable translatedFields;
+
+@@ -96,7 +97,7 @@
+ * is returned if the specified class does not implement
+ * java.io.Serializable or java.io.Externalizable.
+ */
+- static final ObjectStreamClass_1_3_1 lookup(Class cl)
++ static final ObjectStreamClass_1_3_1 lookup(Class<?> cl)
+ {
+ ObjectStreamClass_1_3_1 desc = lookupInternal(cl);
+ if (desc.isSerializable() || desc.isExternalizable())
+@@ -108,7 +109,7 @@
+ * Find the class descriptor for the specified class.
+ * Package access only so it can be called from ObjectIn/OutStream.
+ */
+- static ObjectStreamClass_1_3_1 lookupInternal(Class cl)
++ static ObjectStreamClass_1_3_1 lookupInternal(Class<?> cl)
+ {
+ /* Synchronize on the hashtable so no two threads will do
+ * this at the same time.
+@@ -122,13 +123,13 @@
+ }
+
+ /* Check if it's serializable */
+- boolean serializable = classSerializable.isAssignableFrom(cl);
++ boolean serializable = Serializable.class.isAssignableFrom(cl);
+ /* If the class is only Serializable,
+ * lookup the descriptor for the superclass.
+ */
+ ObjectStreamClass_1_3_1 superdesc = null;
+ if (serializable) {
+- Class superclass = cl.getSuperclass();
++ Class<?> superclass = cl.getSuperclass();
+ if (superclass != null)
+ superdesc = lookup(superclass);
+ }
+@@ -141,7 +142,7 @@
+ if (serializable) {
+ externalizable =
+ ((superdesc != null) && superdesc.isExternalizable()) ||
+- classExternalizable.isAssignableFrom(cl);
++ Externalizable.class.isAssignableFrom(cl);
+ if (externalizable) {
+ serializable = false;
+ }
+@@ -170,7 +171,7 @@
+ * that have evolved from a common root class and agree to be serialized
+ * and deserialized using a common format.
+ */
+- public static final long getSerialVersionUID( java.lang.Class clazz) {
++ public static final long getSerialVersionUID( java.lang.Class<?> clazz) {
+ ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz );
+ if( theosc != null )
+ {
+@@ -204,7 +205,7 @@
+ /**
+ * Return the actual (computed) serialVersionUID for this class.
+ */
+- public static final long getActualSerialVersionUID( java.lang.Class clazz )
++ public static final long getActualSerialVersionUID( java.lang.Class<?> clazz )
+ {
+ ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz );
+ if( theosc != null )
+@@ -234,7 +235,7 @@
+ * Return the class in the local VM that this version is mapped to.
+ * Null is returned if there is no corresponding local class.
+ */
+- public final Class forClass() {
++ public final Class<?> forClass() {
+ return ofClass;
+ }
+
+@@ -333,7 +334,7 @@
+ * Create a new ObjectStreamClass_1_3_1 from a loaded class.
+ * Don't call this directly, call lookup instead.
+ */
+- private ObjectStreamClass_1_3_1(java.lang.Class cl, ObjectStreamClass_1_3_1 superdesc,
++ private ObjectStreamClass_1_3_1(java.lang.Class<?> cl, ObjectStreamClass_1_3_1 superdesc,
+ boolean serial, boolean extern)
+ {
+ ofClass = cl; /* created from this class */
+@@ -376,7 +377,7 @@
+ private void init() {
+ synchronized (lock) {
+
+- final Class cl = ofClass;
++ final Class<?> cl = ofClass;
+
+ if (fields != null) // already initialized
+ return;
+@@ -558,7 +559,7 @@
+ * will call it as necessary.
+ */
+ try {
+- Class[] args = {java.io.ObjectOutputStream.class};
++ Class<?>[] args = {java.io.ObjectOutputStream.class};
+ writeObjectMethod = cl.getDeclaredMethod("writeObject", args);
+ hasWriteObjectMethod = true;
+ int mods = writeObjectMethod.getModifiers();
+@@ -578,7 +579,7 @@
+ * ObjectInputStream so it can all the method directly.
+ */
+ try {
+- Class[] args = {java.io.ObjectInputStream.class};
++ Class<?>[] args = {java.io.ObjectInputStream.class};
+ readObjectMethod = cl.getDeclaredMethod("readObject", args);
+ int mods = readObjectMethod.getModifiers();
+
+@@ -629,11 +630,11 @@
+ if (translation != null)
+ return translation;
+ else {
+- Class osfClass = com.sun.corba.se.impl.orbutil.ObjectStreamField.class;
++ Class<?> osfClass = com.sun.corba.se.impl.orbutil.ObjectStreamField.class;
+
+ translation = (Object[])java.lang.reflect.Array.newInstance(osfClass, objs.length);
+ Object arg[] = new Object[2];
+- Class types[] = {String.class, Class.class};
++ Class<?> types[] = {String.class, Class.class};
+ Constructor constructor = osfClass.getDeclaredConstructor(types);
+ for (int i = fields.length -1; i >= 0; i--){
+ arg[0] = fields[i].getName();
+@@ -804,7 +805,7 @@
+ }
+ }
+
+- private static long computeStructuralUID(ObjectStreamClass_1_3_1 osc, Class cl) {
++ private static long computeStructuralUID(ObjectStreamClass_1_3_1 osc, Class<?> cl) {
+ ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
+
+ long h = 0;
+@@ -824,7 +825,7 @@
+ DataOutputStream data = new DataOutputStream(mdo);
+
+ // Get SUID of parent
+- Class parent = cl.getSuperclass();
++ Class<?> parent = cl.getSuperclass();
+ if ((parent != null))
+ // SerialBug 1; acc. to spec the one for
+ // java.lang.object
+@@ -910,10 +911,10 @@
+ /**
+ * Compute the JVM signature for the class.
+ */
+- static String getSignature(Class clazz) {
++ static String getSignature(Class<?> clazz) {
+ String type = null;
+ if (clazz.isArray()) {
+- Class cl = clazz;
++ Class<?> cl = clazz;
+ int dimensions = 0;
+ while (cl.isArray()) {
+ dimensions++;
+@@ -959,7 +960,7 @@
+
+ sb.append("(");
+
+- Class[] params = meth.getParameterTypes(); // avoid clone
++ Class<?>[] params = meth.getParameterTypes(); // avoid clone
+ for (int j = 0; j < params.length; j++) {
+ sb.append(getSignature(params[j]));
+ }
+@@ -976,7 +977,7 @@
+
+ sb.append("(");
+
+- Class[] params = cons.getParameterTypes(); // avoid clone
++ Class<?>[] params = cons.getParameterTypes(); // avoid clone
+ for (int j = 0; j < params.length; j++) {
+ sb.append(getSignature(params[j]));
+ }
+@@ -996,7 +997,7 @@
+ * The entries are extended from java.lang.ref.SoftReference so the
+ * gc will be able to free them if needed.
+ */
+- private static ObjectStreamClass_1_3_1 findDescriptorFor(Class cl) {
++ private static ObjectStreamClass_1_3_1 findDescriptorFor(Class<?> cl) {
+
+ int hash = cl.hashCode();
+ int index = (hash & 0x7FFFFFFF) % descriptorFor.length;
+@@ -1077,7 +1078,7 @@
+ /*
+ * Class that is a descriptor for in this virtual machine.
+ */
+- private Class ofClass;
++ private Class<?> ofClass;
+
+ /*
+ * True if descriptor for a proxy class.
+@@ -1130,22 +1131,6 @@
+ /* Get the private static final field for serial version UID */
+ // private static native long getSerialVersionUIDField(Class cl);
+
+- /* The Class Object for java.io.Serializable */
+- private static Class classSerializable = null;
+- private static Class classExternalizable = null;
+-
+- /*
+- * Resolve java.io.Serializable at load time.
+- */
+- static {
+- try {
+- classSerializable = Class.forName("java.io.Serializable");
+- classExternalizable = Class.forName("java.io.Externalizable");
+- } catch (Throwable e) {
+- System.err.println("Could not load java.io.Serializable or java.io.Externalizable.");
+- }
+- }
+-
+ /** use serialVersionUID from JDK 1.1. for interoperability */
+ private static final long serialVersionUID = -6120832682080437368L;
+
+@@ -1183,8 +1168,8 @@
+
+ private static class CompareClassByName implements Comparator {
+ public int compare(Object o1, Object o2) {
+- Class c1 = (Class)o1;
+- Class c2 = (Class)o2;
++ Class<?> c1 = (Class)o1;
++ Class<?> c2 = (Class)o2;
+ return (c1.getName()).compareTo(c2.getName());
+ }
+ }
+--- ./corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Tue Mar 18 12:29:47 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -170,6 +170,12 @@
+ // representing LogDomain and ExceptionGroup.
+ private Map wrapperMap ;
+
++ static class Holder {
++ static final PresentationManager defaultPresentationManager =
++ setupPresentationManager();
++ }
++ private static final Object pmLock = new Object();
++
+ private static Map staticWrapperMap = new ConcurrentHashMap();
+
+ protected MonitoringManager monitoringManager;
+@@ -235,13 +241,24 @@
+ */
+ public static PresentationManager getPresentationManager()
+ {
+- AppContext ac = AppContext.getAppContext();
+- PresentationManager pm = (PresentationManager) ac.get(PresentationManager.class);
+- if (pm == null) {
+- pm = setupPresentationManager();
+- ac.put(PresentationManager.class, pm);
++ SecurityManager sm = System.getSecurityManager();
++ if (sm != null && AppContext.getAppContexts().size() > 0) {
++ AppContext ac = AppContext.getAppContext();
++ if (ac != null) {
++ synchronized (pmLock) {
++ PresentationManager pm =
++ (PresentationManager) ac.get(PresentationManager.class);
++ if (pm == null) {
++ pm = setupPresentationManager();
++ ac.put(PresentationManager.class, pm);
++ }
++ return pm;
++ }
++ }
+ }
+- return pm;
++
++ // No security manager or AppContext
++ return Holder.defaultPresentationManager;
+ }
+
+ /** Get the appropriate StubFactoryFactory. This
+--- ./corba/src/share/classes/org/omg/CORBA/ORB.java Thu Dec 19 09:00:44 2013 -0800
++++ ./corba/src/share/classes/org/omg/CORBA/ORB.java Tue Mar 18 12:29:47 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -36,6 +36,8 @@
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
+
++import sun.reflect.misc.ReflectUtil;
++
+ /**
+ * A class providing APIs for the CORBA Object Request Broker
+ * features. The <code>ORB</code> class also provides
+@@ -289,20 +291,38 @@
+ (className.equals("com.sun.corba.se.impl.orb.ORBSingleton"))) {
+ singleton = new com.sun.corba.se.impl.orb.ORBSingleton();
+ } else {
+- singleton = create_impl(className);
++ singleton = create_impl_with_systemclassloader(className);
+ }
+ }
+ return singleton;
+ }
+
++ private static ORB create_impl_with_systemclassloader(String className) {
++
++ try {
++ ReflectUtil.checkPackageAccess(className);
++ ClassLoader cl = ClassLoader.getSystemClassLoader();
++ Class<org.omg.CORBA.ORB> orbBaseClass = org.omg.CORBA.ORB.class;
++ Class<?> singletonOrbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass);
++ return (ORB)singletonOrbClass.newInstance();
++ } catch (Throwable ex) {
++ SystemException systemException = new INITIALIZE(
++ "can't instantiate default ORB implementation " + className);
++ systemException.initCause(ex);
++ throw systemException;
++ }
++ }
++
+ private static ORB create_impl(String className) {
+-
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl == null)
+ cl = ClassLoader.getSystemClassLoader();
+
+ try {
+- return (ORB) Class.forName(className, true, cl).newInstance();
++ ReflectUtil.checkPackageAccess(className);
++ Class<org.omg.CORBA.ORB> orbBaseClass = org.omg.CORBA.ORB.class;
++ Class<?> orbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass);
++ return (ORB)orbClass.newInstance();
+ } catch (Throwable ex) {
+ SystemException systemException = new INITIALIZE(
+ "can't instantiate default ORB implementation " + className);
+@@ -346,7 +366,6 @@
+ } else {
+ orb = create_impl(className);
+ }
+-
+ orb.set_parameters(args, props);
+ return orb;
+ }
+@@ -377,7 +396,6 @@
+ } else {
+ orb = create_impl(className);
+ }
+-
+ orb.set_parameters(app, props);
+ return orb;
+ }
+@@ -573,7 +591,7 @@
+ try {
+ // First try to load the OperationDef class
+ String opDefClassName = "org.omg.CORBA.OperationDef";
+- Class opDefClass = null;
++ Class<?> opDefClass = null;
+
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if ( cl == null )
+@@ -583,7 +601,7 @@
+
+ // OK, we loaded OperationDef. Now try to get the
+ // create_operation_list(OperationDef oper) method.
+- Class[] argc = { opDefClass };
++ Class<?>[] argc = { opDefClass };
+ java.lang.reflect.Method meth =
+ this.getClass().getMethod("create_operation_list", argc);
+
+--- ./hotspot/.hgtags Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/.hgtags Tue Mar 18 12:31:20 2014 -0700
+@@ -590,6 +590,9 @@
+ 12374864c655a2cefb0d65caaacf215d5365ec5f jdk7u45-b18
+ 3677c8cc3c89c0fa608f485b84396e4cf755634b jdk7u45-b30
+ 520b7b3d9153c1407791325946b07c5c222cf0d6 jdk7u45-b31
++c373a733d5d5147f99eaa2b91d6b937c28214fc9 jdk7u45-b33
++0bcb43482f2ac5615437541ffb8dc0f79ece3148 jdk7u45-b34
++12ea8d416f105f5971c808c89dddc1006bfc4c53 jdk7u45-b35
+ 429884602206fcf5314c8b953c06d54d337558ca jdk7u51-b00
+ 68f03ff066f2341b89b52a6d6e21ae09de008351 jdk7u51-b01
+ 67910a581eca113847c5320c49436a9816c5d5c6 jdk7u51-b02
+@@ -604,3 +607,22 @@
+ 1f11dff734af98f5bf11d4fceeda221ab1416971 jdk7u51-b11
+ dee2a38ef6b26534c44c550ef4da2c3146c612c2 jdk7u51-b12
+ 6c6a2299029ad02fa2820b8ff8c61c2bbcae799c jdk7u51-b13
++a398ddc79d2310ad37b131cc3794b3cf574f088e jdk7u51-b30
++cf4110c35afb10456d8264c47b7cde1c20150cab jdk7u51-b31
++208419914859dd77abdb5ec755b32c237ee6e4eb jdk7u51-b33
++f8457a75bdb5052f1d8c547027a926f9b755b808 jdk7u51-b34
++dee2a38ef6b26534c44c550ef4da2c3146c612c2 jdk7u55-b00
++ac0063b4452bc724e8648e64f4b2d495054bb308 jdk7u55-b01
++408028d410e316a99495c42df0031018890c22fe jdk7u55-b02
++50fb91504dd8cdf410eb956075442daf3aacf1db jdk7u55-b03
++3be3b8a032a5508646c1c5620cee18d3e69fc708 jdk7u55-b04
++b86119fa2748bd91ae4984ff2264da92b6626f8c jdk7u55-b05
++260d919d52e500a0b20f911fade2a7710474067a jdk7u55-b06
++8cf6e0a3a0651c4132ae034c2b68ddf4eb5c4d88 jdk7u55-b07
++049fd2cef85bf2d557dd7dd8a90a6831a8168ce4 jdk7u55-b08
++9b238ab164e6d1cf9cfb560827d88ef8a7d8c898 jdk7u55-b09
++573d8d080af9eff48aa3b8f0696d8874ce36fbb1 jdk7u55-b09
++36f8bd4dd467ae4183340842fd7158ac3309b826 jdk7u55-b10
++49cada8e39b9215b9fd8b9183743f92625587cfc jdk7u55-b11
++aadc864abd1ced3049bf59ce32786a07997ba190 jdk7u55-b12
++b021fd817a0177b31d1e3d65127a27458e85801e jdk7u55-b13
+--- ./hotspot/make/bsd/makefiles/arm.make Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/make/bsd/makefiles/arm.make Tue Mar 18 12:31:20 2014 -0700
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -24,6 +24,8 @@
+
+ Obj_Files += bsd_arm.o
+
+-LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
++ifneq ($(EXT_LIBS_PATH),)
++ LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
++endif
+
+ CFLAGS += -DVM_LITTLE_ENDIAN
+--- ./hotspot/make/hotspot_version Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/make/hotspot_version Tue Mar 18 12:31:20 2014 -0700
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -31,10 +31,10 @@
+ #
+
+ # Don't put quotes (fail windows build).
+-HOTSPOT_VM_COPYRIGHT=Copyright 2013
++HOTSPOT_VM_COPYRIGHT=Copyright 2014
+
+ HS_MAJOR_VER=24
+-HS_MINOR_VER=51
++HS_MINOR_VER=55
+ HS_BUILD_NUMBER=03
+
+ JDK_MAJOR_VER=1
+--- ./hotspot/make/linux/makefiles/arm.make Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/make/linux/makefiles/arm.make Tue Mar 18 12:31:20 2014 -0700
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -24,6 +24,8 @@
+
+ Obj_Files += linux_arm.o
+
+-LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
++ifneq ($(EXT_LIBS_PATH),)
++ LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
++endif
+
+ CFLAGS += -DVM_LITTLE_ENDIAN
+--- ./hotspot/src/os/windows/vm/os_windows.cpp Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/src/os/windows/vm/os_windows.cpp Tue Mar 18 12:31:20 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -1591,6 +1591,7 @@
+
+ void os::win32::print_windows_version(outputStream* st) {
+ OSVERSIONINFOEX osvi;
++ SYSTEM_INFO si;
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+
+@@ -1600,6 +1601,18 @@
+ }
+
+ int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
++
++ ZeroMemory(&si, sizeof(SYSTEM_INFO));
++ if (os_vers >= 5002) {
++ // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
++ // find out whether we are running on 64 bit processor or not.
++ if (os::Kernel32Dll::GetNativeSystemInfoAvailable()) {
++ os::Kernel32Dll::GetNativeSystemInfo(&si);
++ } else {
++ GetSystemInfo(&si);
++ }
++ }
++
+ if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+ switch (os_vers) {
+ case 3051: st->print(" Windows NT 3.51"); break;
+@@ -1607,57 +1620,48 @@
+ case 5000: st->print(" Windows 2000"); break;
+ case 5001: st->print(" Windows XP"); break;
+ case 5002:
+- case 6000:
+- case 6001:
+- case 6002: {
+- // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
+- // find out whether we are running on 64 bit processor or not.
+- SYSTEM_INFO si;
+- ZeroMemory(&si, sizeof(SYSTEM_INFO));
+- if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
+- GetSystemInfo(&si);
++ if (osvi.wProductType == VER_NT_WORKSTATION &&
++ si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
++ st->print(" Windows XP x64 Edition");
+ } else {
+- os::Kernel32Dll::GetNativeSystemInfo(&si);
+- }
+- if (os_vers == 5002) {
+- if (osvi.wProductType == VER_NT_WORKSTATION &&
+- si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+- st->print(" Windows XP x64 Edition");
+- else
+- st->print(" Windows Server 2003 family");
+- } else if (os_vers == 6000) {
+- if (osvi.wProductType == VER_NT_WORKSTATION)
+- st->print(" Windows Vista");
+- else
+- st->print(" Windows Server 2008");
+- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+- st->print(" , 64 bit");
+- } else if (os_vers == 6001) {
+- if (osvi.wProductType == VER_NT_WORKSTATION) {
+- st->print(" Windows 7");
+- } else {
+- // Unrecognized windows, print out its major and minor versions
+- st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
+- }
+- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+- st->print(" , 64 bit");
+- } else if (os_vers == 6002) {
+- if (osvi.wProductType == VER_NT_WORKSTATION) {
+- st->print(" Windows 8");
+- } else {
+- st->print(" Windows Server 2012");
+- }
+- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+- st->print(" , 64 bit");
+- } else { // future os
+- // Unrecognized windows, print out its major and minor versions
+- st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
+- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
+- st->print(" , 64 bit");
++ st->print(" Windows Server 2003 family");
+ }
+ break;
+- }
+- default: // future windows, print out its major and minor versions
++
++ case 6000:
++ if (osvi.wProductType == VER_NT_WORKSTATION) {
++ st->print(" Windows Vista");
++ } else {
++ st->print(" Windows Server 2008");
++ }
++ break;
++
++ case 6001:
++ if (osvi.wProductType == VER_NT_WORKSTATION) {
++ st->print(" Windows 7");
++ } else {
++ st->print(" Windows Server 2008 R2");
++ }
++ break;
++
++ case 6002:
++ if (osvi.wProductType == VER_NT_WORKSTATION) {
++ st->print(" Windows 8");
++ } else {
++ st->print(" Windows Server 2012");
++ }
++ break;
++
++ case 6003:
++ if (osvi.wProductType == VER_NT_WORKSTATION) {
++ st->print(" Windows 8.1");
++ } else {
++ st->print(" Windows Server 2012 R2");
++ }
++ break;
++
++ default: // future os
++ // Unrecognized windows, print out its major and minor versions
+ st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
+ }
+ } else {
+@@ -1669,6 +1673,11 @@
+ st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
+ }
+ }
++
++ if (os_vers >= 6000 && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
++ st->print(" , 64 bit");
++ }
++
+ st->print(" Build %d", osvi.dwBuildNumber);
+ st->print(" %s", osvi.szCSDVersion); // service pack
+ st->cr();
+--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Tue Mar 18 12:31:20 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -2661,6 +2661,11 @@
+ "Short length on BootstrapMethods in class file %s",
+ CHECK);
+
++ guarantee_property(attribute_byte_length > sizeof(u2),
++ "Invalid BootstrapMethods attribute length %u in class file %s",
++ attribute_byte_length,
++ CHECK);
++
+ // The attribute contains a counted array of counted tuples of shorts,
+ // represending bootstrap specifiers:
+ // length*{bootstrap_method_index, argument_count*{argument_index}}
+--- ./hotspot/src/share/vm/oops/objArrayKlass.cpp Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/src/share/vm/oops/objArrayKlass.cpp Tue Mar 18 12:31:20 2014 -0700
+@@ -149,7 +149,7 @@
+ if (element_is_null ||
+ Klass::cast((new_val->klass()))->is_subtype_of(bound)) {
+ bs->write_ref_field_pre(p, new_val);
+- *p = *from;
++ *p = element;
+ } else {
+ // We must do a barrier to cover the partial copy.
+ const size_t pd = pointer_delta(p, dst, (size_t)heapOopSize);
+--- ./hotspot/src/share/vm/opto/matcher.cpp Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/src/share/vm/opto/matcher.cpp Tue Mar 18 12:31:20 2014 -0700
+@@ -464,17 +464,17 @@
+ C->FIRST_STACK_mask().Clear();
+
+ // Add in the incoming argument area
+- OptoReg::Name init = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
+- for (i = init; i < _in_arg_limit; i = OptoReg::add(i,1))
++ OptoReg::Name init_in = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
++ for (i = init_in; i < _in_arg_limit; i = OptoReg::add(i,1)) {
+ C->FIRST_STACK_mask().Insert(i);
+-
++ }
+ // Add in all bits past the outgoing argument area
+ guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
+ "must be able to represent all call arguments in reg mask");
+- init = _out_arg_limit;
+- for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1))
++ OptoReg::Name init = _out_arg_limit;
++ for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1)) {
+ C->FIRST_STACK_mask().Insert(i);
+-
++ }
+ // Finally, set the "infinite stack" bit.
+ C->FIRST_STACK_mask().set_AllStack();
+
+@@ -506,16 +506,36 @@
+ idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,2)) {
++ // For VecD we need dual alignment and 8 bytes (2 slots) for spills.
++ // RA guarantees such alignment since it is needed for Double and Long values.
+ *idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
+ idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,4)) {
++ // For VecX we need quadro alignment and 16 bytes (4 slots) for spills.
++ //
++ // RA can use input arguments stack slots for spills but until RA
++ // we don't know frame size and offset of input arg stack slots.
++ //
++ // Exclude last input arg stack slots to avoid spilling vectors there
++ // otherwise vector spills could stomp over stack slots in caller frame.
++ OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
++ for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecX); k++) {
++ aligned_stack_mask.Remove(in);
++ in = OptoReg::add(in, -1);
++ }
+ aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
+ assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+ *idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
+ idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
+ }
+ if (Matcher::vector_size_supported(T_FLOAT,8)) {
++ // For VecY we need octo alignment and 32 bytes (8 slots) for spills.
++ OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
++ for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecY); k++) {
++ aligned_stack_mask.Remove(in);
++ in = OptoReg::add(in, -1);
++ }
+ aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
+ assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
+ *idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
+--- ./hotspot/src/share/vm/opto/output.cpp Thu Dec 19 09:00:51 2013 -0800
++++ ./hotspot/src/share/vm/opto/output.cpp Tue Mar 18 12:31:20 2014 -0700
+@@ -345,6 +345,11 @@
+ uint* jmp_offset = NEW_RESOURCE_ARRAY(uint,nblocks);
+ uint* jmp_size = NEW_RESOURCE_ARRAY(uint,nblocks);
+ int* jmp_nidx = NEW_RESOURCE_ARRAY(int ,nblocks);
++
++ // Collect worst case block paddings
++ int* block_worst_case_pad = NEW_RESOURCE_ARRAY(int, nblocks);
++ memset(block_worst_case_pad, 0, nblocks * sizeof(int));
++
+ DEBUG_ONLY( uint *jmp_target = NEW_RESOURCE_ARRAY(uint,nblocks); )
+ DEBUG_ONLY( uint *jmp_rule = NEW_RESOURCE_ARRAY(uint,nblocks); )
+
+@@ -461,6 +466,7 @@
+ last_avoid_back_to_back_adr += max_loop_pad;
+ }
+ blk_size += max_loop_pad;
++ block_worst_case_pad[i + 1] = max_loop_pad;
+ }
+ }
+
+@@ -500,9 +506,16 @@
+ if (bnum > i) { // adjust following block's offset
+ offset -= adjust_block_start;
+ }
++
++ // This block can be a loop header, account for the padding
++ // in the previous block.
++ int block_padding = block_worst_case_pad[i];
++ assert(i == 0 || block_padding == 0 || br_offs >= block_padding, "Should have at least a padding on top");
+ // In the following code a nop could be inserted before
+ // the branch which will increase the backward distance.
+- bool needs_padding = ((uint)br_offs == last_may_be_short_branch_adr);
++ bool needs_padding = ((uint)(br_offs - block_padding) == last_may_be_short_branch_adr);
++ assert(!needs_padding || jmp_offset[i] == 0, "padding only branches at the beginning of block");
++
+ if (needs_padding && offset <= 0)
+ offset -= nop_size;
+
+--- ./jaxp/.hgtags Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/.hgtags Tue Mar 18 12:34:22 2014 -0700
+@@ -381,6 +381,9 @@
+ 4beb90ab48f7fd46c7a9afbe66f8cccb230699ba jdk7u45-b18
+ a456c78a50e201a65c9f63565c8291b84a4fbd32 jdk7u45-b30
+ 3c34f244296e98d8ebb94973c752f3395612391a jdk7u45-b31
++056494e83d15cd1c546d32a3b35bdb6f670b3876 jdk7u45-b33
++b5a83862ed2ab9cc2de3719e38c72519481a4bbb jdk7u45-b34
++7fda9b300e07738116b2b95b568229bdb4b31059 jdk7u45-b35
+ 0a8b95184728548be4b20876e05f76e0262e4195 jdk7u51-b00
+ 2450ace952f45202e5a3fd4f6a8356a196fe029e jdk7u51-b01
+ 68def851cc6b17944756f1986734b323d8569571 jdk7u51-b02
+@@ -395,3 +398,22 @@
+ 70b5691c44d2830efd4301856e6223fa43894462 jdk7u51-b11
+ 807946db29f42477e8d8390be01c7e27280bc85c jdk7u51-b12
+ 114654a331e2f97a048d7ed43d06d7512e20e2c1 jdk7u51-b13
++3161567adae93d12c64b79592bda3046f0c0a22d jdk7u51-b30
++e85ee81daec2ea2fa21bf804d03431b0664c6dff jdk7u51-b31
++1a6c3258ad218bf286c47d65e4cd80eb6763f8df jdk7u51-b33
++9cdc04d76eb19a871c739625acd801ed1b24bed9 jdk7u51-b34
++807946db29f42477e8d8390be01c7e27280bc85c jdk7u55-b00
++bb7779a8fc4d14719e907b8890a2665476cf45ae jdk7u55-b01
++8275dc4db7f852edb331ae48d663d08b9ab2b5c7 jdk7u55-b02
++381e73f93a83e8d3bfd7dbf79f4f363a8fd6442f jdk7u55-b03
++c72c57f71c2ba6362d9ccfbf4743947b9ecefcac jdk7u55-b04
++5592b0c44617022e3c136eedfa1e98d4f254c964 jdk7u55-b05
++c59d714090080ad2e06f0ca5e8d354403059d8ce jdk7u55-b06
++125ea54089add3a16898b801a9989bf6cca05da6 jdk7u55-b07
++39337c00cb3ce29b4d67f6d247c3fa80f16cb49f jdk7u55-b08
++537f4f609132f3d6a4ce506c98f1dbd57f1320f8 jdk7u55-b09
++997bdd44d5de4aee319ff0a0d2892a912d9de6f5 jdk7u55-b09
++606483a43e8b6317d84922b9ed2b2c30d9e77419 jdk7u55-b10
++f3f02e67d867ae25cd4f3b9bc39a4fd17f593126 jdk7u55-b11
++708a1872f5bb8ba58ecc9fcbf4e12e6fa4783998 jdk7u55-b12
++14719f73596f5c90e3f46c0f4312f32e5b105edd jdk7u55-b13
+--- ./jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java Tue Mar 18 12:34:22 2014 -0700
+@@ -54,8 +54,8 @@
+ //
+ // Constants
+ //
+- private static final String XALAN_INTERNAL = "com.sun.org.apache.xalan.internal";
+- private static final String XERCES_INTERNAL = "com.sun.org.apache.xerces.internal";
++ private static final String JAXP_INTERNAL = "com.sun.org.apache";
++ private static final String STAX_INTERNAL = "com.sun.xml.internal";
+
+ // name of default properties file to look for in JDK's jre/lib directory
+ private static final String DEFAULT_PROPERTIES_FILENAME =
+@@ -497,12 +497,8 @@
+ public static Class findProviderClass(String className, boolean doFallback)
+ throws ClassNotFoundException, ConfigurationError
+ {
+- if (System.getSecurityManager()!=null) {
+- return Class.forName(className);
+- } else {
+- return findProviderClass (className,
++ return findProviderClass (className,
+ findClassLoader (), doFallback);
+- }
+ }
+
+ /**
+@@ -517,8 +513,8 @@
+ SecurityManager security = System.getSecurityManager();
+ try{
+ if (security != null){
+- if (className.startsWith(XALAN_INTERNAL) ||
+- className.startsWith(XERCES_INTERNAL)) {
++ if (className.startsWith(JAXP_INTERNAL) ||
++ className.startsWith(STAX_INTERNAL)) {
+ cl = null;
+ } else {
+ final int lastDot = className.lastIndexOf(".");
+@@ -533,16 +529,7 @@
+
+ Class providerClass;
+ if (cl == null) {
+- // XXX Use the bootstrap ClassLoader. There is no way to
+- // load a class using the bootstrap ClassLoader that works
+- // in both JDK 1.1 and Java 2. However, this should still
+- // work b/c the following should be true:
+- //
+- // (cl == null) iff current ClassLoader == null
+- //
+- // Thus Class.forName(String) will use the current
+- // ClassLoader which will be the bootstrap ClassLoader.
+- providerClass = Class.forName(className);
++ providerClass = Class.forName(className, false, ObjectFactory.class.getClassLoader());
+ } else {
+ try {
+ providerClass = cl.loadClass(className);
+--- ./jaxp/src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java Tue Mar 18 12:34:22 2014 -0700
+@@ -57,7 +57,7 @@
+ return securitySupport;
+ }
+
+- static ClassLoader getContextClassLoader() {
++ public static ClassLoader getContextClassLoader() {
+ return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java Tue Mar 18 12:34:22 2014 -0700
+@@ -48,7 +48,8 @@
+ //
+ // Constants
+ //
+- private static final String DEFAULT_INTERNAL_CLASSES = "com.sun.org.apache.";
++ private static final String JAXP_INTERNAL = "com.sun.org.apache";
++ private static final String STAX_INTERNAL = "com.sun.xml.internal";
+
+ // name of default properties file to look for in JDK's jre/lib directory
+ private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";
+@@ -288,12 +289,8 @@
+ public static Class findProviderClass(String className, boolean doFallback)
+ throws ClassNotFoundException, ConfigurationError
+ {
+- if (System.getSecurityManager()!=null) {
+- return Class.forName(className);
+- } else {
+- return findProviderClass (className,
++ return findProviderClass (className,
+ findClassLoader (), doFallback);
+- }
+ }
+ /**
+ * Find a Class using the specified ClassLoader
+@@ -306,7 +303,8 @@
+ //restrict the access to package as speicified in java.security policy
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+- if (className.startsWith(DEFAULT_INTERNAL_CLASSES)) {
++ if (className.startsWith(JAXP_INTERNAL) ||
++ className.startsWith(STAX_INTERNAL)) {
+ cl = null;
+ } else {
+ final int lastDot = className.lastIndexOf(".");
+@@ -318,7 +316,7 @@
+ Class providerClass;
+ if (cl == null) {
+ //use the bootstrap ClassLoader.
+- providerClass = Class.forName(className);
++ providerClass = Class.forName(className, false, ObjectFactory.class.getClassLoader());
+ } else {
+ try {
+ providerClass = cl.loadClass(className);
+--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/CharInfo.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/CharInfo.java Tue Mar 18 12:34:22 2014 -0700
+@@ -22,6 +22,11 @@
+ */
+ package com.sun.org.apache.xml.internal.serializer;
+
++import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
++import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
++import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
++import com.sun.org.apache.xml.internal.serializer.utils.Utils;
++import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
+ import java.io.BufferedReader;
+ import java.io.InputStream;
+ import java.io.InputStreamReader;
+@@ -29,19 +34,11 @@
+ import java.net.URL;
+ import java.util.Enumeration;
+ import java.util.HashMap;
++import java.util.Locale;
+ import java.util.PropertyResourceBundle;
+ import java.util.ResourceBundle;
+-import java.security.AccessController;
+-import java.security.PrivilegedAction;
+-
+ import javax.xml.transform.TransformerException;
+
+-import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
+-import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
+-import com.sun.org.apache.xml.internal.serializer.utils.Utils;
+-import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
+-import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
+-
+ /**
+ * This class provides services that tell if a character should have
+ * special treatement, such as entity reference substitution or normalization
+@@ -176,13 +173,19 @@
+ // file
+ // 3) try treating the resource a URI
+
+- if (internal) {
+- try {
++ try {
++ if (internal) {
+ // Load entity property files by using PropertyResourceBundle,
+ // cause of security issure for applets
+ entities = PropertyResourceBundle.getBundle(entitiesResource);
+- } catch (Exception e) {}
+- }
++ } else {
++ ClassLoader cl = SecuritySupport.getContextClassLoader();
++ if (cl != null) {
++ entities = PropertyResourceBundle.getBundle(entitiesResource,
++ Locale.getDefault(), cl);
++ }
++ }
++ } catch (Exception e) {}
+
+ if (entities != null) {
+ Enumeration keys = entities.getKeys();
+@@ -198,6 +201,7 @@
+ set(S_CARRIAGERETURN);
+ } else {
+ InputStream is = null;
++ String err = null;
+
+ // Load user specified resource file by using URL loading, it
+ // requires a valid URI as parameter
+@@ -205,18 +209,22 @@
+ if (internal) {
+ is = CharInfo.class.getResourceAsStream(entitiesResource);
+ } else {
+- ClassLoader cl = ObjectFactory.findClassLoader();
+- if (cl == null) {
+- is = ClassLoader.getSystemResourceAsStream(entitiesResource);
+- } else {
+- is = cl.getResourceAsStream(entitiesResource);
++ ClassLoader cl = SecuritySupport.getContextClassLoader();
++ if (cl != null) {
++ try {
++ is = cl.getResourceAsStream(entitiesResource);
++ } catch (Exception e) {
++ err = e.getMessage();
++ }
+ }
+
+ if (is == null) {
+ try {
+ URL url = new URL(entitiesResource);
+ is = url.openStream();
+- } catch (Exception e) {}
++ } catch (Exception e) {
++ err = e.getMessage();
++ }
+ }
+ }
+
+@@ -224,7 +232,7 @@
+ throw new RuntimeException(
+ Utils.messages.createMessage(
+ MsgKey.ER_RESOURCE_COULD_NOT_FIND,
+- new Object[] {entitiesResource, entitiesResource}));
++ new Object[] {entitiesResource, err}));
+ }
+
+ // Fix Bugzilla#4000: force reading in UTF-8
+@@ -456,64 +464,56 @@
+ return isCleanTextASCII[value];
+ }
+
+-// In the future one might want to use the array directly and avoid
+-// the method call, but I think the JIT alreay inlines this well enough
+-// so don't do it (for now) - bjm
+-// public final boolean[] getASCIIClean()
+-// {
+-// return isCleanTextASCII;
+-// }
+
++ /**
++ * Read an internal resource file that describes the mapping of
++ * characters to entity references; Construct a CharInfo object.
++ *
++ * @param entitiesFileName Name of entities resource file that should
++ * be loaded, which describes the mapping of characters to entity references.
++ * @param method the output method type, which should be one of "xml", "html", and "text".
++ * @return an instance of CharInfo
++ *
++ * @xsl.usage internal
++ */
++ static CharInfo getCharInfoInternal(String entitiesFileName, String method)
++ {
++ CharInfo charInfo = (CharInfo) m_getCharInfoCache.get(entitiesFileName);
++ if (charInfo != null) {
++ return charInfo;
++ }
+
+- private static CharInfo getCharInfoBasedOnPrivilege(
+- final String entitiesFileName, final String method,
+- final boolean internal){
+- return (CharInfo) AccessController.doPrivileged(
+- new PrivilegedAction() {
+- public Object run() {
+- return new CharInfo(entitiesFileName,
+- method, internal);}
+- });
++ charInfo = new CharInfo(entitiesFileName, method, true);
++ m_getCharInfoCache.put(entitiesFileName, charInfo);
++ return charInfo;
+ }
+
+ /**
+- * Factory that reads in a resource file that describes the mapping of
+- * characters to entity references.
++ * Constructs a CharInfo object using the following process to try reading
++ * the entitiesFileName parameter:
+ *
+- * Resource files must be encoded in UTF-8 and have a format like:
++ * 1) attempt to load it as a ResourceBundle
++ * 2) try using the class loader to find the specified file
++ * 3) try opening it as an URI
++ *
++ * In case of 2 and 3, the resource file must be encoded in UTF-8 and have the
++ * following format:
+ * <pre>
+ * # First char # is a comment
+ * Entity numericValue
+ * quot 34
+ * amp 38
+ * </pre>
+- * (Note: Why don't we just switch to .properties files? Oct-01 -sc)
+ *
+- * @param entitiesResource Name of entities resource file that should
+- * be loaded, which describes that mapping of characters to entity references.
+- * @param method the output method type, which should be one of "xml", "html", "text"...
+- *
+- * @xsl.usage internal
++ * @param entitiesFileName Name of entities resource file that should
++ * be loaded, which describes the mapping of characters to entity references.
++ * @param method the output method type, which should be one of "xml", "html", and "text".
++ * @return an instance of CharInfo
+ */
+ static CharInfo getCharInfo(String entitiesFileName, String method)
+ {
+- CharInfo charInfo = (CharInfo) m_getCharInfoCache.get(entitiesFileName);
+- if (charInfo != null) {
+- return charInfo;
+- }
+-
+- // try to load it internally - cache
+ try {
+- charInfo = getCharInfoBasedOnPrivilege(entitiesFileName,
+- method, true);
+- m_getCharInfoCache.put(entitiesFileName, charInfo);
+- return charInfo;
+- } catch (Exception e) {}
+-
+- // try to load it externally - do not cache
+- try {
+- return getCharInfoBasedOnPrivilege(entitiesFileName,
+- method, false);
++ return new CharInfo(entitiesFileName, method, false);
+ } catch (Exception e) {}
+
+ String absoluteEntitiesFileName;
+@@ -530,8 +530,7 @@
+ }
+ }
+
+- return getCharInfoBasedOnPrivilege(entitiesFileName,
+- method, false);
++ return new CharInfo(absoluteEntitiesFileName, method, false);
+ }
+
+ /** Table of user-specified char infos. */
+--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java Tue Mar 18 12:34:22 2014 -0700
+@@ -60,7 +60,7 @@
+ */
+ private static final CharInfo m_htmlcharInfo =
+ // new CharInfo(CharInfo.HTML_ENTITIES_RESOURCE);
+- CharInfo.getCharInfo(CharInfo.HTML_ENTITIES_RESOURCE, Method.HTML);
++ CharInfo.getCharInfoInternal(CharInfo.HTML_ENTITIES_RESOURCE, Method.HTML);
+
+ /** A digital search trie for fast, case insensitive lookup of ElemDesc objects. */
+ static final Trie m_elementFlags = new Trie();
+--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToXMLStream.java Thu Dec 19 09:01:08 2013 -0800
++++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToXMLStream.java Tue Mar 18 12:34:22 2014 -0700
+@@ -58,7 +58,7 @@
+ */
+ private static CharInfo m_xmlcharInfo =
+ // new CharInfo(CharInfo.XML_ENTITIES_RESOURCE);
+- CharInfo.getCharInfo(CharInfo.XML_ENTITIES_RESOURCE, Method.XML);
++ CharInfo.getCharInfoInternal(CharInfo.XML_ENTITIES_RESOURCE, Method.XML);
+
+ /**
+ * Default constructor.
+--- ./jaxws/.hgtags Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/.hgtags Tue Mar 18 12:34:51 2014 -0700
+@@ -381,6 +381,9 @@
+ 65b0f3ccdc8bcff0d79e1b543a8cefb817529b3f jdk7u45-b18
+ c32c6a662d18d7195fc02125178c7543ce09bb00 jdk7u45-b30
+ 6802a1c098c48b2c8336e06f1565254759025bab jdk7u45-b31
++e040abab3625fbced33b30cba7c0307236268211 jdk7u45-b33
++e7df5d6b23c64509672d262187f51cde14db4e66 jdk7u45-b34
++c654ba4b2392c2913f45b495a2ea0c53cc348d98 jdk7u45-b35
+ 5524cced32d3959d95ed414add230273bc10c38d jdk7u51-b00
+ db9e3328f393313e52cbf3fee5236aa2429028d0 jdk7u51-b01
+ 92a4787cb3617005a329fb49247c550e8d7eb47a jdk7u51-b02
+@@ -395,3 +398,22 @@
+ 708507f4795cad1f0cf7e19ff2dc16fe9d441754 jdk7u51-b11
+ 7c7c2ea4b6808d0abf7fd48d11440d75b0c08d3a jdk7u51-b12
+ 81a1b110f70c37d2c2f0de7c0ef3bd2d04aba475 jdk7u51-b13
++5dbeb9983f104be717da35c9b14923d71dd248d7 jdk7u51-b30
++eb79f394916efba85f4f6c7ef562966699f2c1e8 jdk7u51-b31
++b2e40219fdcb579d9e10bf01bbd1f05ddcc936fb jdk7u51-b33
++f782f513bb1c74640fe0f4711fec6a417845e9e9 jdk7u51-b34
++7c7c2ea4b6808d0abf7fd48d11440d75b0c08d3a jdk7u55-b00
++c5eb0c2a0f9715b510bc641506fb90df9bf05ab0 jdk7u55-b01
++a257072fc2aa482abd6ffa28e235dbe532af6d00 jdk7u55-b02
++2916fdfc475bf29bc702887bf5ba02df67c98916 jdk7u55-b03
++f4759b4547602b3bc865db8c5f356f46979c6389 jdk7u55-b04
++8a8dfdbc66149b89f804c5a50e4692c2520569ae jdk7u55-b05
++2696d6747826cea92a97b2d80be4a59ff99462bd jdk7u55-b06
++1ad971afe2b5db93420654fa65b23f827760fed7 jdk7u55-b07
++57ba92e96b7fb6f4543038c1daa390c45d8a9d84 jdk7u55-b08
++c9d8555964a581486f4c8e1bf5f5db678eb3b9f2 jdk7u55-b09
++0f469a7307b98e911aaaab8cad781eab3bd94ad6 jdk7u55-b09
++1080e907d64ab63c6138b1a61d9e5b826e83634a jdk7u55-b10
++0db5b891d1ba10211da0a8158551b35f00da7684 jdk7u55-b11
++3834eb921dfd8d29d917a0c57bb9fdd9aa58c209 jdk7u55-b12
++3b0da73591b1ea23c48aa7babc34ed776fc183f0 jdk7u55-b13
+--- ./jaxws/src/share/jaf_classes/javax/activation/CommandMap.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaf_classes/javax/activation/CommandMap.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,6 +25,9 @@
+
+ package javax.activation;
+
++import java.util.Map;
++import java.util.WeakHashMap;
++
+
+ /**
+ * The CommandMap class provides an interface to a registry of
+@@ -38,6 +41,8 @@
+ */
+ public abstract class CommandMap {
+ private static CommandMap defaultCommandMap = null;
++ private static Map<ClassLoader,CommandMap> map =
++ new WeakHashMap<ClassLoader,CommandMap>();
+
+ /**
+ * Get the default CommandMap.
+@@ -56,11 +61,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;
+ }
+
+ /**
+@@ -71,7 +83,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 {
+@@ -79,13 +91,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;
+ }
+
+--- ./jaxws/src/share/jaf_classes/javax/activation/DataHandler.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaf_classes/javax/activation/DataHandler.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -368,7 +368,12 @@
+ // if it's not set, set it...
+ if (transferFlavors == emptyFlavors)
+ transferFlavors = getDataContentHandler().getTransferDataFlavors();
+- return transferFlavors;
++
++ if (transferFlavors == emptyFlavors)
++ return transferFlavors;
++ else
++ return transferFlavors.clone();
++
+ }
+
+ /**
+--- ./jaxws/src/share/jaf_classes/javax/activation/FileTypeMap.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaf_classes/javax/activation/FileTypeMap.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -26,6 +26,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
+@@ -48,6 +50,8 @@
+ public abstract class FileTypeMap {
+
+ private static FileTypeMap defaultMap = null;
++ private static Map<ClassLoader,FileTypeMap> map =
++ new WeakHashMap<ClassLoader,FileTypeMap>();
+
+ /**
+ * The default constructor.
+@@ -78,11 +82,11 @@
+ * Sets the default FileTypeMap for the system. This instance
+ * will be returned to callers of getDefaultFileTypeMap.
+ *
+- * @param map The FileTypeMap.
++ * @param fileTypeMap The FileTypeMap.
+ * @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 fileTypeMap) {
+ SecurityManager security = System.getSecurityManager();
+ if (security != null) {
+ try {
+@@ -90,14 +94,17 @@
+ 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() !=
+- map.getClass().getClassLoader())
++ if (FileTypeMap.class.getClassLoader() == null ||
++ FileTypeMap.class.getClassLoader() !=
++ fileTypeMap.getClass().getClassLoader())
+ throw ex;
+ }
+ }
+- defaultMap = map;
++ // remove any per-thread-context-class-loader FileTypeMap
++ map.remove(SecuritySupport.getContextClassLoader());
++ defaultMap = fileTypeMap;
+ }
+
+ /**
+@@ -109,10 +116,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;
+ }
+ }
+--- ./jaxws/src/share/jaf_classes/javax/activation/MailcapCommandMap.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaf_classes/javax/activation/MailcapCommandMap.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -120,11 +120,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
+
+@@ -164,14 +160,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);
+--- ./jaxws/src/share/jaf_classes/javax/activation/MimetypesFileTypeMap.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaf_classes/javax/activation/MimetypesFileTypeMap.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -69,11 +69,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
+
+@@ -114,14 +110,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);
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.tools.internal.ws.wsdl.parser;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/Internalizer.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/Internalizer.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -65,8 +65,15 @@
+ * @author Vivek Pandey
+ */
+ public class Internalizer {
+- private static final XPathFactory xpf = XPathFactory.newInstance();
+- private final XPath xpath = xpf.newXPath();
++
++ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
++ @Override
++ protected XPathFactory initialValue() throws Exception {
++ return XPathFactory.newInstance();
++ }
++ };
++
++ private final XPath xpath = xpf.get().newXPath();
+ private final WsimportOptions options;
+ private final DOMForest forest;
+ private final ErrorReceiver errorReceiver;
+--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -56,8 +56,14 @@
+ */
+ public class JAXWSBindingExtensionHandler extends AbstractExtensionHandler {
+
+- private static final XPathFactory xpf = XPathFactory.newInstance();
+- private final XPath xpath = xpf.newXPath();
++ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
++ @Override
++ protected XPathFactory initialValue() throws Exception {
++ return XPathFactory.newInstance();
++ }
++ };
++
++ private final XPath xpath = xpf.get().newXPath();
+
+ public JAXWSBindingExtensionHandler(Map<String, AbstractExtensionHandler> extensionHandlerMap) {
+ super(extensionHandlerMap);
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.tools.internal.xjc.reader.internalizer;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/Internalizer.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/Internalizer.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -75,9 +75,14 @@
+
+ private static final String WSDL_NS = "http://schemas.xmlsoap.org/wsdl/";
+
+- private static final XPathFactory xpf = XPathFactory.newInstance();
++ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
++ @Override
++ protected XPathFactory initialValue() throws Exception {
++ return XPathFactory.newInstance();
++ }
++ };
+
+- private final XPath xpath = xpf.newXPath();
++ private final XPath xpath = xpf.get().newXPath();
+
+ /**
+ * Internalize all &lt;jaxb:bindings> customizations in the given forest.
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -27,9 +27,14 @@
+
+ import java.math.BigDecimal;
+ import java.math.BigInteger;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.Calendar;
++import java.util.Collections;
+ import java.util.GregorianCalendar;
++import java.util.Map;
+ import java.util.TimeZone;
++import java.util.WeakHashMap;
+
+ import javax.xml.bind.DatatypeConverter;
+ import javax.xml.bind.DatatypeConverterInterface;
+@@ -352,7 +357,7 @@
+
+ public static GregorianCalendar _parseDateTime(CharSequence s) {
+ String val = WhiteSpaceProcessor.trim(s).toString();
+- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
+ }
+
+ public static String _printDateTime(Calendar val) {
+@@ -718,14 +723,30 @@
+ }
+ return false;
+ }
+- private static final DatatypeFactory datatypeFactory;
+
+- static {
+- try {
+- datatypeFactory = DatatypeFactory.newInstance();
+- } catch (DatatypeConfigurationException e) {
+- throw new Error(e);
++ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
++
++ public static DatatypeFactory getDatatypeFactory() {
++ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
++ public ClassLoader run() {
++ return Thread.currentThread().getContextClassLoader();
++ }
++ });
++ DatatypeFactory df = DF_CACHE.get(tccl);
++ if (df == null) {
++ synchronized (DatatypeConverterImpl.class) {
++ df = DF_CACHE.get(tccl);
++ if (df == null) { // to prevent multiple initialization
++ try {
++ df = DatatypeFactory.newInstance();
++ } catch (DatatypeConfigurationException e) {
++ throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
++ }
++ DF_CACHE.put(tccl, df);
++ }
++ }
+ }
++ return df;
+ }
+
+ private static final class CalendarFormatter {
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.bind;
++
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++
++/**
++ * Message resources
++ */
++enum Messages {
++ FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
++ ;
++
++ private static final ResourceBundle rb = ResourceBundle.getBundle(Messages.class.getName());
++
++ @Override
++ public String toString() {
++ return format();
++ }
++
++ public String format( Object... args ) {
++ return MessageFormat.format( rb.getString(name()), args );
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++
++FAILED_TO_INITIALE_DATATYPE_FACTORY = \
++ Failed to initialize JAXP 1.3 DatatypeFactory class.
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -60,7 +60,6 @@
+ PROPERTY_ORDER_CONTAINS_UNUSED_ENTRY, // 2 args
+
+ INVALID_XML_ENUM_VALUE, // 2 arg
+- FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
+ NO_IMAGE_WRITER, // 1 arg
+
+ ILLEGAL_MIME_TYPE, // 2 args
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -86,9 +86,6 @@
+ INVALID_XML_ENUM_VALUE = \
+ "{0}" is not a valid value for {1}.
+
+-FAILED_TO_INITIALE_DATATYPE_FACTORY = \
+- Failed to initialize JAXP 1.3 DatatypeFactory class.
+-
+ NO_IMAGE_WRITER = \
+ No javax.imageio.ImageWriter is available for the specified MIME type "{0}"
+
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -60,9 +60,7 @@
+ import javax.imageio.stream.ImageOutputStream;
+ import javax.xml.bind.ValidationEvent;
+ import javax.xml.bind.helpers.ValidationEventImpl;
+-import javax.xml.datatype.DatatypeConfigurationException;
+ import javax.xml.datatype.DatatypeConstants;
+-import javax.xml.datatype.DatatypeFactory;
+ import javax.xml.datatype.Duration;
+ import javax.xml.datatype.XMLGregorianCalendar;
+ import javax.xml.namespace.QName;
+@@ -565,7 +563,8 @@
+
+ public XMLGregorianCalendar parse(CharSequence lexical) throws SAXException {
+ try {
+- return datatypeFactory.newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
++ return DatatypeConverterImpl.getDatatypeFactory()
++ .newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
+ } catch (Exception e) {
+ UnmarshallingContext.getInstance().handleError(e);
+ return null;
+@@ -835,7 +834,7 @@
+
+ public Duration parse(CharSequence lexical) {
+ TODO.checkSpec("JSR222 Issue #42");
+- return datatypeFactory.newDuration(lexical.toString());
++ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
+ }
+ });
+ primaryList.add(
+@@ -876,21 +875,6 @@
+ }
+ }
+
+-
+- /**
+- * Cached instance of {@link DatatypeFactory} to create
+- * {@link XMLGregorianCalendar} and {@link Duration}.
+- */
+- private static final DatatypeFactory datatypeFactory = init();
+-
+- private static DatatypeFactory init() {
+- try {
+- return DatatypeFactory.newInstance();
+- } catch (DatatypeConfigurationException e) {
+- throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
+- }
+- }
+-
+ private static void checkXmlGregorianCalendarFieldRef(QName type,
+ XMLGregorianCalendar cal)throws javax.xml.bind.MarshalException{
+ StringBuilder buf = new StringBuilder();
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -33,7 +33,6 @@
+
+ import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl;
+ import com.sun.xml.internal.bind.v2.runtime.XMLSerializer;
+-import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
+
+ import org.xml.sax.SAXException;
+
+@@ -153,7 +152,6 @@
+ }
+ }
+
+-
+ /**
+ * Reference to FI's XMLStreamWriter class, if FI can be loaded.
+ */
+@@ -162,9 +160,8 @@
+
+ private static Class initFIStAXWriterClass() {
+ try {
+- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
+- Class llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter", true, loader);
+- Class sds = loader.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
++ Class<?> llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter");
++ Class<?> sds = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
+ // Check if StAXDocumentSerializer implements LowLevelFastInfosetStreamWriter
+ if (llfisw.isAssignableFrom(sds))
+ return sds;
+@@ -179,8 +176,7 @@
+ try {
+ if (FI_STAX_WRITER_CLASS == null)
+ return null;
+- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
+- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput", true, loader);
++ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput");
+ return c.getConstructor(FI_STAX_WRITER_CLASS, JAXBContextImpl.class);
+ } catch (Throwable e) {
+ return null;
+@@ -195,8 +191,7 @@
+
+ private static Class initStAXExWriterClass() {
+ try {
+- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
+- return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx",true,loader);
++ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx");
+ } catch (Throwable e) {
+ return null;
+ }
+@@ -204,8 +199,7 @@
+
+ private static Constructor<? extends XmlOutput> initStAXExOutputClass() {
+ try {
+- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
+- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput",true, loader);
++ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput");
+ return c.getConstructor(STAXEX_WRITER_CLASS);
+ } catch (Throwable e) {
+ return null;
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -33,7 +33,6 @@
+ import javax.xml.stream.XMLStreamReader;
+
+ import com.sun.xml.internal.bind.WhiteSpaceProcessor;
+-import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
+
+ import org.xml.sax.Attributes;
+ import org.xml.sax.SAXException;
+@@ -337,9 +336,8 @@
+
+ private static Class initFIStAXReaderClass() {
+ try {
+- ClassLoader cl = getClassLoader();
+- Class fisr = cl.loadClass("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
+- Class sdp = cl.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
++ Class<?> fisr = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
++ Class<?> sdp = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
+ // Check if StAXDocumentParser implements FastInfosetStreamReader
+ if (fisr.isAssignableFrom(sdp))
+ return sdp;
+@@ -355,7 +353,7 @@
+ if (FI_STAX_READER_CLASS == null)
+ return null;
+
+- Class c = getClassLoader().loadClass(
++ Class c = Class.forName(
+ "com.sun.xml.internal.bind.v2.runtime.unmarshaller.FastInfosetConnector");
+ return c.getConstructor(FI_STAX_READER_CLASS,XmlVisitor.class);
+ } catch (Throwable e) {
+@@ -371,7 +369,7 @@
+
+ private static Class initStAXExReader() {
+ try {
+- return getClassLoader().loadClass("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
++ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
+ } catch (Throwable e) {
+ return null;
+ }
+@@ -379,15 +377,10 @@
+
+ private static Constructor<? extends StAXConnector> initStAXExConnector() {
+ try {
+- Class c = getClassLoader().loadClass("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
++ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
+ return c.getConstructor(STAX_EX_READER_CLASS,XmlVisitor.class);
+ } catch (Throwable e) {
+ return null;
+ }
+ }
+-
+- public static ClassLoader getClassLoader() {
+- return ClassLoaderRetriever.getClassLoader();
+- }
+-
+ }
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -62,61 +62,6 @@
+ Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
+ "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
+
+- static {
+- try {
+- CommandMap map = CommandMap.getDefaultCommandMap();
+- if (map instanceof MailcapCommandMap) {
+- MailcapCommandMap mailMap = (MailcapCommandMap) map;
+- String hndlrStr = ";;x-java-content-handler=";
+- mailMap.addMailcap(
+- "text/xml"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
+- mailMap.addMailcap(
+- "application/xml"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
+- mailMap.addMailcap(
+- "application/fastinfoset"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
+- /* Image DataContentHandler handles all image types
+- mailMap.addMailcap(
+- "image/jpeg"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.JpegDataContentHandler");
+- mailMap.addMailcap(
+- "image/gif"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.GifDataContentHandler"); */
+- /*mailMap.addMailcap(
+- "multipart/*"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");*/
+- mailMap.addMailcap(
+- "image/*"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
+- mailMap.addMailcap(
+- "text/plain"
+- + hndlrStr
+- + "com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
+- } else {
+- throw new SOAPExceptionImpl("Default CommandMap is not a MailcapCommandMap");
+- }
+- } catch (Throwable t) {
+- log.log(
+- Level.SEVERE,
+- "SAAJ0508.soap.cannot.register.handlers",
+- t);
+- if (t instanceof RuntimeException) {
+- throw (RuntimeException) t;
+- } else {
+- throw new RuntimeException(t.getLocalizedMessage());
+- }
+- }
+- };
+-
+ private final MimeHeaders headers;
+ private MimeBodyPart rawContent = null;
+ private DataHandler dataHandler = null;
+@@ -126,6 +71,12 @@
+
+ public AttachmentPartImpl() {
+ headers = new MimeHeaders();
++
++ // initialization from here should cover most of cases;
++ // if not, it would be necessary to call
++ // AttachmentPartImpl.initializeJavaActivationHandlers()
++ // explicitly by programmer
++ initializeJavaActivationHandlers();
+ }
+
+ public AttachmentPartImpl(MIMEPart part) {
+@@ -263,7 +214,7 @@
+ log.log(
+ Level.FINE,
+ "SAAJ0580.soap.set.Content-Type",
+- new String[] { dataHandler.getContentType()});
++ new String[] { dataHandler.getContentType() });
+ setMimeHeader("Content-Type", dataHandler.getContentType());
+ }
+
+@@ -405,7 +356,7 @@
+ throw new SOAPExceptionImpl(e.getLocalizedMessage());
+ } finally {
+ try {
+- decoded.close();
++ decoded.close();
+ } catch (IOException ex) {
+ throw new SOAPException(ex);
+ }
+@@ -608,4 +559,43 @@
+ return headers;
+ }
+
+-}
++ public static void initializeJavaActivationHandlers() {
++ // DataHandler.writeTo() may search for DCH. So adding some default ones.
++ try {
++ CommandMap map = CommandMap.getDefaultCommandMap();
++ if (map instanceof MailcapCommandMap) {
++ MailcapCommandMap mailMap = (MailcapCommandMap) map;
++
++ // registering our DCH since javamail's DCH doesn't handle
++ if (!cmdMapInitialized(mailMap)) {
++ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
++ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
++ mailMap.addMailcap("application/fastinfoset;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
++ mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");
++ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
++ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
++ }
++ }
++ } catch (Throwable t) {
++ // ignore the exception.
++ }
++ }
++
++ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
++
++ // checking fastinfoset handler, since this one is specific to SAAJ
++ CommandInfo[] commands = mailMap.getAllCommands("application/fastinfoset");
++ if (commands == null || commands.length == 0) {
++ return false;
++ }
++
++ String saajClassName = "com.sun.xml.internal.ws.binding.FastInfosetDataContentHandler";
++ for (CommandInfo command : commands) {
++ String commandClass = command.getCommandClass();
++ if (saajClassName.equals(commandClass)) {
++ return true;
++ }
++ }
++ return false;
++ }
++}
+\ No newline at end of file
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.messaging.saaj.soap;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for StaticCache utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,7 +25,14 @@
+
+ package com.sun.xml.internal.messaging.saaj.soap;
+
+-import java.util.logging.Logger;
++import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
++import com.sun.xml.internal.messaging.saaj.util.JAXMStreamSource;
++import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
++import com.sun.xml.internal.messaging.saaj.util.ParserPool;
++import com.sun.xml.internal.messaging.saaj.util.RejectDoctypeSaxFilter;
++import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
++import org.xml.sax.InputSource;
++import org.xml.sax.XMLReader;
+
+ import javax.xml.parsers.SAXParser;
+ import javax.xml.soap.SOAPException;
+@@ -34,14 +41,7 @@
+ import javax.xml.transform.dom.DOMResult;
+ import javax.xml.transform.sax.SAXSource;
+ import javax.xml.transform.stream.StreamSource;
+-
+-import org.xml.sax.InputSource;
+-import org.xml.sax.XMLReader;
+-
+-import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
+-import com.sun.xml.internal.messaging.saaj.util.*;
+-
+-import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
++import java.util.logging.Logger;
+
+ /**
+ * EnvelopeFactory creates SOAP Envelope objects using different
+@@ -50,14 +50,19 @@
+ public class EnvelopeFactory {
+
+ protected static final Logger
+- log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
+- "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
++ log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
++ "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
+
+- private static ParserPool parserPool = new ParserPool(5);
++ private static ContextClassloaderLocal<ParserPool> parserPool =
++ new ContextClassloaderLocal<ParserPool>() {
++ @Override
++ protected ParserPool initialValue() throws Exception {
++ return new ParserPool(5);
++ }
++ };
+
+ public static Envelope createEnvelope(Source src, SOAPPartImpl soapPart)
+- throws SOAPException
+- {
++ throws SOAPException {
+ // Insert SAX filter to disallow Document Type Declarations since
+ // they are not legal in SOAP
+ SAXParser saxParser = null;
+@@ -73,15 +78,15 @@
+ }
+ }
+ try {
+- saxParser = parserPool.get();
++ saxParser = parserPool.get().get();
+ } catch (Exception e) {
+ log.severe("SAAJ0601.util.newSAXParser.exception");
+ throw new SOAPExceptionImpl(
+- "Couldn't get a SAX parser while constructing a envelope",
+- e);
++ "Couldn't get a SAX parser while constructing a envelope",
++ e);
+ }
+ InputSource is = SAXSource.sourceToInputSource(src);
+- if (is.getEncoding()== null && soapPart.getSourceCharsetEncoding() != null) {
++ if (is.getEncoding() == null && soapPart.getSourceCharsetEncoding() != null) {
+ is.setEncoding(soapPart.getSourceCharsetEncoding());
+ }
+ XMLReader rejectFilter;
+@@ -90,15 +95,15 @@
+ } catch (Exception ex) {
+ log.severe("SAAJ0510.soap.cannot.create.envelope");
+ throw new SOAPExceptionImpl(
+- "Unable to create envelope from given source: ",
+- ex);
++ "Unable to create envelope from given source: ",
++ ex);
+ }
+ src = new SAXSource(rejectFilter, is);
+ }
+
+ try {
+ Transformer transformer =
+- EfficientStreamingTransformer.newTransformer();
++ EfficientStreamingTransformer.newTransformer();
+ DOMResult result = new DOMResult(soapPart);
+ transformer.transform(src, result);
+
+@@ -110,11 +115,11 @@
+ }
+ log.severe("SAAJ0511.soap.cannot.create.envelope");
+ throw new SOAPExceptionImpl(
+- "Unable to create envelope from given source: ",
+- ex);
++ "Unable to create envelope from given source: ",
++ ex);
+ } finally {
+ if (saxParser != null) {
+- parserPool.returnParser(saxParser);
++ parserPool.get().returnParser(saxParser);
+ }
+ }
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.stream.buffer;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -370,7 +370,12 @@
+ writeTo(handler, errorHandler, isFragment());
+ }
+
+- private static final TransformerFactory trnsformerFactory = TransformerFactory.newInstance();
++ private static final ContextClassloaderLocal<TransformerFactory> trnsformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
++ @Override
++ protected TransformerFactory initialValue() throws Exception {
++ return TransformerFactory.newInstance();
++ }
++ };
+
+ /**
+ * Writes out the contents of this buffer as DOM node and append that to the given node.
+@@ -382,7 +387,7 @@
+ */
+ public final Node writeTo(Node n) throws XMLStreamBufferException {
+ try {
+- Transformer t = trnsformerFactory.newTransformer();
++ Transformer t = trnsformerFactory.get().newTransformer();
+ t.transform(new XMLStreamBufferSource(this), new DOMResult(n));
+ return n.getLastChild();
+ } catch (TransformerException e) {
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.ws.api.streaming;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -61,29 +61,32 @@
+ /**
+ * Singleton instance.
+ */
+- private static volatile @NotNull XMLStreamReaderFactory theInstance;
++ private static volatile ContextClassloaderLocal<XMLStreamReaderFactory> streamReader =
++ new ContextClassloaderLocal<XMLStreamReaderFactory>() {
+
+- static {
+- XMLInputFactory xif = getXMLInputFactory();
+- XMLStreamReaderFactory f=null;
++ @Override
++ protected XMLStreamReaderFactory initialValue() {
++ XMLInputFactory xif = getXMLInputFactory();
++ XMLStreamReaderFactory f=null;
+
+- // this system property can be used to disable the pooling altogether,
+- // in case someone hits an issue with pooling in the production system.
+- if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
+- f = Zephyr.newInstance(xif);
++ // this system property can be used to disable the pooling altogether,
++ // in case someone hits an issue with pooling in the production system.
++ if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
++ f = Zephyr.newInstance(xif);
+
+- if(f==null) {
+- // is this Woodstox?
+- if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
+- f = new Woodstox(xif);
++ if(f==null) {
++ // is this Woodstox?
++ if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
++ f = new Woodstox(xif);
++ }
++
++ if(f==null)
++ f = new Default();
++
++ LOGGER.fine("XMLStreamReaderFactory instance is = "+f);
++ return f;
+ }
+-
+- if(f==null)
+- f = new Default();
+-
+- theInstance = f;
+- LOGGER.fine("XMLStreamReaderFactory instance is = "+theInstance);
+- }
++ };
+
+ private static XMLInputFactory getXMLInputFactory() {
+ XMLInputFactory xif = null;
+@@ -109,11 +112,11 @@
+ */
+ public static void set(XMLStreamReaderFactory f) {
+ if(f==null) throw new IllegalArgumentException();
+- theInstance = f;
++ streamReader.set(f);
+ }
+
+ public static XMLStreamReaderFactory get() {
+- return theInstance;
++ return streamReader.get();
+ }
+
+ public static XMLStreamReader create(InputSource source, boolean rejectDTDs) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -57,39 +57,41 @@
+ /**
+ * Singleton instance.
+ */
+- private static volatile @NotNull XMLStreamWriterFactory theInstance;
++ private static volatile ContextClassloaderLocal<XMLStreamWriterFactory> writerFactory =
++ new ContextClassloaderLocal<XMLStreamWriterFactory>() {
+
++ @Override
++ protected XMLStreamWriterFactory initialValue() {
++ XMLOutputFactory xof = null;
++ if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
++ try {
++ xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
++ } catch (Exception e) {
++ // Ignore and fallback to default XMLOutputFactory
++ }
++ }
++ if (xof == null) {
++ xof = XMLOutputFactory.newInstance();
++ }
+
+- static {
+- XMLOutputFactory xof = null;
+- if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
+- try {
+- xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
+- } catch (Exception e) {
+- // Ignore and fallback to default XMLOutputFactory
++ XMLStreamWriterFactory f=null;
++
++ // this system property can be used to disable the pooling altogether,
++ // in case someone hits an issue with pooling in the production system.
++ if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
++ f = Zephyr.newInstance(xof);
++ if(f==null) {
++ // is this Woodstox?
++ if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
++ f = new NoLock(xof);
+ }
++ if (f == null)
++ f = new Default(xof);
++
++ LOGGER.fine("XMLStreamWriterFactory instance is = "+ f);
++ return f;
+ }
+- if (xof == null) {
+- xof = XMLOutputFactory.newInstance();
+- }
+-
+- XMLStreamWriterFactory f=null;
+-
+- // this system property can be used to disable the pooling altogether,
+- // in case someone hits an issue with pooling in the production system.
+- if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
+- f = Zephyr.newInstance(xof);
+- if(f==null) {
+- // is this Woodstox?
+- if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
+- f = new NoLock(xof);
+- }
+- if (f == null)
+- f = new Default(xof);
+-
+- theInstance = f;
+- LOGGER.fine("XMLStreamWriterFactory instance is = "+theInstance);
+- }
++ };
+
+ /**
+ * See {@link #create(OutputStream)} for the contract.
+@@ -152,7 +154,7 @@
+ * Gets the singleton instance.
+ */
+ public static @NotNull XMLStreamWriterFactory get() {
+- return theInstance;
++ return writerFactory.get();
+ }
+
+ /**
+@@ -164,7 +166,7 @@
+ */
+ public static void set(@NotNull XMLStreamWriterFactory f) {
+ if(f==null) throw new IllegalArgumentException();
+- theInstance = f;
++ writerFactory.set(f);
+ }
+
+ /**
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -36,6 +36,9 @@
+ import com.sun.xml.internal.ws.developer.MemberSubmissionAddressingFeature;
+ import com.sun.xml.internal.ws.developer.BindingTypeFeature;
+
++import javax.activation.CommandInfo;
++import javax.activation.CommandMap;
++import javax.activation.MailcapCommandMap;
+ import javax.xml.ws.Service;
+ import javax.xml.ws.WebServiceFeature;
+ import javax.xml.ws.soap.AddressingFeature;
+@@ -109,9 +112,15 @@
+ return addressingVersion;
+ }
+
+- public final
+ @NotNull
+- Codec createCodec() {
++ public final Codec createCodec() {
++
++ // initialization from here should cover most of cases;
++ // if not, it would be necessary to call
++ // BindingImpl.initializeJavaActivationHandlers()
++ // explicitly by programmer
++ initializeJavaActivationHandlers();
++
+ return bindingId.createEncoder(this);
+ }
+
+@@ -169,4 +178,48 @@
+ public void addFeature(@NotNull WebServiceFeature newFeature) {
+ features.add(newFeature);
+ }
++
++ public static void initializeJavaActivationHandlers() {
++ // DataHandler.writeTo() may search for DCH. So adding some default ones.
++ try {
++ CommandMap map = CommandMap.getDefaultCommandMap();
++ if (map instanceof MailcapCommandMap) {
++ MailcapCommandMap mailMap = (MailcapCommandMap) map;
++
++ // registering our DCH since javamail's DCH doesn't handle
++ if (!cmdMapInitialized(mailMap)) {
++ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
++ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
++ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.ws.encoding.ImageDataContentHandler");
++ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.ws.encoding.StringDataContentHandler");
++ }
++ }
++ } catch (Throwable t) {
++ // ignore the exception.
++ }
++ }
++
++ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
++ CommandInfo[] commands = mailMap.getAllCommands("text/xml");
++ if (commands == null || commands.length == 0) {
++ return false;
++ }
++
++ // SAAJ RI implements it's own DataHandlers which can be used for JAX-WS too;
++ // see com.sun.xml.internal.messaging.saaj.soap.AttachmentPartImpl#initializeJavaActivationHandlers
++ // so if found any of SAAJ or our own handler registered, we are ok; anyway using SAAJ directly here
++ // is not good idea since we don't want standalone JAX-WS to depend on specific SAAJ impl.
++ // This is also reason for duplication of Handler's code by JAX-WS
++ String saajClassName = "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler";
++ String jaxwsClassName = "com.sun.xml.internal.ws.encoding.XmlDataContentHandler";
++ for (CommandInfo command : commands) {
++ String commandClass = command.getCommandClass();
++ if (saajClassName.equals(commandClass) ||
++ jaxwsClassName.equals(commandClass)) {
++ return true;
++ }
++ }
++ return false;
++ }
++
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.ws.developer;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -64,7 +64,12 @@
+ @XmlType(name = "EndpointReferenceType", namespace = MemberSubmissionEndpointReference.MSNS)
+ public final class MemberSubmissionEndpointReference extends EndpointReference implements MemberSubmissionAddressingConstants {
+
+- private final static JAXBContext msjc = MemberSubmissionEndpointReference.getMSJaxbContext();
++ private final static ContextClassloaderLocal<JAXBContext> msjc = new ContextClassloaderLocal<JAXBContext>() {
++ @Override
++ protected JAXBContext initialValue() throws Exception {
++ return MemberSubmissionEndpointReference.getMSJaxbContext();
++ }
++ };
+
+ public MemberSubmissionEndpointReference() {
+ }
+@@ -85,7 +90,7 @@
+ throw new WebServiceException("Source parameter can not be null on constructor");
+
+ try {
+- Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.createUnmarshaller();
++ Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.get().createUnmarshaller();
+ MemberSubmissionEndpointReference epr = unmarshaller.unmarshal(source,MemberSubmissionEndpointReference.class).getValue();
+
+ this.addr = epr.addr;
+@@ -104,7 +109,7 @@
+
+ public void writeTo(Result result) {
+ try {
+- Marshaller marshaller = MemberSubmissionEndpointReference.msjc.createMarshaller();
++ Marshaller marshaller = MemberSubmissionEndpointReference.msjc.get().createMarshaller();
+ //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
+ marshaller.marshal(this, result);
+ } catch (JAXBException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -34,9 +34,6 @@
+ import com.sun.xml.internal.ws.api.pipe.ContentType;
+ import com.sun.xml.internal.ws.developer.StreamingAttachmentFeature;
+
+-import javax.activation.CommandMap;
+-import javax.activation.MailcapCommandMap;
+-import javax.activation.DataContentHandler;
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.OutputStream;
+@@ -62,33 +59,6 @@
+ */
+ abstract class MimeCodec implements Codec {
+
+- static {
+- // DataHandler.writeTo() may search for DCH. So adding some default ones.
+- try {
+- CommandMap map = CommandMap.getDefaultCommandMap();
+- if (map instanceof MailcapCommandMap) {
+- MailcapCommandMap mailMap = (MailcapCommandMap) map;
+- String hndlrStr = ";;x-java-content-handler=";
+- // registering our DCH since javamail's DCH doesn't handle
+- // Source
+- mailMap.addMailcap(
+- "text/xml" + hndlrStr + XmlDataContentHandler.class.getName());
+- mailMap.addMailcap(
+- "application/xml" + hndlrStr + XmlDataContentHandler.class.getName());
+- if (map.createDataContentHandler("image/*") == null) {
+- mailMap.addMailcap(
+- "image/*" + hndlrStr + ImageDataContentHandler.class.getName());
+- }
+- if (map.createDataContentHandler("text/plain") == null) {
+- mailMap.addMailcap(
+- "text/plain" + hndlrStr + StringDataContentHandler.class.getName());
+- }
+- }
+- } catch (Throwable t) {
+- // ignore the exception.
+- }
+- }
+-
+ public static final String MULTIPART_RELATED_MIME_TYPE = "multipart/related";
+
+ private String boundary;
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.ws.policy.sourcemodel.attach;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -83,7 +83,13 @@
+ private static final QName POLICY = new QName("http://www.w3.org/ns/ws-policy", "Policy");
+ private static final QName URI = new QName("http://www.w3.org/ns/ws-policy", "URI");
+ private static final QName POLICIES = new QName(PolicyConstants.SUN_MANAGEMENT_NAMESPACE, "Policies");
+- private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory.newInstance();
++ private static final ContextClassloaderLocal<XMLInputFactory> XML_INPUT_FACTORY = new ContextClassloaderLocal<XMLInputFactory>() {
++ @Override
++ protected XMLInputFactory initialValue() throws Exception {
++ return XMLInputFactory.newInstance();
++ }
++ };
++
+ private static final PolicyModelUnmarshaller POLICY_UNMARSHALLER = PolicyModelUnmarshaller.getXmlUnmarshaller();
+
+ private final Map<URI, Policy> map = new HashMap<URI, Policy>();
+@@ -93,7 +99,7 @@
+ public static Map<URI, Policy> unmarshal(final Reader source) throws PolicyException {
+ LOGGER.entering(source);
+ try {
+- XMLEventReader reader = XML_INPUT_FACTORY.createXMLEventReader(source);
++ XMLEventReader reader = XML_INPUT_FACTORY.get().createXMLEventReader(source);
+ ExternalAttachmentsUnmarshaller instance = new ExternalAttachmentsUnmarshaller();
+ final Map<URI, Policy> map = instance.unmarshal(reader, null);
+ LOGGER.exiting(map);
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.ws.spi;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for StaticCache utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -77,7 +77,12 @@
+ */
+ public class ProviderImpl extends Provider {
+
+- private final static JAXBContext eprjc = getEPRJaxbContext();
++ private final static ContextClassloaderLocal<JAXBContext> eprjc = new ContextClassloaderLocal<JAXBContext>() {
++ @Override
++ protected JAXBContext initialValue() throws Exception {
++ return getEPRJaxbContext();
++ }
++ };
+
+ /**
+ * Convenient singleton instance.
+@@ -140,7 +145,7 @@
+ return AccessController.doPrivileged(new PrivilegedAction<EndpointReference>() {
+ public EndpointReference run() {
+ try {
+- Unmarshaller unmarshaller = eprjc.createUnmarshaller();
++ Unmarshaller unmarshaller = eprjc.get().createUnmarshaller();
+ return (EndpointReference) unmarshaller.unmarshal(eprInfoset);
+ } catch (JAXBException e) {
+ throw new WebServiceException("Error creating Marshaller or marshalling.", e);
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.ws.util.xml;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for StaticCache utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -199,20 +199,28 @@
+ }
+ }
+
+- static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
++ static final ContextClassloaderLocal<TransformerFactory> transformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
++ @Override
++ protected TransformerFactory initialValue() throws Exception {
++ return TransformerFactory.newInstance();
++ }
++ };
+
+- static final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+-
+- static {
+- saxParserFactory.setNamespaceAware(true);
+- }
++ static final ContextClassloaderLocal<SAXParserFactory> saxParserFactory = new ContextClassloaderLocal<SAXParserFactory>() {
++ @Override
++ protected SAXParserFactory initialValue() throws Exception {
++ SAXParserFactory factory = SAXParserFactory.newInstance();
++ factory.setNamespaceAware(true);
++ return factory;
++ }
++ };
+
+ /**
+ * Creates a new identity transformer.
+ */
+ public static Transformer newTransformer() {
+ try {
+- return transformerFactory.newTransformer();
++ return transformerFactory.get().newTransformer();
+ } catch (TransformerConfigurationException tex) {
+ throw new IllegalStateException("Unable to create a JAXP transformer");
+ }
+@@ -227,9 +235,9 @@
+ // work around a bug in JAXP in JDK6u4 and earlier where the namespace processing
+ // is not turned on by default
+ StreamSource ssrc = (StreamSource) src;
+- TransformerHandler th = ((SAXTransformerFactory) transformerFactory).newTransformerHandler();
++ TransformerHandler th = ((SAXTransformerFactory) transformerFactory.get()).newTransformerHandler();
+ th.setResult(result);
+- XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();
++ XMLReader reader = saxParserFactory.get().newSAXParser().getXMLReader();
+ reader.setContentHandler(th);
+ reader.setProperty(LEXICAL_HANDLER_PROPERTY, th);
+ reader.parse(toInputSource(ssrc));
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package com.sun.xml.internal.xsom.util;
++
++import java.security.AccessController;
++import java.security.PrivilegedAction;
++import java.text.MessageFormat;
++import java.util.ResourceBundle;
++import java.util.WeakHashMap;
++
++/**
++ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
++ */
++abstract class ContextClassloaderLocal<V> {
++
++ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
++
++ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
++
++ public V get() throws Error {
++ ClassLoader tccl = getContextClassLoader();
++ V instance = CACHE.get(tccl);
++ if (instance == null) {
++ instance = createNewInstance();
++ CACHE.put(tccl, instance);
++ }
++ return instance;
++ }
++
++ public void set(V instance) {
++ CACHE.put(getContextClassLoader(), instance);
++ }
++
++ protected abstract V initialValue() throws Exception;
++
++ private V createNewInstance() {
++ try {
++ return initialValue();
++ } catch (Exception e) {
++ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
++ }
++ }
++
++ private static String format(String property, Object... args) {
++ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
++ return MessageFormat.format(text, args);
++ }
++
++ private static ClassLoader getContextClassLoader() {
++ return (ClassLoader)
++ AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ClassLoader cl = null;
++ try {
++ cl = Thread.currentThread().getContextClassLoader();
++ } catch (SecurityException ex) {
++ }
++ return cl;
++ }
++ });
++ }
++}
++
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -0,0 +1,27 @@
++#
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++#
++# This code is free software; you can redistribute it and/or modify it
++# under the terms of the GNU General Public License version 2 only, as
++# published by the Free Software Foundation. Oracle designates this
++# particular file as subject to the "Classpath" exception as provided
++# by Oracle in the LICENSE file that accompanied this code.
++#
++# This code 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
++# version 2 for more details (a copy is included in the LICENSE file that
++# accompanied this code).
++#
++# You should have received a copy of the GNU General Public License version
++# 2 along with this work; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++# or visit www.oracle.com if you need additional information or have any
++# questions.
++#
++# Error messages for ContextClassloaderLocal utility class
++FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
++
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -60,7 +60,12 @@
+ return new AnnotationParserImpl();
+ }
+
+- private static final SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
++ private static final ContextClassloaderLocal<SAXTransformerFactory> stf = new ContextClassloaderLocal<SAXTransformerFactory>() {
++ @Override
++ protected SAXTransformerFactory initialValue() throws Exception {
++ return (SAXTransformerFactory) SAXTransformerFactory.newInstance();
++ }
++ };
+
+ private static class AnnotationParserImpl extends AnnotationParser {
+
+@@ -72,7 +77,7 @@
+
+ AnnotationParserImpl() {
+ try {
+- transformer = stf.newTransformerHandler();
++ transformer = stf.get().newTransformerHandler();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+ }
+--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -27,9 +27,14 @@
+
+ import java.math.BigDecimal;
+ import java.math.BigInteger;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.Calendar;
++import java.util.Collections;
+ import java.util.GregorianCalendar;
++import java.util.Map;
+ import java.util.TimeZone;
++import java.util.WeakHashMap;
+
+ import javax.xml.namespace.QName;
+ import javax.xml.namespace.NamespaceContext;
+@@ -418,7 +423,7 @@
+
+ public static GregorianCalendar _parseDateTime(CharSequence s) {
+ String val = WhiteSpaceProcessor.trim(s).toString();
+- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
+ }
+
+ public String printDateTime(Calendar val) {
+@@ -492,7 +497,7 @@
+ }
+
+ public Calendar parseTime(String lexicalXSDTime) {
+- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
+ }
+
+ public String printTime(Calendar val) {
+@@ -500,7 +505,7 @@
+ }
+
+ public Calendar parseDate(String lexicalXSDDate) {
+- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
+ }
+
+ public String printDate(Calendar val) {
+@@ -882,14 +887,30 @@
+ }
+ return false;
+ }
+- private static final DatatypeFactory datatypeFactory;
+
+- static {
+- try {
+- datatypeFactory = DatatypeFactory.newInstance();
+- } catch (DatatypeConfigurationException e) {
+- throw new Error(e);
++ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
++
++ public static DatatypeFactory getDatatypeFactory() {
++ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
++ public ClassLoader run() {
++ return Thread.currentThread().getContextClassLoader();
++ }
++ });
++ DatatypeFactory df = DF_CACHE.get(tccl);
++ if (df == null) {
++ synchronized (DatatypeConverterImpl.class) {
++ df = DF_CACHE.get(tccl);
++ if (df == null) { // to prevent multiple initialization
++ try {
++ df = DatatypeFactory.newInstance();
++ } catch (DatatypeConfigurationException e) {
++ throw new Error(Messages.format(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY), e);
++ }
++ DF_CACHE.put(tccl, df);
++ }
++ }
+ }
++ return df;
+ }
+
+ private static final class CalendarFormatter {
+--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -88,4 +88,6 @@
+
+ static final String ILLEGAL_CAST = // 2 args
+ "JAXBContext.IllegalCast";
++
++ static final String FAILED_TO_INITIALE_DATATYPE_FACTORY = "FAILED_TO_INITIALE_DATATYPE_FACTORY";
+ }
+--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -49,3 +49,6 @@
+
+ JAXBContext.IllegalCast = \
+ ClassCastException: attempting to cast {0} to {1}. Please make sure that you are specifying the proper ClassLoader.
++
++FAILED_TO_INITIALE_DATATYPE_FACTORY = \
++ Failed to initialize JAXP 1.3 DatatypeFactory class.
+--- ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
++++ ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -69,7 +69,7 @@
+ @XmlType(name="EndpointReferenceType",namespace=W3CEndpointReference.NS)
+ public final class W3CEndpointReference extends EndpointReference {
+
+- private final static JAXBContext w3cjc = getW3CJaxbContext();
++ private final JAXBContext w3cjc = getW3CJaxbContext();
+
+ protected W3CEndpointReference() {
+ }
+--- ./jdk/.hgtags Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/.hgtags Tue Mar 18 12:35:25 2014 -0700
+@@ -365,6 +365,9 @@
+ c5ca4daec23b5e7f99ac8d684f5016ff8bfebbb0 jdk7u45-b18
+ 4797f984f6c93c433aa797e9b2d8f904cf083f96 jdk7u45-b30
+ 8c343a783777b8728cb819938f387db0acf7f3ac jdk7u45-b31
++402d54c7d8ce95f3945cc3d698e528e4adec7b9b jdk7u45-b33
++34e8f9f26ae612ebac36357eecbe70ea20e0233c jdk7u45-b34
++3dbb06a924cdf73d39b8543824ec88ae501ba5c6 jdk7u45-b35
+ 3c9a6d9eafd31be44b0ade0354e60f5078b417a4 jdk7u51-b00
+ d76613074ff357d0664b97b4aaf99fbb65dcec47 jdk7u51-b01
+ fb057871f094ebe4906ad6856326768b01a62c45 jdk7u51-b02
+@@ -379,3 +382,22 @@
+ f0425ecbbb0ca9d8c87c250c19e8f9524b38833d jdk7u51-b11
+ f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u51-b12
+ d19a89fdfb9b959b8638441d9d396685d6c7ab7b jdk7u51-b13
++ef58b2b9a9a1e1a42b0139b57816a160c4681371 jdk7u51-b30
++5bca0d0969b13b1d9b8caba3cce8293a98d68318 jdk7u51-b31
++e9143dc3dc2a8f4b896e74f70d6c503d73c40533 jdk7u51-b33
++c1eaf405fb8d7beddd75c6f81671970f6baa70d8 jdk7u51-b34
++f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u55-b00
++5010db5b9b5ab07a9409a5c557d3f43ab32dc428 jdk7u55-b01
++2ca3e1fa4455ad564228ad6e654498167af2f20d jdk7u55-b02
++c12b3c81366cb067ff4444952209d54bfa387353 jdk7u55-b03
++476d1bddaa32bf440953c3b1814ba38f16886c03 jdk7u55-b04
++7fa6d3ba2cc77cd1e6f24e33f0c39788cb2893b8 jdk7u55-b05
++795654fce29c38d4c8504f760d8d8a36248d38ed jdk7u55-b06
++4b2ed892b195e95f7541aaa3b129a2caa5faae1d jdk7u55-b07
++db1323224053a18ecc62bdc1d3902d93b33f0b70 jdk7u55-b08
++534eeff29ac9fcbbb99ef8908548dbb368d04baf jdk7u55-b09
++d39dd4135844ca5c707bc39ae1d7e020d49880ce jdk7u55-b09
++b231536550067c3b00c77d0e035afe8faaa15581 jdk7u55-b10
++2d80b7cd7aae76f0909a210414317dcf846ad651 jdk7u55-b11
++07be5d5508733ed37c11fcd21a13ae3c8288313b jdk7u55-b12
++92fd166252c2701092a510002f4cf9285a20473d jdk7u55-b13
+--- ./jdk/make/common/Defs-embedded.gmk Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/common/Defs-embedded.gmk Tue Mar 18 12:35:25 2014 -0700
+@@ -71,7 +71,9 @@
+ # and it must be linked after fdlibm - this places it at the end after libc
+ # -z muldefs avoids linker errors for duplicate symbols.
+ ifeq ($(CROSS_COMPILE_ARCH), arm)
+- EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
++ ifneq ($(EXT_LIBS_PATH),)
++ EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
++ endif
+ endif
+ endif
+
+--- ./jdk/make/java/java/Exportedfiles.gmk Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/java/java/Exportedfiles.gmk Tue Mar 18 12:35:25 2014 -0700
+@@ -50,6 +50,7 @@
+ java/lang/SecurityManager.java \
+ java/lang/Shutdown.java \
+ java/lang/Package.java \
++ java/lang/UNIXProcess.java \
+ java/lang/ref/Finalizer.java \
+ java/lang/reflect/AccessibleObject.java \
+ java/lang/reflect/Field.java \
+--- ./jdk/make/java/java/Makefile Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/java/java/Makefile Tue Mar 18 12:35:25 2014 -0700
+@@ -84,6 +84,7 @@
+ java/util/prefs/FileSystemPreferencesFactory.java \
+
+ FILES_c += UNIXProcess_md.c \
++ childproc.c \
+ UnixFileSystem_md.c \
+ canonicalize_md.c \
+ TimeZone.c \
+@@ -451,3 +452,36 @@
+ clean::
+ $(RM) $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java
+
++
++HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper
++BUILDHELPER =
++ifeq ($(PLATFORM), solaris)
++ BUILDHELPER = 1
++endif
++ifeq ($(PLATFORM), macosx)
++ HELPER_EXE = $(LIBDIR)/jspawnhelper
++ BUILDHELPER = 1
++endif
++
++ARCHFLAG =
++ifeq ($(ARCH_DATA_MODEL), 64)
++ARCHFLAG = -m64
++endif
++
++ifdef BUILDHELPER
++
++HELPER_EXE_FILES_c = jspawnhelper.c
++HELPER_EXE_FILES_o = $(OBJDIR)/jspawnhelper.o \
++ $(OBJDIR)/childproc.o
++
++$(HELPER_EXE): $(HELPER_EXE_FILES_o)
++ $(CC) $(ARCHFLAG) $(HELPER_EXE_FILES_o) \
++ -o $(TEMPDIR)/jspawnhelper
++ $(CP) $(TEMPDIR)/jspawnhelper $(HELPER_EXE)
++
++build: $(HELPER_EXE)
++
++clean clobber::
++ $(RM) $(HELPER_EXE_FILES_o) $(HELPER_EXE)
++
++endif #BUILDHELPER
+--- ./jdk/make/java/java/mapfile-vers Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/java/java/mapfile-vers Tue Mar 18 12:35:25 2014 -0700
+@@ -215,7 +215,7 @@
+ Java_java_lang_Throwable_fillInStackTrace;
+ Java_java_lang_Throwable_getStackTraceDepth;
+ Java_java_lang_Throwable_getStackTraceElement;
+- Java_java_lang_UNIXProcess_initIDs;
++ Java_java_lang_UNIXProcess_init;
+ Java_java_lang_UNIXProcess_waitForProcessExit;
+ Java_java_lang_UNIXProcess_forkAndExec;
+ Java_java_lang_UNIXProcess_destroyProcess;
+--- ./jdk/make/sun/javazic/tzdata/VERSION Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/sun/javazic/tzdata/VERSION Tue Mar 18 12:35:25 2014 -0700
+@@ -21,4 +21,4 @@
+ # or visit www.oracle.com if you need additional information or have any
+ # questions.
+ #
+-tzdata2013h
++tzdata2013i
+--- ./jdk/make/sun/javazic/tzdata/africa Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/sun/javazic/tzdata/africa Tue Mar 18 12:35:25 2014 -0700
+@@ -500,14 +500,13 @@
+ Rule Libya 1997 only - Oct 4 0:00 0 -
+ Rule Libya 2013 only - Mar lastFri 1:00 1:00 S
+ Rule Libya 2013 only - Oct lastFri 2:00 0 -
+-
+-# The 1996 and 1997 entries are from Shanks & Pottenger;
+-# the IATA SSIM data contain some obvious errors.
+ # Zone NAME GMTOFF RULES FORMAT [UNTIL]
+ Zone Africa/Tripoli 0:52:44 - LMT 1920
+ 1:00 Libya CE%sT 1959
+ 2:00 - EET 1982
+ 1:00 Libya CE%sT 1990 May 4
++# The 1996 and 1997 entries are from Shanks & Pottenger;
++# the IATA SSIM data contain some obvious errors.
+ 2:00 - EET 1996 Sep 30
+ 1:00 Libya CE%sT 1997 Oct 4
+ 2:00 - EET 2012 Nov 10 2:00
+--- ./jdk/make/sun/javazic/tzdata/asia Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/sun/javazic/tzdata/asia Tue Mar 18 12:35:25 2014 -0700
+@@ -1403,12 +1403,22 @@
+ # switch back to standard time this winter, so the will stay on DST
+ # until about the same time next year (at least).
+ # http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?NewsID=88950
+-#
+-# From Paul Eggert (2013-09-21):
+-# It's looking like this change will be permanent; see
+-# Petra News Agency, Cancelling winter saved Jordan $7 million (2013-02-20)
+-# <http://www.albawaba.com/business/jordan-winter-electricity--472005>.
+-# So move Jordan to UTC+3 as of the abovementioned date.
++
++# From Steffen Thorsen (2013-12-11):
++# Jordan Times and other sources say that Jordan is going back to
++# UTC+2 on 2013-12-19 at midnight:
++# http://jordantimes.com/govt-decides-to-switch-back-to-wintertime
++# Official, in Arabic:
++# http://www.petra.gov.jo/public_news/Nws_NewsDetails.aspx?Menu_ID=&Site_Id=2&lang=1&NewsID=133230&CatID=14
++# ... Our background/permalink about it
++# http://www.timeanddate.com/news/time/jordan-reverses-dst-decision.html
++# ...
++# http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?lang=2&site_id=1&NewsID=133313&Type=P
++# ... says midnight for the coming one and 1:00 for the ones in the future
++# (and they will use DST again next year, using the normal schedule).
++
++# From Paul Eggert (2013-12-11):
++# As Steffen suggested, consider the past 21-month experiment to be DST.
+
+ # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+ Rule Jordan 1973 only - Jun 6 0:00 1:00 S
+@@ -1438,11 +1448,13 @@
+ Rule Jordan 2003 only - Oct 24 0:00s 0 -
+ Rule Jordan 2004 only - Oct 15 0:00s 0 -
+ Rule Jordan 2005 only - Sep lastFri 0:00s 0 -
+-Rule Jordan 2006 2012 - Oct lastFri 0:00s 0 -
++Rule Jordan 2006 2011 - Oct lastFri 0:00s 0 -
++Rule Jordan 2013 only - Dec 20 0:00 0 -
++Rule Jordan 2014 max - Mar lastThu 24:00 1:00 S
++Rule Jordan 2014 max - Oct lastFri 0:00s 0 -
+ # Zone NAME GMTOFF RULES FORMAT [UNTIL]
+ Zone Asia/Amman 2:23:44 - LMT 1931
+- 2:00 Jordan EE%sT 2012 Oct 26 0:00s
+- 3:00 - AST
++ 2:00 Jordan EE%sT
+
+
+ # Kazakhstan
+--- ./jdk/make/sun/javazic/tzdata/northamerica Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/make/sun/javazic/tzdata/northamerica Tue Mar 18 12:35:25 2014 -0700
+@@ -2688,6 +2688,11 @@
+ # to DST--and one more hour on 1999-04-04--when the announcers will have
+ # returned to Baltimore, which switches on that date.)
+
++# From Steffen Thorsen (2013-11-11):
++# DST start in Cuba in 2004 ... does not follow the same rules as the
++# years before. The correct date should be Sunday 2004-03-28 00:00 ...
++# https://web.archive.org/web/20040402060750/http://www.granma.cu/espanol/2004/marzo/sab27/reloj.html
++
+ # From Evert van der Veer via Steffen Thorsen (2004-10-28):
+ # Cuba is not going back to standard time this year.
+ # From Paul Eggert (2006-03-22):
+@@ -2877,7 +2882,8 @@
+ Rule Cuba 1997 only - Oct 12 0:00s 0 S
+ Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D
+ Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S
+-Rule Cuba 2000 2004 - Apr Sun>=1 0:00s 1:00 D
++Rule Cuba 2000 2003 - Apr Sun>=1 0:00s 1:00 D
++Rule Cuba 2004 only - Mar lastSun 0:00s 1:00 D
+ Rule Cuba 2006 2010 - Oct lastSun 0:00s 0 S
+ Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D
+ Rule Cuba 2008 only - Mar Sun>=15 0:00s 1:00 D
+--- ./jdk/src/macosx/classes/sun/font/CFontManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/font/CFontManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -27,6 +27,8 @@
+
+ import java.awt.*;
+ import java.io.File;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+ import java.util.Hashtable;
+@@ -38,6 +40,7 @@
+
+ import sun.awt.FontConfiguration;
+ import sun.awt.HeadlessToolkit;
++import sun.misc.ThreadGroupUtils;
+ import sun.lwawt.macosx.*;
+
+ public class CFontManager extends SunFontManager {
+@@ -215,24 +218,22 @@
+ });
+ }
+ };
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction<Object>() {
+- public Object run() {
++ AccessController.doPrivileged(
++ new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+- ThreadGroup tg =
+- Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null;
+- tg = tgn, tgn = tg.getParent());
+- fileCloser = new Thread(tg, fileCloserRunnable);
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ fileCloser = new Thread(rootTG, fileCloserRunnable);
+ fileCloser.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(fileCloser);
+ return null;
+ }
+- });
++ }
++ );
+ }
+ }
+ }
+--- ./jdk/src/macosx/classes/sun/font/CStrike.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/font/CStrike.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -31,7 +31,7 @@
+
+ import sun.awt.SunHints;
+
+-public class CStrike extends FontStrike {
++public final class CStrike extends FontStrike {
+
+ // Creates the native strike
+ private static native long createNativeStrikePtr(long nativeFontPtr,
+@@ -68,10 +68,10 @@
+ Rectangle2D.Float result,
+ double x, double y);
+
+- private CFont nativeFont;
++ private final CFont nativeFont;
+ private AffineTransform invDevTx;
+- private GlyphInfoCache glyphInfoCache;
+- private GlyphAdvanceCache glyphAdvanceCache;
++ private final GlyphInfoCache glyphInfoCache;
++ private final GlyphAdvanceCache glyphAdvanceCache;
+ private long nativeStrikePtr;
+
+ CStrike(final CFont font, final FontStrikeDesc inDesc) {
+@@ -84,11 +84,11 @@
+ // Normally the device transform should be the identity transform
+ // for screen operations. The device transform only becomes
+ // interesting when we are outputting between different dpi surfaces,
+- // like when we are printing to postscript.
++ // like when we are printing to postscript or use retina.
+ if (inDesc.devTx != null && !inDesc.devTx.isIdentity()) {
+ try {
+ invDevTx = inDesc.devTx.createInverse();
+- } catch (NoninvertibleTransformException e) {
++ } catch (NoninvertibleTransformException ignored) {
+ // ignored, since device transforms should not be that
+ // complicated, and if they are - there is nothing we can do,
+ // so we won't worry about it.
+@@ -134,15 +134,13 @@
+ nativeStrikePtr = 0;
+ }
+
+- // the fractional metrics default on our platform is OFF
+- private boolean useFractionalMetrics() {
+- return desc.fmHint == SunHints.INTVAL_FRACTIONALMETRICS_ON;
+- }
+
++ @Override
+ public int getNumGlyphs() {
+ return nativeFont.getNumGlyphs();
+ }
+
++ @Override
+ StrikeMetrics getFontMetrics() {
+ if (strikeMetrics == null) {
+ StrikeMetrics metrics = getFontMetrics(getNativeStrikePtr());
+@@ -155,74 +153,24 @@
+ return strikeMetrics;
+ }
+
+- float getGlyphAdvance(int glyphCode) {
+- return getScaledAdvanceForAdvance(getCachedNativeGlyphAdvance(glyphCode));
++ @Override
++ float getGlyphAdvance(final int glyphCode) {
++ return getCachedNativeGlyphAdvance(glyphCode);
+ }
+
+- float getCodePointAdvance(int cp) {
+- float advance = getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
+-
+- double glyphScaleX = desc.glyphTx.getScaleX();
+- double devScaleX = desc.devTx.getScaleX();
+-
+- if (devScaleX == 0) {
+- glyphScaleX = Math.sqrt(desc.glyphTx.getDeterminant());
+- devScaleX = Math.sqrt(desc.devTx.getDeterminant());
+- }
+-
+- if (devScaleX == 0) {
+- devScaleX = Double.NaN; // this an undefined graphics state
+- }
+- advance = (float) (advance * glyphScaleX / devScaleX);
+- return useFractionalMetrics() ? advance : Math.round(advance);
++ @Override
++ float getCodePointAdvance(final int cp) {
++ return getGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
+ }
+
+- // calculate an advance, and round if not using fractional metrics
+- private float getScaledAdvanceForAdvance(float advance) {
+- if (invDevTx != null) {
+- advance *= invDevTx.getScaleX();
+- }
+- advance *= desc.glyphTx.getScaleX();
+- return useFractionalMetrics() ? advance : Math.round(advance);
++ @Override
++ Point2D.Float getCharMetrics(final char ch) {
++ return getGlyphMetrics(nativeFont.getMapper().charToGlyph(ch));
+ }
+
+- Point2D.Float getCharMetrics(char ch) {
+- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(ch)));
+- }
+-
+- Point2D.Float getGlyphMetrics(int glyphCode) {
+- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(glyphCode));
+- }
+-
+- // calculate an advance point, and round if not using fractional metrics
+- private Point2D.Float getScaledPointForAdvance(float advance) {
+- Point2D.Float pt = new Point2D.Float(advance, 0);
+-
+- if (!desc.glyphTx.isIdentity()) {
+- return scalePoint(pt);
+- }
+-
+- if (!useFractionalMetrics()) {
+- pt.x = Math.round(pt.x);
+- }
+- return pt;
+- }
+-
+- private Point2D.Float scalePoint(Point2D.Float pt) {
+- if (invDevTx != null) {
+- // transform the point out of the device space first
+- invDevTx.transform(pt, pt);
+- }
+- desc.glyphTx.transform(pt, pt);
+- pt.x -= desc.glyphTx.getTranslateX();
+- pt.y -= desc.glyphTx.getTranslateY();
+-
+- if (!useFractionalMetrics()) {
+- pt.x = Math.round(pt.x);
+- pt.y = Math.round(pt.y);
+- }
+-
+- return pt;
++ @Override
++ Point2D.Float getGlyphMetrics(final int glyphCode) {
++ return new Point2D.Float(getGlyphAdvance(glyphCode), 0.0f);
+ }
+
+ Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
+@@ -414,9 +362,7 @@
+ private SparseBitShiftingTwoLayerArray secondLayerCache;
+ private HashMap<Integer, Long> generalCache;
+
+- public GlyphInfoCache(final Font2D nativeFont,
+- final FontStrikeDesc desc)
+- {
++ GlyphInfoCache(final Font2D nativeFont, final FontStrikeDesc desc) {
+ super(nativeFont, desc);
+ firstLayerCache = new long[FIRST_LAYER_SIZE];
+ }
+@@ -527,7 +473,7 @@
+ final int shift;
+ final int secondLayerLength;
+
+- public SparseBitShiftingTwoLayerArray(final int size, final int shift) {
++ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
+ this.shift = shift;
+ this.cache = new long[1 << shift][];
+ this.secondLayerLength = size >> shift;
+@@ -559,6 +505,12 @@
+ private SparseBitShiftingTwoLayerArray secondLayerCache;
+ private HashMap<Integer, Float> generalCache;
+
++ // Empty non private constructor was added because access to this
++ // class shouldn't be emulated by a synthetic accessor method.
++ GlyphAdvanceCache() {
++ super();
++ }
++
+ public synchronized float get(final int index) {
+ if (index < 0) {
+ if (-index < SECOND_LAYER_SIZE) {
+@@ -609,9 +561,7 @@
+ final int shift;
+ final int secondLayerLength;
+
+- public SparseBitShiftingTwoLayerArray(final int size,
+- final int shift)
+- {
++ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
+ this.shift = shift;
+ this.cache = new float[1 << shift][];
+ this.secondLayerLength = size >> shift;
+--- ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -37,6 +37,7 @@
+
+ import sun.awt.*;
+ import sun.lwawt.macosx.*;
++import sun.misc.ThreadGroupUtils;
+ import sun.print.*;
+
+ public abstract class LWToolkit extends SunToolkit implements Runnable {
+@@ -66,22 +67,17 @@
+ protected final void init() {
+ AWTAutoShutdown.notifyToolkitThreadBusy();
+
+- ThreadGroup mainTG = AccessController.doPrivileged(
+- new PrivilegedAction<ThreadGroup>() {
+- public ThreadGroup run() {
+- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = currentTG.getParent();
+- while (parentTG != null) {
+- currentTG = parentTG;
+- parentTG = currentTG.getParent();
++ ThreadGroup rootTG = AccessController.doPrivileged(
++ new PrivilegedAction<ThreadGroup>() {
++ @Override
++ public ThreadGroup run() {
++ return ThreadGroupUtils.getRootThreadGroup();
+ }
+- return currentTG;
+- }
+- }
+- );
++ });
+
+ Runtime.getRuntime().addShutdownHook(
+- new Thread(mainTG, new Runnable() {
++ new Thread(rootTG, new Runnable() {
++ @Override
+ public void run() {
+ shutdown();
+ waitForRunState(STATE_CLEANUP);
+@@ -89,7 +85,7 @@
+ })
+ );
+
+- Thread toolkitThread = new Thread(mainTG, this, "AWT-LW");
++ Thread toolkitThread = new Thread(rootTG, this, "AWT-LW");
+ toolkitThread.setDaemon(true);
+ toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
+ toolkitThread.start();
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Tue Mar 18 12:35:25 2014 -0700
+@@ -53,7 +53,7 @@
+ }
+
+ protected void setContentsNative(Transferable contents) {
+-
++ FlavorTable flavorMap = getDefaultFlavorTable();
+ // Don't use delayed Clipboard rendering for the Transferable's data.
+ // If we did that, we would call Transferable.getTransferData on
+ // the Toolkit thread, which is a security hole.
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Tue Mar 18 12:35:25 2014 -0700
+@@ -620,8 +620,7 @@
+ retString[0] = new String(selectedText);
+ }}
+ }, fAwtFocussedComponent);
+- } catch (InterruptedException ie) { ie.printStackTrace(); }
+- catch (InvocationTargetException ite) { ite.printStackTrace(); }
++ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
+
+ synchronized(retString) { return retString[0]; }
+ }
+@@ -669,8 +668,7 @@
+
+ }}
+ }, fAwtFocussedComponent);
+- } catch (InterruptedException ie) { ie.printStackTrace(); }
+- catch (InvocationTargetException ite) { ite.printStackTrace(); }
++ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
+
+ synchronized(returnValue) { return returnValue; }
+ }
+@@ -695,8 +693,7 @@
+ returnValue[0] = fIMContext.getInsertPositionOffset();
+ }}
+ }, fAwtFocussedComponent);
+- } catch (InterruptedException ie) { ie.printStackTrace(); }
+- catch (InvocationTargetException ite) { ite.printStackTrace(); }
++ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
+
+ returnValue[1] = fCurrentTextLength;
+ synchronized(returnValue) { return returnValue; }
+@@ -743,8 +740,7 @@
+ }
+ }}
+ }, fAwtFocussedComponent);
+- } catch (InterruptedException ie) { ie.printStackTrace(); }
+- catch (InvocationTargetException ite) { ite.printStackTrace(); }
++ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
+
+ synchronized(rect) { return rect; }
+ }
+@@ -764,8 +760,7 @@
+ insertPositionOffset[0] = fIMContext.getInsertPositionOffset();
+ }}
+ }, fAwtFocussedComponent);
+- } catch (InterruptedException ie) { ie.printStackTrace(); }
+- catch (InvocationTargetException ite) { ite.printStackTrace(); }
++ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
+
+ // This bit of gymnastics ensures that the returned location is within the composed text.
+ // If it falls outside that region, the input method will commit the text, which is inconsistent with native
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Mar 18 12:35:25 2014 -0700
+@@ -918,7 +918,7 @@
+ //Posting an empty to flush the EventQueue without blocking the main thread
+ }
+ }, target);
+- } catch (InterruptedException | InvocationTargetException e) {
++ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ }
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Tue Mar 18 12:35:25 2014 -0700
+@@ -97,6 +97,6 @@
+ setVisible(true);
+ }
+ }, this);
+- } catch (InterruptedException | InvocationTargetException ex) {}
++ } catch (InvocationTargetException ex) {}
+ }
+ }
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Mar 18 12:35:25 2014 -0700
+@@ -414,8 +414,15 @@
+ }
+
+ // Intended to be called from the LWCToolkit.m only.
+- private static void installToolkitThreadNameInJava() {
++ private static void installToolkitThreadInJava() {
+ Thread.currentThread().setName(CThreading.APPKIT_THREAD_NAME);
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ Thread.currentThread().setContextClassLoader(null);
++ return null;
++ }
++ });
+ }
+
+ @Override
+@@ -518,22 +525,21 @@
+ // Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop
+ // The InvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop
+ // Does not dispatch native events while in the loop
+- public static void invokeAndWait(Runnable event, Component component) throws InterruptedException, InvocationTargetException {
++ public static void invokeAndWait(Runnable runnable, Component component) throws InvocationTargetException {
+ final long mediator = createAWTRunLoopMediator();
+
+- InvocationEvent invocationEvent =
+- new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event) {
+- @Override
+- public void dispatch() {
+- try {
+- super.dispatch();
+- } finally {
+- if (mediator != 0) {
+- stopAWTRunLoop(mediator);
++ InvocationEvent invocationEvent = AWTAccessor.getInvocationEventAccessor()
++ .createEvent(component != null ? component : Toolkit.getDefaultToolkit(),
++ runnable,
++ new Runnable() {
++ @Override
++ public void run() {
++ if (mediator != 0) {
++ stopAWTRunLoop(mediator);
++ }
+ }
+- }
+- }
+- };
++ },
++ true);
+
+ if (component != null) {
+ AppContext appContext = SunToolkit.targetToAppContext(component);
+--- ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Tue Mar 18 12:35:25 2014 -0700
+@@ -193,8 +193,8 @@
+
+ JNIEnv *env = [ThreadUtilities getJNIEnv];
+ static JNF_CLASS_CACHE(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
+- static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadNameInJava, jc_LWCToolkit, "installToolkitThreadNameInJava", "()V");
+- JNFCallStaticVoidMethod(env, jsm_installToolkitThreadNameInJava);
++ static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
++ JNFCallStaticVoidMethod(env, jsm_installToolkitThreadInJava);
+ });
+
+ gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
+--- ./jdk/src/macosx/native/sun/awt/awt.m Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/awt/awt.m Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -432,6 +432,16 @@
+ forceEmbeddedMode = YES;
+ }
+
++ JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
++ jclass jc_ThreadGroupUtils = (*env)->FindClass(env, "sun/misc/ThreadGroupUtils");
++ jmethodID sjm_getRootThreadGroup = (*env)->GetStaticMethodID(env, jc_ThreadGroupUtils, "getRootThreadGroup", "()Ljava/lang/ThreadGroup;");
++ jobject rootThreadGroup = (*env)->CallStaticObjectMethod(env, jc_ThreadGroupUtils, sjm_getRootThreadGroup);
++ [ThreadUtilities setAppkitThreadGroup:(*env)->NewGlobalRef(env, rootThreadGroup)];
++
++ // The current thread was attached in getJNIEnvUncached.
++ // Detach it back. It will be reattached later if needed with a proper TG
++ [ThreadUtilities detachCurrentThread];
++
+ BOOL headless = isHeadless(env);
+
+ // We need to let Foundation know that this is a multithreaded application, if it isn't already.
+--- ./jdk/src/macosx/native/sun/font/AWTStrike.h Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/font/AWTStrike.h Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -31,11 +31,12 @@
+ @interface AWTStrike : NSObject {
+ @public
+ AWTFont * fAWTFont;
+- CGFloat fSize;
++ CGFloat fSize;
+ JRSFontRenderingStyle fStyle;
+- jint fAAStyle;
++ jint fAAStyle;
+
+ CGAffineTransform fTx;
++ CGAffineTransform fDevTx;
+ CGAffineTransform fAltTx; // alternate strike tx used for Sun2D
+ CGAffineTransform fFontTx;
+ }
+--- ./jdk/src/macosx/native/sun/font/AWTStrike.m Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/font/AWTStrike.m Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -60,6 +60,7 @@
+ invDevTx.b *= -1;
+ invDevTx.c *= -1;
+ fFontTx = CGAffineTransformConcat(CGAffineTransformConcat(tx, invDevTx), sInverseTX);
++ fDevTx = CGAffineTransformInvert(invDevTx);
+
+ // the "font size" is the square root of the determinant of the matrix
+ fSize = sqrt(abs(fFontTx.a * fFontTx.d - fFontTx.b * fFontTx.c));
+@@ -143,7 +144,8 @@
+ {
+ CGSize advance;
+ JNF_COCOA_ENTER(env);
+- AWTFont *awtFont = ((AWTStrike *)jlong_to_ptr(awtStrikePtr))->fAWTFont;
++ AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
++ AWTFont *awtFont = awtStrike->fAWTFont;
+
+ // negative glyph codes are really unicodes, which were placed there by the mapper
+ // to indicate we should use CoreText to substitute the character
+@@ -151,6 +153,10 @@
+ const CTFontRef fallback = CTS_CopyCTFallbackFontAndGlyphForJavaGlyphCode(awtFont, glyphCode, &glyph);
+ CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
+ CFRelease(fallback);
++ advance = CGSizeApplyAffineTransform(advance, awtStrike->fFontTx);
++ if (!JRSFontStyleUsesFractionalMetrics(awtStrike->fStyle)) {
++ advance.width = round(advance.width);
++ }
+
+ JNF_COCOA_EXIT(env);
+ return advance.width;
+--- ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -455,6 +455,7 @@
+ #define CGGI_GLYPH_BBOX_PADDING 2.0f
+ static inline GlyphInfo *
+ CGGI_CreateNewGlyphInfoFrom(CGSize advance, CGRect bbox,
++ const AWTStrike *strike,
+ const CGGI_RenderingMode *mode)
+ {
+ size_t pixelSize = mode->glyphDescriptor->pixelSize;
+@@ -477,6 +478,12 @@
+ width = 1;
+ height = 1;
+ }
++ advance = CGSizeApplyAffineTransform(advance, strike->fFontTx);
++ if (!JRSFontStyleUsesFractionalMetrics(strike->fStyle)) {
++ advance.width = round(advance.width);
++ advance.height = round(advance.height);
++ }
++ advance = CGSizeApplyAffineTransform(advance, strike->fDevTx);
+
+ #ifdef USE_IMAGE_ALIGNED_MEMORY
+ // create separate memory
+@@ -564,10 +571,10 @@
+ JRSFontGetBoundingBoxesForGlyphsAndStyle(fallback, &tx, style, &glyph, 1, &bbox);
+
+ CGSize advance;
+- JRSFontGetAdvancesForGlyphsAndStyle(fallback, &tx, strike->fStyle, &glyph, 1, &advance);
++ CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
+
+ // create the Sun2D GlyphInfo we are going to strike into
+- GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
++ GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
+
+ // fix the context size, just in case the substituted character is unexpectedly large
+ CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode);
+@@ -715,7 +722,7 @@
+ JRSFontRenderingStyle bboxCGMode = JRSFontAlignStyleForFractionalMeasurement(strike->fStyle);
+
+ JRSFontGetBoundingBoxesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, bboxCGMode, glyphs, len, bboxes);
+- JRSFontGetAdvancesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, strike->fStyle, glyphs, len, advances);
++ CTFontGetAdvancesForGlyphs((CTFontRef)font->fFont, kCTFontDefaultOrientation, glyphs, advances, len);
+
+ size_t maxWidth = 1;
+ size_t maxHeight = 1;
+@@ -732,7 +739,7 @@
+ CGSize advance = advances[i];
+ CGRect bbox = bboxes[i];
+
+- GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
++ GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
+
+ if (maxWidth < glyphInfo->width) maxWidth = glyphInfo->width;
+ if (maxHeight < glyphInfo->height) maxHeight = glyphInfo->height;
+--- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -127,6 +127,8 @@
+
+ + (JNIEnv*)getJNIEnv;
+ + (JNIEnv*)getJNIEnvUncached;
+++ (void)detachCurrentThread;
+++ (void)setAppkitThreadGroup:(jobject)group;
+
+ //Wrappers for the corresponding JNFRunLoop methods with a check for main thread
+ + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
+--- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -33,23 +33,44 @@
+ // The following must be named "jvm", as there are extern references to it in AWT
+ JavaVM *jvm = NULL;
+ static JNIEnv *appKitEnv = NULL;
++static jobject appkitThreadGroup = NULL;
++
++inline void attachCurrentThread(void** env) {
++ if ([NSThread isMainThread]) {
++ JavaVMAttachArgs args;
++ args.version = JNI_VERSION_1_4;
++ args.name = "AppKit Thread";
++ args.group = appkitThreadGroup;
++ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, &args);
++ } else {
++ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, NULL);
++ }
++}
+
+ @implementation ThreadUtilities
+
+ + (JNIEnv*)getJNIEnv {
+ AWT_ASSERT_APPKIT_THREAD;
+ if (appKitEnv == NULL) {
+- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&appKitEnv, NULL);
++ attachCurrentThread((void **)&appKitEnv);
+ }
+ return appKitEnv;
+ }
+
+ + (JNIEnv*)getJNIEnvUncached {
+ JNIEnv *env = NULL;
+- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&env, nil);
++ attachCurrentThread((void **)&env);
+ return env;
+ }
+
+++ (void)detachCurrentThread {
++ (*jvm)->DetachCurrentThread(jvm);
++}
++
+++ (void)setAppkitThreadGroup:(jobject)group {
++ appkitThreadGroup = group;
++}
++
+ + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
+ if ([NSThread isMainThread] && wait == YES) {
+ block();
+--- ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Tue Mar 18 12:35:25 2014 -0700
+@@ -35,6 +35,8 @@
+ import javax.management.remote.SubjectDelegationPermission;
+
+ import com.sun.jmx.remote.util.CacheMap;
++import java.util.ArrayList;
++import java.util.Collection;
+
+ public class SubjectDelegator {
+ private static final int PRINCIPALS_CACHE_SIZE = 10;
+@@ -53,11 +55,14 @@
+ boolean removeCallerContext)
+ throws SecurityException {
+
++ if (System.getSecurityManager() != null && authenticatedACC == null) {
++ throw new SecurityException("Illegal AccessControlContext: null");
++ }
+ if (principalsCache == null || accCache == null) {
+ principalsCache =
+- new CacheMap<Subject, Principal[]>(PRINCIPALS_CACHE_SIZE);
++ new CacheMap<>(PRINCIPALS_CACHE_SIZE);
+ accCache =
+- new CacheMap<Subject, AccessControlContext>(ACC_CACHE_SIZE);
++ new CacheMap<>(ACC_CACHE_SIZE);
+ }
+
+ // Retrieve the principals for the given
+@@ -101,14 +106,15 @@
+ // principal in the delegated subject
+ //
+ final Principal[] dp = delegatedPrincipals;
++ final Collection<Permission> permissions = new ArrayList<>(dp.length);
++ for(Principal p : dp) {
++ final String pname = p.getClass().getName() + "." + p.getName();
++ permissions.add(new SubjectDelegationPermission(pname));
++ }
+ PrivilegedAction<Void> action =
+ new PrivilegedAction<Void>() {
+ public Void run() {
+- for (int i = 0 ; i < dp.length ; i++) {
+- final String pname =
+- dp[i].getClass().getName() + "." + dp[i].getName();
+- Permission sdp =
+- new SubjectDelegationPermission(pname);
++ for (Permission sdp : permissions) {
+ AccessController.checkPermission(sdp);
+ }
+ return null;
+--- ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -30,13 +30,14 @@
+ import java.net.DatagramPacket;
+ import java.net.InetAddress;
+ import java.net.Socket;
++import java.security.SecureRandom;
+ import javax.naming.*;
+
+ import java.util.Collections;
+ import java.util.Map;
+ import java.util.HashMap;
+-import java.util.Set;
+-import java.util.HashSet;
++
++import sun.security.jca.JCAUtil;
+
+ // Some of this code began life as part of sun.javaos.net.DnsClient
+ // originally by sritchie@eng 1/96. It was first hacked up for JNDI
+@@ -77,6 +78,8 @@
+ };
+
+ private static final int DEFAULT_PORT = 53;
++ private static final int TRANSACTION_ID_BOUND = 0x10000;
++ private static final SecureRandom random = JCAUtil.getSecureRandom();
+ private InetAddress[] servers;
+ private int[] serverPorts;
+ private int timeout; // initial timeout on UDP queries in ms
+@@ -85,7 +88,7 @@
+ private DatagramSocket udpSocket;
+
+ // Requests sent
+- private Set<Integer> reqs;
++ private Map<Integer, ResourceRecord> reqs;
+
+ // Responses received
+ private Map<Integer, byte[]> resps;
+@@ -134,7 +137,8 @@
+ throw ne;
+ }
+ }
+- reqs = Collections.synchronizedSet(new HashSet<Integer>());
++ reqs = Collections.synchronizedMap(
++ new HashMap<Integer, ResourceRecord>());
+ resps = Collections.synchronizedMap(new HashMap<Integer, byte[]>());
+ }
+
+@@ -153,10 +157,6 @@
+ }
+ }
+
+-
+- private int ident = 0; // used to set the msg ID field
+- private Object identLock = new Object();
+-
+ /*
+ * If recursion is true, recursion is requested on the query.
+ * If auth is true, only authoritative responses are accepted; other
+@@ -167,15 +167,22 @@
+ throws NamingException {
+
+ int xid;
+- synchronized (identLock) {
+- ident = 0xFFFF & (ident + 1);
+- xid = ident;
+- }
++ Packet pkt;
++ ResourceRecord collision;
+
+- // enqueue the outstanding request
+- reqs.add(xid);
++ do {
++ // Generate a random transaction ID
++ xid = random.nextInt(TRANSACTION_ID_BOUND);
++ pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
+
+- Packet pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
++ // enqueue the outstanding request
++ synchronized (reqs) {
++ if ((collision = reqs.put(xid, new ResourceRecord(pkt.getData(),
++ pkt.length(), Header.HEADER_SIZE, true, false))) != null) {
++ reqs.put(xid, collision); // revert
++ }
++ }
++ } while (collision != null);
+
+ Exception caughtException = null;
+ boolean[] doNotRetry = new boolean[servers.length];
+@@ -305,11 +312,8 @@
+ ResourceRecords queryZone(DnsName zone, int qclass, boolean recursion)
+ throws NamingException {
+
+- int xid;
+- synchronized (identLock) {
+- ident = 0xFFFF & (ident + 1);
+- xid = ident;
+- }
++ int xid = random.nextInt(TRANSACTION_ID_BOUND);
++
+ Packet pkt = makeQueryPacket(zone, xid, qclass,
+ ResourceRecord.QTYPE_AXFR, recursion);
+ Exception caughtException = null;
+@@ -390,6 +394,7 @@
+ DatagramPacket opkt = new DatagramPacket(
+ pkt.getData(), pkt.length(), server, port);
+ DatagramPacket ipkt = new DatagramPacket(new byte[8000], 8000);
++ // Packets may only be sent to or received from this server address
+ udpSocket.connect(server, port);
+ int pktTimeout = (timeout * (1 << retry));
+ try {
+@@ -524,7 +529,7 @@
+ "\tResponse Q:" + resps);
+ }
+ byte[] pkt;
+- if ((pkt = (byte[]) resps.get(xid)) != null) {
++ if ((pkt = resps.get(xid)) != null) {
+ checkResponseCode(new Header(pkt, pkt.length));
+ synchronized (queuesLock) {
+ resps.remove(xid);
+@@ -543,6 +548,9 @@
+ * Checks the header of an incoming DNS response.
+ * Returns true if it matches the given xid and throws a naming
+ * exception, if appropriate, based on the response code.
++ *
++ * Also checks that the domain name, type and class in the response
++ * match those in the original query.
+ */
+ private boolean isMatchResponse(byte[] pkt, int xid)
+ throws NamingException {
+@@ -552,7 +560,7 @@
+ throw new CommunicationException("DNS error: expecting response");
+ }
+
+- if (!reqs.contains(xid)) { // already received, ignore the response
++ if (!reqs.containsKey(xid)) { // already received, ignore the response
+ return false;
+ }
+
+@@ -561,14 +569,47 @@
+ if (debug) {
+ dprint("XID MATCH:" + xid);
+ }
++ checkResponseCode(hdr);
++ if (!hdr.query && hdr.numQuestions == 1) {
+
+- checkResponseCode(hdr);
+- // remove the response for the xid if received by some other thread.
+- synchronized (queuesLock) {
+- resps.remove(xid);
+- reqs.remove(xid);
++ ResourceRecord rr = new ResourceRecord(pkt, pkt.length,
++ Header.HEADER_SIZE, true, false);
++
++ // Retrieve the original query
++ ResourceRecord query = reqs.get(xid);
++ int qtype = query.getType();
++ int qclass = query.getRrclass();
++ DnsName qname = query.getName();
++
++ // Check that the type/class/name in the query section of the
++ // response match those in the original query
++ if ((qtype == ResourceRecord.QTYPE_STAR ||
++ qtype == rr.getType()) &&
++ (qclass == ResourceRecord.QCLASS_STAR ||
++ qclass == rr.getRrclass()) &&
++ qname.equals(rr.getName())) {
++
++ if (debug) {
++ dprint("MATCH NAME:" + qname + " QTYPE:" + qtype +
++ " QCLASS:" + qclass);
++ }
++
++ // Remove the response for the xid if received by some other
++ // thread.
++ synchronized (queuesLock) {
++ resps.remove(xid);
++ reqs.remove(xid);
++ }
++ return true;
++
++ } else {
++ if (debug) {
++ dprint("NO-MATCH NAME:" + qname + " QTYPE:" + qtype +
++ " QCLASS:" + qclass);
++ }
++ }
+ }
+- return true;
++ return false;
+ }
+
+ //
+@@ -577,7 +618,7 @@
+ // enqueue only the first response, responses for retries are ignored.
+ //
+ synchronized (queuesLock) {
+- if (reqs.contains(hdr.xid)) { // enqueue only the first response
++ if (reqs.containsKey(hdr.xid)) { // enqueue only the first response
+ resps.put(hdr.xid, pkt);
+ }
+ }
+--- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,6 +25,10 @@
+
+ package com.sun.jndi.ldap;
+
++import java.security.AccessControlContext;
++import java.security.AccessController;
++import java.security.PrivilegedActionException;
++import java.security.PrivilegedExceptionAction;
+ import java.util.Vector;
+ import javax.naming.*;
+ import javax.naming.directory.*;
+@@ -34,6 +38,8 @@
+
+ final class LdapBindingEnumeration extends LdapNamingEnumeration {
+
++ private final AccessControlContext acc = AccessController.getContext();
++
+ LdapBindingEnumeration(LdapCtx homeCtx, LdapResult answer, Name remain,
+ Continuation cont) throws NamingException
+ {
+@@ -41,7 +47,7 @@
+ }
+
+ protected NameClassPair
+- createItem(String dn, Attributes attrs, Vector respCtls)
++ createItem(String dn, final Attributes attrs, Vector respCtls)
+ throws NamingException {
+
+ Object obj = null;
+@@ -49,7 +55,16 @@
+
+ if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
+ // serialized object or object reference
+- obj = Obj.decodeObject(attrs);
++ try {
++ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
++ @Override
++ public Object run() throws NamingException {
++ return Obj.decodeObject(attrs);
++ }
++ }, acc);
++ } catch (PrivilegedActionException e) {
++ throw (NamingException)e.getException();
++ }
+ }
+ if (obj == null) {
+ // DirContext object
+--- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,6 +25,10 @@
+
+ package com.sun.jndi.ldap;
+
++import java.security.AccessControlContext;
++import java.security.AccessController;
++import java.security.PrivilegedActionException;
++import java.security.PrivilegedExceptionAction;
+ import java.util.Vector;
+ import javax.naming.*;
+ import javax.naming.directory.*;
+@@ -39,6 +43,8 @@
+ private Name startName; // prefix of names of search results
+ private LdapCtx.SearchArgs searchArgs = null;
+
++ private final AccessControlContext acc = AccessController.getContext();
++
+ LdapSearchEnumeration(LdapCtx homeCtx, LdapResult search_results,
+ String starter, LdapCtx.SearchArgs args, Continuation cont)
+ throws NamingException {
+@@ -53,7 +59,7 @@
+ }
+
+ protected NameClassPair
+- createItem(String dn, Attributes attrs, Vector respCtls)
++ createItem(String dn, final Attributes attrs, Vector respCtls)
+ throws NamingException {
+
+ Object obj = null;
+@@ -110,8 +116,16 @@
+ if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
+ // Entry contains Java-object attributes (ser/ref object)
+ // serialized object or object reference
+- obj = Obj.decodeObject(attrs);
+-
++ try {
++ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
++ @Override
++ public Object run() throws NamingException {
++ return Obj.decodeObject(attrs);
++ }
++ }, acc);
++ } catch (PrivilegedActionException e) {
++ throw (NamingException)e.getException();
++ }
+ }
+ if (obj == null) {
+ obj = new LdapCtx(homeCtx, dn);
+--- ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Tue Mar 18 12:35:25 2014 -0700
+@@ -25,27 +25,33 @@
+
+ package com.sun.media.sound;
+
++import java.util.ArrayList;
+ import java.util.Collections;
+-import java.util.HashMap;
+ import java.util.List;
+-import java.util.Map;
+ import java.util.Properties;
+
+ import javax.sound.midi.Receiver;
+ import javax.sound.midi.Sequencer;
+ import javax.sound.midi.Synthesizer;
+ import javax.sound.midi.Transmitter;
++import javax.sound.midi.spi.MidiDeviceProvider;
++import javax.sound.midi.spi.MidiFileReader;
++import javax.sound.midi.spi.MidiFileWriter;
++import javax.sound.midi.spi.SoundbankReader;
+ import javax.sound.sampled.Clip;
+ import javax.sound.sampled.Port;
+ import javax.sound.sampled.SourceDataLine;
+ import javax.sound.sampled.TargetDataLine;
++import javax.sound.sampled.spi.AudioFileReader;
++import javax.sound.sampled.spi.AudioFileWriter;
++import javax.sound.sampled.spi.FormatConversionProvider;
++import javax.sound.sampled.spi.MixerProvider;
+
+
+ /**
+- * JDK13Services uses the Service class in JDK 1.3
+- * to discover a list of service providers installed
+- * in the system.
+- *
++ * JDK13Services uses the Service class in JDK 1.3 to discover a list of service
++ * providers installed in the system.
++ * <p>
+ * This class is public because it is called from javax.sound.midi.MidiSystem
+ * and javax.sound.sampled.AudioSystem. The alternative would be to make
+ * JSSecurityManager public, which is considered worse.
+@@ -54,80 +60,55 @@
+ */
+ public final class JDK13Services {
+
+- /** The default for the length of the period to hold the cache.
+- This value is given in milliseconds. It is equivalent to
+- 1 minute.
+- */
+- private static final long DEFAULT_CACHING_PERIOD = 60000;
+-
+- /** Filename of the properties file for default provider properties.
+- This file is searched in the subdirectory "lib" of the JRE directory
+- (this behaviour is hardcoded).
+- */
++ /**
++ * Filename of the properties file for default provider properties. This
++ * file is searched in the subdirectory "lib" of the JRE directory (this
++ * behaviour is hardcoded).
++ */
+ private static final String PROPERTIES_FILENAME = "sound.properties";
+
+- /** Cache for the providers.
+- Class objects of the provider type (MixerProvider, MidiDeviceProvider
+- ...) are used as keys. The values are instances of ProviderCache.
+- */
+- private static final Map providersCacheMap = new HashMap();
+-
+-
+- /** The length of the period to hold the cache.
+- This value is given in milliseconds.
+- */
+- private static long cachingPeriod = DEFAULT_CACHING_PERIOD;
+-
+- /** Properties loaded from the properties file for default provider
+- properties.
+- */
++ /**
++ * Properties loaded from the properties file for default provider
++ * properties.
++ */
+ private static Properties properties;
+
+-
+- /** Private, no-args constructor to ensure against instantiation.
++ /**
++ * Private, no-args constructor to ensure against instantiation.
+ */
+ private JDK13Services() {
+ }
+
+-
+- /** Set the period provider lists are cached.
+- This method is only intended for testing.
++ /**
++ * Obtains a List containing installed instances of the providers for the
++ * requested service. The returned List is immutable.
++ *
++ * @param serviceClass The type of providers requested. This should be one
++ * of AudioFileReader.class, AudioFileWriter.class,
++ * FormatConversionProvider.class, MixerProvider.class,
++ * MidiDeviceProvider.class, MidiFileReader.class,
++ * MidiFileWriter.class or SoundbankReader.class.
++ *
++ * @return A List of providers of the requested type. This List is
++ * immutable.
+ */
+- public static void setCachingPeriod(int seconds) {
+- cachingPeriod = seconds * 1000L;
++ public static List<?> getProviders(final Class<?> serviceClass) {
++ final List<?> providers;
++ if (!MixerProvider.class.equals(serviceClass)
++ && !FormatConversionProvider.class.equals(serviceClass)
++ && !AudioFileReader.class.equals(serviceClass)
++ && !AudioFileWriter.class.equals(serviceClass)
++ && !MidiDeviceProvider.class.equals(serviceClass)
++ && !SoundbankReader.class.equals(serviceClass)
++ && !MidiFileWriter.class.equals(serviceClass)
++ && !MidiFileReader.class.equals(serviceClass)) {
++ providers = new ArrayList<>(0);
++ } else {
++ providers = JSSecurityManager.getProviders(serviceClass);
++ }
++ return Collections.unmodifiableList(providers);
+ }
+
+-
+- /** Obtains a List containing installed instances of the
+- providers for the requested service.
+- The List of providers is cached for the period of time given by
+- {@link #cachingPeriod cachingPeriod}. During this period, the same
+- List instance is returned for the same type of provider. After this
+- period, a new instance is constructed and returned. The returned
+- List is immutable.
+- @param serviceClass The type of providers requested. This should be one
+- of AudioFileReader.class, AudioFileWriter.class,
+- FormatConversionProvider.class, MixerProvider.class,
+- MidiDeviceProvider.class, MidiFileReader.class, MidiFileWriter.class or
+- SoundbankReader.class.
+- @return A List of providers of the requested type. This List is
+- immutable.
+- */
+- public static synchronized List getProviders(Class serviceClass) {
+- ProviderCache cache = (ProviderCache) providersCacheMap.get(serviceClass);
+- if (cache == null) {
+- cache = new ProviderCache();
+- providersCacheMap.put(serviceClass, cache);
+- }
+- if (cache.providers == null ||
+- System.currentTimeMillis() > cache.lastUpdate + cachingPeriod) {
+- cache.providers = Collections.unmodifiableList(JSSecurityManager.getProviders(serviceClass));
+- cache.lastUpdate = System.currentTimeMillis();
+- }
+- return cache.providers;
+- }
+-
+-
+ /** Obtain the provider class name part of a default provider property.
+ @param typeClass The type of the default provider property. This
+ should be one of Receiver.class, Transmitter.class, Sequencer.class,
+@@ -219,14 +200,4 @@
+ }
+ return properties;
+ }
+-
+- // INNER CLASSES
+-
+- private static class ProviderCache {
+- // System time of the last update in milliseconds.
+- public long lastUpdate;
+-
+- // The providers.
+- public List providers;
+- }
+ }
+--- ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -187,7 +187,7 @@
+ return thread;
+ }
+
+- static List getProviders(final Class providerClass) {
++ static synchronized List getProviders(final Class providerClass) {
+ List p = new ArrayList();
+ // Service.providers(Class) just creates "lazy" iterator instance,
+ // so it doesn't require do be called from privileged section
+--- ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -69,6 +69,14 @@
+ private static final String JRELIB_PROPERTY_FILE_NAME = "jndi.properties";
+
+ /*
++ * Internal environment property, that when set to "true", disables
++ * application resource files lookup to prevent recursion issues
++ * when validating signed JARs.
++ */
++ private static final String DISABLE_APP_RESOURCE_FILES =
++ "com.sun.naming.disable.app.resource.files";
++
++ /*
+ * The standard JNDI properties that specify colon-separated lists.
+ */
+ private static final String[] listProperties = {
+@@ -218,6 +226,13 @@
+ }
+ }
+
++ // Return without merging if application resource files lookup
++ // is disabled.
++ String disableAppRes = (String)env.get(DISABLE_APP_RESOURCE_FILES);
++ if (disableAppRes != null && disableAppRes.equalsIgnoreCase("true")) {
++ return env;
++ }
++
+ // Merge the above with the values read from all application
+ // resource files. Colon-separated lists are concatenated.
+ mergeTables(env, getApplicationResources());
+--- ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -37,6 +37,7 @@
+ import javax.sql.rowset.serial.*;
+ import com.sun.rowset.internal.*;
+ import com.sun.rowset.providers.*;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * The standard implementation of the <code>CachedRowSet</code> interface.
+@@ -2963,13 +2964,9 @@
+ // create new instance of the class
+ SQLData obj = null;
+ try {
+- obj = (SQLData)c.newInstance();
+- } catch (java.lang.InstantiationException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
+- } catch (java.lang.IllegalAccessException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
++ obj = (SQLData) ReflectUtil.newInstance(c);
++ } catch(Exception ex) {
++ throw new SQLException("Unable to Instantiate: ", ex);
+ }
+ // get the attributes from the struct
+ Object attribs[] = s.getAttributes(map);
+@@ -5714,13 +5711,9 @@
+ // create new instance of the class
+ SQLData obj = null;
+ try {
+- obj = (SQLData)c.newInstance();
+- } catch (java.lang.InstantiationException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
+- } catch (java.lang.IllegalAccessException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
++ obj = (SQLData) ReflectUtil.newInstance(c);
++ } catch(Exception ex) {
++ throw new SQLException("Unable to Instantiate: ", ex);
+ }
+ // get the attributes from the struct
+ Object attribs[] = s.getAttributes(map);
+--- ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -39,6 +39,7 @@
+ import javax.sql.rowset.serial.SerialClob;
+ import javax.sql.rowset.serial.SerialStruct;
+ import javax.sql.rowset.spi.*;
++import sun.reflect.misc.ReflectUtil;
+
+
+ /**
+@@ -578,13 +579,9 @@
+ // create new instance of the class
+ SQLData obj = null;
+ try {
+- obj = (SQLData)c.newInstance();
+- } catch (java.lang.InstantiationException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
+- } catch (java.lang.IllegalAccessException ex) {
+- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
+- ex.getMessage()));
++ obj = (SQLData)ReflectUtil.newInstance(c);
++ } catch (Exception ex) {
++ throw new SQLException("Unable to Instantiate: ", ex);
+ }
+ // get the attributes from the struct
+ Object attribs[] = s.getAttributes(map);
+--- ./jdk/src/share/classes/java/awt/EventQueue.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/awt/EventQueue.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -1043,11 +1043,11 @@
+ t.setContextClassLoader(classLoader);
+ t.setPriority(Thread.NORM_PRIORITY + 1);
+ t.setDaemon(false);
++ AWTAutoShutdown.getInstance().notifyThreadBusy(t);
+ return t;
+ }
+ }
+ );
+- AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
+ dispatchThread.start();
+ }
+ } finally {
+@@ -1139,6 +1139,10 @@
+ if (entry.event instanceof SentEvent) {
+ ((SentEvent)entry.event).dispose();
+ }
++ if (entry.event instanceof InvocationEvent) {
++ AWTAccessor.getInvocationEventAccessor()
++ .dispose((InvocationEvent)entry.event);
++ }
+ if (prev == null) {
+ queues[i].head = entry.next;
+ } else {
+--- ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Tue Mar 18 12:35:25 2014 -0700
+@@ -45,8 +45,8 @@
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+-import java.util.WeakHashMap;
+
++import sun.awt.AppContext;
+ import sun.awt.datatransfer.DataTransferer;
+
+ /**
+@@ -72,10 +72,7 @@
+ */
+ private static String JavaMIME = "JAVA_DATAFLAVOR:";
+
+- /**
+- * System singleton which maps a thread's ClassLoader to a SystemFlavorMap.
+- */
+- private static final WeakHashMap flavorMaps = new WeakHashMap();
++ private static final Object FLAVOR_MAP_KEY = new Object();
+
+ /**
+ * Copied from java.util.Properties.
+@@ -184,22 +181,12 @@
+ * Returns the default FlavorMap for this thread's ClassLoader.
+ */
+ public static FlavorMap getDefaultFlavorMap() {
+- ClassLoader contextClassLoader =
+- Thread.currentThread().getContextClassLoader();
+- if (contextClassLoader == null) {
+- contextClassLoader = ClassLoader.getSystemClassLoader();
++ AppContext context = AppContext.getAppContext();
++ FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY);
++ if (fm == null) {
++ fm = new SystemFlavorMap();
++ context.put(FLAVOR_MAP_KEY, fm);
+ }
+-
+- FlavorMap fm;
+-
+- synchronized(flavorMaps) {
+- fm = (FlavorMap)flavorMaps.get(contextClassLoader);
+- if (fm == null) {
+- fm = new SystemFlavorMap();
+- flavorMaps.put(contextClassLoader, fm);
+- }
+- }
+-
+ return fm;
+ }
+
+@@ -240,26 +227,11 @@
+ }
+ });
+
+- BufferedReader flavormapURL =
++ String url =
+ java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction<BufferedReader>() {
+- public BufferedReader run() {
+- String url = Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
+-
+- if (url == null) {
+- return null;
+- }
+-
+- try {
+- return new BufferedReader
+- (new InputStreamReader
+- (new URL(url).openStream(), "ISO-8859-1"));
+- } catch (MalformedURLException e) {
+- System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
+- } catch (IOException e) {
+- System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
+- }
+- return null;
++ new java.security.PrivilegedAction<String>() {
++ public String run() {
++ return Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
+ }
+ });
+
+@@ -271,6 +243,19 @@
+ }
+ }
+
++ BufferedReader flavormapURL = null;
++ if (url != null) {
++ try {
++ flavormapURL = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "ISO-8859-1"));
++ } catch (MalformedURLException e) {
++ System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
++ } catch (IOException e) {
++ System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
++ } catch (SecurityException e) {
++ // ignored
++ }
++ }
++
+ if (flavormapURL != null) {
+ try {
+ parseAndStoreReader(flavormapURL);
+--- ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Tue Mar 18 12:35:25 2014 -0700
+@@ -25,6 +25,8 @@
+
+ package java.awt.event;
+
++import sun.awt.AWTAccessor;
++
+ import java.awt.ActiveEvent;
+ import java.awt.AWTEvent;
+
+@@ -56,6 +58,20 @@
+ */
+ public class InvocationEvent extends AWTEvent implements ActiveEvent {
+
++ static {
++ AWTAccessor.setInvocationEventAccessor(new AWTAccessor.InvocationEventAccessor() {
++ @Override
++ public void dispose(InvocationEvent invocationEvent) {
++ invocationEvent.finishedDispatching(false);
++ }
++ @Override
++ public InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
++ boolean catchThrowables) {
++ return new InvocationEvent(source, runnable, listener, catchThrowables);
++ }
++ });
++ }
++
+ /**
+ * Marks the first integer id for the range of invocation event ids.
+ */
+@@ -85,6 +101,14 @@
+ protected Object notifier;
+
+ /**
++ * The (potentially null) Runnable whose run() method will be called
++ * immediately after the event was dispatched or disposed.
++ *
++ * @see #isDispatched
++ */
++ private final Runnable listener;
++
++ /**
+ * Indicates whether the <code>run()</code> method of the <code>runnable</code>
+ * was executed or not.
+ *
+@@ -147,7 +171,7 @@
+ * @see #InvocationEvent(Object, Runnable, Object, boolean)
+ */
+ public InvocationEvent(Object source, Runnable runnable) {
+- this(source, runnable, null, false);
++ this(source, INVOCATION_DEFAULT, runnable, null, null, false);
+ }
+
+ /**
+@@ -185,7 +209,39 @@
+ */
+ public InvocationEvent(Object source, Runnable runnable, Object notifier,
+ boolean catchThrowables) {
+- this(source, INVOCATION_DEFAULT, runnable, notifier, catchThrowables);
++ this(source, INVOCATION_DEFAULT, runnable, notifier, null, catchThrowables);
++ }
++
++ /**
++ * Constructs an <code>InvocationEvent</code> with the specified
++ * source which will execute the runnable's <code>run</code>
++ * method when dispatched. If listener is non-<code>null</code>,
++ * <code>listener.run()</code> will be called immediately after
++ * <code>run</code> has returned, thrown an exception or the event
++ * was disposed.
++ * <p>This method throws an <code>IllegalArgumentException</code>
++ * if <code>source</code> is <code>null</code>.
++ *
++ * @param source The <code>Object</code> that originated
++ * the event
++ * @param runnable The <code>Runnable</code> whose
++ * <code>run</code> method will be
++ * executed
++ * @param listener The <code>Runnable</code>Runnable whose
++ * <code>run()</code> method will be called
++ * after the {@code InvocationEvent}
++ * was dispatched or disposed
++ * @param catchThrowables Specifies whether <code>dispatch</code>
++ * should catch Throwable when executing
++ * the <code>Runnable</code>'s <code>run</code>
++ * method, or should instead propagate those
++ * Throwables to the EventDispatchThread's
++ * dispatch loop
++ * @throws IllegalArgumentException if <code>source</code> is null
++ */
++ private InvocationEvent(Object source, Runnable runnable, Runnable listener,
++ boolean catchThrowables) {
++ this(source, INVOCATION_DEFAULT, runnable, null, listener, catchThrowables);
+ }
+
+ /**
+@@ -221,13 +277,18 @@
+ */
+ protected InvocationEvent(Object source, int id, Runnable runnable,
+ Object notifier, boolean catchThrowables) {
++ this(source, id, runnable, notifier, null, catchThrowables);
++ }
++
++ private InvocationEvent(Object source, int id, Runnable runnable,
++ Object notifier, Runnable listener, boolean catchThrowables) {
+ super(source, id);
+ this.runnable = runnable;
+ this.notifier = notifier;
++ this.listener = listener;
+ this.catchExceptions = catchThrowables;
+ this.when = System.currentTimeMillis();
+ }
+-
+ /**
+ * Executes the Runnable's <code>run()</code> method and notifies the
+ * notifier (if any) when <code>run()</code> has returned or thrown an exception.
+@@ -251,13 +312,7 @@
+ runnable.run();
+ }
+ } finally {
+- dispatched = true;
+-
+- if (notifier != null) {
+- synchronized (notifier) {
+- notifier.notifyAll();
+- }
+- }
++ finishedDispatching(true);
+ }
+ }
+
+@@ -331,6 +386,25 @@
+ }
+
+ /**
++ * Called when the event was dispatched or disposed
++ * @param dispatched true if the event was dispatched
++ * false if the event was disposed
++ */
++ private void finishedDispatching(boolean dispatched) {
++ this.dispatched = dispatched;
++
++ if (notifier != null) {
++ synchronized (notifier) {
++ notifier.notifyAll();
++ }
++ }
++
++ if (listener != null) {
++ listener.run();
++ }
++ }
++
++ /**
+ * Returns a parameter string identifying this event.
+ * This method is useful for event-logging and for debugging.
+ *
+--- ./jdk/src/share/classes/java/lang/Thread.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/lang/Thread.java Tue Mar 18 12:35:25 2014 -0700
+@@ -366,6 +366,8 @@
+ throw new NullPointerException("name cannot be null");
+ }
+
++ this.name = name.toCharArray();
++
+ Thread parent = currentThread();
+ SecurityManager security = System.getSecurityManager();
+ if (g == null) {
+@@ -402,7 +404,6 @@
+ this.group = g;
+ this.daemon = parent.isDaemon();
+ this.priority = parent.getPriority();
+- this.name = name.toCharArray();
+ if (security == null || isCCLOverridden(parent.getClass()))
+ this.contextClassLoader = parent.getContextClassLoader();
+ else
+--- ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Tue Mar 18 12:35:25 2014 -0700
+@@ -140,7 +140,7 @@
+ * Return the {@link SpeciesData} instance representing this BMH species. All subclasses must provide a
+ * static field containing this value, and they must accordingly implement this method.
+ */
+- protected abstract SpeciesData speciesData();
++ /*non-public*/ abstract SpeciesData speciesData();
+
+ @Override
+ final Object internalProperties() {
+@@ -156,7 +156,7 @@
+ return Arrays.asList(boundValues);
+ }
+
+- public final Object arg(int i) {
++ /*non-public*/ final Object arg(int i) {
+ try {
+ switch (speciesData().fieldType(i)) {
+ case 'L': return argL(i);
+@@ -170,22 +170,22 @@
+ }
+ throw new InternalError("unexpected type: " + speciesData().types+"."+i);
+ }
+- public final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
+- public final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
+- public final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
+- public final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
+- public final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
++ /*non-public*/ final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
++ /*non-public*/ final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
++ /*non-public*/ final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
++ /*non-public*/ final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
++ /*non-public*/ final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
+
+ //
+ // cloning API
+ //
+
+- public abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
+- public abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
+- public abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
+- public abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
+- public abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
+- public abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
++ /*non-public*/ abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
+
+ // The following is a grossly irregular hack:
+ @Override MethodHandle reinvokerTarget() {
+@@ -203,39 +203,39 @@
+ private // make it private to force users to access the enclosing class first
+ static final class Species_L extends BoundMethodHandle {
+ final Object argL0;
+- public Species_L(MethodType mt, LambdaForm lf, Object argL0) {
++ /*non-public*/ Species_L(MethodType mt, LambdaForm lf, Object argL0) {
+ super(mt, lf);
+ this.argL0 = argL0;
+ }
+ // The following is a grossly irregular hack:
+ @Override MethodHandle reinvokerTarget() { return (MethodHandle) argL0; }
+ @Override
+- public SpeciesData speciesData() {
++ /*non-public*/ SpeciesData speciesData() {
+ return SPECIES_DATA;
+ }
+- public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
++ /*non-public*/ static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
+ @Override
+- public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
++ /*non-public*/ final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
+ return new Species_L(mt, lf, argL0);
+ }
+ @Override
+- public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
++ /*non-public*/ final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
+ return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, narg);
+ }
+ @Override
+- public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
++ /*non-public*/ final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
+ return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, narg);
+ }
+ @Override
+- public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
++ /*non-public*/ final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
+ return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, narg);
+ }
+ @Override
+- public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
++ /*non-public*/ final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
+ return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, narg);
+ }
+ @Override
+- public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
++ /*non-public*/ final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
+ return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, narg);
+ }
+ }
+@@ -338,10 +338,10 @@
+ final MethodHandle[] getters;
+ final SpeciesData[] extensions;
+
+- public int fieldCount() {
++ /*non-public*/ int fieldCount() {
+ return types.length();
+ }
+- public char fieldType(int i) {
++ /*non-public*/ char fieldType(int i) {
+ return types.charAt(i);
+ }
+
+@@ -546,30 +546,30 @@
+ * final Object argL0;
+ * final Object argL1;
+ * final int argI2;
+- * public Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
++ * Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
+ * super(mt, lf);
+ * this.argL0 = argL0;
+ * this.argL1 = argL1;
+ * this.argI2 = argI2;
+ * }
+- * public final SpeciesData speciesData() { return SPECIES_DATA; }
+- * public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
+- * public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
++ * final SpeciesData speciesData() { return SPECIES_DATA; }
++ * static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
++ * final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
+ * return SPECIES_DATA.constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2);
+ * }
+- * public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
++ * final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
+ * return SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
+ * }
+- * public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
++ * final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
+ * return SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
+ * }
+- * public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
++ * final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
+ * return SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
+ * }
+- * public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
++ * final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
+ * return SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
+ * }
+- * public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
++ * final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
+ * return SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
+ * }
+ * }
+@@ -583,11 +583,12 @@
+
+ final String className = SPECIES_PREFIX_PATH + types;
+ final String sourceFile = SPECIES_PREFIX_NAME + types;
+- cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
++ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
++ cw.visit(V1_6, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
+ cw.visitSource(sourceFile, null);
+
+ // emit static types and SPECIES_DATA fields
+- cw.visitField(ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
++ cw.visitField(NOT_ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
+
+ // emit bound argument fields
+ for (int i = 0; i < types.length(); ++i) {
+@@ -600,7 +601,7 @@
+ MethodVisitor mv;
+
+ // emit constructor
+- mv = cw.visitMethod(ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+@@ -624,7 +625,7 @@
+ mv.visitEnd();
+
+ // emit implementation of reinvokerTarget()
+- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, className, "argL0", JLO_SIG);
+@@ -634,7 +635,7 @@
+ mv.visitEnd();
+
+ // emit implementation of speciesData()
+- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
+ mv.visitCode();
+ mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG);
+ mv.visitInsn(ARETURN);
+@@ -642,7 +643,7 @@
+ mv.visitEnd();
+
+ // emit clone()
+- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
+ mv.visitCode();
+ // return speciesData().constructor[0].invokeBasic(mt, lf, argL0, ...)
+ // obtain constructor
+@@ -665,7 +666,7 @@
+ // for each type, emit cloneExtendT()
+ for (Class<?> c : TYPES) {
+ char t = Wrapper.basicTypeChar(c);
+- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
+ mv.visitCode();
+ // return SPECIES_DATA.extendWithIndex(extensionIndex(t)).constructor[0].invokeBasic(mt, lf, argL0, ..., narg)
+ // obtain constructor
+@@ -692,7 +693,7 @@
+ }
+
+ // emit class initializer
+- mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
++ mv = cw.visitMethod(NOT_ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
+ mv.visitCode();
+ mv.visitLdcInsn(types);
+ mv.visitLdcInsn(Type.getObjectType(className));
+--- ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Tue Mar 18 12:35:25 2014 -0700
+@@ -289,8 +289,9 @@
+ * Set up class file generation.
+ */
+ private void classFilePrologue() {
++ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
+ cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
+- cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
++ cw.visit(Opcodes.V1_6, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
+ cw.visitSource(sourceFile, null);
+
+ String invokerDesc = invokerType.toMethodDescriptorString();
+--- ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1616,6 +1616,7 @@
+ */
+ public static
+ MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) {
++ reorder = reorder.clone();
+ checkReorder(reorder, newType, target.type());
+ return target.permuteArguments(newType, reorder);
+ }
+@@ -1810,6 +1811,7 @@
+ throw newIllegalArgumentException("no argument type to remove");
+ ArrayList<Class<?>> ptypes = new ArrayList<>(oldType.parameterList());
+ ptypes.addAll(pos, valueTypes);
++ if (ptypes.size() != inargs) throw newIllegalArgumentException("valueTypes");
+ MethodType newType = MethodType.methodType(oldType.returnType(), ptypes);
+ return target.dropArguments(newType, pos, dropped);
+ }
+--- ./jdk/src/share/classes/java/util/ServiceLoader.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/util/ServiceLoader.java Tue Mar 18 12:35:25 2014 -0700
+@@ -375,7 +375,7 @@
+ return p;
+ } catch (Throwable x) {
+ fail(service,
+- "Provider " + cn + " could not be instantiated: " + x,
++ "Provider " + cn + " could not be instantiated",
+ x);
+ }
+ throw new Error(); // This cannot happen
+--- ./jdk/src/share/classes/java/util/jar/JarVerifier.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/util/jar/JarVerifier.java Tue Mar 18 12:35:25 2014 -0700
+@@ -677,6 +677,8 @@
+ } else {
+ matchUnsigned = true;
+ }
++ } else {
++ matchUnsigned = true;
+ }
+ }
+
+@@ -779,23 +781,7 @@
+
+ // true if file is part of the signature mechanism itself
+ static boolean isSigningRelated(String name) {
+- name = name.toUpperCase(Locale.ENGLISH);
+- if (!name.startsWith("META-INF/")) {
+- return false;
+- }
+- name = name.substring(9);
+- if (name.indexOf('/') != -1) {
+- return false;
+- }
+- if (name.endsWith(".DSA")
+- || name.endsWith(".RSA")
+- || name.endsWith(".SF")
+- || name.endsWith(".EC")
+- || name.startsWith("SIG-")
+- || name.equals("MANIFEST.MF")) {
+- return true;
+- }
+- return false;
++ return SignatureFileVerifier.isSigningRelated(name);
+ }
+
+ private Enumeration<String> unsignedEntryNames(JarFile jar) {
+--- ./jdk/src/share/classes/java/util/logging/LogManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/util/logging/LogManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -363,6 +363,9 @@
+ changes.removePropertyChangeListener(l);
+ }
+
++ // LoggerContext maps from AppContext
++ private static WeakHashMap<Object, LoggerContext> contextsMap = null;
++
+ // Returns the LoggerContext for the user code (i.e. application or AppContext).
+ // Loggers are isolated from each AppContext.
+ private LoggerContext getUserContext() {
+@@ -371,33 +374,28 @@
+ SecurityManager sm = System.getSecurityManager();
+ JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess();
+ if (sm != null && javaAwtAccess != null) {
++ // for each applet, it has its own LoggerContext isolated from others
+ synchronized (javaAwtAccess) {
+- // AppContext.getAppContext() returns the system AppContext if called
+- // from a system thread but Logger.getLogger might be called from
+- // an applet code. Instead, find the AppContext of the applet code
+- // from the execution stack.
+- Object ecx = javaAwtAccess.getExecutionContext();
+- if (ecx == null) {
+- // fall back to thread group seach of AppContext
+- ecx = javaAwtAccess.getContext();
+- }
++ // find the AppContext of the applet code
++ // will be null if we are in the main app context.
++ final Object ecx = javaAwtAccess.getAppletContext();
+ if (ecx != null) {
+- context = (LoggerContext)javaAwtAccess.get(ecx, LoggerContext.class);
++ if (contextsMap == null) {
++ contextsMap = new WeakHashMap<>();
++ }
++ context = contextsMap.get(ecx);
+ if (context == null) {
+- if (javaAwtAccess.isMainAppContext()) {
+- context = userContext;
+- } else {
+- // Create a new LoggerContext for the applet.
+- // The new logger context has its requiresDefaultLoggers
+- // flag set to true - so that these loggers will be
+- // lazily added when the context is firt accessed.
+- context = new LoggerContext(true);
+- }
+- javaAwtAccess.put(ecx, LoggerContext.class, context);
++ // Create a new LoggerContext for the applet.
++ // The new logger context has its requiresDefaultLoggers
++ // flag set to true - so that these loggers will be
++ // lazily added when the context is firt accessed.
++ context = new LoggerContext(true);
++ contextsMap.put(ecx, context);
+ }
+ }
+ }
+ }
++ // for standalone app, return userContext
+ return context != null ? context : userContext;
+ }
+
+@@ -424,7 +422,7 @@
+ Logger result = getLogger(name);
+ if (result == null) {
+ // only allocate the new logger once
+- Logger newLogger = new Logger(name, resourceBundleName, caller);
++ Logger newLogger = new Logger(name, resourceBundleName, caller, false);
+ do {
+ if (addLogger(newLogger)) {
+ // We successfully added the new Logger that we
+@@ -471,12 +469,12 @@
+ } while (logger == null);
+
+ // LogManager will set the sysLogger's handlers via LogManager.addLogger method.
+- if (logger != sysLogger && sysLogger.getHandlers().length == 0) {
++ if (logger != sysLogger && sysLogger.accessCheckedHandlers().length == 0) {
+ // if logger already exists but handlers not set
+ final Logger l = logger;
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
+- for (Handler hdl : l.getHandlers()) {
++ for (Handler hdl : l.accessCheckedHandlers()) {
+ sysLogger.addHandler(hdl);
+ }
+ return null;
+@@ -760,7 +758,7 @@
+ Logger result = findLogger(name);
+ if (result == null) {
+ // only allocate the new system logger once
+- Logger newLogger = new Logger(name, resourceBundleName);
++ Logger newLogger = new Logger(name, resourceBundleName, null, true);
+ do {
+ if (addLocalLogger(newLogger)) {
+ // We successfully added the new Logger that we
+@@ -1425,31 +1423,35 @@
+ // We use a subclass of Logger for the root logger, so
+ // that we only instantiate the global handlers when they
+ // are first needed.
+- private class RootLogger extends Logger {
++ private final class RootLogger extends Logger {
+ private RootLogger() {
+- super("", null);
++ super("", null, null, true);
+ setLevel(defaultLevel);
+ }
+
++ @Override
+ public void log(LogRecord record) {
+ // Make sure that the global handlers have been instantiated.
+ initializeGlobalHandlers();
+ super.log(record);
+ }
+
++ @Override
+ public void addHandler(Handler h) {
+ initializeGlobalHandlers();
+ super.addHandler(h);
+ }
+
++ @Override
+ public void removeHandler(Handler h) {
+ initializeGlobalHandlers();
+ super.removeHandler(h);
+ }
+
+- public Handler[] getHandlers() {
++ @Override
++ Handler[] accessCheckedHandlers() {
+ initializeGlobalHandlers();
+- return super.getHandlers();
++ return super.accessCheckedHandlers();
+ }
+ }
+
+--- ./jdk/src/share/classes/java/util/logging/Logger.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/java/util/logging/Logger.java Tue Mar 18 12:35:25 2014 -0700
+@@ -178,7 +178,7 @@
+ private String name;
+ private final CopyOnWriteArrayList<Handler> handlers =
+ new CopyOnWriteArrayList<>();
+- private String resourceBundleName;
++ private volatile String resourceBundleName;
+ private volatile boolean useParentHandlers = true;
+ private volatile Filter filter;
+ private boolean anonymous;
+@@ -189,7 +189,7 @@
+
+ // The fields relating to parent-child relationships and levels
+ // are managed under a separate lock, the treeLock.
+- private static Object treeLock = new Object();
++ private static final Object treeLock = new Object();
+ // We keep weak references from parents to children, but strong
+ // references from children to parents.
+ private volatile Logger parent; // our nearest parent.
+@@ -197,6 +197,7 @@
+ private volatile Level levelObject;
+ private volatile int levelValue; // current effective level value
+ private WeakReference<ClassLoader> callersClassLoaderRef;
++ private final boolean isSystemLogger;
+
+ /**
+ * GLOBAL_LOGGER_NAME is a name for the global logger.
+@@ -257,11 +258,12 @@
+ * no corresponding resource can be found.
+ */
+ protected Logger(String name, String resourceBundleName) {
+- this(name, resourceBundleName, null);
++ this(name, resourceBundleName, null, false);
+ }
+
+- Logger(String name, String resourceBundleName, Class<?> caller) {
++ Logger(String name, String resourceBundleName, Class<?> caller, boolean isSystemLogger) {
+ this.manager = LogManager.getLogManager();
++ this.isSystemLogger = isSystemLogger;
+ setupResourceInfo(resourceBundleName, caller);
+ this.name = name;
+ levelValue = Level.INFO.intValue();
+@@ -288,6 +290,7 @@
+ private Logger(String name) {
+ // The manager field is not initialized here.
+ this.name = name;
++ this.isSystemLogger = true;
+ levelValue = Level.INFO.intValue();
+ }
+
+@@ -528,7 +531,7 @@
+ // cleanup some Loggers that have been GC'ed
+ manager.drainLoggerRefQueueBounded();
+ Logger result = new Logger(null, resourceBundleName,
+- Reflection.getCallerClass());
++ Reflection.getCallerClass(), false);
+ result.anonymous = true;
+ Logger root = manager.getLogger("");
+ result.doSetParent(root);
+@@ -606,15 +609,22 @@
+
+ Logger logger = this;
+ while (logger != null) {
+- for (Handler handler : logger.getHandlers()) {
++ final Handler[] loggerHandlers = isSystemLogger
++ ? logger.accessCheckedHandlers()
++ : logger.getHandlers();
++ for (Handler handler : loggerHandlers) {
+ handler.publish(record);
+ }
+
+- if (!logger.getUseParentHandlers()) {
++ final boolean useParentHdls = isSystemLogger
++ ? logger.useParentHandlers
++ : logger.getUseParentHandlers();
++
++ if (!useParentHdls) {
+ break;
+ }
+
+- logger = logger.getParent();
++ logger = isSystemLogger ? logger.parent : logger.getParent();
+ }
+ }
+
+@@ -1337,6 +1347,12 @@
+ * @return an array of all registered Handlers
+ */
+ public Handler[] getHandlers() {
++ return accessCheckedHandlers();
++ }
++
++ // This method should ideally be marked final - but unfortunately
++ // it needs to be overridden by LogManager.RootLogger
++ Handler[] accessCheckedHandlers() {
+ return handlers.toArray(emptyHandlers);
+ }
+
+@@ -1669,11 +1685,13 @@
+ private String getEffectiveResourceBundleName() {
+ Logger target = this;
+ while (target != null) {
+- String rbn = target.getResourceBundleName();
++ final String rbn = isSystemLogger
++ ? target.resourceBundleName
++ : target.getResourceBundleName();
+ if (rbn != null) {
+ return rbn;
+ }
+- target = target.getParent();
++ target = isSystemLogger ? target.parent : target.getParent();
+ }
+ return null;
+ }
+--- ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -85,15 +85,18 @@
+ nameAssociations = new HashMap<String, ScriptEngineFactory>();
+ extensionAssociations = new HashMap<String, ScriptEngineFactory>();
+ mimeTypeAssociations = new HashMap<String, ScriptEngineFactory>();
+- AccessController.doPrivileged(new PrivilegedAction<Object>() {
+- public Object run() {
+- initEngines(loader);
+- return null;
+- }
+- });
++ List<ScriptEngineFactory> facList = AccessController.doPrivileged(
++ new PrivilegedAction<List<ScriptEngineFactory>>() {
++ public List<ScriptEngineFactory> run() {
++ return initEngines(loader);
++ }
++ });
++ for (ScriptEngineFactory fac : facList) {
++ engineSpis.add(fac);
++ }
+ }
+
+- private void initEngines(final ClassLoader loader) {
++ private List<ScriptEngineFactory> initEngines(final ClassLoader loader) {
+ Iterator itr = null;
+ try {
+ if (loader != null) {
+@@ -110,14 +113,15 @@
+ // do not throw any exception here. user may want to
+ // manage his/her own factories using this manager
+ // by explicit registratation (by registerXXX) methods.
+- return;
++ return null;
+ }
+
++ final List<ScriptEngineFactory> facList = new ArrayList<>();
+ try {
+ while (itr.hasNext()) {
+ try {
+ ScriptEngineFactory fact = (ScriptEngineFactory) itr.next();
+- engineSpis.add(fact);
++ facList.add(fact);
+ } catch (ServiceConfigurationError err) {
+ System.err.println("ScriptEngineManager providers.next(): "
+ + err.getMessage());
+@@ -137,8 +141,8 @@
+ // do not throw any exception here. user may want to
+ // manage his/her own factories using this manager
+ // by explicit registratation (by registerXXX) methods.
+- return;
+ }
++ return facList;
+ }
+
+ /**
+--- ./jdk/src/share/classes/javax/security/auth/Subject.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/javax/security/auth/Subject.java Tue Mar 18 12:35:25 2014 -0700
+@@ -941,14 +941,30 @@
+ /**
+ * Reads this object from a stream (i.e., deserializes it)
+ */
++ @SuppressWarnings("unchecked")
+ private void readObject(java.io.ObjectInputStream s)
+ throws java.io.IOException, ClassNotFoundException {
+
+- s.defaultReadObject();
++ ObjectInputStream.GetField gf = s.readFields();
++
++ readOnly = gf.get("readOnly", false);
++
++ Set<Principal> inputPrincs = (Set<Principal>)gf.get("principals", null);
+
+ // Rewrap the principals into a SecureSet
+- principals = Collections.synchronizedSet(new SecureSet<Principal>
+- (this, PRINCIPAL_SET, principals));
++ if (inputPrincs == null) {
++ throw new NullPointerException
++ (ResourcesMgr.getString("invalid.null.input.s."));
++ }
++ try {
++ principals = Collections.synchronizedSet(new SecureSet<Principal>
++ (this, PRINCIPAL_SET, inputPrincs));
++ } catch (NullPointerException npe) {
++ // Sometimes people deserialize the principals set only.
++ // Subject is not accessible, so just don't fail.
++ principals = Collections.synchronizedSet
++ (new SecureSet<Principal>(this, PRINCIPAL_SET));
++ }
+
+ // The Credential <code>Set</code> is not serialized, but we do not
+ // want the default deserialization routine to set it to null.
+--- ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -30,6 +30,7 @@
+ import java.sql.SQLException;
+ import java.util.ServiceConfigurationError;
+ import java.util.ServiceLoader;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * A factory API that enables applications to obtain a
+@@ -127,15 +128,11 @@
+ factoryClassName = getSystemProperty(ROWSET_FACTORY_NAME);
+ if (factoryClassName != null) {
+ trace("Found system property, value=" + factoryClassName);
+- factory = (RowSetFactory) getFactoryClass(factoryClassName, null, true).newInstance();
++ factory = (RowSetFactory) ReflectUtil.newInstance(getFactoryClass(factoryClassName, null, true));
+ }
+- } catch (ClassNotFoundException e) {
+- throw new SQLException(
+- "RowSetFactory: " + factoryClassName + " not found", e);
+- } catch (Exception e) {
+- throw new SQLException(
+- "RowSetFactory: " + factoryClassName + " could not be instantiated: " + e,
+- e);
++ } catch (Exception e) {
++ throw new SQLException( "RowSetFactory: " + factoryClassName +
++ " could not be instantiated: ", e);
+ }
+
+ // Check to see if we found the RowSetFactory via a System property
+@@ -180,6 +177,16 @@
+ throws SQLException {
+
+ trace("***In newInstance()");
++
++ if(factoryClassName == null) {
++ throw new SQLException("Error: factoryClassName cannot be null");
++ }
++ try {
++ ReflectUtil.checkPackageAccess(factoryClassName);
++ } catch (java.security.AccessControlException e) {
++ throw new SQLException("Access Exception",e);
++ }
++
+ try {
+ Class providerClass = getFactoryClass(factoryClassName, cl, false);
+ RowSetFactory instance = (RowSetFactory) providerClass.newInstance();
+@@ -292,6 +299,7 @@
+ });
+ } catch (SecurityException se) {
+ if (debug) {
++ trace("error getting " + propName + ": "+ se);
+ se.printStackTrace();
+ }
+ }
+--- ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -30,6 +30,7 @@
+ import java.io.*;
+ import java.math.*;
+ import java.util.Map;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * An input stream used for custom mapping user-defined types (UDTs).
+@@ -606,13 +607,9 @@
+ // create new instance of the class
+ SQLData obj = null;
+ try {
+- obj = (SQLData)c.newInstance();
+- } catch (java.lang.InstantiationException ex) {
+- throw new SQLException("Unable to instantiate: " +
+- ex.getMessage());
+- } catch (java.lang.IllegalAccessException ex) {
+- throw new SQLException("Unable to instantiate: " +
+- ex.getMessage());
++ obj = (SQLData)ReflectUtil.newInstance(c);
++ } catch (Exception ex) {
++ throw new SQLException("Unable to Instantiate: ", ex);
+ }
+ // get the attributes from the struct
+ Object attribs[] = s.getAttributes(map);
+--- ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Tue Mar 18 12:35:25 2014 -0700
+@@ -37,8 +37,11 @@
+ import java.io.FileNotFoundException;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
++import java.security.PrivilegedActionException;
++import java.security.PrivilegedExceptionAction;
+
+ import javax.naming.*;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * The Service Provider Interface (SPI) mechanism that generates <code>SyncProvider</code>
+@@ -343,7 +346,7 @@
+ // Local implementation class names and keys from Properties
+ // file, translate names into Class objects using Class.forName
+ // and store mappings
+- Properties properties = new Properties();
++ final Properties properties = new Properties();
+
+ if (implementations == null) {
+ implementations = new Hashtable();
+@@ -372,6 +375,7 @@
+ }
+ });
+ } catch (Exception ex) {
++ System.out.println("errorget rowset.properties: " + ex);
+ strRowsetProperties = null;
+ }
+ if (strRowsetProperties != null) {
+@@ -391,16 +395,33 @@
+ strFileSep + "rowset" + strFileSep +
+ "rowset.properties";
+
+- ClassLoader cl = Thread.currentThread().getContextClassLoader();
++ final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+
+- try (InputStream stream =
+- (cl == null) ? ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
+- : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
+- if (stream == null) {
+- throw new SyncFactoryException(
+- "Resource " + ROWSET_PROPERTIES + " not found");
++ try {
++ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
++ @Override
++ public Void run() throws SyncFactoryException, IOException, FileNotFoundException {
++ try (InputStream stream = (cl == null) ?
++ ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
++ : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
++ if (stream == null) {
++ throw new SyncFactoryException("Resource " + ROWSET_PROPERTIES + " not found");
++ }
++ properties.load(stream);
++ }
++ return null;
++ }
++
++ });
++ } catch (PrivilegedActionException ex) {
++ Throwable e = ex.getException();
++ if (e instanceof SyncFactoryException) {
++ throw (SyncFactoryException) e;
++ } else {
++ SyncFactoryException sfe = new SyncFactoryException();
++ sfe.initCause(ex.getException());
++ throw sfe;
+ }
+- properties.load(stream);
+ }
+
+ parseProperties(properties);
+@@ -560,6 +581,13 @@
+ return new com.sun.rowset.providers.RIOptimisticProvider();
+ }
+
++ try {
++ ReflectUtil.checkPackageAccess(providerID);
++ } catch (java.security.AccessControlException e) {
++ SyncFactoryException sfe = new SyncFactoryException();
++ sfe.initCause(e);
++ throw sfe;
++ }
+ // Attempt to invoke classname from registered SyncProvider list
+ Class c = null;
+ try {
+@@ -568,7 +596,7 @@
+ /**
+ * The SyncProvider implementation of the user will be in
+ * the classpath. We need to find the ClassLoader which loads
+- * this SyncFactory and try to laod the SyncProvider class from
++ * this SyncFactory and try to load the SyncProvider class from
+ * there.
+ **/
+ c = Class.forName(providerID, true, cl);
+--- ./jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/AWTAccessor.java Tue Mar 18 12:35:25 2014 -0700
+@@ -29,6 +29,7 @@
+ import java.awt.KeyboardFocusManager;
+ import java.awt.DefaultKeyboardFocusManager;
+ import java.awt.event.InputEvent;
++import java.awt.event.InvocationEvent;
+ import java.awt.event.KeyEvent;
+ import java.awt.geom.Point2D;
+
+@@ -690,6 +691,25 @@
+ }
+
+ /*
++ * An accessor object for the InvocationEvent class
++ */
++ public interface InvocationEventAccessor {
++ /**
++ * Disposes the InvocationEvent
++ */
++ void dispose(InvocationEvent event);
++
++ /**
++ * Creates an InvocationEvent with a completion listener -
++ * a Runnable whose run() method will be called immediately after
++ * the event is dispatched or disposed
++ */
++ InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
++ boolean catchThrowables);
++ }
++
++
++ /*
+ * Accessor instances are initialized in the static initializers of
+ * corresponding AWT classes by using setters defined below.
+ */
+@@ -716,6 +736,7 @@
+ private static TrayIconAccessor trayIconAccessor;
+ private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
+ private static SequencedEventAccessor sequencedEventAccessor;
++ private static InvocationEventAccessor invocationEventAccessor;
+
+ /*
+ * Set an accessor object for the java.awt.Component class.
+@@ -1110,4 +1131,18 @@
+ // (so not a single instance of the event has been created).
+ return sequencedEventAccessor;
+ }
++
++ /*
++ * Get the accessor object for the java.awt.event.InvocationEvent class.
++ */
++ public static void setInvocationEventAccessor(InvocationEventAccessor invocationEventAccessor) {
++ AWTAccessor.invocationEventAccessor = invocationEventAccessor;
++ }
++
++ /*
++ * Set the accessor object for the java.awt.event.InvocationEvent class.
++ */
++ public static InvocationEventAccessor getInvocationEventAccessor() {
++ return invocationEventAccessor;
++ }
+ }
+--- ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -26,10 +26,13 @@
+ package sun.awt;
+
+ import java.awt.AWTEvent;
+-import java.util.Collections;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.HashSet;
+ import java.util.IdentityHashMap;
+ import java.util.Map;
++
++import sun.misc.ThreadGroupUtils;
+ import sun.util.logging.PlatformLogger;
+
+ /**
+@@ -212,7 +215,13 @@
+ synchronized (activationLock) {
+ synchronized (mainLock) {
+ if (!isReadyToShutdown() && blockerThread == null) {
+- activateBlockerThread();
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ activateBlockerThread();
++ return null;
++ }
++ });
+ } else {
+ mainLock.notifyAll();
+ timeoutPassed = false;
+@@ -326,9 +335,12 @@
+ /**
+ * Creates and starts a new blocker thread. Doesn't return until
+ * the new blocker thread starts.
++ *
++ * Must be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
+ */
+ private void activateBlockerThread() {
+- Thread thread = new Thread(this, "AWT-Shutdown");
++ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), this, "AWT-Shutdown");
++ thread.setContextClassLoader(null);
+ thread.setDaemon(false);
+ blockerThread = thread;
+ thread.start();
+--- ./jdk/src/share/classes/sun/awt/AppContext.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/AppContext.java Tue Mar 18 12:35:25 2014 -0700
+@@ -837,21 +837,68 @@
+ public boolean isMainAppContext() {
+ return (numAppContexts.get() == 1 && mainAppContext != null);
+ }
+- public Object getContext() {
+- return getAppContext();
++
++ private boolean hasRootThreadGroup(final AppContext ecx) {
++ return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
++ @Override
++ public Boolean run() {
++ return ecx.threadGroup.getParent() == null;
++ }
++ });
+ }
+- public Object getExecutionContext() {
+- return getExecutionAppContext();
++
++ /**
++ * Returns the AppContext used for applet logging isolation, or null if
++ * the default global context can be used.
++ * If there's no applet, or if the caller is a stand alone application,
++ * or running in the main app context, returns null.
++ * Otherwise, returns the AppContext of the calling applet.
++ * @return null if the global default context can be used,
++ * an AppContext otherwise.
++ **/
++ public Object getAppletContext() {
++ // There's no AppContext: return null.
++ // No need to call getAppContext() if numAppContext == 0:
++ // it means that no AppContext has been created yet, and
++ // we don't want to trigger the creation of a main app
++ // context since we don't need it.
++ if (numAppContexts.get() == 0) return null;
++
++ // Get the context from the security manager
++ AppContext ecx = getExecutionAppContext();
++
++ // Not sure we really need to re-check numAppContexts here.
++ // If all applets have gone away then we could have a
++ // numAppContexts coming back to 0. So we recheck
++ // it here because we don't want to trigger the
++ // creation of a main AppContext in that case.
++ // This is probably not 100% MT-safe but should reduce
++ // the window of opportunity in which that issue could
++ // happen.
++ if (numAppContexts.get() > 0) {
++ // Defaults to thread group caching.
++ // This is probably not required as we only really need
++ // isolation in a deployed applet environment, in which
++ // case ecx will not be null when we reach here
++ // However it helps emulate the deployed environment,
++ // in tests for instance.
++ ecx = ecx != null ? ecx : getAppContext();
++ }
++
++ // getAppletContext() may be called when initializing the main
++ // app context - in which case mainAppContext will still be
++ // null. To work around this issue we simply use
++ // AppContext.threadGroup.getParent() == null instead, since
++ // mainAppContext is the only AppContext which should have
++ // the root TG as its thread group.
++ // See: JDK-8023258
++ final boolean isMainAppContext = ecx == null
++ || mainAppContext == ecx
++ || mainAppContext == null && hasRootThreadGroup(ecx);
++
++ return isMainAppContext ? null : ecx;
+ }
+- public Object get(Object context, Object key) {
+- return ((AppContext)context).get(key);
+- }
+- public void put(Object context, Object key, Object value) {
+- ((AppContext)context).put(key, value);
+- }
+- public void remove(Object context, Object key) {
+- ((AppContext)context).remove(key);
+- }
++
+ });
+ }
+ }
+--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -37,6 +37,7 @@
+ import java.awt.SystemTray;
+ import java.awt.event.InputEvent;
+ import java.net.URL;
++import java.security.PrivilegedAction;
+ import java.util.*;
+ import java.util.concurrent.TimeUnit;
+ import java.util.concurrent.locks.Condition;
+--- ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Tue Mar 18 12:35:25 2014 -0700
+@@ -87,7 +87,7 @@
+ HashMap cached_data = new HashMap(formats.length, 1.0f);
+
+ Map flavorsForFormats = DataTransferer.getInstance().
+- getFlavorsForFormats(formats, SunClipboard.flavorMap);
++ getFlavorsForFormats(formats, SunClipboard.getDefaultFlavorTable());
+ for (Iterator iter = flavorsForFormats.keySet().iterator();
+ iter.hasNext(); )
+ {
+--- ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Tue Mar 18 12:35:25 2014 -0700
+@@ -64,9 +64,6 @@
+ public abstract class SunClipboard extends Clipboard
+ implements PropertyChangeListener {
+
+- public static final FlavorTable flavorMap =
+- (FlavorTable)SystemFlavorMap.getDefaultFlavorMap();
+-
+ private AppContext contentsContext = null;
+
+ private final Object CLIPBOARD_FLAVOR_LISTENER_KEY;
+@@ -172,7 +169,7 @@
+ long[] formats = getClipboardFormatsOpenClose();
+
+ return DataTransferer.getInstance().
+- getFlavorsForFormatsAsArray(formats, flavorMap);
++ getFlavorsForFormatsAsArray(formats, getDefaultFlavorTable());
+ }
+
+ /**
+@@ -218,7 +215,7 @@
+
+ long[] formats = getClipboardFormats();
+ Long lFormat = (Long)DataTransferer.getInstance().
+- getFlavorsForFormats(formats, flavorMap).get(flavor);
++ getFlavorsForFormats(formats, getDefaultFlavorTable()).get(flavor);
+
+ if (lFormat == null) {
+ throw new UnsupportedFlavorException(flavor);
+@@ -349,7 +346,7 @@
+ private static Set formatArrayAsDataFlavorSet(long[] formats) {
+ return (formats == null) ? null :
+ DataTransferer.getInstance().
+- getFlavorsForFormatsAsSet(formats, flavorMap);
++ getFlavorsForFormatsAsSet(formats, getDefaultFlavorTable());
+ }
+
+
+@@ -469,4 +466,7 @@
+ }
+ }
+
++ public static FlavorTable getDefaultFlavorTable() {
++ return (FlavorTable) SystemFlavorMap.getDefaultFlavorMap();
++ }
+ }
+--- ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -27,12 +27,15 @@
+
+ import java.io.File;
+ import java.io.OutputStream;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.HashMap;
+ import java.util.Map;
+ import java.util.concurrent.Semaphore;
+ import java.util.concurrent.TimeUnit;
+
+ import sun.awt.AppContext;
++import sun.misc.ThreadGroupUtils;
+
+ public class CreatedFontTracker {
+
+@@ -112,28 +115,25 @@
+ static void init() {
+ if (t == null) {
+ // Add a shutdown hook to remove the temp file.
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction() {
+- public Object run() {
+- /* The thread must be a member of a thread group
+- * which will not get GCed before VM exit.
+- * Make its parent the top-level thread group.
+- */
+- ThreadGroup tg =
+- Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null;
+- tg = tgn, tgn = tg.getParent());
+- t = new Thread(tg, new Runnable() {
+- public void run() {
+- runHooks();
+- }
+- });
+- t.setContextClassLoader(null);
+- Runtime.getRuntime().addShutdownHook(t);
+- return null;
+- }
+- });
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ /* The thread must be a member of a thread group
++ * which will not get GCed before VM exit.
++ * Make its parent the top-level thread group.
++ */
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ t = new Thread(rootTG, new Runnable() {
++ @Override
++ public void run() {
++ runHooks();
++ }
++ });
++ t.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(t);
++ return null;
++ }
++ });
+ }
+ }
+
+--- ./jdk/src/share/classes/sun/font/SunFontManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/font/SunFontManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -52,6 +52,7 @@
+ import sun.awt.AppContext;
+ import sun.awt.FontConfiguration;
+ import sun.awt.SunToolkit;
++import sun.misc.ThreadGroupUtils;
+ import sun.java2d.FontSupport;
+ import sun.util.logging.PlatformLogger;
+
+@@ -2521,24 +2522,20 @@
+ });
+ }
+ };
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction() {
+- public Object run() {
+- /* The thread must be a member of a thread group
+- * which will not get GCed before VM exit.
+- * Make its parent the top-level thread group.
+- */
+- ThreadGroup tg =
+- Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null;
+- tg = tgn, tgn = tg.getParent());
+- fileCloser = new Thread(tg, fileCloserRunnable);
+- fileCloser.setContextClassLoader(null);
+- Runtime.getRuntime().addShutdownHook(fileCloser);
+- return null;
+- }
+- });
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ /* The thread must be a member of a thread group
++ * which will not get GCed before VM exit.
++ * Make its parent the top-level thread group.
++ */
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ fileCloser = new Thread(rootTG, fileCloserRunnable);
++ fileCloser.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(fileCloser);
++ return null;
++ }
++ });
+ }
+ }
+ }
+--- ./jdk/src/share/classes/sun/java2d/Disposer.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/java2d/Disposer.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,10 +25,14 @@
+
+ package sun.java2d;
+
++import sun.misc.ThreadGroupUtils;
++
+ import java.lang.ref.Reference;
+ import java.lang.ref.ReferenceQueue;
+ import java.lang.ref.PhantomReference;
+ import java.lang.ref.WeakReference;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.ArrayList;
+ import java.util.Hashtable;
+
+@@ -71,26 +75,22 @@
+ }
+ }
+ disposerInstance = new Disposer();
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction() {
+- public Object run() {
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+- ThreadGroup tg = Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null;
+- tg = tgn, tgn = tg.getParent());
+- Thread t =
+- new Thread(tg, disposerInstance, "Java2D Disposer");
+- t.setContextClassLoader(null);
+- t.setDaemon(true);
+- t.setPriority(Thread.MAX_PRIORITY);
+- t.start();
+- return null;
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Thread t = new Thread(rootTG, disposerInstance, "Java2D Disposer");
++ t.setContextClassLoader(null);
++ t.setDaemon(true);
++ t.setPriority(Thread.MAX_PRIORITY);
++ t.start();
++ return null;
++ }
+ }
+- }
+ );
+ }
+
+--- ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -25,6 +25,7 @@
+
+ package sun.java2d.opengl;
+
++import sun.misc.ThreadGroupUtils;
+ import sun.java2d.pipe.RenderBuffer;
+ import sun.java2d.pipe.RenderQueue;
+ import static sun.java2d.pipe.BufferedOpCodes.*;
+@@ -48,12 +49,9 @@
+ * which will not get GCed before VM exit.
+ */
+ flusher = AccessController.doPrivileged(new PrivilegedAction<QueueFlusher>() {
++ @Override
+ public QueueFlusher run() {
+- ThreadGroup rootThreadGroup = Thread.currentThread().getThreadGroup();
+- while (rootThreadGroup.getParent() != null) {
+- rootThreadGroup = rootThreadGroup.getParent();
+- }
+- return new QueueFlusher(rootThreadGroup);
++ return new QueueFlusher(ThreadGroupUtils.getRootThreadGroup());
+ }
+ });
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/share/classes/sun/misc/InnocuousThread.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,121 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNUNSAFE General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUNSAFET
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICUNSAFELAR PUNSAFERPOSE. See the GNUNSAFE General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNUNSAFE General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 UNSAFESA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 UNSAFESA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package sun.misc;
++
++import java.security.AccessControlContext;
++import java.security.ProtectionDomain;
++
++/**
++ * A thread that has no permissions, is not a member of any user-defined
++ * ThreadGroup and supports the ability to erase ThreadLocals.
++ *
++ * @implNote Based on the implementation of InnocuousForkJoinWorkerThread.
++ */
++public final class InnocuousThread extends Thread {
++ private static final Unsafe UNSAFE;
++ private static final ThreadGroup THREADGROUP;
++ private static final AccessControlContext ACC;
++ private static final long THREADLOCALS;
++ private static final long INHERITABLETHREADLOCALS;
++ private static final long INHERITEDACCESSCONTROLCONTEXT;
++
++ public InnocuousThread(Runnable target) {
++ super(THREADGROUP, target, "anInnocuousThread");
++ UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC);
++ eraseThreadLocals();
++ }
++
++ @Override
++ public ClassLoader getContextClassLoader() {
++ // always report system class loader
++ return ClassLoader.getSystemClassLoader();
++ }
++
++ @Override
++ public void setUncaughtExceptionHandler(UncaughtExceptionHandler x) {
++ // silently fail
++ }
++
++ @Override
++ public void setContextClassLoader(ClassLoader cl) {
++ throw new SecurityException("setContextClassLoader");
++ }
++
++ // ensure run method is run only once
++ private volatile boolean hasRun;
++
++ @Override
++ public void run() {
++ if (Thread.currentThread() == this && !hasRun) {
++ hasRun = true;
++ super.run();
++ }
++ }
++
++ /**
++ * Drops all thread locals (and inherited thread locals).
++ */
++ public void eraseThreadLocals() {
++ UNSAFE.putObject(this, THREADLOCALS, null);
++ UNSAFE.putObject(this, INHERITABLETHREADLOCALS, null);
++ }
++
++ // Use Unsafe to access Thread group and ThreadGroup parent fields
++ static {
++ try {
++ ACC = new AccessControlContext(new ProtectionDomain[] {
++ new ProtectionDomain(null, null)
++ });
++
++ // Find and use topmost ThreadGroup as parent of new group
++ UNSAFE = Unsafe.getUnsafe();
++ Class<?> tk = Thread.class;
++ Class<?> gk = ThreadGroup.class;
++
++ THREADLOCALS = UNSAFE.objectFieldOffset
++ (tk.getDeclaredField("threadLocals"));
++ INHERITABLETHREADLOCALS = UNSAFE.objectFieldOffset
++ (tk.getDeclaredField("inheritableThreadLocals"));
++ INHERITEDACCESSCONTROLCONTEXT = UNSAFE.objectFieldOffset
++ (tk.getDeclaredField("inheritedAccessControlContext"));
++
++ long tg = UNSAFE.objectFieldOffset(tk.getDeclaredField("group"));
++ long gp = UNSAFE.objectFieldOffset(gk.getDeclaredField("parent"));
++ ThreadGroup group = (ThreadGroup)
++ UNSAFE.getObject(Thread.currentThread(), tg);
++
++ while (group != null) {
++ ThreadGroup parent = (ThreadGroup)UNSAFE.getObject(group, gp);
++ if (parent == null)
++ break;
++ group = parent;
++ }
++ THREADGROUP = new ThreadGroup(group, "InnocuousThreadGroup");
++ } catch (Exception e) {
++ throw new Error(e);
++ }
++ }
++}
+--- ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Tue Mar 18 12:35:25 2014 -0700
+@@ -26,14 +26,16 @@
+ package sun.misc;
+
+ public interface JavaAWTAccess {
+- public Object getContext();
+- public Object getExecutionContext();
+
+- public Object get(Object context, Object key);
+- public void put(Object context, Object key, Object value);
+- public void remove(Object context, Object key);
++ // Returns the AppContext used for applet logging isolation, or null if
++ // no isolation is required.
++ // If there's no applet, or if the caller is a stand alone application,
++ // or running in the main app context, returns null.
++ // Otherwise, returns the AppContext of the calling applet.
++ public Object getAppletContext();
+
+- // convenience methods whose context is the object returned by getContext()
++ // convenience methods to cache objects in the current thread group's
++ // AppContext
+ public Object get(Object key);
+ public void put(Object key, Object value);
+ public void remove(Object key);
+--- ./jdk/src/share/classes/sun/misc/Service.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/misc/Service.java Tue Mar 18 12:35:25 2014 -0700
+@@ -299,7 +299,7 @@
+ return service.cast(c.newInstance());
+ } catch (Throwable x) {
+ fail(service,
+- "Provider " + cn + " could not be instantiated: " + x,
++ "Provider " + cn + " could not be instantiated",
+ x);
+ }
+ return null; /* This cannot happen */
+--- ./jdk/src/share/classes/sun/misc/SharedSecrets.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/misc/SharedSecrets.java Tue Mar 18 12:35:25 2014 -0700
+@@ -197,9 +197,6 @@
+ public static JavaAWTAccess getJavaAWTAccess() {
+ // this may return null in which case calling code needs to
+ // provision for.
+- if (javaAWTAccess == null || javaAWTAccess.getContext() == null) {
+- return null;
+- }
+ return javaAWTAccess;
+ }
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/share/classes/sun/misc/ThreadGroupUtils.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,55 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++package sun.misc;
++
++/**
++ * A utility class needed to access the root {@code ThreadGroup}
++ *
++ * The class should not depend on any others, because it' called from JNI_OnLoad of the AWT
++ * native library. Triggering class loading could could lead to a deadlock.
++ */
++public final class ThreadGroupUtils {
++
++ private ThreadGroupUtils() {
++ // Avoid instantiation
++ }
++
++ /**
++ * Returns a root thread group.
++ * Should be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
++ *
++ * @return a root {@code ThreadGroup}
++ */
++ public static ThreadGroup getRootThreadGroup() {
++ ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
++ ThreadGroup parentTG = currentTG.getParent();
++ while (parentTG != null) {
++ currentTG = parentTG;
++ parentTG = currentTG.getParent();
++ }
++ return currentTG;
++ }
++}
+--- ./jdk/src/share/classes/sun/nio/ch/Invoker.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/nio/ch/Invoker.java Tue Mar 18 12:35:25 2014 -0700
+@@ -130,6 +130,18 @@
+
+ // clear interrupt
+ Thread.interrupted();
++
++ // clear thread locals when in default thread pool
++ if (System.getSecurityManager() != null) {
++ Thread me = Thread.currentThread();
++ if (me instanceof sun.misc.InnocuousThread) {
++ GroupAndInvokeCount thisGroupAndInvokeCount = myGroupAndInvokeCount.get();
++ ((sun.misc.InnocuousThread)me).eraseThreadLocals();
++ if (thisGroupAndInvokeCount != null) {
++ myGroupAndInvokeCount.set(thisGroupAndInvokeCount);
++ }
++ }
++ }
+ }
+
+ /**
+--- ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Tue Mar 18 12:35:25 2014 -0700
+@@ -27,6 +27,7 @@
+
+ import java.util.concurrent.*;
+ import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import sun.security.action.GetPropertyAction;
+ import sun.security.action.GetIntegerAction;
+
+@@ -39,14 +40,6 @@
+ "java.nio.channels.DefaultThreadPool.threadFactory";
+ private static final String DEFAULT_THREAD_POOL_INITIAL_SIZE =
+ "java.nio.channels.DefaultThreadPool.initialSize";
+- private static final ThreadFactory defaultThreadFactory = new ThreadFactory() {
+- @Override
+- public Thread newThread(Runnable r) {
+- Thread t = new Thread(r);
+- t.setDaemon(true);
+- return t;
+- }
+- };
+
+ private final ExecutorService executor;
+
+@@ -79,7 +72,29 @@
+ }
+
+ static ThreadFactory defaultThreadFactory() {
+- return defaultThreadFactory;
++ if (System.getSecurityManager() == null) {
++ return new ThreadFactory() {
++ @Override
++ public Thread newThread(Runnable r) {
++ Thread t = new Thread(r);
++ t.setDaemon(true);
++ return t;
++ }
++ };
++ } else {
++ return new ThreadFactory() {
++ @Override
++ public Thread newThread(final Runnable r) {
++ return (Thread) AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ Thread t = new sun.misc.InnocuousThread(r);
++ t.setDaemon(true);
++ return t;
++ }
++ });
++ }
++ };
++ }
+ }
+
+ private static class DefaultThreadPoolHolder {
+@@ -100,7 +115,7 @@
+ // default to thread factory that creates daemon threads
+ ThreadFactory threadFactory = getDefaultThreadPoolThreadFactory();
+ if (threadFactory == null)
+- threadFactory = defaultThreadFactory;
++ threadFactory = defaultThreadFactory();
+ // create thread pool
+ ExecutorService executor =
+ new ThreadPoolExecutor(0, Integer.MAX_VALUE,
+--- ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -173,8 +173,8 @@
+ md.update(p.getProperty(s).getBytes());
+ }
+
+- md.update
+- (InetAddress.getLocalHost().toString().getBytes());
++ // Include network adapter names (and a Mac address)
++ addNetworkAdapterInfo(md);
+
+ // The temporary dir
+ File f = new File(p.getProperty("java.io.tmpdir"));
+@@ -212,6 +212,31 @@
+ return md.digest();
+ }
+
++ /*
++ * Include network adapter names and, if available, a Mac address
++ *
++ * See also java.util.concurrent.ThreadLocalRandom.initialSeed()
++ */
++ private static void addNetworkAdapterInfo(MessageDigest md) {
++
++ try {
++ Enumeration<NetworkInterface> ifcs =
++ NetworkInterface.getNetworkInterfaces();
++ while (ifcs.hasMoreElements()) {
++ NetworkInterface ifc = ifcs.nextElement();
++ md.update(ifc.toString().getBytes());
++ if (!ifc.isVirtual()) { // skip fake addresses
++ byte[] bs = ifc.getHardwareAddress();
++ if (bs != null) {
++ md.update(bs);
++ break;
++ }
++ }
++ }
++ } catch (Exception ignore) {
++ }
++ }
++
+ /**
+ * Helper function to convert a long into a byte array (least significant
+ * byte first).
+--- ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Tue Mar 18 12:35:25 2014 -0700
+@@ -75,7 +75,7 @@
+ private PublicKey prevPubKey;
+
+ private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
+- EnumSet.of(CryptoPrimitive.SIGNATURE);
++ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
+
+ private final static DisabledAlgorithmConstraints
+ certPathDefaultConstraints = new DisabledAlgorithmConstraints(
+--- ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Mar 18 12:35:25 2014 -0700
+@@ -50,6 +50,7 @@
+ import sun.security.util.Cache;
+ import sun.security.util.Debug;
+ import sun.security.x509.X500Name;
++import sun.security.action.GetBooleanAction;
+ import sun.security.action.GetPropertyAction;
+
+ /**
+@@ -135,6 +136,14 @@
+ private final static String PROP_LIFETIME =
+ "sun.security.certpath.ldap.cache.lifetime";
+
++ /*
++ * Internal system property, that when set to "true", disables the
++ * JNDI application resource files lookup to prevent recursion issues
++ * when validating signed JARs with LDAP URLs in certificates.
++ */
++ private final static String PROP_DISABLE_APP_RESOURCE_FILES =
++ "sun.security.certpath.ldap.disable.app.resource.files";
++
+ static {
+ String s = AccessController.doPrivileged(
+ new GetPropertyAction(PROP_LIFETIME));
+@@ -236,6 +245,17 @@
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
+ "com.sun.jndi.ldap.LdapCtxFactory");
+ env.put(Context.PROVIDER_URL, url);
++
++ // If property is set to true, disable application resource file lookup.
++ boolean disableAppResourceFiles = AccessController.doPrivileged(
++ new GetBooleanAction(PROP_DISABLE_APP_RESOURCE_FILES));
++ if (disableAppResourceFiles) {
++ if (debug != null) {
++ debug.println("LDAPCertStore disabling app resource files");
++ }
++ env.put("com.sun.naming.disable.app.resource.files", "true");
++ }
++
+ try {
+ ctx = new InitialDirContext(env);
+ /*
+--- ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Tue Mar 18 12:35:25 2014 -0700
+@@ -25,11 +25,9 @@
+
+ package sun.security.rsa;
+
+-import java.math.BigInteger;
+ import java.util.*;
+
+ import java.security.*;
+-import java.security.interfaces.*;
+ import java.security.spec.*;
+
+ import javax.crypto.BadPaddingException;
+@@ -41,21 +39,41 @@
+ /**
+ * RSA padding and unpadding.
+ *
+- * Format of PKCS#1 v1.5 padding is:
++ * The various PKCS#1 versions can be found in the EMC/RSA Labs
++ * web site, which is currently:
++ *
++ * http://www.emc.com/emc-plus/rsa-labs/index.htm
++ *
++ * or in the IETF RFCs derived from the above PKCS#1 standards.
++ *
++ * RFC 2313: v1.5
++ * RFC 2437: v2.0
++ * RFC 3447: v2.1
++ *
++ * The format of PKCS#1 v1.5 padding is:
++ *
+ * 0x00 | BT | PS...PS | 0x00 | data...data
++ *
+ * where BT is the blocktype (1 or 2). The length of the entire string
+ * must be the same as the size of the modulus (i.e. 128 byte for a 1024 bit
+ * key). Per spec, the padding string must be at least 8 bytes long. That
+ * leaves up to (length of key in bytes) - 11 bytes for the data.
+ *
+- * OAEP padding is a bit more complicated and has a number of options.
+- * We support:
++ * OAEP padding was introduced in PKCS#1 v2.0 and is a bit more complicated
++ * and has a number of options. We support:
++ *
+ * . arbitrary hash functions ('Hash' in the specification), MessageDigest
+ * implementation must be available
+ * . MGF1 as the mask generation function
+ * . the empty string as the default value for label L and whatever
+ * specified in javax.crypto.spec.OAEPParameterSpec
+ *
++ * The algorithms (representations) are forwards-compatible: that is,
++ * the algorithm described in previous releases are in later releases.
++ * However, additional comments/checks/clarifications were added to the
++ * later versions based on real-world experience (e.g. stricter v1.5
++ * format checking.)
++ *
+ * Note: RSA keys should be at least 512 bits long
+ *
+ * @since 1.5
+@@ -156,7 +174,8 @@
+ throw new InvalidAlgorithmParameterException
+ ("Unsupported MGF algo: " + mgfName);
+ }
+- mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters()).getDigestAlgorithm();
++ mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters())
++ .getDigestAlgorithm();
+ PSource pSrc = spec.getPSource();
+ String pSrcAlgo = pSrc.getAlgorithm();
+ if (!pSrcAlgo.equalsIgnoreCase("PSpecified")) {
+@@ -198,7 +217,7 @@
+ */
+ private static byte[] getInitialHash(MessageDigest md,
+ byte[] digestInput) {
+- byte[] result = null;
++ byte[] result;
+ if ((digestInput == null) || (digestInput.length == 0)) {
+ String digestName = md.getAlgorithm();
+ result = emptyHashes.get(digestName);
+@@ -213,8 +232,8 @@
+ }
+
+ /**
+- * Return the maximum size of the plaintext data that can be processed using
+- * this object.
++ * Return the maximum size of the plaintext data that can be processed
++ * using this object.
+ */
+ public int getMaxDataSize() {
+ return maxDataSize;
+@@ -262,7 +281,7 @@
+ */
+ public byte[] unpad(byte[] padded) throws BadPaddingException {
+ if (padded.length != paddedSize) {
+- throw new BadPaddingException("Padded length must be " + paddedSize);
++ throw new BadPaddingException("Decryption error");
+ }
+ switch (type) {
+ case PAD_NONE:
+@@ -282,7 +301,8 @@
+ */
+ private byte[] padV15(byte[] data) throws BadPaddingException {
+ byte[] padded = new byte[paddedSize];
+- System.arraycopy(data, 0, padded, paddedSize - data.length, data.length);
++ System.arraycopy(data, 0, padded, paddedSize - data.length,
++ data.length);
+ int psSize = paddedSize - 3 - data.length;
+ int k = 0;
+ padded[k++] = 0;
+@@ -317,55 +337,53 @@
+ }
+
+ /**
+- * PKCS#1 v1.5 unpadding (blocktype 1 and 2).
++ * PKCS#1 v1.5 unpadding (blocktype 1 (signature) and 2 (encryption)).
+ *
+ * Note that we want to make it a constant-time operation
+ */
+ private byte[] unpadV15(byte[] padded) throws BadPaddingException {
+ int k = 0;
+- BadPaddingException bpe = null;
++ boolean bp = false;
+
+ if (padded[k++] != 0) {
+- bpe = new BadPaddingException("Data must start with zero");
++ bp = true;
+ }
+- if (padded[k++] != type && bpe == null) {
+- bpe = new BadPaddingException("Blocktype mismatch: " + padded[1]);
++ if (padded[k++] != type) {
++ bp = true;
+ }
+ int p = 0;
+ while (k < padded.length) {
+ int b = padded[k++] & 0xff;
+- if (b == 0 && p == 0) {
++ if ((b == 0) && (p == 0)) {
+ p = k;
+ }
+- if (k == padded.length && p == 0 && bpe == null) {
+- bpe = new BadPaddingException("Padding string not terminated");
++ if ((k == padded.length) && (p == 0)) {
++ bp = true;
+ }
+ if ((type == PAD_BLOCKTYPE_1) && (b != 0xff) &&
+- p == 0 && bpe == null) {
+- bpe = new BadPaddingException("Padding byte not 0xff: " + b);
++ (p == 0)) {
++ bp = true;
+ }
+ }
+ int n = padded.length - p;
+- if (n > maxDataSize && bpe == null) {
+- bpe = new BadPaddingException("Padding string too short");
++ if (n > maxDataSize) {
++ bp = true;
+ }
+
+ // copy useless padding array for a constant-time method
+- //
+- // Is it necessary?
+ byte[] padding = new byte[p];
+ System.arraycopy(padded, 0, padding, 0, p);
+
+ byte[] data = new byte[n];
+ System.arraycopy(padded, p, data, 0, n);
+
+- if (bpe == null) {
+- bpe = new BadPaddingException("Unused exception");
++ BadPaddingException bpe = new BadPaddingException("Decryption error");
++
++ if (bp) {
++ throw bpe;
+ } else {
+- throw bpe;
++ return data;
+ }
+-
+- return data;
+ }
+
+ /**
+@@ -424,10 +442,11 @@
+ */
+ private byte[] unpadOAEP(byte[] padded) throws BadPaddingException {
+ byte[] EM = padded;
++ boolean bp = false;
+ int hLen = lHash.length;
+
+ if (EM[0] != 0) {
+- throw new BadPaddingException("Data must start with zero");
++ bp = true;
+ }
+
+ int seedStart = 1;
+@@ -442,29 +461,48 @@
+ // verify lHash == lHash'
+ for (int i = 0; i < hLen; i++) {
+ if (lHash[i] != EM[dbStart + i]) {
+- throw new BadPaddingException("lHash mismatch");
++ bp = true;
+ }
+ }
+
+- // skip over padding (0x00 bytes)
+- int i = dbStart + hLen;
+- while (EM[i] == 0) {
+- i++;
+- if (i >= EM.length) {
+- throw new BadPaddingException("Padding string not terminated");
++ int padStart = dbStart + hLen;
++ int onePos = -1;
++
++ for (int i = padStart; i < EM.length; i++) {
++ int value = EM[i];
++ if (onePos == -1) {
++ if (value == 0x00) {
++ // continue;
++ } else if (value == 0x01) {
++ onePos = i;
++ } else { // Anything other than {0,1} is bad.
++ bp = true;
++ }
+ }
+ }
+
+- if (EM[i++] != 1) {
+- throw new BadPaddingException
+- ("Padding string not terminated by 0x01 byte");
++ // We either ran off the rails or found something other than 0/1.
++ if (onePos == -1) {
++ bp = true;
++ onePos = EM.length - 1; // Don't inadvertently return any data.
+ }
+
+- int mLen = EM.length - i;
+- byte[] m = new byte[mLen];
+- System.arraycopy(EM, i, m, 0, mLen);
++ int mStart = onePos + 1;
+
+- return m;
++ // copy useless padding array for a constant-time method
++ byte [] tmp = new byte[mStart - padStart];
++ System.arraycopy(EM, padStart, tmp, 0, tmp.length);
++
++ byte [] m = new byte[EM.length - mStart];
++ System.arraycopy(EM, mStart, m, 0, m.length);
++
++ BadPaddingException bpe = new BadPaddingException("Decryption error");
++
++ if (bp) {
++ throw bpe;
++ } else {
++ return m;
++ }
+ }
+
+ /**
+@@ -478,7 +516,7 @@
+ private void mgf1(byte[] seed, int seedOfs, int seedLen,
+ byte[] out, int outOfs, int maskLen) throws BadPaddingException {
+ byte[] C = new byte[4]; // 32 bit counter
+- byte[] digest = new byte[20]; // 20 bytes is length of SHA-1 digest
++ byte[] digest = new byte[mgfMd.getDigestLength()];
+ while (maskLen > 0) {
+ mgfMd.update(seed, seedOfs, seedLen);
+ mgfMd.update(C);
+@@ -499,5 +537,4 @@
+ }
+ }
+ }
+-
+ }
+--- ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Tue Mar 18 12:35:25 2014 -0700
+@@ -68,7 +68,7 @@
+
+ // performance optimization
+ private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
+- EnumSet.of(CryptoPrimitive.SIGNATURE);
++ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
+
+ // supported pairs of signature and hash algorithm
+ private final static Map<Integer, SignatureAndHashAlgorithm> supportedMap;
+--- ./jdk/src/share/classes/sun/security/tools/JarSigner.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/tools/JarSigner.java Tue Mar 18 12:35:25 2014 -0700
+@@ -88,9 +88,6 @@
+
+ private static final String META_INF = "META-INF/";
+
+- // prefix for new signature-related files in META-INF directory
+- private static final String SIG_PREFIX = META_INF + "SIG-";
+-
+ private static final Class[] PARAM_STRING = { String.class };
+
+ private static final String NONE = "NONE";
+@@ -1516,22 +1513,7 @@
+ * . META-INF/*.EC
+ */
+ private boolean signatureRelated(String name) {
+- String ucName = name.toUpperCase(Locale.ENGLISH);
+- if (ucName.equals(JarFile.MANIFEST_NAME) ||
+- ucName.equals(META_INF) ||
+- (ucName.startsWith(SIG_PREFIX) &&
+- ucName.indexOf("/") == ucName.lastIndexOf("/"))) {
+- return true;
+- }
+-
+- if (ucName.startsWith(META_INF) &&
+- SignatureFileVerifier.isBlockOrSF(ucName)) {
+- // .SF/.DSA/.RSA/.EC files in META-INF subdirs
+- // are not considered signature-related
+- return (ucName.indexOf("/") == ucName.lastIndexOf("/"));
+- }
+-
+- return false;
++ return SignatureFileVerifier.isSigningRelated(name);
+ }
+
+ Map<CodeSigner,String> cacheForSignerInfo = new IdentityHashMap<>();
+--- ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Tue Mar 18 12:35:25 2014 -0700
+@@ -153,6 +153,52 @@
+ return false;
+ }
+
++ /**
++ * Yet another utility method used by JarVerifier and JarSigner
++ * to determine what files are signature related, which includes
++ * the MANIFEST, SF files, known signature block files, and other
++ * unknown signature related files (those starting with SIG- with
++ * an optional [A-Z0-9]{1,3} extension right inside META-INF).
++ *
++ * @param s file name
++ * @return true if the input file name is signature related
++ */
++ public static boolean isSigningRelated(String name) {
++ name = name.toUpperCase(Locale.ENGLISH);
++ if (!name.startsWith("META-INF/")) {
++ return false;
++ }
++ name = name.substring(9);
++ if (name.indexOf('/') != -1) {
++ return false;
++ }
++ if (isBlockOrSF(name) || name.equals("MANIFEST.MF")) {
++ return true;
++ } else if (name.startsWith("SIG-")) {
++ // check filename extension
++ // see http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Digital_Signatures
++ // for what filename extensions are legal
++ int extIndex = name.lastIndexOf('.');
++ if (extIndex != -1) {
++ String ext = name.substring(extIndex + 1);
++ // validate length first
++ if (ext.length() > 3 || ext.length() < 1) {
++ return false;
++ }
++ // then check chars, must be in [a-zA-Z0-9] per the jar spec
++ for (int index = 0; index < ext.length(); index++) {
++ char cc = ext.charAt(index);
++ // chars are promoted to uppercase so skip lowercase checks
++ if ((cc < 'A' || cc > 'Z') && (cc < '0' || cc > '9')) {
++ return false;
++ }
++ }
++ }
++ return true; // no extension is OK
++ }
++ return false;
++ }
++
+ /** get digest from cache */
+
+ private MessageDigest getDigest(String algorithm)
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
+ "Alma-Ata Summer Time", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
+ "Anadyr Summer Time", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT",
+ "Alma-Ata Sommerzeit", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT",
+ "Anadyr Sommerzeit", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Aqtau Zeit", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT",
+ "Hora de verano de Alma-Ata", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT",
+ "Hora de verano de Anadyr", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Hora de Aqtau", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT",
+ "Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT",
+ "Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Heure d'Aqtau", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT",
+ "Ora estiva di Alma-Ata", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT",
+ "Ora estiva di Anadyr", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Ora di Aqtau", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"\u30a2\u30eb\u30de\u30a2\u30bf\u6642\u9593", "ALMT",
+ "\u30a2\u30eb\u30de\u30a2\u30bf\u590f\u6642\u9593", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u6642\u9593", "ANAT",
+ "\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u590f\u6642\u9593", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"\u30a2\u30af\u30bf\u30a6\u6642\u9593", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"\uc54c\ub9c8\uc544\ud0c0 \uc2dc\uac04", "ALMT",
+ "\uc54c\ub9c8\uc544\ud0c0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"\uc544\ub098\ub514\ub974 \uc2dc\uac04", "ANAT",
+ "\uc544\ub098\ub514\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"\uc545\ud0c0\uc6b0 \uc2dc\uac04", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Fuso hor\u00e1rio de Alma-Ata", "ALMT",
+ "Fuso hor\u00e1rio de ver\u00e3o de Alma-Ata", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Fuso hor\u00e1rio de Anadyr", "ANAT",
+ "Fuso hor\u00e1rio de ver\u00e3o de Anadyr", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Fuso hor\u00e1rio de Aqtau", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Alma-Ata, normaltid", "ALMT",
+ "Alma-Ata, sommartid", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr, normaltid", "ANAT",
+ "Anadyr, sommartid", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Aqtau, normaltid", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Alma-Ata \u65f6\u95f4", "ALMT",
+ "Alma-Ata \u590f\u4ee4\u65f6", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u65f6\u95f4", "ANAT",
+ "\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u65f6", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Aqtau \u65f6\u95f4", "AQTT",
+--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -483,7 +483,7 @@
+ {"Asia/Aden", ARAST},
+ {"Asia/Almaty", new String[] {"Alma-Ata \u6642\u9593", "ALMT",
+ "Alma-Ata \u590f\u4ee4\u6642\u9593", "ALMST"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u6642\u9593", "ANAT",
+ "\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u6642\u9593", "ANAST"}},
+ {"Asia/Aqtau", new String[] {"Aqtau \u6642\u9593", "AQTT",
+--- ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -4780,39 +4780,7 @@
+ } else if (log_file[0] != '\0' && (errstrm = fopen(log_file,"a+")) != NULL) {
+ return;
+ } else {
+- char log_file_name[PATH_MAX+100];
+- char tmpdir[PATH_MAX];
+-#ifdef WIN32
+- int n = GetTempPath(PATH_MAX,tmpdir); //API returns with trailing '\'
+- if (n < 1 || n > PATH_MAX) {
+- sprintf(tmpdir,"C:\\");
+- }
+- sprintf(log_file_name, "%sunpack.log", tmpdir);
+-#else
+- sprintf(tmpdir,"/tmp");
+- sprintf(log_file_name, "/tmp/unpack.log");
+-#endif
+- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
+- log_file = errstrm_name = saveStr(log_file_name);
+- return ;
+- }
+-
+- char *tname = tempnam(tmpdir,"#upkg");
+- if (tname == NULL) return;
+- sprintf(log_file_name, "%s", tname);
+- ::free(tname);
+- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
+- log_file = errstrm_name = saveStr(log_file_name);
+- return ;
+- }
+-#ifndef WIN32
+- sprintf(log_file_name, "/dev/null");
+- // On windows most likely it will fail.
+- if ( (errstrm = fopen(log_file_name, "a+")) != NULL) {
+- log_file = errstrm_name = saveStr(log_file_name);
+- return ;
+- }
+-#endif
++ fprintf(stderr, "Can not open log file %s\n", log_file);
+ // Last resort
+ // (Do not use stdout, since it might be jarout->jarfp.)
+ errstrm = stderr;
+--- ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Tue Mar 18 12:35:25 2014 -0700
+@@ -435,9 +435,7 @@
+ Private->PixelCount = (long)GifFile->Image.Width *
+ (long)GifFile->Image.Height;
+
+- DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
+-
+- return GIF_OK;
++ return DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
+ }
+
+ /******************************************************************************
+--- ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Tue Mar 18 12:35:25 2014 -0700
+@@ -249,6 +249,7 @@
+ /* fill the block */
+ len = (*env)->CallIntMethod(env, this, readID,
+ blockh, remain, blockLength + 1);
++ if (len > blockLength + 1) len = blockLength + 1;
+ if ((*env)->ExceptionOccurred(env)) {
+ return 0;
+ }
+--- ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Tue Mar 18 12:35:25 2014 -0700
+@@ -939,6 +939,9 @@
+ JPEGImageReader_readInputDataID,
+ sb->hstreamBuffer, 0,
+ sb->bufferLength);
++ if ((ret > 0) && ((unsigned int)ret > sb->bufferLength)) {
++ ret = sb->bufferLength;
++ }
+ if ((*env)->ExceptionOccurred(env)
+ || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
+ cinfo->err->error_exit((j_common_ptr) cinfo);
+@@ -1035,6 +1038,7 @@
+ JPEGImageReader_readInputDataID,
+ sb->hstreamBuffer,
+ offset, buflen);
++ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
+ if ((*env)->ExceptionOccurred(env)
+ || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
+ cinfo->err->error_exit((j_common_ptr) cinfo);
+--- ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Tue Mar 18 12:35:25 2014 -0700
+@@ -349,6 +349,12 @@
+
+ TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+ compptr->dc_tbl_no, compptr->ac_tbl_no);
++
++ /* This CSi (cc) should differ from the previous CSi */
++ for (ci = 0; ci < i; ci++) {
++ if (cinfo->cur_comp_info[ci] == compptr)
++ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
++ }
+ }
+
+ /* Collect the additional scan parameters Ss, Se, Ah/Al. */
+--- ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Tue Mar 18 12:35:25 2014 -0700
+@@ -289,6 +289,7 @@
+ buflen = (*env)->GetArrayLength(env, src->hInputBuffer);
+ ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
+ src->hInputBuffer, 0, buflen);
++ if (ret > buflen) ret = buflen;
+ if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
+ cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
+ }
+@@ -349,6 +350,7 @@
+ }
+ ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
+ src->hInputBuffer, offset, buflen);
++ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
+ if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
+ cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
+ }
+@@ -424,6 +426,7 @@
+ ret = (*env)->CallIntMethod(env, src->hInputStream,
+ InputStream_readID,
+ src->hInputBuffer, 0, buflen);
++ if (ret > buflen) ret = buflen;
+ if ((*env)->ExceptionOccurred(env)) {
+ cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
+ }
+--- ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Tue Mar 18 12:35:25 2014 -0700
+@@ -1862,6 +1862,9 @@
+
+ info_ptr->bit_depth = 8;
+ info_ptr->num_trans = 0;
++
++ if (png_ptr->palette == NULL)
++ png_error (png_ptr, "Palette is NULL in indexed image");
+ }
+ else
+ {
+--- ./jdk/src/share/native/sun/awt/libpng/pngset.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/libpng/pngset.c Tue Mar 18 12:35:25 2014 -0700
+@@ -512,6 +512,17 @@
+ }
+ }
+
++ if ((num_palette > 0 && palette == NULL) ||
++ (num_palette == 0
++# ifdef PNG_MNG_FEATURES_SUPPORTED
++ && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
++# endif
++ ))
++ {
++ png_error(png_ptr, "Invalid palette");
++ return;
++ }
++
+ /* It may not actually be necessary to set png_ptr->palette here;
+ * we do it for backward compatibility with the way the png_handle_tRNS
+ * function used to do the allocation.
+--- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue Mar 18 12:35:25 2014 -0700
+@@ -228,6 +228,49 @@
+ }
+ }
+
++/*
++ * We have to make sure that awt_setPixels can be safely applied to the given pair of
++ * raster and mlib image.
++ *
++ * In particular, make sure that
++ * - dimension is the same
++ * - number of channels in mlib image corresponds to the number of bands in the raster
++ * - sample size in image and raster are the same.
++ *
++ * Returns:
++ * -1 to indicate failure,
++ * 1 to indicate success
++ */
++static int setPixelsFormMlibImage(JNIEnv *env, RasterS_t *rasterP, mlib_image* img) {
++ if (rasterP->width != img->width || rasterP->height != img->height) {
++ /* dimension does not match */
++ return -1;
++ }
++
++ if (rasterP->numBands != img->channels) {
++ /* number of bands does not match */
++ return -1;
++ }
++
++ switch (rasterP->dataType) {
++ case BYTE_DATA_TYPE:
++ if (img->type != MLIB_BYTE) {
++ return -1;
++ }
++ break;
++ case SHORT_DATA_TYPE:
++ if (img->type != MLIB_SHORT && img->type != MLIB_USHORT) {
++ return -1;
++ }
++ break;
++ default:
++ /* awt_setPixels does not support such rasters */
++ return -1;
++ }
++
++ return awt_setPixels(env, rasterP, mlib_ImageGetData(img));
++}
++
+ /***************************************************************************
+ * External Functions *
+ ***************************************************************************/
+@@ -700,7 +743,9 @@
+
+ /* Means that we couldn't write directly into the destination buffer */
+ if (ddata == NULL) {
+- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
++ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
++ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
++ }
+ }
+
+ /* Release the pinned memory */
+@@ -1106,7 +1151,7 @@
+ if (ddata == NULL) {
+ /* Need to store it back into the array */
+ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
+- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
++ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
+ }
+ }
+
+@@ -1432,6 +1477,14 @@
+ retStatus = 0;
+ }
+
++ /* Release the LUT */
++ for (i=0; i < lut_nbands; i++) {
++ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
++ (jbyte *) jtable[i].table, JNI_ABORT);
++ }
++ free ((void *) jtable);
++ free ((void *) tbl);
++
+ /*
+ * Means that we couldn't write directly into
+ * the destination buffer
+@@ -1445,13 +1498,6 @@
+ }
+ }
+
+- /* Release the LUT */
+- for (i=0; i < lut_nbands; i++) {
+- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
+- (jbyte *) jtable[i].table, JNI_ABORT);
+- }
+- free ((void *) jtable);
+- free ((void *) tbl);
+
+ /* Release the pinned memory */
+ freeArray(env, srcImageP, src, sdata, dstImageP, dst, ddata);
+@@ -1669,18 +1715,20 @@
+ retStatus = 0;
+ }
+
++ /* Release the LUT */
++ for (i=0; i < lut_nbands; i++) {
++ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
++ (jbyte *) jtable[i].table, JNI_ABORT);
++ }
++
+ /*
+ * Means that we couldn't write directly into
+ * the destination buffer
+ */
+ if (ddata == NULL) {
+- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
+- }
+-
+- /* Release the LUT */
+- for (i=0; i < lut_nbands; i++) {
+- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
+- (jbyte *) jtable[i].table, JNI_ABORT);
++ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
++ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
++ }
+ }
+
+ /* Release the pinned memory */
+@@ -2640,7 +2688,7 @@
+ }
+ }
+ else if (mlibImP->type == MLIB_SHORT) {
+- return awt_setPixels(env, rasterP, mlibImP->data);
++ return setPixelsFormMlibImage(env, rasterP, mlibImP);
+ }
+ }
+ else {
+--- ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -154,6 +154,7 @@
+ TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
+ if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) {
+ LEReferenceToArrayOf<LookupValue> valueArray(lookupTable8, success, &lookupTable8->valueArray[0], glyphCount);
++ if (LE_FAILURE(success)) { return newGlyph; }
+ newGlyph = SWAPW(valueArray(glyphCode - firstGlyph, success));
+ }
+ }
+--- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -110,6 +110,8 @@
+ LEErrorCode &success,
+ le_bool backtrack)
+ {
++ if (LE_FAILURE(success)) { return FALSE; }
++
+ le_int32 direction = 1;
+ le_int32 match = 0;
+
+@@ -255,6 +257,7 @@
+ le_uint16 matchCount = SWAPW(subRuleTable->glyphCount) - 1;
+ le_uint16 substCount = SWAPW(subRuleTable->substCount);
+ LEReferenceToArrayOf<TTGlyphID> inputGlyphArray(base, success, subRuleTable->inputGlyphArray, matchCount+2);
++ if (LE_FAILURE(success)) { return 0; }
+ if (matchGlyphIDs(inputGlyphArray, matchCount, glyphIterator)) {
+ LEReferenceToArrayOf<SubstitutionLookupRecord>
+ substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount], substCount);
+@@ -315,6 +318,7 @@
+
+ LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1);
+
++ if (LE_FAILURE(success)) { return 0; }
+ if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) {
+ LEReferenceToArrayOf<SubstitutionLookupRecord>
+ substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount);
+@@ -573,7 +577,7 @@
+ if (matchGlyphClasses(inputClassArray, inputGlyphCount, glyphIterator, inputClassDefinitionTable, success)) {
+ LEReferenceToArrayOf<SubstitutionLookupRecord>
+ substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) lookaheadClassArray.getAlias(lookaheadGlyphCount + 1, success), substCount);
+-
++ if (LE_FAILURE(success)) { return 0; }
+ applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
+
+ return inputGlyphCount + 1;
+@@ -601,6 +605,7 @@
+ le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount);
+ le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]);
+ LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset
++ if (LE_FAILURE(success)) { return 0; }
+ const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]);
+
+ if( LE_FAILURE(success) ) { return 0; }
+--- ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -95,7 +95,7 @@
+
+ if (actionOffset != 0) {
+ LEReferenceTo<LigatureActionEntry> ap(stHeader, success, ligActionOffset); // byte offset
+- ap.addObject(ligActionIndex - 1, success); // index offset ( one before the actual start, because we will pre-increment)
++ ap.addObject(ligActionIndex, success);
+ LEReferenceToArrayOf<TTGlyphID> ligatureTable(stHeader, success, ligatureOffset, LE_UNBOUNDED_ARRAY);
+ LigatureActionEntry action;
+ le_int32 offset, i = 0;
+@@ -111,7 +111,6 @@
+ do {
+ le_uint32 componentGlyph = componentStack[m--]; // pop off
+
+- ap.addObject(success);
+ action = SWAPL(*ap.getAlias());
+
+ if (m < 0) {
+@@ -145,7 +144,8 @@
+ LE_DEBUG_BAD_FONT("m<0")
+ }
+ #endif
+- } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
++ ap.addObject(success);
++ } while (LE_SUCCESS(success) && !(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
+
+ while (mm >= 0) {
+ if (++m >= nComponents) {
+--- ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -282,6 +282,7 @@
+
+ for (le_uint16 feature = 0; feature < featureCount; feature += 1) {
+ LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
++ if (LE_FAILURE(success)) { continue; }
+ le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success));
+
+ // don't add the required feature to the list more than once...
+--- ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -67,6 +67,7 @@
+
+ LEPoint markAnchor;
+ LEReferenceTo<MarkArray> markArray(base, success, (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)));
++ if(LE_FAILURE(success)) return 0;
+ le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success);
+ le_uint16 mcCount = SWAPW(classCount);
+
+--- ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -79,8 +79,8 @@
+
+ Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success)
+ {
++ if(LE_FAILURE(success)) return 0;
+ const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias();
+- if(LE_FAILURE(success)) return 0;
+
+ le_uint32 recordCount = records.getCount();
+ le_uint8 bit = highBit(recordCount);
+--- ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -73,6 +73,7 @@
+
+ if (offset != 0) {
+ LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY);
++ if (LE_FAILURE(success)) { continue; }
+ TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success));
+ glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
+ }
+--- ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -97,6 +97,7 @@
+
+ LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY);
+ EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success);
++ if (LE_FAILURE(success)) { break; }
+ LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
+ currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex);
+ LE_STATE_PATIENCE_INCR(currGlyph);
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Tue Mar 18 12:35:25 2014 -0700
+@@ -81,7 +81,7 @@
+ cmsUInt32Number surround;
+ cmsFloat64Number n, Nbb, Ncb, z, FL, D;
+
+- cmsContext ContextID;
++ cmsContext ContextID;
+
+ } cmsCIECAM02;
+
+@@ -467,6 +467,7 @@
+ CAM02COLOR clr;
+ cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
++ memset(&clr, 0, sizeof(clr));
+ _cmsAssert(lpMod != NULL);
+ _cmsAssert(pIn != NULL);
+ _cmsAssert(pOut != NULL);
+@@ -491,6 +492,7 @@
+ CAM02COLOR clr;
+ cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
++ memset(&clr, 0, sizeof(clr));
+ _cmsAssert(lpMod != NULL);
+ _cmsAssert(pIn != NULL);
+ _cmsAssert(pOut != NULL);
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Tue Mar 18 12:35:25 2014 -0700
+@@ -59,8 +59,8 @@
+ // IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
+
+
+-#define MAXID 128 // Max lenght of identifier
+-#define MAXSTR 1024 // Max lenght of string
++#define MAXID 128 // Max length of identifier
++#define MAXSTR 1024 // Max length of string
+ #define MAXTABLES 255 // Max Number of tables in a single stream
+ #define MAXINCLUDE 20 // Max number of nested includes
+
+@@ -383,28 +383,28 @@
+ //Forward declaration of some internal functions
+ static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);
+
+-// Checks if c is a separator
++// Checks whatever c is a separator
+ static
+ cmsBool isseparator(int c)
+ {
+- return (c == ' ') || (c == '\t') || (c == '\r');
++ return (c == ' ') || (c == '\t') ;
+ }
+
+-// Checks whatever if c is a valid identifier char
++// Checks whatever c is a valid identifier char
+ static
+ cmsBool ismiddle(int c)
+ {
+ return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
+ }
+
+-// Checks whatsever if c is a valid identifier middle char.
++// Checks whatsever c is a valid identifier middle char.
+ static
+ cmsBool isidchar(int c)
+ {
+ return isalnum(c) || ismiddle(c);
+ }
+
+-// Checks whatsever if c is a valid identifier first char.
++// Checks whatsever c is a valid identifier first char.
+ static
+ cmsBool isfirstidchar(int c)
+ {
+@@ -436,7 +436,6 @@
+ }
+
+
+-
+ // Makes a file path based on a given reference path
+ // NOTE: this function doesn't check if the path exists or even if it's legal
+ static
+@@ -634,6 +633,9 @@
+ cmsFloat64Number dnum = 0.0;
+ int sign = 1;
+
++ // keep safe
++ if (Buffer == NULL) return 0.0;
++
+ if (*Buffer == '-' || *Buffer == '+') {
+
+ sign = (*Buffer == '-') ? -1 : 1;
+@@ -867,6 +869,14 @@
+
+
+ // Next line
++ case '\r':
++ NextCh(it8);
++ if (it8 ->ch == '\n')
++ NextCh(it8);
++ it8->sy = SEOLN;
++ it8->lineno++;
++ break;
++
+ case '\n':
+ NextCh(it8);
+ it8->sy = SEOLN;
+@@ -876,7 +886,7 @@
+ // Comment
+ case '#':
+ NextCh(it8);
+- while (it8->ch && it8->ch != '\n')
++ while (it8->ch && it8->ch != '\n' && it8->ch != '\r')
+ NextCh(it8);
+
+ it8->sy = SCOMMENT;
+@@ -994,6 +1004,9 @@
+ {
+ switch (it8->sy) {
+
++ case SEOLN: // Empty value
++ Buffer[0]=0;
++ break;
+ case SIDENT: strncpy(Buffer, it8->id, max);
+ Buffer[max-1]=0;
+ break;
+@@ -1143,9 +1156,9 @@
+ if (*Key != '#') { // Comments are ignored
+
+ if (cmsstrcasecmp(Key, p->Keyword) == 0)
+- break;
++ break;
+ }
+- }
++ }
+
+ if (p == NULL)
+ return FALSE;
+@@ -1155,11 +1168,13 @@
+
+ for (; p != NULL; p = p->NextSubkey) {
+
++ if (p ->Subkey == NULL) continue;
++
+ if (LastPtr) *LastPtr = p;
+
+ if (cmsstrcasecmp(Subkey, p->Subkey) == 0)
+- return TRUE;
+- }
++ return TRUE;
++ }
+
+ return FALSE;
+ }
+@@ -1282,7 +1297,7 @@
+
+ it8 ->nTable = nTable;
+
+- return nTable;
++ return (cmsInt32Number) nTable;
+ }
+
+
+@@ -1387,7 +1402,7 @@
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ char Buffer[1024];
+
+- sprintf(Buffer, "%d", Val);
++ sprintf(Buffer, "%u", Val);
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;
+ }
+@@ -1424,6 +1439,8 @@
+ {
+ const char *v = cmsIT8GetProperty(hIT8, cProp);
+
++ if (v == NULL) return 0.0;
++
+ return ParseFloatNumber(v);
+ }
+
+@@ -1456,7 +1473,7 @@
+ t -> nSamples = 10;
+ }
+
+- t -> DataFormat = (char**) AllocChunk (it8, (t->nSamples + 1) * sizeof(char *));
++ t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));
+ if (t->DataFormat == NULL) {
+
+ SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
+@@ -1512,7 +1529,7 @@
+ t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+ t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+- t-> Data = (char**)AllocChunk (it8, (t->nSamples + 1) * (t->nPatches + 1) *sizeof (char*));
++ t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));
+ if (t->Data == NULL) {
+
+ SynError(it8, "AllocateDataSet: Unable to allocate data array");
+@@ -1571,7 +1588,7 @@
+ if (str == NULL)
+ str = " ";
+
+- // Lenghth to write
++ // Length to write
+ len = (cmsUInt32Number) strlen(str);
+ f ->Used += len;
+
+@@ -2095,7 +2112,7 @@
+ NextCh(it8);
+
+ // If a newline is found, then this is a type string
+- if (it8 ->ch == '\n') {
++ if (it8 ->ch == '\n' || it8->ch == '\r') {
+
+ cmsIT8SetSheetType(it8, it8 ->id);
+ InSymbol(it8);
+@@ -2210,7 +2227,7 @@
+ char Buffer[256];
+
+ char *Type = p ->Value;
+- int nTable = k;
++ int nTable = (int) k;
+
+ snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
+
+@@ -2564,6 +2581,8 @@
+
+ Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+
++ if (Buffer == NULL) return 0.0;
++
+ return ParseFloatNumber(Buffer);
+ }
+
+@@ -2776,7 +2795,7 @@
+ if (Formatter == NULL)
+ strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+ else
+- strcpy(it8->DoubleFormatter, Formatter);
++ strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));
+
+ it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;
+ }
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Tue Mar 18 12:35:25 2014 -0700
+@@ -270,7 +270,7 @@
+ // m2 holds CHAD from output white to D50 times abs. col. scaling
+
+ // Observer is not adapted, undo the chromatic adaptation
+- _cmsMAT3per(m, &m3, ChromaticAdaptationMatrixOut);
++ _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);
+
+ m3 = *ChromaticAdaptationMatrixIn;
+ if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;
+@@ -411,57 +411,61 @@
+ // Handle PCS mismatches. A specialized stage is added to the LUT in such case
+ switch (InPCS) {
+
+- case cmsSigXYZData: // Input profile operates in XYZ
++ case cmsSigXYZData: // Input profile operates in XYZ
+
+- switch (OutPCS) {
++ switch (OutPCS) {
+
+- case cmsSigXYZData: // XYZ -> XYZ
+- if (!IsEmptyLayer(m, off))
+- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
+- break;
++ case cmsSigXYZData: // XYZ -> XYZ
++ if (!IsEmptyLayer(m, off) &&
++ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
++ return FALSE;
++ break;
+
+- case cmsSigLabData: // XYZ -> Lab
+- if (!IsEmptyLayer(m, off))
+- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
+- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
+- break;
++ case cmsSigLabData: // XYZ -> Lab
++ if (!IsEmptyLayer(m, off) &&
++ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
++ return FALSE;
++ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
++ return FALSE;
++ break;
+
+- default:
+- return FALSE; // Colorspace mismatch
+- }
+- break;
++ default:
++ return FALSE; // Colorspace mismatch
++ }
++ break;
+
++ case cmsSigLabData: // Input profile operates in Lab
+
+- case cmsSigLabData: // Input profile operates in Lab
++ switch (OutPCS) {
+
+- switch (OutPCS) {
++ case cmsSigXYZData: // Lab -> XYZ
+
+- case cmsSigXYZData: // Lab -> XYZ
++ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))
++ return FALSE;
++ if (!IsEmptyLayer(m, off) &&
++ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
++ return FALSE;
++ break;
+
+- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
+- if (!IsEmptyLayer(m, off))
+- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
+- break;
++ case cmsSigLabData: // Lab -> Lab
+
+- case cmsSigLabData: // Lab -> Lab
+-
+- if (!IsEmptyLayer(m, off)) {
+- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
+- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
+- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
+- }
+- break;
+-
+- default:
+- return FALSE; // Mismatch
++ if (!IsEmptyLayer(m, off)) {
++ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||
++ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||
++ !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
++ return FALSE;
+ }
+ break;
+
++ default:
++ return FALSE; // Mismatch
++ }
++ break;
+
+- // On colorspaces other than PCS, check for same space
+- default:
+- if (InPCS != OutPCS) return FALSE;
+- break;
++ // On colorspaces other than PCS, check for same space
++ default:
++ if (InPCS != OutPCS) return FALSE;
++ break;
+ }
+
+ return TRUE;
+@@ -497,7 +501,8 @@
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+ {
+- cmsPipeline* Lut, *Result;
++ cmsPipeline* Lut = NULL;
++ cmsPipeline* Result;
+ cmsHPROFILE hProfile;
+ cmsMAT3 m;
+ cmsVEC3 off;
+@@ -593,8 +598,11 @@
+ }
+
+ // Concatenate to the output LUT
+- cmsPipelineCat(Result, Lut);
++ if (!cmsPipelineCat(Result, Lut))
++ goto Error;
++
+ cmsPipelineFree(Lut);
++ Lut = NULL;
+
+ // Update current space
+ CurrentColorSpace = ColorSpaceOut;
+@@ -604,6 +612,7 @@
+
+ Error:
+
++ if (Lut != NULL) cmsPipelineFree(Lut);
+ if (Result != NULL) cmsPipelineFree(Result);
+ return NULL;
+
+@@ -742,7 +751,8 @@
+ if (CLUT == NULL) goto Error;
+
+ // This is the one and only MPE in this LUT
+- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
++ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
++ goto Error;
+
+ // Sample it. We cannot afford pre/post linearization this time.
+ if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))
+@@ -959,7 +969,8 @@
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
+ if (CLUT == NULL) goto Cleanup;
+
+- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
++ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
++ goto Cleanup;
+
+ cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);
+
+@@ -1057,7 +1068,7 @@
+ }
+
+ // The plug-in registration. User can add new intents or override default routines
+-cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;
+ cmsIntentsList* fl;
+@@ -1072,7 +1083,7 @@
+ fl = SearchIntent(Plugin ->Intent);
+
+ if (fl == NULL) {
+- fl = (cmsIntentsList*) _cmsPluginMalloc(sizeof(cmsIntentsList));
++ fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));
+ if (fl == NULL) return FALSE;
+ }
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Tue Mar 18 12:35:25 2014 -0700
+@@ -302,8 +302,6 @@
+ return NULL;
+ }
+
+-
+-
+ chunk ->BlockSize = Initial;
+ chunk ->Used = 0;
+ chunk ->next = NULL;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Tue Mar 18 12:35:25 2014 -0700
+@@ -30,7 +30,7 @@
+ //---------------------------------------------------------------------------------
+ //
+ // Little Color Management System
+-// Copyright (c) 1998-2012 Marti Maria Saguer
++// Copyright (c) 1998-2013 Marti Maria Saguer
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the "Software"),
+@@ -99,7 +99,7 @@
+ static _cmsParametricCurvesCollection* ParametricCurves = &DefaultCurves;
+
+ // As a way to install new parametric curves
+-cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;
+ _cmsParametricCurvesCollection* fl;
+@@ -110,7 +110,7 @@
+ return TRUE;
+ }
+
+- fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(sizeof(_cmsParametricCurvesCollection));
++ fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(id, sizeof(_cmsParametricCurvesCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+@@ -258,7 +258,8 @@
+ }
+
+ p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);
+- return p;
++ if (p->InterpParams != NULL)
++ return p;
+
+ Error:
+ if (p -> Segments) _cmsFree(ContextID, p ->Segments);
+@@ -423,7 +424,7 @@
+ if (e > 0)
+ Val = pow(e, Params[0]) + Params[5];
+ else
+- Val = 0;
++ Val = Params[5];
+ }
+ else
+ Val = R*Params[3] + Params[6];
+@@ -458,7 +459,7 @@
+ e = Params[1]*R + Params[2];
+
+ if (e < 0)
+- Val = 0;
++ Val = Params[3];
+ else
+ Val = pow(e, Params[0]) + Params[3];
+ break;
+@@ -478,7 +479,7 @@
+
+ e = Params[2] * pow(R, Params[0]) + Params[3];
+ if (e <= 0)
+- Val = 0;
++ Val = Params[4];
+ else
+ Val = Params[1]*log10(e) + Params[4];
+ break;
+@@ -544,7 +545,7 @@
+ // Type == 0 means segment is sampled
+ if (g ->Segments[i].Type == 0) {
+
+- cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0);
++ cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
+ cmsFloat32Number Out;
+
+ // Setup the table (TODO: clean that)
+@@ -629,20 +630,21 @@
+ // Use a segmented curve to store the floating point table
+ cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])
+ {
+- cmsCurveSegment Seg[2];
++ cmsCurveSegment Seg[3];
+
+- // Initialize segmented curve part up to 0
+- Seg[0].x0 = -1;
++ // A segmented tone curve should have function segments in the first and last positions
++ // Initialize segmented curve part up to 0 to constant value = samples[0]
++ Seg[0].x0 = MINUS_INF;
+ Seg[0].x1 = 0;
+ Seg[0].Type = 6;
+
+ Seg[0].Params[0] = 1;
+ Seg[0].Params[1] = 0;
+ Seg[0].Params[2] = 0;
+- Seg[0].Params[3] = 0;
++ Seg[0].Params[3] = values[0];
+ Seg[0].Params[4] = 0;
+
+- // From zero to any
++ // From zero to 1
+ Seg[1].x0 = 0;
+ Seg[1].x1 = 1.0;
+ Seg[1].Type = 0;
+@@ -650,7 +652,19 @@
+ Seg[1].nGridPoints = nEntries;
+ Seg[1].SampledPoints = (cmsFloat32Number*) values;
+
+- return cmsBuildSegmentedToneCurve(ContextID, 2, Seg);
++ // Final segment is constant = lastsample
++ Seg[2].x0 = 1.0;
++ Seg[2].x1 = PLUS_INF;
++ Seg[2].Type = 6;
++
++ Seg[2].Params[0] = 1;
++ Seg[2].Params[1] = 0;
++ Seg[2].Params[2] = 0;
++ Seg[2].Params[3] = values[nEntries-1];
++ Seg[2].Params[4] = 0;
++
++
++ return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);
+ }
+
+ // Parametric curves
+@@ -993,7 +1007,7 @@
+
+ if (Tab == NULL) return FALSE;
+
+- if (cmsIsToneCurveLinear(Tab)) return FALSE; // Nothing to do
++ if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do
+
+ nItems = Tab -> nEntries;
+
+@@ -1020,11 +1034,20 @@
+
+ if (z[i] == 0.) Zeros++;
+ if (z[i] >= 65535.) Poles++;
+- if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
++ if (z[i] < z[i-1]) {
++ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic.");
++ return FALSE;
++ }
+ }
+
+- if (Zeros > (nItems / 3)) return FALSE; // Degenerated, mostly zeros
+- if (Poles > (nItems / 3)) return FALSE; // Degenerated, mostly poles
++ if (Zeros > (nItems / 3)) {
++ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros.");
++ return FALSE;
++ }
++ if (Poles > (nItems / 3)) {
++ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles.");
++ return FALSE;
++ }
+
+ // Seems ok
+ for (i=0; i < nItems; i++) {
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Tue Mar 18 12:35:25 2014 -0700
+@@ -249,13 +249,10 @@
+ cmsFloat64Number dE1, dE2, ErrorRatio;
+
+ // Assume in-gamut by default.
+- dE1 = 0.;
+- dE2 = 0;
+ ErrorRatio = 1.0;
+
+ // Convert input to Lab
+- if (t -> hInput != NULL)
+- cmsDoTransform(t -> hInput, In, &LabIn1, 1);
++ cmsDoTransform(t -> hInput, In, &LabIn1, 1);
+
+ // converts from PCS to colorant. This always
+ // does return in-gamut values,
+@@ -267,7 +264,7 @@
+ memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
+
+ // Try again, but this time taking Check as input
+- cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
++ cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
+ cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
+
+ // Take difference of direct value
+@@ -374,7 +371,7 @@
+ ProfileList[nGamutPCSposition] = hLab;
+ BPCList[nGamutPCSposition] = 0;
+ AdaptationList[nGamutPCSposition] = 1.0;
+- Intents[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
++ IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
+
+
+ ColorSpace = cmsGetColorSpace(hGamut);
+@@ -385,45 +382,48 @@
+
+ // 16 bits to Lab double
+ Chain.hInput = cmsCreateExtendedTransform(ContextID,
+- nGamutPCSposition + 1,
+- ProfileList,
+- BPCList,
+- Intents,
+- AdaptationList,
+- NULL, 0,
+- dwFormat, TYPE_Lab_DBL,
+- cmsFLAGS_NOCACHE);
++ nGamutPCSposition + 1,
++ ProfileList,
++ BPCList,
++ IntentList,
++ AdaptationList,
++ NULL, 0,
++ dwFormat, TYPE_Lab_DBL,
++ cmsFLAGS_NOCACHE);
+
+
+ // Does create the forward step. Lab double to device
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+ Chain.hForward = cmsCreateTransformTHR(ContextID,
+- hLab, TYPE_Lab_DBL,
+- hGamut, dwFormat,
+- INTENT_RELATIVE_COLORIMETRIC,
+- cmsFLAGS_NOCACHE);
++ hLab, TYPE_Lab_DBL,
++ hGamut, dwFormat,
++ INTENT_RELATIVE_COLORIMETRIC,
++ cmsFLAGS_NOCACHE);
+
+ // Does create the backwards step
+ Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
+- hLab, TYPE_Lab_DBL,
+- INTENT_RELATIVE_COLORIMETRIC,
+- cmsFLAGS_NOCACHE);
++ hLab, TYPE_Lab_DBL,
++ INTENT_RELATIVE_COLORIMETRIC,
++ cmsFLAGS_NOCACHE);
+
+
+ // All ok?
+- if (Chain.hForward && Chain.hReverse) {
++ if (Chain.hInput && Chain.hForward && Chain.hReverse) {
+
+ // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
+ // dE when doing a transform back and forth on the colorimetric intent.
+
+ Gamut = cmsPipelineAlloc(ContextID, 3, 1);
+-
+ if (Gamut != NULL) {
+
+- CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
+- cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT);
+-
+- cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
++ CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
++ if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
++ cmsPipelineFree(Gamut);
++ Gamut = NULL;
++ }
++ else {
++ cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
++ }
+ }
+ }
+ else
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Tue Mar 18 12:35:25 2014 -0700
+@@ -83,7 +83,6 @@
+
+
+ // Set the interpolation method
+-
+ cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p)
+ {
+ // Invoke factory, possibly in the Plug-in
+@@ -215,6 +214,11 @@
+ Output[0] = LinearInterp(rest, y0, y1);
+ }
+
++// To prevent out of bounds indexing
++cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v)
++{
++ return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);
++}
+
+ // Floating-point version of 1D interpolation
+ static
+@@ -227,13 +231,15 @@
+ int cell0, cell1;
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
++ val2 = fclamp(Value[0]);
++
+ // if last value...
+- if (Value[0] == 1.0) {
++ if (val2 == 1.0) {
+ Output[0] = LutTable[p -> Domain[0]];
+ return;
+ }
+
+- val2 = p -> Domain[0] * Value[0];
++ val2 *= p -> Domain[0];
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+@@ -292,13 +298,15 @@
+ cmsUInt32Number OutChan;
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
++ val2 = fclamp(Value[0]);
++
+ // if last value...
+- if (Value[0] == 1.0) {
++ if (val2 == 1.0) {
+ Output[0] = LutTable[p -> Domain[0]];
+ return;
+ }
+
+- val2 = p -> Domain[0] * Value[0];
++ val2 *= p -> Domain[0];
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+@@ -339,8 +347,8 @@
+ dxy;
+
+ TotalOut = p -> nOutputs;
+- px = Input[0] * p->Domain[0];
+- py = Input[1] * p->Domain[1];
++ px = fclamp(Input[0]) * p->Domain[0];
++ py = fclamp(Input[1]) * p->Domain[1];
+
+ x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+ y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+@@ -454,20 +462,9 @@
+ TotalOut = p -> nOutputs;
+
+ // We need some clipping here
+- px = Input[0];
+- py = Input[1];
+- pz = Input[2];
+-
+- if (px < 0) px = 0;
+- if (px > 1) px = 1;
+- if (py < 0) py = 0;
+- if (py > 1) py = 1;
+- if (pz < 0) pz = 0;
+- if (pz > 1) pz = 1;
+-
+- px *= p->Domain[0];
+- py *= p->Domain[1];
+- pz *= p->Domain[2];
++ px = fclamp(Input[0]) * p->Domain[0];
++ py = fclamp(Input[1]) * p->Domain[1];
++ pz = fclamp(Input[2]) * p->Domain[2];
+
+ x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+ y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+@@ -609,20 +606,9 @@
+ TotalOut = p -> nOutputs;
+
+ // We need some clipping here
+- px = Input[0];
+- py = Input[1];
+- pz = Input[2];
+-
+- if (px < 0) px = 0;
+- if (px > 1) px = 1;
+- if (py < 0) py = 0;
+- if (py > 1) py = 1;
+- if (pz < 0) pz = 0;
+- if (pz > 1) pz = 1;
+-
+- px *= p->Domain[0];
+- py *= p->Domain[1];
+- pz *= p->Domain[2];
++ px = fclamp(Input[0]) * p->Domain[0];
++ py = fclamp(Input[1]) * p->Domain[1];
++ pz = fclamp(Input[2]) * p->Domain[2];
+
+ x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);
+ y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);
+@@ -844,7 +830,7 @@
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+ {
+- const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
++ const cmsUInt16Number* LutTable;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+@@ -1039,8 +1025,7 @@
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+-
+- pk = Input[0] * p->Domain[0];
++ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+@@ -1127,7 +1112,7 @@
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+- pk = Input[0] * p->Domain[0];
++ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+@@ -1214,7 +1199,7 @@
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+- pk = Input[0] * p->Domain[0];
++ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+@@ -1299,7 +1284,7 @@
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+- pk = Input[0] * p->Domain[0];
++ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+@@ -1384,7 +1369,7 @@
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+- pk = Input[0] * p->Domain[0];
++ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Tue Mar 18 12:35:25 2014 -0700
+@@ -154,7 +154,6 @@
+ return iohandler;
+
+ Error:
+- if (fm) _cmsFree(ContextID, fm);
+ if (iohandler) _cmsFree(ContextID, iohandler);
+ return NULL;
+
+@@ -223,12 +222,17 @@
+
+ // Writes data to memory, also keeps used space for further reference.
+ static
+-cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
++cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
+ {
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+ if (ResData == NULL) return FALSE; // Housekeeping
+
++ // Check for available space. Clip.
++ if (iohandler ->UsedSpace + size > ResData->Size) {
++ size = ResData ->Size - iohandler ->UsedSpace;
++ }
++
+ if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing
+
+ memmove(ResData ->Block + ResData ->Pointer, Ptr, size);
+@@ -389,13 +393,15 @@
+ return TRUE;
+ }
+
+-// Create a iohandler for disk based files. if FileName is NULL, then 'stream' member is also set
+-// to NULL and no real writting is performed. This only happens in writting access mode
++// Create a iohandler for disk based files.
+ cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)
+ {
+ cmsIOHANDLER* iohandler = NULL;
+ FILE* fm = NULL;
+
++ _cmsAssert(FileName != NULL);
++ _cmsAssert(AccessMode != NULL);
++
+ iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+ if (iohandler == NULL) return NULL;
+
+@@ -432,11 +438,8 @@
+ iohandler ->UsedSpace = 0;
+
+ // Keep track of the original file
+- if (FileName != NULL) {
+-
+- strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
+- iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
+- }
++ strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
++ iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
+
+ iohandler ->Read = FileRead;
+ iohandler ->Seek = FileSeek;
+@@ -616,6 +619,31 @@
+ return _cmsSearchTag(Icc, sig, FALSE) >= 0;
+ }
+
++/*
++ * Enforces that the profile version is per. spec.
++ * Operates on the big endian bytes from the profile.
++ * Called before converting to platform endianness.
++ * Byte 0 is BCD major version, so max 9.
++ * Byte 1 is 2 BCD digits, one per nibble.
++ * Reserved bytes 2 & 3 must be 0.
++ */
++static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
++{
++ cmsUInt8Number* pByte = (cmsUInt8Number*)&DWord;
++ cmsUInt8Number temp1;
++ cmsUInt8Number temp2;
++
++ if (*pByte > 0x09) *pByte = (cmsUInt8Number)9;
++ temp1 = *(pByte+1) & 0xf0;
++ temp2 = *(pByte+1) & 0x0f;
++ if (temp1 > 0x90) temp1 = 0x90;
++ if (temp2 > 9) temp2 = 0x09;
++ *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
++ *(pByte+2) = (cmsUInt8Number)0;
++ *(pByte+3) = (cmsUInt8Number)0;
++
++ return DWord;
++}
+
+ // Read profile header and validate it
+ cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
+@@ -643,12 +671,15 @@
+ Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
+ Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
+ Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
++
+ Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);
+ Icc -> flags = _cmsAdjustEndianess32(Header.flags);
+ Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer);
+ Icc -> model = _cmsAdjustEndianess32(Header.model);
++ Icc -> creator = _cmsAdjustEndianess32(Header.creator);
++
+ _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
+- Icc -> Version = _cmsAdjustEndianess32(Header.version);
++ Icc -> Version = _cmsAdjustEndianess32(_validatedVersion(Header.version));
+
+ // Get size as reported in header
+ HeaderSize = _cmsAdjustEndianess32(Header.size);
+@@ -815,28 +846,33 @@
+ cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+- return (cmsUInt32Number) Icc ->manufacturer;
++ return Icc ->manufacturer;
+ }
+
+ void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+- Icc -> manufacturer = (cmsUInt32Number) manufacturer;
++ Icc -> manufacturer = manufacturer;
++}
++
++cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)
++{
++ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
++ return Icc ->creator;
+ }
+
+ cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+- return (cmsUInt32Number) Icc ->model;
++ return Icc ->model;
+ }
+
+ void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+- Icc -> model = (cmsUInt32Number) model;
++ Icc -> model = model;
+ }
+
+-
+ void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+@@ -1073,11 +1109,16 @@
+ return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
+ }
+
+-
+ static
+ cmsBool SanityCheck(_cmsICCPROFILE* profile)
+ {
+- cmsIOHANDLER* io = profile->IOhandler;
++ cmsIOHANDLER* io;
++
++ if (!profile) {
++ return FALSE;
++ }
++
++ io = profile->IOhandler;
+ if (!io) {
+ return FALSE;
+ }
+@@ -1106,13 +1147,13 @@
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature TypeBase;
++ cmsTagTypeSignature Type;
+ cmsTagTypeHandler* TypeHandler;
+-
+- if (!SanityCheck(FileOrig)) return FALSE;
++ cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc);
++ cmsTagTypeHandler LocalTypeHandler;
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+-
+ if (Icc ->TagNames[i] == 0) continue;
+
+ // Linked tags are not written
+@@ -1126,7 +1167,7 @@
+
+ // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
+ // In this case a blind copy of the block data is performed
+- if (FileOrig != NULL && Icc -> TagOffsets[i]) {
++ if (SanityCheck(FileOrig) && Icc -> TagOffsets[i]) {
+
+ cmsUInt32Number TagSize = FileOrig -> TagSizes[i];
+ cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
+@@ -1164,7 +1205,16 @@
+ TagDescriptor = _cmsGetTagDescriptor(Icc -> TagNames[i]);
+ if (TagDescriptor == NULL) continue; // Unsupported, ignore it
+
+- TypeHandler = Icc ->TagTypeHandlers[i];
++ if (TagDescriptor ->DecideType != NULL) {
++
++ Type = TagDescriptor ->DecideType(Version, Data);
++ }
++ else {
++
++ Type = TagDescriptor ->SupportedTypes[0];
++ }
++
++ TypeHandler = _cmsGetTagTypeHandler(Type);
+
+ if (TypeHandler == NULL) {
+ cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]);
+@@ -1175,9 +1225,10 @@
+ if (!_cmsWriteTypeBase(io, TypeBase))
+ return FALSE;
+
+- TypeHandler ->ContextID = Icc ->ContextID;
+- TypeHandler ->ICCVersion = Icc ->Version;
+- if (!TypeHandler ->WritePtr(TypeHandler, io, Data, TagDescriptor ->ElemCount)) {
++ LocalTypeHandler = *TypeHandler;
++ LocalTypeHandler.ContextID = Icc ->ContextID;
++ LocalTypeHandler.ICCVersion = Icc ->Version;
++ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {
+
+ char String[5];
+
+@@ -1314,8 +1365,8 @@
+ // Should we just calculate the needed space?
+ if (MemPtr == NULL) {
+
+- *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
+- return (*BytesNeeded == 0 ? FALSE : TRUE);
++ *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
++ return (*BytesNeeded == 0 ? FALSE : TRUE);
+ }
+
+ // That is a real write operation
+@@ -1353,10 +1404,11 @@
+ cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
+
+ if (TypeHandler != NULL) {
++ cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
+
+- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameters
+- TypeHandler ->ICCVersion = Icc ->Version;
+- TypeHandler ->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
++ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameters
++ LocalTypeHandler.ICCVersion = Icc ->Version;
++ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+ }
+ else
+ _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
+@@ -1400,6 +1452,7 @@
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagTypeHandler* TypeHandler;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature BaseType;
+ cmsUInt32Number Offset, TagSize;
+@@ -1423,7 +1476,7 @@
+
+ // Seek to its location
+ if (!io -> Seek(io, Offset))
+- return NULL;
++ return NULL;
+
+ // Search for support on this tag
+ TagDescriptor = _cmsGetTagDescriptor(sig);
+@@ -1440,14 +1493,15 @@
+ // Get type handler
+ TypeHandler = _cmsGetTagTypeHandler(BaseType);
+ if (TypeHandler == NULL) return NULL;
++ LocalTypeHandler = *TypeHandler;
+
+
+ // Read the tag
+ Icc -> TagTypeHandlers[n] = TypeHandler;
+
+- TypeHandler ->ContextID = Icc ->ContextID;
+- TypeHandler ->ICCVersion = Icc ->Version;
+- Icc -> TagPtrs[n] = TypeHandler ->ReadPtr(TypeHandler, io, &ElemCount, TagSize);
++ LocalTypeHandler.ContextID = Icc ->ContextID;
++ LocalTypeHandler.ICCVersion = Icc ->Version;
++ Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
+
+ // The tag type is supported, but something wrong happend and we cannot read the tag.
+ // let know the user about this (although it is just a warning)
+@@ -1468,7 +1522,7 @@
+
+ _cmsTagSignature2String(String, sig);
+ cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d",
+- String, TagDescriptor ->ElemCount, ElemCount);
++ String, TagDescriptor ->ElemCount, ElemCount);
+ }
+
+
+@@ -1500,6 +1554,7 @@
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsTagTypeHandler* TypeHandler = NULL;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsTagTypeSignature Type;
+ int i;
+@@ -1530,9 +1585,10 @@
+
+ if (TypeHandler != NULL) {
+
+- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameter
+- TypeHandler ->ICCVersion = Icc ->Version;
+- TypeHandler->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
++ LocalTypeHandler = *TypeHandler;
++ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter
++ LocalTypeHandler.ICCVersion = Icc ->Version;
++ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+ }
+ }
+ }
+@@ -1571,7 +1627,7 @@
+ // Let the tag descriptor to decide the type base on depending on
+ // the data. This is useful for example on parametric curves, where
+ // curves specified by a table cannot be saved as parametric and needs
+- // to be revented to single v2-curves, even on v4 profiles.
++ // to be casted to single v2-curves, even on v4 profiles.
+
+ Type = TagDescriptor ->DecideType(Version, data);
+ }
+@@ -1609,9 +1665,10 @@
+ Icc ->TagSizes[i] = 0;
+ Icc ->TagOffsets[i] = 0;
+
+- TypeHandler ->ContextID = Icc ->ContextID;
+- TypeHandler ->ICCVersion = Icc ->Version;
+- Icc ->TagPtrs[i] = TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount);
++ LocalTypeHandler = *TypeHandler;
++ LocalTypeHandler.ContextID = Icc ->ContextID;
++ LocalTypeHandler.ICCVersion = Icc ->Version;
++ Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);
+
+ if (Icc ->TagPtrs[i] == NULL) {
+
+@@ -1638,6 +1695,7 @@
+ int i;
+ cmsIOHANDLER* MemIO;
+ cmsTagTypeHandler* TypeHandler = NULL;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsUInt32Number rc;
+ cmsUInt32Number Offset, TagSize;
+@@ -1653,15 +1711,16 @@
+ Offset = Icc ->TagOffsets[i];
+ TagSize = Icc ->TagSizes[i];
+
+-
+ // read the data directly, don't keep copy
+ if (data != NULL) {
+
+ if (BufferSize < TagSize)
+- TagSize = BufferSize;
++ TagSize = BufferSize;
+
+ if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) return 0;
+ if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) return 0;
++
++ return TagSize;
+ }
+
+ return Icc ->TagSizes[i];
+@@ -1675,9 +1734,11 @@
+
+ TagSize = Icc ->TagSizes[i];
+ if (BufferSize < TagSize)
+- TagSize = BufferSize;
++ TagSize = BufferSize;
+
+ memmove(data, Icc ->TagPtrs[i], TagSize);
++
++ return TagSize;
+ }
+
+ return Icc ->TagSizes[i];
+@@ -1693,7 +1754,7 @@
+ if (data == NULL) {
+ MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));
+ } else{
+- MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
++ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
+ }
+ if (MemIO == NULL) return 0;
+
+@@ -1701,20 +1762,22 @@
+ TypeHandler = Icc ->TagTypeHandlers[i];
+ TagDescriptor = _cmsGetTagDescriptor(sig);
+ if (TagDescriptor == NULL) {
+- cmsCloseIOhandler(MemIO);
+- return 0;
++ cmsCloseIOhandler(MemIO);
++ return 0;
+ }
+
++ // FIXME: No handling for TypeHandler == NULL here?
+ // Serialize
+- TypeHandler ->ContextID = Icc ->ContextID;
+- TypeHandler ->ICCVersion = Icc ->Version;
++ LocalTypeHandler = *TypeHandler;
++ LocalTypeHandler.ContextID = Icc ->ContextID;
++ LocalTypeHandler.ICCVersion = Icc ->Version;
+
+ if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {
+ cmsCloseIOhandler(MemIO);
+ return 0;
+ }
+
+- if (!TypeHandler ->WritePtr(TypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
++ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
+ cmsCloseIOhandler(MemIO);
+ return 0;
+ }
+@@ -1752,7 +1815,7 @@
+ // Using this function you can collapse several tag entries to the same block in the profile
+ cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
+ {
+- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
++ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ int i;
+
+ if (!_cmsNewTag(Icc, sig, &i)) return FALSE;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Tue Mar 18 12:35:25 2014 -0700
+@@ -129,7 +129,6 @@
+ Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);
+
+ if (Tag != NULL) {
+-
+ *Dest = *Tag;
+ return TRUE;
+ }
+@@ -193,7 +192,8 @@
+ if (GrayTRC == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 1, 3);
+- if (Lut == NULL) return NULL;
++ if (Lut == NULL)
++ goto Error;
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+@@ -204,28 +204,35 @@
+
+ EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
+
+- if (EmptyTab == NULL) {
+-
+- cmsPipelineFree(Lut);
+- return NULL;
+- }
++ if (EmptyTab == NULL)
++ goto Error;
+
+ LabCurves[0] = GrayTRC;
+ LabCurves[1] = EmptyTab;
+ LabCurves[2] = EmptyTab;
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL));
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) ||
++ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {
++ cmsFreeToneCurve(EmptyTab);
++ goto Error;
++ }
+
+ cmsFreeToneCurve(EmptyTab);
+
+ }
+ else {
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC));
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL));
++
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||
++ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL)))
++ goto Error;
+ }
+
+ return Lut;
++
++Error:
++ cmsFreeToneCurve(GrayTRC);
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // RGB Matrix shaper
+@@ -259,49 +266,31 @@
+ Lut = cmsPipelineAlloc(ContextID, 3, 3);
+ if (Lut != NULL) {
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes));
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||
++ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))
++ goto Error;
+
+ // Note that it is certainly possible a single profile would have a LUT based
+ // tag for output working in lab and a matrix-shaper for the fallback cases.
+ // This is not allowed by the spec, but this code is tolerant to those cases
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))
++ goto Error;
+ }
+
+ }
+
+ return Lut;
++
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+
+
+ // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+-/*static
+-cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+-{
+- cmsContext ContextID = cmsGetProfileContextID(hProfile);
+- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+- cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
+-
+- if (Lut == NULL) return NULL;
+-
+- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
+- // and since the formatter has already accomodated to 0..1.0, we should undo this change
+- if ( spc == cmsSigLabData)
+- {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
+- }
+- else
+- if (spc == cmsSigXYZData)
+- {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
+- }
+-
+- return Lut;
+-}
+-*/
+ static
+ cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+ {
+@@ -316,23 +305,31 @@
+ // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
+ if ( spc == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
++ goto Error;
+ }
+ else if (spc == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
++ goto Error;
+ }
+
+ if ( PCS == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
++ goto Error;
+ }
+ else if( PCS == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
++ goto Error;
+ }
+
+ return Lut;
++
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+
+@@ -359,8 +356,11 @@
+ return NULL;
+ }
+
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE));
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||
++ !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {
++ cmsPipelineFree(Lut);
++ return NULL;
++ }
+ return Lut;
+ }
+
+@@ -395,12 +395,18 @@
+ return Lut;
+
+ // If the input is Lab, add also a conversion at the begin
+- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
++ if (cmsGetColorSpace(hProfile) == cmsSigLabData &&
++ !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
++ goto Error;
+
+ // Add a matrix for conversion V2 to V4 Lab PCS
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
++ goto Error;
++
+ return Lut;
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // Lut was not found, try to create a matrix-shaper
+@@ -445,21 +451,27 @@
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL)))
++ goto Error;
+ }
+ else {
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL)))
++ goto Error;
+ }
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
++ goto Error;
++
+ cmsFreeToneCurve(RevGrayTRC);
++ return Lut;
+
+- return Lut;
++Error:
++ cmsFreeToneCurve(RevGrayTRC);
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+
+-
+-
+ static
+ cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
+ {
+@@ -506,15 +518,21 @@
+ // This is not allowed by the spec, but this code is tolerant to those cases
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))
++ goto Error;
+ }
+
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL));
+- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||
++ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))
++ goto Error;
+ }
+
+ cmsFreeToneCurveTriple(InvShapes);
+ return Lut;
++Error:
++ cmsFreeToneCurveTriple(InvShapes);
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+
+@@ -540,30 +558,6 @@
+
+
+ // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+-/*static
+-cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+-{
+- cmsContext ContextID = cmsGetProfileContextID(hProfile);
+- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+- cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+-
+- if (Lut == NULL) return NULL;
+-
+- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
+- // and since the formatter has already accomodated to 0..1.0, we should undo this change
+- if ( PCS == cmsSigLabData)
+- {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
+- }
+- else
+- if (PCS == cmsSigXYZData)
+- {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
+- }
+-
+- return Lut;
+-}*/
+-
+ static
+ cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+ {
+@@ -578,25 +572,33 @@
+ // and since the formatter has already accomodated to 0..1.0, we should undo this change
+ if ( PCS == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
++ goto Error;
+ }
+ else
+ if (PCS == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
++ goto Error;
+ }
+
+ // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
+ if ( dataSpace == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
++ goto Error;
+ }
+- else if ( dataSpace == cmsSigXYZData)
++ else if (dataSpace == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
++ goto Error;
+ }
+
+ return Lut;
++
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // Create an output MPE LUT from agiven profile. Version mismatches are handled here
+@@ -636,30 +638,35 @@
+ // Now it is time for a controversial stuff. I found that for 3D LUTS using
+ // Lab used as indexer space, trilinear interpolation should be used
+ if (cmsGetPCS(hProfile) == cmsSigLabData)
+- ChangeInterpolationToTrilinear(Lut);
++ ChangeInterpolationToTrilinear(Lut);
+
+ // We need to adjust data only for Lab and Lut16 type
+ if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
+ return Lut;
+
+ // Add a matrix for conversion V4 to V2 Lab PCS
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
++ goto Error;
+
+ // If the output is Lab, add also a conversion at the end
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
++ goto Error;
+
+ return Lut;
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // Lut not found, try to create a matrix-shaper
+
+ // Check if this is a grayscale profile.
+- if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
++ if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+
+- // if so, build appropiate conversion tables.
+- // The tables are the PCS iluminant, scaled across GrayTRC
+- return BuildGrayOutputPipeline(hProfile);
++ // if so, build appropiate conversion tables.
++ // The tables are the PCS iluminant, scaled across GrayTRC
++ return BuildGrayOutputPipeline(hProfile);
+ }
+
+ // Not gray, create a normal matrix-shaper, which only operates in XYZ space
+@@ -681,25 +688,32 @@
+
+ if (spc == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
++ goto Error;
+ }
+ else
+ if (spc == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
++ goto Error;
+ }
+
+ if (PCS == cmsSigLabData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
++ goto Error;
+ }
+ else
+ if (PCS == cmsSigXYZData)
+ {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
++ goto Error;
+ }
+
+- return Lut;
++ return Lut;
++Error:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
+@@ -721,15 +735,21 @@
+ if (nc == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 0, 0);
+- if (Lut == NULL) {
+- cmsFreeNamedColorList(nc);
+- return NULL;
+- }
++ if (Lut == NULL)
++ goto Error;
+
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
++ goto Error;
++
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
++ goto Error;
++
+ return Lut;
++Error:
++ cmsPipelineFree(Lut);
++ cmsFreeNamedColorList(nc);
++ return NULL;
+ }
+
+ if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
+@@ -760,10 +780,10 @@
+ Lut = cmsPipelineDup(Lut);
+ if (Lut == NULL) return NULL;
+
+- // Now it is time for a controversial stuff. I found that for 3D LUTS using
+- // Lab used as indexer space, trilinear interpolation should be used
++ // Now it is time for a controversial stuff. I found that for 3D LUTS using
++ // Lab used as indexer space, trilinear interpolation should be used
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+- ChangeInterpolationToTrilinear(Lut);
++ ChangeInterpolationToTrilinear(Lut);
+
+ // After reading it, we have info about the original type
+ OriginalType = _cmsGetTagTrueType(hProfile, tag16);
+@@ -774,16 +794,20 @@
+ // Here it is possible to get Lab on both sides
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
++ if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
++ goto Error2;
+ }
+
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
+- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
++ if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
++ goto Error2;
+ }
+
+ return Lut;
+
+-
++Error2:
++ cmsPipelineFree(Lut);
++ return NULL;
+ }
+
+ // ---------------------------------------------------------------------------------------------------------------
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Tue Mar 18 12:35:25 2014 -0700
+@@ -264,10 +264,10 @@
+ if (NewElem ->TheCurves != NULL) {
+ for (i=0; i < NewElem ->nCurves; i++) {
+ if (NewElem ->TheCurves[i])
+- cmsFreeToneCurve(Data ->TheCurves[i]);
++ cmsFreeToneCurve(NewElem ->TheCurves[i]);
+ }
+ }
+- _cmsFree(mpe ->ContextID, Data ->TheCurves);
++ _cmsFree(mpe ->ContextID, NewElem ->TheCurves);
+ _cmsFree(mpe ->ContextID, NewElem);
+ return NULL;
+ }
+@@ -392,6 +392,8 @@
+ void MatrixElemTypeFree(cmsStage* mpe)
+ {
+ _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
++ if (Data == NULL)
++ return;
+ if (Data ->Double)
+ _cmsFree(mpe ->ContextID, Data ->Double);
+
+@@ -526,10 +528,15 @@
+
+ if (Data ->Tab.T) {
+
+- if (Data ->HasFloatValues)
++ if (Data ->HasFloatValues) {
+ NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));
+- else
++ if (NewElem ->Tab.TFloat == NULL)
++ goto Error;
++ } else {
+ NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));
++ if (NewElem ->Tab.TFloat == NULL)
++ goto Error;
++ }
+ }
+
+ NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID,
+@@ -538,8 +545,14 @@
+ Data ->Params ->nOutputs,
+ NewElem ->Tab.T,
+ Data ->Params ->dwFlags);
+-
+- return (void*) NewElem;
++ if (NewElem->Params != NULL)
++ return (void*) NewElem;
++ Error:
++ if (NewElem->Tab.T)
++ // This works for both types
++ _cmsFree(mpe ->ContextID, NewElem -> Tab.T);
++ _cmsFree(mpe ->ContextID, NewElem);
++ return NULL;
+ }
+
+
+@@ -636,7 +649,6 @@
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+ Dimensions[i] = nGridPoints;
+
+-
+ return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);
+ }
+
+@@ -706,15 +718,12 @@
+ }
+ }
+
+-
+ NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);
+ if (NewElem ->Params == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+-
+-
+ return NewMPE;
+ }
+
+@@ -772,7 +781,7 @@
+ int i, t, nTotalPoints, index, rest;
+ int nInputs, nOutputs;
+ cmsUInt32Number* nSamples;
+- cmsUInt16Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
++ cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+ _cmsStageCLutData* clut;
+
+ if (mpe == NULL) return FALSE;
+@@ -785,7 +794,9 @@
+ nInputs = clut->Params ->nInputs;
+ nOutputs = clut->Params ->nOutputs;
+
+- if (nInputs >= cmsMAXCHANNELS) return FALSE;
++ if (nInputs <= 0) return FALSE;
++ if (nOutputs <= 0) return FALSE;
++ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
+ if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(nSamples, nInputs);
+@@ -832,14 +843,16 @@
+ int i, t, nTotalPoints, index, rest;
+ int nInputs, nOutputs;
+ cmsUInt32Number* nSamples;
+- cmsFloat32Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
++ cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+ _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
+
+ nSamples = clut->Params ->nSamples;
+ nInputs = clut->Params ->nInputs;
+ nOutputs = clut->Params ->nOutputs;
+
+- if (nInputs >= cmsMAXCHANNELS) return FALSE;
++ if (nInputs <= 0) return FALSE;
++ if (nOutputs <= 0) return FALSE;
++ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
+ if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(nSamples, nInputs);
+@@ -1021,7 +1034,7 @@
+ mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
+ cmsFreeToneCurveTriple(LabTable);
+
+- if (mpe == NULL) return mpe;
++ if (mpe == NULL) return NULL;
+ mpe ->Implements = cmsSigLabV2toV4;
+ return mpe;
+ }
+@@ -1247,12 +1260,22 @@
+ NULL);
+ if (NewMPE == NULL) return NULL;
+
+- NewMPE ->Implements = mpe ->Implements;
++ NewMPE ->Implements = mpe ->Implements;
+
+- if (mpe ->DupElemPtr)
+- NewMPE ->Data = mpe ->DupElemPtr(mpe);
+- else
++ if (mpe ->DupElemPtr) {
++
++ NewMPE ->Data = mpe ->DupElemPtr(mpe);
++
++ if (NewMPE->Data == NULL) {
++
++ cmsStageFree(NewMPE);
++ return NULL;
++ }
++
++ } else {
++
+ NewMPE ->Data = NULL;
++ }
+
+ return NewMPE;
+ }
+@@ -1465,12 +1488,12 @@
+ }
+
+
+-void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
++int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
+ {
+ cmsStage* Anterior = NULL, *pt;
+
+- _cmsAssert(lut != NULL);
+- _cmsAssert(mpe != NULL);
++ if (lut == NULL || mpe == NULL)
++ return FALSE;
+
+ switch (loc) {
+
+@@ -1494,9 +1517,11 @@
+ }
+ break;
+ default:;
++ return FALSE;
+ }
+
+ BlessLUT(lut);
++ return TRUE;
+ }
+
+ // Unlink an element and return the pointer to it
+@@ -1558,7 +1583,7 @@
+ // Concatenate two LUT into a new single one
+ cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
+ {
+- cmsStage* mpe, *NewMPE;
++ cmsStage* mpe;
+
+ // If both LUTS does not have elements, we need to inherit
+ // the number of channels
+@@ -1573,17 +1598,12 @@
+ mpe = mpe ->Next) {
+
+ // We have to dup each element
+- NewMPE = cmsStageDup(mpe);
+-
+- if (NewMPE == NULL) {
+- return FALSE;
+- }
+-
+- cmsPipelineInsertStage(l1, cmsAT_END, NewMPE);
++ if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))
++ return FALSE;
+ }
+
+- BlessLUT(l1);
+- return TRUE;
++ BlessLUT(l1);
++ return TRUE;
+ }
+
+
+@@ -1713,16 +1733,11 @@
+ cmsFloat32Number fx[4], x[4], xd[4], fxd[4];
+ cmsVEC3 tmp, tmp2;
+ cmsMAT3 Jacobian;
+- cmsFloat64Number LastResult[4];
+-
+
+ // Only 3->3 and 4->3 are supported
+ if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;
+ if (lut ->OutputChannels != 3) return FALSE;
+
+- // Mark result of -1
+- LastResult[0] = LastResult[1] = LastResult[2] = -1.0f;
+-
+ // Take the hint as starting point if specified
+ if (Hint == NULL) {
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Tue Mar 18 12:35:25 2014 -0700
+@@ -338,7 +338,7 @@
+ Error:
+
+ // Free resources as something went wrong
+- if (MD5 != NULL) _cmsFree(ContextID, MD5);
++ // "MD5" cannot be other than NULL here, so no need to free it
+ if (Mem != NULL) _cmsFree(ContextID, Mem);
+ memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+ return FALSE;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Tue Mar 18 12:35:25 2014 -0700
+@@ -359,9 +359,9 @@
+ if (Best == -1)
+ Best = 0;
+
+- v = mlu ->Entries + Best;
++ v = mlu ->Entries + Best;
+
+- if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
++ if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+ if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country;
+
+ if (len != NULL) *len = v ->Len;
+@@ -475,6 +475,35 @@
+ }
+
+
++
++// Get the number of translations in the MLU object
++cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)
++{
++ if (mlu == NULL) return 0;
++ return mlu->UsedEntries;
++}
++
++// Get the language and country codes for a specific MLU index
++cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
++ cmsUInt32Number idx,
++ char LanguageCode[3],
++ char CountryCode[3])
++{
++ _cmsMLUentry *entry;
++
++ if (mlu == NULL) return FALSE;
++
++ if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;
++
++ entry = &mlu->Entries[idx];
++
++ *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);
++ *(cmsUInt16Number *)CountryCode = _cmsAdjustEndianess16(entry->Country);
++
++ return TRUE;
++}
++
++
+ // Named color lists --------------------------------------------------------------------------------------------
+
+ // Grow the list to keep at least NumElements
+@@ -517,9 +546,9 @@
+ while (v -> Allocated < n)
+ GrowNamedColorList(v);
+
+- strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix) - 1);
+- strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix) - 1);
+- v->Prefix[sizeof(v ->Prefix) - 1] = v->Suffix[sizeof(v ->Suffix) - 1] = 0;
++ strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
++ strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
++ v->Prefix[32] = v->Suffix[32] = 0;
+
+ v -> ColorantCount = ColorantCount;
+
+@@ -529,8 +558,9 @@
+ // Free a list
+ void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
+ {
++ if (v == NULL) return;
+ if (v ->List) _cmsFree(v ->ContextID, v ->List);
+- if (v) _cmsFree(v ->ContextID, v);
++ _cmsFree(v ->ContextID, v);
+ }
+
+ cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
+@@ -576,11 +606,8 @@
+
+ if (Name != NULL) {
+
+- strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name,
+- sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1);
+-
+- NamedColorList ->List[NamedColorList ->nColors].
+- Name[sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1] = 0;
++ strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);
++ NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;
+
+ }
+ else
+@@ -891,7 +918,6 @@
+ {
+ _cmsDICT* old_dict = (_cmsDICT*) hDict;
+ cmsHANDLE hNew;
+- _cmsDICT* new_dict;
+ cmsDICTentry *entry;
+
+ _cmsAssert(old_dict != NULL);
+@@ -899,8 +925,6 @@
+ hNew = cmsDictAlloc(old_dict ->ContextID);
+ if (hNew == NULL) return NULL;
+
+- new_dict = (_cmsDICT*) hNew;
+-
+ // Walk the list freeing all nodes
+ entry = old_dict ->head;
+ while (entry != NULL) {
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Tue Mar 18 12:35:25 2014 -0700
+@@ -27,6 +27,7 @@
+ // However, the following notice accompanied the original version of this
+ // file:
+ //
++
+ //---------------------------------------------------------------------------------
+ //
+ // Little Color Management System
+@@ -81,10 +82,6 @@
+ int nInputs;
+ int nOutputs;
+
+- // Since there is no limitation of the output number of channels, this buffer holding the connexion CLUT-shaper
+- // has to be dynamically allocated. This is not the case of first step shaper-CLUT, which is limited to max inputs
+- cmsUInt16Number* StageDEF;
+-
+ _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance
+ cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
+
+@@ -202,8 +199,6 @@
+ {
+ cmsBool AnyOpt = FALSE, Opt;
+
+- AnyOpt = FALSE;
+-
+ do {
+
+ Opt = FALSE;
+@@ -253,6 +248,7 @@
+ {
+ Prelin16Data* p16 = (Prelin16Data*) D;
+ cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS];
++ cmsUInt16Number StageDEF[cmsMAXCHANNELS];
+ int i;
+
+ for (i=0; i < p16 ->nInputs; i++) {
+@@ -260,11 +256,11 @@
+ p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);
+ }
+
+- p16 ->EvalCLUT(StageABC, p16 ->StageDEF, p16 ->CLUTparams);
++ p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);
+
+ for (i=0; i < p16 ->nOutputs; i++) {
+
+- p16 ->EvalCurveOut16[i](&p16->StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
++ p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
+ }
+ }
+
+@@ -274,7 +270,6 @@
+ {
+ Prelin16Data* p16 = (Prelin16Data*) ptr;
+
+- _cmsFree(ContextID, p16 ->StageDEF);
+ _cmsFree(ContextID, p16 ->EvalCurveOut16);
+ _cmsFree(ContextID, p16 ->ParamsCurveOut16);
+
+@@ -289,7 +284,6 @@
+
+ if (Duped == NULL) return NULL;
+
+- Duped ->StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
+ Duped ->EvalCurveOut16 = _cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
+ Duped ->ParamsCurveOut16 = _cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
+
+@@ -328,7 +322,6 @@
+ p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16;
+
+
+- p16 -> StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
+ p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));
+ p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));
+
+@@ -413,7 +406,7 @@
+ int i, index;
+
+ if (CLUT -> Type != cmsSigCLutElemType) {
+- cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut MPE");
++ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage");
+ return FALSE;
+ }
+
+@@ -548,6 +541,10 @@
+ for (i=0; i < nOuts; i++) {
+
+ cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);
++ if (InversePostLin == NULL) {
++ WhiteOut[i] = 0;
++ continue;
++ }
+ WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);
+ cmsFreeToneCurve(InversePostLin);
+ }
+@@ -575,8 +572,8 @@
+ static
+ cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+ {
+- cmsPipeline* Src;
+- cmsPipeline* Dest;
++ cmsPipeline* Src = NULL;
++ cmsPipeline* Dest = NULL;
+ cmsStage* mpe;
+ cmsStage* CLUT;
+ cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
+@@ -589,7 +586,6 @@
+ cmsToneCurve** DataSetOut;
+ Prelin16Data* p16;
+
+-
+ // This is a loosy optimization! does not apply in floating-point cases
+ if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+@@ -603,10 +599,10 @@
+
+ Src = *Lut;
+
+- // Named color pipelines cannot be optimized either
+- for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+- mpe != NULL;
+- mpe = cmsStageNext(mpe)) {
++ // Named color pipelines cannot be optimized either
++ for (mpe = cmsPipelineGetPtrToFirstStage(Src);
++ mpe != NULL;
++ mpe = cmsStageNext(mpe)) {
+ if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
+ }
+
+@@ -628,7 +624,8 @@
+
+ // All seems ok, proceed.
+ NewPreLin = cmsStageDup(PreLin);
+- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin);
++ if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))
++ goto Error;
+
+ // Remove prelinearization. Since we have duplicated the curve
+ // in destination LUT, the sampling shoud be applied after this stage.
+@@ -642,7 +639,9 @@
+ if (CLUT == NULL) return FALSE;
+
+ // Add the CLUT to the destination LUT
+- cmsPipelineInsertStage(Dest, cmsAT_END, CLUT);
++ if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
++ goto Error;
++ }
+
+ // Postlinearization tables are kept unless indicated by flags
+ if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {
+@@ -658,7 +657,8 @@
+
+ // All seems ok, proceed.
+ NewPostLin = cmsStageDup(PostLin);
+- cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin);
++ if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
++ goto Error;
+
+ // In destination LUT, the sampling shoud be applied after this stage.
+ cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
+@@ -669,10 +669,18 @@
+ // Now its time to do the sampling. We have to ignore pre/post linearization
+ // The source LUT whithout pre/post curves is passed as parameter.
+ if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
+-
++Error:
+ // Ops, something went wrong, Restore stages
+- if (KeepPreLin != NULL) cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin);
+- if (KeepPostLin != NULL) cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin);
++ if (KeepPreLin != NULL) {
++ if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {
++ _cmsAssert(0); // This never happens
++ }
++ }
++ if (KeepPostLin != NULL) {
++ if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) {
++ _cmsAssert(0); // This never happens
++ }
++ }
+ cmsPipelineFree(Dest);
+ return FALSE;
+ }
+@@ -699,12 +707,11 @@
+ else {
+
+ p16 = PrelinOpt16alloc(Dest ->ContextID,
+- DataCLUT ->Params,
+- Dest ->InputChannels,
+- DataSetIn,
+- Dest ->OutputChannels,
+- DataSetOut);
+-
++ DataCLUT ->Params,
++ Dest ->InputChannels,
++ DataSetIn,
++ Dest ->OutputChannels,
++ DataSetOut);
+
+ _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
+ }
+@@ -1058,7 +1065,8 @@
+ LutPlusCurves = cmsPipelineDup(OriginalLut);
+ if (LutPlusCurves == NULL) goto Error;
+
+- cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse));
++ if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))
++ goto Error;
+
+ // Create the result LUT
+ OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);
+@@ -1067,13 +1075,15 @@
+ OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);
+
+ // Create and insert the curves at the beginning
+- cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe);
++ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))
++ goto Error;
+
+ // Allocate the CLUT for result
+ OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);
+
+ // Add the CLUT to the destination LUT
+- cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe);
++ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))
++ goto Error;
+
+ // Resample the LUT
+ if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;
+@@ -1201,13 +1211,14 @@
+ for (i=0; i < nCurves; i++) {
+
+ c16->Curves[i] = _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
++
+ if (c16->Curves[i] == NULL) {
++
+ for (j=0; j < i; j++) {
+ _cmsFree(ContextID, c16->Curves[j]);
+ }
+ _cmsFree(ContextID, c16->Curves);
+ _cmsFree(ContextID, c16);
+-
+ return NULL;
+ }
+
+@@ -1336,7 +1347,8 @@
+ // Maybe the curves are linear at the end
+ if (!AllCurvesAreLinear(ObtainedCurves)) {
+
+- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves);
++ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))
++ goto Error;
+
+ // If the curves are to be applied in 8 bits, we can save memory
+ if (_cmsFormatterIs8bit(*InputFormat)) {
+@@ -1344,6 +1356,7 @@
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;
+ Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);
+
++ if (c16 == NULL) goto Error;
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
+
+@@ -1353,6 +1366,7 @@
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
+ Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
+
++ if (c16 == NULL) goto Error;
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
+ }
+@@ -1362,7 +1376,8 @@
+ // LUT optimizes to nothing. Set the identity LUT
+ cmsStageFree(ObtainedCurves);
+
+- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels));
++ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))
++ goto Error;
+
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);
+@@ -1592,10 +1607,14 @@
+ if (!Dest) return FALSE;
+
+ // Assamble the new LUT
+- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1));
++ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
++ goto Error;
++
+ if (!IdentityMat)
+- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset));
+- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2));
++ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
++ goto Error;
++ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
++ goto Error;
+
+ // If identity on matrix, we can further optimize the curves, so call the join curves routine
+ if (IdentityMat) {
+@@ -1617,6 +1636,10 @@
+ cmsPipelineFree(Src);
+ *Lut = Dest;
+ return TRUE;
++Error:
++ // Leave Src unchanged
++ cmsPipelineFree(Dest);
++ return FALSE;
+ }
+
+
+@@ -1646,7 +1669,7 @@
+ static _cmsOptimizationCollection* OptimizationCollection = DefaultOptimization;
+
+ // Register new ways to optimize
+-cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterOptimizationPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;
+ _cmsOptimizationCollection* fl;
+@@ -1660,7 +1683,7 @@
+ // Optimizer callback is required
+ if (Plugin ->OptimizePtr == NULL) return FALSE;
+
+- fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(sizeof(_cmsOptimizationCollection));
++ fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(id, sizeof(_cmsOptimizationCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Tue Mar 18 12:35:25 2014 -0700
+@@ -317,6 +317,23 @@
+ }
+
+ static
++cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
++ register cmsUInt16Number wIn[],
++ register cmsUInt8Number* accum,
++ register cmsUInt32Number Stride)
++{
++ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
++ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
++ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
++ accum++; // A
++
++ return accum;
++
++ cmsUNUSED_PARAMETER(info);
++ cmsUNUSED_PARAMETER(Stride);
++}
++
++static
+ cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+@@ -2901,6 +2918,9 @@
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap},
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst},
+
++ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
++ ANYSPACE, Unroll3BytesSkip1SwapSwapFirst},
++
+ { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes},
+ { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse},
+ { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst},
+@@ -3166,7 +3186,7 @@
+
+
+ // Formatters management
+-cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterFormattersPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
+ cmsFormattersFactoryList* fl ;
+@@ -3178,7 +3198,7 @@
+ return TRUE;
+ }
+
+- fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(sizeof(cmsFormattersFactoryList));
++ fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(id, sizeof(cmsFormattersFactoryList));
+ if (fl == NULL) return FALSE;
+
+ fl ->Factory = Plugin ->FormattersFactory;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Tue Mar 18 12:35:25 2014 -0700
+@@ -898,9 +898,11 @@
+ {
+ switch (ColorSpace) {
+
++ case cmsSigMCH1Data:
+ case cmsSig1colorData:
+ case cmsSigGrayData: return 1;
+
++ case cmsSigMCH2Data:
+ case cmsSig2colorData: return 2;
+
+ case cmsSigXYZData:
+@@ -912,10 +914,12 @@
+ case cmsSigHsvData:
+ case cmsSigHlsData:
+ case cmsSigCmyData:
++ case cmsSigMCH3Data:
+ case cmsSig3colorData: return 3;
+
+ case cmsSigLuvKData:
+ case cmsSigCmykData:
++ case cmsSigMCH4Data:
+ case cmsSig4colorData: return 4;
+
+ case cmsSigMCH5Data:
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Tue Mar 18 12:35:25 2014 -0700
+@@ -125,10 +125,14 @@
+ pOut[0] = pIn[7];
+
+ #else
+-
+ _cmsAssert(Result != NULL);
+
++# ifdef CMS_DONT_USE_INT64
++ (*Result)[0] = QWord[0];
++ (*Result)[1] = QWord[1];
++# else
+ *Result = *QWord;
++# endif
+ #endif
+ }
+
+@@ -543,10 +547,10 @@
+ static _cmsSubAllocator* PluginPool = NULL;
+
+ // Specialized malloc for plug-ins, that is freed upon exit.
+-void* _cmsPluginMalloc(cmsUInt32Number size)
++void* _cmsPluginMalloc(cmsContext id, cmsUInt32Number size)
+ {
+ if (PluginPool == NULL)
+- PluginPool = _cmsCreateSubAlloc(0, 4*1024);
++ PluginPool = _cmsCreateSubAlloc(id, 4*1024);
+
+ return _cmsSubAlloc(PluginPool, size);
+ }
+@@ -555,6 +559,11 @@
+ // Main plug-in dispatcher
+ cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
+ {
++ return cmsPluginTHR(NULL, Plug_in);
++}
++
++cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
++{
+ cmsPluginBase* Plugin;
+
+ for (Plugin = (cmsPluginBase*) Plug_in;
+@@ -583,35 +592,35 @@
+ break;
+
+ case cmsPluginTagTypeSig:
+- if (!_cmsRegisterTagTypePlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginTagSig:
+- if (!_cmsRegisterTagPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginFormattersSig:
+- if (!_cmsRegisterFormattersPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginRenderingIntentSig:
+- if (!_cmsRegisterRenderingIntentPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginParametricCurveSig:
+- if (!_cmsRegisterParametricCurvesPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginMultiProcessElementSig:
+- if (!_cmsRegisterMultiProcessElementPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginOptimizationSig:
+- if (!_cmsRegisterOptimizationPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginTransformSig:
+- if (!_cmsRegisterTransformPlugin(Plugin)) return FALSE;
++ if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;
+ break;
+
+ default:
+@@ -630,14 +639,14 @@
+ {
+ _cmsRegisterMemHandlerPlugin(NULL);
+ _cmsRegisterInterpPlugin(NULL);
+- _cmsRegisterTagTypePlugin(NULL);
+- _cmsRegisterTagPlugin(NULL);
+- _cmsRegisterFormattersPlugin(NULL);
+- _cmsRegisterRenderingIntentPlugin(NULL);
+- _cmsRegisterParametricCurvesPlugin(NULL);
+- _cmsRegisterMultiProcessElementPlugin(NULL);
+- _cmsRegisterOptimizationPlugin(NULL);
+- _cmsRegisterTransformPlugin(NULL);
++ _cmsRegisterTagTypePlugin(NULL, NULL);
++ _cmsRegisterTagPlugin(NULL, NULL);
++ _cmsRegisterFormattersPlugin(NULL, NULL);
++ _cmsRegisterRenderingIntentPlugin(NULL, NULL);
++ _cmsRegisterParametricCurvesPlugin(NULL, NULL);
++ _cmsRegisterMultiProcessElementPlugin(NULL, NULL);
++ _cmsRegisterOptimizationPlugin(NULL, NULL);
++ _cmsRegisterTransformPlugin(NULL, NULL);
+
+ if (PluginPool != NULL)
+ _cmsSubAllocDestroy(PluginPool);
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Tue Mar 18 12:35:25 2014 -0700
+@@ -806,7 +806,6 @@
+
+ mpe = Pipeline ->Elements;
+
+-
+ switch (cmsStageInputChannels(mpe)) {
+ case 3:
+
+@@ -838,8 +837,6 @@
+ mpe = mpe ->Next;
+ }
+
+-
+-
+ if (cmsStageType(mpe) == cmsSigCLutElemType) {
+
+ _cmsIOPrintf(m, "/Table ");
+@@ -854,7 +851,6 @@
+ _cmsIOPrintf(m, " >>\n");
+ _cmsIOPrintf(m, "]\n");
+
+-
+ return 1;
+ }
+
+@@ -950,6 +946,7 @@
+
+ rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
+ cmsPipelineFree(DeviceLink);
++ if (rc == 0) return 0;
+ }
+ break;
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Tue Mar 18 12:35:25 2014 -0700
+@@ -56,6 +56,8 @@
+ #include "lcms2_internal.h"
+
+
++#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))
++#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))
+
+ // This file contains routines for resampling and LUT optimization, black point detection
+ // and black preservation.
+@@ -67,13 +69,13 @@
+ static
+ cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)
+ {
+- cmsHPROFILE hLab = cmsCreateLab4Profile(NULL);
++ cmsContext ContextID = cmsGetProfileContextID(hProfile);
++ cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ cmsHTRANSFORM xform;
+ cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };
+ cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };
+ cmsHPROFILE hProfiles[4];
+ cmsUInt32Number Intents[4];
+- cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;
+ Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;
+@@ -141,8 +143,8 @@
+ cmsCloseProfile(hLab);
+
+ if (xform == NULL) {
++
+ // Something went wrong. Get rid of open resources and return zero as black
+-
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+@@ -173,7 +175,6 @@
+ // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
+ static
+ cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)
+-
+ {
+ cmsHTRANSFORM hRoundTrip;
+ cmsCIELab LabIn, LabOut;
+@@ -218,17 +219,27 @@
+ // involves to turn BP to neutral and to use only L component.
+ cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
+ {
++ cmsProfileClassSignature devClass;
+
+- // Zero for black point
+- if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {
++ // Make sure the device class is adequate
++ devClass = cmsGetDeviceClass(hProfile);
++ if (devClass == cmsSigLinkClass ||
++ devClass == cmsSigAbstractClass ||
++ devClass == cmsSigNamedColorClass) {
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
++ }
+
+- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+- return FALSE;
++ // Make sure intent is adequate
++ if (Intent != INTENT_PERCEPTUAL &&
++ Intent != INTENT_RELATIVE_COLORIMETRIC &&
++ Intent != INTENT_SATURATION) {
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
+ }
+
+ // v4 + perceptual & saturation intents does have its own black point, and it is
+ // well specified enough to use it. Black point tag is deprecated in V4.
+-
+ if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
+ (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+@@ -303,7 +314,7 @@
+ {
+ double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;
+ double sum_y = 0, sum_yx = 0, sum_yx2 = 0;
+- double disc;
++ double d, a, b, c;
+ int i;
+ cmsMAT3 m;
+ cmsVEC3 v, res;
+@@ -333,14 +344,32 @@
+
+ if (!_cmsMAT3solve(&res, &m, &v)) return 0;
+
+- // y = t x2 + u x + c
+- // x = ( - u + Sqrt( u^2 - 4 t c ) ) / ( 2 t )
+- disc = res.n[1]*res.n[1] - 4.0 * res.n[0] * res.n[2];
+- if (disc < 0) return -1;
+
+- return ( -1.0 * res.n[1] + sqrt( disc )) / (2.0 * res.n[0]);
++ a = res.n[2];
++ b = res.n[1];
++ c = res.n[0];
++
++ if (fabs(a) < 1.0E-10) {
++
++ return cmsmin(0, cmsmax(50, -c/b ));
++ }
++ else {
++
++ d = b*b - 4.0 * a * c;
++ if (d <= 0) {
++ return 0;
++ }
++ else {
++
++ double rt = (-b + sqrt(d)) / (2.0 * a);
++
++ return cmsmax(0, cmsmin(50, rt));
++ }
++ }
++
+ }
+
++/*
+ static
+ cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
+ {
+@@ -361,6 +390,7 @@
+
+ return TRUE;
+ }
++*/
+
+ // Calculates the black point of a destination profile.
+ // This algorithm comes from the Adobe paper disclosing its black point compensation method.
+@@ -369,21 +399,30 @@
+ cmsColorSpaceSignature ColorSpace;
+ cmsHTRANSFORM hRoundTrip = NULL;
+ cmsCIELab InitialLab, destLab, Lab;
++ cmsFloat64Number inRamp[256], outRamp[256];
++ cmsFloat64Number MinL, MaxL;
++ cmsBool NearlyStraightMidrange = TRUE;
++ cmsFloat64Number yRamp[256];
++ cmsFloat64Number x[256], y[256];
++ cmsFloat64Number lo, hi;
++ int n, l;
++ cmsProfileClassSignature devClass;
+
+- cmsFloat64Number MinL, MaxL;
+- cmsBool NearlyStraightMidRange = FALSE;
+- cmsFloat64Number L;
+- cmsFloat64Number x[101], y[101];
+- cmsFloat64Number lo, hi, NonMonoMin;
+- int n, l, i, NonMonoIndx;
+-
++ // Make sure the device class is adequate
++ devClass = cmsGetDeviceClass(hProfile);
++ if (devClass == cmsSigLinkClass ||
++ devClass == cmsSigAbstractClass ||
++ devClass == cmsSigNamedColorClass) {
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
++ }
+
+ // Make sure intent is adequate
+ if (Intent != INTENT_PERCEPTUAL &&
+ Intent != INTENT_RELATIVE_COLORIMETRIC &&
+ Intent != INTENT_SATURATION) {
+- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+- return FALSE;
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
+ }
+
+
+@@ -415,10 +454,8 @@
+ return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
+ }
+
+- // It is one of the valid cases!, presto chargo hocus pocus, go for the Adobe magic
++ // It is one of the valid cases!, use Adobe algorithm
+
+- // Step 1
+- // ======
+
+ // Set a first guess, that should work on good profiles.
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+@@ -449,71 +486,68 @@
+ hRoundTrip = CreateRoundtripXForm(hProfile, Intent);
+ if (hRoundTrip == NULL) return FALSE;
+
+- // Calculate Min L*
+- Lab = InitialLab;
+- Lab.L = 0;
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+- MinL = destLab.L;
++ // Compute ramps
+
+- // Calculate Max L*
+- Lab = InitialLab;
+- Lab.L = 100;
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+- MaxL = destLab.L;
++ for (l=0; l < 256; l++) {
+
+- // Step 3
+- // ======
++ Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
++ Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
++ Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
+
+- // check if quadratic estimation needs to be done.
++ cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
++
++ inRamp[l] = Lab.L;
++ outRamp[l] = destLab.L;
++ }
++
++ // Make monotonic
++ for (l = 254; l > 0; --l) {
++ outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);
++ }
++
++ // Check
++ if (! (outRamp[0] < outRamp[255])) {
++
++ cmsDeleteTransform(hRoundTrip);
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
++ }
++
++
++ // Test for mid range straight (only on relative colorimetric)
++
++ NearlyStraightMidrange = TRUE;
++ MinL = outRamp[0]; MaxL = outRamp[255];
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+- // Conceptually, this code tests how close the source l and converted L are to one another in the mid-range
+- // of the values. If the converted ramp of L values is close enough to a straight line y=x, then InitialLab
+- // is good enough to be the DestinationBlackPoint,
+- NearlyStraightMidRange = TRUE;
++ for (l=0; l < 256; l++) {
+
+- for (l=0; l <= 100; l++) {
++ if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||
++ (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
++ NearlyStraightMidrange = FALSE;
++ }
+
+- Lab.L = l;
+- Lab.a = InitialLab.a;
+- Lab.b = InitialLab.b;
++ // If the mid range is straight (as determined above) then the
++ // DestinationBlackPoint shall be the same as initialLab.
++ // Otherwise, the DestinationBlackPoint shall be determined
++ // using curve fitting.
+
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
++ if (NearlyStraightMidrange) {
+
+- L = destLab.L;
+-
+- // Check the mid range in 20% after MinL
+- if (L > (MinL + 0.2 * (MaxL - MinL))) {
+-
+- // Is close enough?
+- if (fabs(L - l) > 4.0) {
+-
+- // Too far away, profile is buggy!
+- NearlyStraightMidRange = FALSE;
+- break;
+- }
+- }
++ cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
++ cmsDeleteTransform(hRoundTrip);
++ return TRUE;
+ }
+ }
+- else {
+- // Check is always performed for perceptual and saturation intents
+- NearlyStraightMidRange = FALSE;
+- }
+
+
+- // If no furter checking is needed, we are done
+- if (NearlyStraightMidRange) {
+-
+- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+- cmsDeleteTransform(hRoundTrip);
+- return TRUE;
+- }
+-
+- // The round-trip curve normally looks like a nearly constant section at the black point,
++ // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
+ // with a corner and a nearly straight line to the white point.
+
+- // STEP 4
+- // =======
++ for (l=0; l < 256; l++) {
++
++ yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
++ }
+
+ // find the black point using the least squares error quadratic curve fitting
+
+@@ -528,62 +562,32 @@
+ hi = 0.25;
+ }
+
+- // Capture points for the fitting.
++ // Capture shadow points for the fitting.
+ n = 0;
+- for (l=0; l <= 100; l++) {
++ for (l=0; l < 256; l++) {
+
+- cmsFloat64Number ff;
+-
+- Lab.L = (cmsFloat64Number) l;
+- Lab.a = InitialLab.a;
+- Lab.b = InitialLab.b;
+-
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+-
+- ff = (destLab.L - MinL)/(MaxL - MinL);
++ cmsFloat64Number ff = yRamp[l];
+
+ if (ff >= lo && ff < hi) {
+-
+- x[n] = Lab.L;
+- y[n] = ff;
++ x[n] = inRamp[l];
++ y[n] = yRamp[l];
+ n++;
+ }
+-
+- }
+-
+- // This part is not on the Adobe paper, but I found is necessary for getting any result.
+-
+- if (IsMonotonic(n, y)) {
+-
+- // Monotonic means lower point is stil valid
+- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+- cmsDeleteTransform(hRoundTrip);
+- return TRUE;
+- }
+-
+- // No suitable points, regret and use safer algorithm
+- if (n == 0) {
+- cmsDeleteTransform(hRoundTrip);
+- return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
+- }
+-
+-
+- NonMonoMin = 100;
+- NonMonoIndx = 0;
+- for (i=0; i < n; i++) {
+-
+- if (y[i] < NonMonoMin) {
+- NonMonoIndx = i;
+- NonMonoMin = y[i];
+- }
+ }
+
+- Lab.L = x[NonMonoIndx];
++
++ // No suitable points
++ if (n < 3 ) {
++ cmsDeleteTransform(hRoundTrip);
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
++ }
++
+
+ // fit and get the vertex of quadratic curve
+ Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);
+
+- if (Lab.L < 0.0 || Lab.L > 50.0) { // clip to zero L* if the vertex is negative
++ if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative
+ Lab.L = 0;
+ }
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Tue Mar 18 12:35:25 2014 -0700
+@@ -91,7 +91,7 @@
+
+ // Register a new type handler. This routine is shared between normal types and MPE
+ static
+-cmsBool RegisterTypesPlugin(cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
++cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
+ {
+ cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;
+ _cmsTagTypeLinkedList *pt, *Anterior = NULL;
+@@ -118,7 +118,7 @@
+ }
+
+ // Registering happens in plug-in memory pool
+- pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagTypeLinkedList));
++ pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));
+ if (pt == NULL) return FALSE;
+
+ pt ->Handler = Plugin ->Handler;
+@@ -208,10 +208,10 @@
+ cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+ // Let's take the offsets to each element
+- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
++ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
++ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ for (i=0; i < Count; i++) {
+@@ -257,10 +257,10 @@
+ cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+ // Create table
+- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
++ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
++ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ // Keep starting position of curve offsets
+@@ -456,6 +456,7 @@
+ void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+ {
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));
++
+ cmsUNUSED_PARAMETER(n);
+ }
+
+@@ -1106,8 +1107,6 @@
+ {
+ cmsUInt32Number Count;
+ cmsToneCurve* NewGamma;
+- cmsUInt16Number Linear[2] = { 0, 0xffff };
+-
+
+ *nItems = 0;
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+@@ -1115,11 +1114,14 @@
+ switch (Count) {
+
+ case 0: // Linear.
+-
+- NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, 2, Linear);
+- if (!NewGamma) return NULL;
+- *nItems = 1;
+- return NewGamma;
++ {
++ cmsFloat64Number SingleGamma = 1.0;
++
++ NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
++ if (!NewGamma) return NULL;
++ *nItems = 1;
++ return NewGamma;
++ }
+
+ case 1: // Specified as the exponent of gamma function
+ {
+@@ -1210,6 +1212,7 @@
+ if (ICCVersion < 4.0) return cmsSigCurveType;
+ if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric
+ if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves
++ if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves
+
+ return cmsSigParametricCurveType;
+ }
+@@ -1386,6 +1389,9 @@
+ {
+ cmsICCMeasurementConditions mc;
+
++
++ memset(&mc, 0, sizeof(mc));
++
+ if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;
+ if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL;
+ if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;
+@@ -1640,7 +1646,6 @@
+ static
+ cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)
+ {
+- cmsStage* mpe;
+ cmsUInt8Number* Temp = NULL;
+ int i, j;
+ cmsToneCurve* Tables[cmsMAXCHANNELS];
+@@ -1669,11 +1674,8 @@
+ _cmsFree(ContextID, Temp);
+ Temp = NULL;
+
+-
+- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
+- if (mpe == NULL) goto Error;
+-
+- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
++ goto Error;
+
+ for (i=0; i < nChannels; i++)
+ cmsFreeToneCurve(Tables[i]);
+@@ -1701,21 +1703,30 @@
+
+ if (Tables) {
+
+- if (Tables ->TheCurves[i]->nEntries != 256) {
+- cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
+- return FALSE;
++ // Usual case of identity curves
++ if ((Tables ->TheCurves[i]->nEntries == 2) &&
++ (Tables->TheCurves[i]->Table16[0] == 0) &&
++ (Tables->TheCurves[i]->Table16[1] == 65535)) {
++
++ for (j=0; j < 256; j++) {
++ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
++ }
+ }
+-
+- }
+-
+- for (j=0; j < 256; j++) {
+-
+- if (Tables != NULL)
+- val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
+ else
+- val = (cmsUInt8Number) j;
+-
+- if (!_cmsWriteUInt8Number(io, val)) return FALSE;
++ if (Tables ->TheCurves[i]->nEntries != 256) {
++ cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
++ return FALSE;
++ }
++ else
++ for (j=0; j < 256; j++) {
++
++ if (Tables != NULL)
++ val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
++ else
++ val = (cmsUInt8Number) j;
++
++ if (!_cmsWriteUInt8Number(io, val)) return FALSE;
++ }
+ }
+ }
+ return TRUE;
+@@ -1724,7 +1735,7 @@
+
+ // Check overflow
+ static
+-size_t uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
++cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
+ {
+ cmsUInt32Number rv = 1, rc;
+
+@@ -1736,13 +1747,13 @@
+ rv *= a;
+
+ // Check for overflow
+- if (rv > UINT_MAX / a) return (size_t) -1;
++ if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;
+
+ }
+
+ rc = rv * n;
+
+- if (rv != rc / n) return (size_t) -1;
++ if (rv != rc / n) return (cmsUInt32Number) -1;
+ return rc;
+ }
+
+@@ -1757,7 +1768,6 @@
+ cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+ cmsUInt8Number* Temp = NULL;
+ cmsPipeline* NewLUT = NULL;
+- cmsStage *mpemat, *mpeclut;
+ cmsUInt32Number nTabSize, i;
+ cmsFloat64Number Matrix[3*3];
+
+@@ -1796,9 +1806,8 @@
+ // Only operates if not identity...
+ if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
+- if (mpemat == NULL) goto Error;
+- cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, mpemat);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
++ goto Error;
+ }
+
+ // Get input tables
+@@ -1806,13 +1815,10 @@
+
+ // Get 3D CLUT. Check the overflow....
+ nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+- if (nTabSize == (size_t) -1) goto Error;
++ if (nTabSize == (cmsUInt32Number) -1) goto Error;
+ if (nTabSize > 0) {
+
+ cmsUInt16Number *PtrW, *T;
+- cmsUInt32Number Tsize;
+-
+- Tsize = (cmsUInt32Number) nTabSize * sizeof(cmsUInt16Number);
+
+ PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
+ if (T == NULL) goto Error;
+@@ -1829,10 +1835,8 @@
+ _cmsFree(self ->ContextID, Temp);
+ Temp = NULL;
+
+-
+- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
+- if (mpeclut == NULL) goto Error;
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))
++ goto Error;
+ _cmsFree(self ->ContextID, T);
+ }
+
+@@ -1934,7 +1938,7 @@
+ if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;
+
+ nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);
+- if (nTabSize == (size_t) -1) return FALSE;
++ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+ if (nTabSize > 0) {
+
+ // The 3D CLUT.
+@@ -1983,7 +1987,6 @@
+ static
+ cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)
+ {
+- cmsStage* mpe;
+ int i;
+ cmsToneCurve* Tables[cmsMAXCHANNELS];
+
+@@ -2007,10 +2010,8 @@
+
+
+ // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)
+- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
+- if (mpe == NULL) goto Error;
+-
+- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
++ goto Error;
+
+ for (i=0; i < nChannels; i++)
+ cmsFreeToneCurve(Tables[i]);
+@@ -2031,7 +2032,9 @@
+ int j;
+ cmsUInt32Number i;
+ cmsUInt16Number val;
+- int nEntries = 256;
++ int nEntries;
++
++ _cmsAssert(Tables != NULL);
+
+ nEntries = Tables->TheCurves[0]->nEntries;
+
+@@ -2039,11 +2042,7 @@
+
+ for (j=0; j < nEntries; j++) {
+
+- if (Tables != NULL)
+- val = Tables->TheCurves[i]->Table16[j];
+- else
+- val = _cmsQuantizeVal(j, nEntries);
+-
++ val = Tables->TheCurves[i]->Table16[j];
+ if (!_cmsWriteUInt16Number(io, val)) return FALSE;
+ }
+ }
+@@ -2057,7 +2056,6 @@
+ {
+ cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+ cmsPipeline* NewLUT = NULL;
+- cmsStage *mpemat, *mpeclut;
+ cmsUInt32Number nTabSize;
+ cmsFloat64Number Matrix[3*3];
+ cmsUInt16Number InputEntries, OutputEntries;
+@@ -2094,9 +2092,8 @@
+ // Only operates on 3 channels
+ if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
+- if (mpemat == NULL) goto Error;
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpemat);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
++ goto Error;
+ }
+
+ if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;
+@@ -2110,7 +2107,7 @@
+
+ // Get 3D CLUT
+ nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+- if (nTabSize == (size_t) -1) goto Error;
++ if (nTabSize == (cmsUInt32Number) -1) goto Error;
+ if (nTabSize > 0) {
+
+ cmsUInt16Number *T;
+@@ -2123,13 +2120,10 @@
+ goto Error;
+ }
+
+- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
+- if (mpeclut == NULL) {
+- _cmsFree(self ->ContextID, T);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {
++ _cmsFree(self ->ContextID, T);
+ goto Error;
+ }
+-
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
+ _cmsFree(self ->ContextID, T);
+ }
+
+@@ -2159,7 +2153,7 @@
+ _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
+ _cmsStageMatrixData* MatMPE = NULL;
+ _cmsStageCLutData* clut = NULL;
+- int InputChannels, OutputChannels, clutPoints;
++ int i, InputChannels, OutputChannels, clutPoints;
+
+ // Disassemble the LUT into components.
+ mpe = NewLUT -> Elements;
+@@ -2234,13 +2228,13 @@
+ if (PreMPE != NULL) {
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;
+ } else {
+- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
++ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+ }
+
+ if (PostMPE != NULL) {
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;
+ } else {
+- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
++ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+
+ }
+
+@@ -2249,9 +2243,16 @@
+ if (PreMPE != NULL) {
+ if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;
+ }
++ else {
++ for (i=0; i < InputChannels; i++) {
++
++ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
++ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
++ }
++ }
+
+ nTabSize = uipow(OutputChannels, clutPoints, InputChannels);
+- if (nTabSize == (size_t) -1) return FALSE;
++ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+ if (nTabSize > 0) {
+ // The 3D CLUT.
+ if (clut != NULL) {
+@@ -2263,7 +2264,13 @@
+ if (PostMPE != NULL) {
+ if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;
+ }
+-
++ else {
++ for (i=0; i < OutputChannels; i++) {
++
++ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
++ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
++ }
++ }
+
+ return TRUE;
+
+@@ -2479,7 +2486,6 @@
+ cmsUInt32Number offsetM; // Offset to first "M" curve
+ cmsUInt32Number offsetC; // Offset to CLUT
+ cmsUInt32Number offsetA; // Offset to first "A" curve
+- cmsStage* mpe;
+ cmsPipeline* NewLUT = NULL;
+
+
+@@ -2501,37 +2507,35 @@
+ if (NewLUT == NULL) return NULL;
+
+ if (offsetA!= 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))
++ goto Error;
+ }
+
+ if (offsetC != 0) {
+- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
++ goto Error;
+ }
+
+ if (offsetM != 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))
++ goto Error;
+ }
+
+ if (offsetMat != 0) {
+- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
++ goto Error;
+ }
+
+ if (offsetB != 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))
++ goto Error;
+ }
+
+ *nItems = 1;
+ return NewLUT;
++Error:
++ cmsPipelineFree(NewLUT);
++ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+ }
+@@ -2798,7 +2802,6 @@
+ cmsUInt32Number offsetM; // Offset to first "M" curve
+ cmsUInt32Number offsetC; // Offset to CLUT
+ cmsUInt32Number offsetA; // Offset to first "A" curve
+- cmsStage* mpe;
+ cmsPipeline* NewLUT = NULL;
+
+
+@@ -2821,37 +2824,35 @@
+ if (NewLUT == NULL) return NULL;
+
+ if (offsetB != 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))
++ goto Error;
+ }
+
+ if (offsetMat != 0) {
+- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
++ goto Error;
+ }
+
+ if (offsetM != 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))
++ goto Error;
+ }
+
+ if (offsetC != 0) {
+- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
++ goto Error;
+ }
+
+ if (offsetA!= 0) {
+- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan);
+- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))
++ goto Error;
+ }
+
+ *nItems = 1;
+ return NewLUT;
++Error:
++ cmsPipelineFree(NewLUT);
++ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+ }
+@@ -3287,7 +3288,7 @@
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;
+- if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
++ if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;
+ SizeOfTag -= sizeof(cmsUInt64Number);
+
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;
+@@ -4292,6 +4293,9 @@
+ if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+ if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
++ if (InputChans == 0) goto Error;
++ if (OutputChans == 0) goto Error;
++
+ if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
+ goto Error;
+
+@@ -4381,7 +4385,6 @@
+ {
+ cmsStageSignature ElementSig;
+ cmsTagTypeHandler* TypeHandler;
+- cmsStage *mpe = NULL;
+ cmsUInt32Number nItems;
+ cmsPipeline *NewLUT = (cmsPipeline *) Cargo;
+
+@@ -4409,11 +4412,8 @@
+ if (TypeHandler ->ReadPtr != NULL) {
+
+ // This is a real element which should be read and processed
+- mpe = (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag);
+- if (mpe == NULL) return FALSE;
+-
+- // All seems ok, insert element
+- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
++ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))
++ return FALSE;
+ }
+
+ return TRUE;
+@@ -4479,10 +4479,10 @@
+ outputChan = cmsPipelineOutputChannels(Lut);
+ ElemCount = cmsPipelineStageCount(Lut);
+
+- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
++ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+- ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
++ ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ // Write the head
+@@ -4825,10 +4825,10 @@
+ static
+ cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count)
+ {
+- e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
++ e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+ if (e->Offsets == NULL) return FALSE;
+
+- e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
++ e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+ if (e->Sizes == NULL) {
+
+ _cmsFree(ContextID, e -> Offsets);
+@@ -4844,7 +4844,7 @@
+ void FreeElem(_cmsDICelem* e)
+ {
+ if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets);
+- if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e ->Sizes);
++ if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes);
+ e->Offsets = e ->Sizes = NULL;
+ }
+
+@@ -5084,7 +5084,7 @@
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+- // Get rec lenghth
++ // Get rec length
+ if (!_cmsReadUInt32Number(io, &Length)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+@@ -5118,14 +5118,22 @@
+ if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;
+ }
+
++ if (NameWCS == NULL || ValueWCS == NULL) {
++
++ cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value");
++ rc = FALSE;
++ }
++ else {
++
+ rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);
++ }
+
+ if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);
+ if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);
+ if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);
+ if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);
+
+- if (!rc) return FALSE;
++ if (!rc) goto Error;
+ }
+
+ FreeArray(&a);
+@@ -5277,14 +5285,14 @@
+ #define DEFAULT_TAG_TYPE_COUNT (sizeof(SupportedTagTypes) / sizeof(_cmsTagTypeLinkedList))
+
+ // Both kind of plug-ins share same structure
+-cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)
+ {
+- return RegisterTypesPlugin(Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
++ return RegisterTypesPlugin(id, Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
+ }
+
+-cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+- return RegisterTypesPlugin(Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
++ return RegisterTypesPlugin(id, Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
+ }
+
+
+@@ -5391,7 +5399,9 @@
+ { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]},
+ { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]},
+ { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]},
+- { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL}, NULL}
++ { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]},
++ { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}
++
+
+ };
+
+@@ -5406,7 +5416,7 @@
+
+ #define DEFAULT_TAG_COUNT (sizeof(SupportedTags) / sizeof(_cmsTagLinkedList))
+
+-cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginTag* Plugin = (cmsPluginTag*) Data;
+ _cmsTagLinkedList *pt, *Anterior;
+@@ -5430,7 +5440,7 @@
+ pt = pt ->Next;
+ }
+
+- pt = (_cmsTagLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagLinkedList));
++ pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));
+ if (pt == NULL) return FALSE;
+
+ pt ->Signature = Plugin ->Signature;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Tue Mar 18 12:35:25 2014 -0700
+@@ -208,9 +208,26 @@
+
+ if (TransferFunction) {
+
++ // Tries to minimize space. Thanks to Richard Hughes for this nice idea
+ if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error;
+- if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
+- if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
++
++ if (TransferFunction[1] == TransferFunction[0]) {
++
++ if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;
++
++ } else {
++
++ if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
++ }
++
++ if (TransferFunction[2] == TransferFunction[0]) {
++
++ if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;
++
++ } else {
++
++ if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
++ }
+ }
+
+ if (Primaries) {
+@@ -303,7 +320,6 @@
+ {
+ cmsHPROFILE hICC;
+ cmsPipeline* Pipeline;
+- cmsStage* Lin;
+ int nChannels;
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+@@ -327,10 +343,8 @@
+
+
+ // Copy tables to Pipeline
+- Lin = cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions);
+- if (Lin == NULL) goto Error;
+-
+- cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, Lin);
++ if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))
++ goto Error;
+
+ // Create tags
+ if (!SetTextTags(hICC, L"Linearization built-in")) goto Error;
+@@ -344,6 +358,7 @@
+ return hICC;
+
+ Error:
++ cmsPipelineFree(Pipeline);
+ if (hICC)
+ cmsCloseProfile(hICC);
+
+@@ -451,9 +466,10 @@
+
+ if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;
+
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels));
+- cmsPipelineInsertStage(LUT, cmsAT_END, CLUT);
+- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||
++ !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||
++ !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))
++ goto Error;
+
+ // Create tags
+ if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error;
+@@ -504,7 +520,8 @@
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))
++ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+@@ -550,7 +567,8 @@
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
++ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+@@ -595,7 +613,8 @@
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
++ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+@@ -734,81 +753,83 @@
+ // contrast, Saturation and white point displacement
+
+ cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
+- int nLUTPoints,
+- cmsFloat64Number Bright,
+- cmsFloat64Number Contrast,
+- cmsFloat64Number Hue,
+- cmsFloat64Number Saturation,
+- int TempSrc,
+- int TempDest)
++ int nLUTPoints,
++ cmsFloat64Number Bright,
++ cmsFloat64Number Contrast,
++ cmsFloat64Number Hue,
++ cmsFloat64Number Saturation,
++ int TempSrc,
++ int TempDest)
+ {
+- cmsHPROFILE hICC;
+- cmsPipeline* Pipeline;
+- BCHSWADJUSTS bchsw;
+- cmsCIExyY WhitePnt;
+- cmsStage* CLUT;
+- cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+- int i;
++ cmsHPROFILE hICC;
++ cmsPipeline* Pipeline;
++ BCHSWADJUSTS bchsw;
++ cmsCIExyY WhitePnt;
++ cmsStage* CLUT;
++ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
++ int i;
+
++ bchsw.Brightness = Bright;
++ bchsw.Contrast = Contrast;
++ bchsw.Hue = Hue;
++ bchsw.Saturation = Saturation;
+
+- bchsw.Brightness = Bright;
+- bchsw.Contrast = Contrast;
+- bchsw.Hue = Hue;
+- bchsw.Saturation = Saturation;
++ cmsWhitePointFromTemp(&WhitePnt, TempSrc );
++ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+
+- cmsWhitePointFromTemp(&WhitePnt, TempSrc );
+- cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
++ cmsWhitePointFromTemp(&WhitePnt, TempDest);
++ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+
+- cmsWhitePointFromTemp(&WhitePnt, TempDest);
+- cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
++ hICC = cmsCreateProfilePlaceholder(ContextID);
++ if (!hICC) // can't allocate
++ return NULL;
+
+- hICC = cmsCreateProfilePlaceholder(ContextID);
+- if (!hICC) // can't allocate
+- return NULL;
+
++ cmsSetDeviceClass(hICC, cmsSigAbstractClass);
++ cmsSetColorSpace(hICC, cmsSigLabData);
++ cmsSetPCS(hICC, cmsSigLabData);
+
+- cmsSetDeviceClass(hICC, cmsSigAbstractClass);
+- cmsSetColorSpace(hICC, cmsSigLabData);
+- cmsSetPCS(hICC, cmsSigLabData);
++ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+- cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
++ // Creates a Pipeline with 3D grid only
++ Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
++ if (Pipeline == NULL) {
++ cmsCloseProfile(hICC);
++ return NULL;
++ }
+
++ for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
++ CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
++ if (CLUT == NULL) return NULL;
+
+- // Creates a Pipeline with 3D grid only
+- Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
+- if (Pipeline == NULL) {
+- cmsCloseProfile(hICC);
+- return NULL;
+- }
+
+- for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
+- CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
+- if (CLUT == NULL) return NULL;
++ if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
+
++ // Shouldn't reach here
++ goto Error;
++ }
+
+- if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
++ if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
++ goto Error;
++ }
+
+- // Shouldn't reach here
+- cmsPipelineFree(Pipeline);
+- cmsCloseProfile(hICC);
+- return NULL;
+- }
++ // Create tags
++ if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
+
+- cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT);
++ cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
+
+- // Create tags
++ cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
+
+- if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
++ // Pipeline is already on virtual profile
++ cmsPipelineFree(Pipeline);
+
+- cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
++ // Ok, done
++ return hICC;
+
+- cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
+-
+- // Pipeline is already on virtual profile
+- cmsPipelineFree(Pipeline);
+-
+- // Ok, done
+- return hICC;
++Error:
++ cmsPipelineFree(Pipeline);
++ cmsCloseProfile(hICC);
++ return NULL;
+ }
+
+
+@@ -856,7 +877,8 @@
+ PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);
+ cmsFreeToneCurve(EmptyTab);
+
+- cmsPipelineInsertStage(LUT, cmsAT_END, PostLin);
++ if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))
++ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
+@@ -999,6 +1021,7 @@
+
+ { FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+ { FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
++ { FALSE, 0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType}},
+ { TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }},
+ { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
+ { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
+@@ -1059,6 +1082,7 @@
+ cmsContext ContextID = cmsGetTransformContextID(hTransform);
+ const cmsAllowedLUT* AllowedLUT;
+ cmsTagSignature DestinationTag;
++ cmsProfileClassSignature deviceClass;
+
+ _cmsAssert(hTransform != NULL);
+
+@@ -1080,13 +1104,15 @@
+ // Time to fix the Lab2/Lab4 issue.
+ if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {
+
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))
++ goto Error;
+ }
+
+ // On the output side too
+ if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {
+
+- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))
++ goto Error;
+ }
+
+
+@@ -1108,8 +1134,9 @@
+ FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);
+ FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);
+
++ deviceClass = cmsGetDeviceClass(hProfile);
+
+- if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass)
++ if (deviceClass == cmsSigOutputClass)
+ DestinationTag = cmsSigBToA0Tag;
+ else
+ DestinationTag = cmsSigAToB0Tag;
+@@ -1136,10 +1163,12 @@
+
+ // Put identity curves if needed
+ if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
+- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
++ goto Error;
+
+ if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
+- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut));
++ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
++ goto Error;
+
+ AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+ }
+@@ -1168,10 +1197,22 @@
+ if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;
+ }
+
+- if (xform ->Sequence != NULL) {
++ if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {
+ if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;
+ }
+
++ // Set the white point
++ if (deviceClass == cmsSigInputClass) {
++ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;
++ }
++ else {
++ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;
++ }
++
++
++ // Per 7.2.15 in spec 4.3
++ cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);
++
+ cmsPipelineFree(LUT);
+ return hProfile;
+
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Tue Mar 18 12:35:25 2014 -0700
+@@ -30,7 +30,7 @@
+ //---------------------------------------------------------------------------------
+ //
+ // Little Color Management System
+-// Copyright (c) 1998-2010 Marti Maria Saguer
++// Copyright (c) 1998-2012 Marti Maria Saguer
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the "Software"),
+@@ -76,48 +76,48 @@
+ // Obtains WhitePoint from Temperature
+ cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)
+ {
+- cmsFloat64Number x, y;
+- cmsFloat64Number T, T2, T3;
+- // cmsFloat64Number M1, M2;
++ cmsFloat64Number x, y;
++ cmsFloat64Number T, T2, T3;
++ // cmsFloat64Number M1, M2;
+
+- _cmsAssert(WhitePoint != NULL);
++ _cmsAssert(WhitePoint != NULL);
+
+- T = TempK;
+- T2 = T*T; // Square
+- T3 = T2*T; // Cube
++ T = TempK;
++ T2 = T*T; // Square
++ T3 = T2*T; // Cube
+
+- // For correlated color temperature (T) between 4000K and 7000K:
++ // For correlated color temperature (T) between 4000K and 7000K:
+
+- if (T >= 4000. && T <= 7000.)
+- {
+- x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
+- }
+- else
+- // or for correlated color temperature (T) between 7000K and 25000K:
++ if (T >= 4000. && T <= 7000.)
++ {
++ x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
++ }
++ else
++ // or for correlated color temperature (T) between 7000K and 25000K:
+
+- if (T > 7000.0 && T <= 25000.0)
+- {
+- x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
+- }
+- else {
+- cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
+- return FALSE;
+- }
++ if (T > 7000.0 && T <= 25000.0)
++ {
++ x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
++ }
++ else {
++ cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
++ return FALSE;
++ }
+
+- // Obtain y(x)
++ // Obtain y(x)
+
+- y = -3.000*(x*x) + 2.870*x - 0.275;
++ y = -3.000*(x*x) + 2.870*x - 0.275;
+
+- // wave factors (not used, but here for futures extensions)
++ // wave factors (not used, but here for futures extensions)
+
+- // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
+- // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
++ // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
++ // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
+
+- WhitePoint -> x = x;
+- WhitePoint -> y = y;
+- WhitePoint -> Y = 1.0;
++ WhitePoint -> x = x;
++ WhitePoint -> y = y;
++ WhitePoint -> Y = 1.0;
+
+- return TRUE;
++ return TRUE;
+ }
+
+
+@@ -266,7 +266,7 @@
+ {{ 0.8951, 0.2664, -0.1614 }},
+ {{ -0.7502, 1.7135, 0.0367 }},
+ {{ 0.0389, -0.0685, 1.0296 }}
+- }};
++ }};
+
+ if (ConeMatrix == NULL)
+ ConeMatrix = &LamRigg;
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Tue Mar 18 12:35:25 2014 -0700
+@@ -396,7 +396,7 @@
+ static _cmsTransformCollection* TransformCollection = NULL;
+
+ // Register new ways to transform
+-cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Data)
++cmsBool _cmsRegisterTransformPlugin(cmsContext id, cmsPluginBase* Data)
+ {
+ cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;
+ _cmsTransformCollection* fl;
+@@ -412,7 +412,7 @@
+ if (Plugin ->Factory == NULL) return FALSE;
+
+
+- fl = (_cmsTransformCollection*) _cmsPluginMalloc(sizeof(_cmsTransformCollection));
++ fl = (_cmsTransformCollection*) _cmsPluginMalloc(id, sizeof(_cmsTransformCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+@@ -651,6 +651,22 @@
+
+ // ----------------------------------------------------------------------------------------------------------------
+
++static
++void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)
++{
++ if (src == NULL) {
++ wtPt ->X = cmsD50X;
++ wtPt ->Y = cmsD50Y;
++ wtPt ->Z = cmsD50Z;
++ }
++ else {
++ wtPt ->X = src->X;
++ wtPt ->Y = src->Y;
++ wtPt ->Z = src->Z;
++ }
++
++}
++
+ // New to lcms 2.0 -- have all parameters available.
+ cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
+ cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
+@@ -664,7 +680,6 @@
+ cmsUInt32Number dwFlags)
+ {
+ _cmsTRANSFORM* xform;
+- cmsBool FloatTransform;
+ cmsColorSpaceSignature EntryColorSpace;
+ cmsColorSpaceSignature ExitColorSpace;
+ cmsPipeline* Lut;
+@@ -681,9 +696,7 @@
+ if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;
+ }
+
+- // On floating point transforms, inhibit optimizations
+- FloatTransform = (_cmsFormatterIsFloat(InputFormat) && _cmsFormatterIsFloat(OutputFormat));
+-
++ // On floating point transforms, inhibit cache
+ if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))
+ dwFlags |= cmsFLAGS_NOCACHE;
+
+@@ -730,6 +743,10 @@
+ xform ->ExitColorSpace = ExitColorSpace;
+ xform ->RenderingIntent = Intents[nProfiles-1];
+
++ // Take white points
++ SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));
++ SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));
++
+
+ // Create a gamut check LUT if requested
+ if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Tue Mar 18 12:35:25 2014 -0700
+@@ -30,7 +30,7 @@
+ //---------------------------------------------------------------------------------
+ //
+ // Little Color Management System
+-// Copyright (c) 1998-2011 Marti Maria Saguer
++// Copyright (c) 1998-2013 Marti Maria Saguer
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the "Software"),
+@@ -52,7 +52,7 @@
+ //
+ //---------------------------------------------------------------------------------
+ //
+-// Version 2.4
++// Version 2.5
+ //
+
+ #ifndef _lcms2_H
+@@ -101,7 +101,7 @@
+ #endif
+
+ // Version/release
+-#define LCMS_VERSION 2040
++#define LCMS_VERSION 2050
+
+ // I will give the chance of redefining basic types for compilers that are not fully C99 compliant
+ #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
+@@ -367,6 +367,7 @@
+ cmsSigPreview1Tag = 0x70726531, // 'pre1'
+ cmsSigPreview2Tag = 0x70726532, // 'pre2'
+ cmsSigProfileDescriptionTag = 0x64657363, // 'desc'
++ cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm'
+ cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq'
+ cmsSigProfileSequenceIdTag = 0x70736964, // 'psid'
+ cmsSigPs2CRD0Tag = 0x70736430, // 'psd0'
+@@ -1014,6 +1015,7 @@
+ // Plug-In registering ---------------------------------------------------------------------------------------------------
+
+ CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin);
++CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
+ CMSAPI void CMSEXPORT cmsUnregisterPlugins(void);
+
+ // Error logging ----------------------------------------------------------------------------------------------------------
+@@ -1190,7 +1192,7 @@
+ // Where to place/locate the stages in the pipeline chain
+ typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
+
+-CMSAPI void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
++CMSAPI int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
+ CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
+
+ // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
+@@ -1274,6 +1276,13 @@
+ const char LanguageCode[3], const char CountryCode[3],
+ char ObtainedLanguage[3], char ObtainedCountry[3]);
+
++CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
++
++CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
++ cmsUInt32Number idx,
++ char LanguageCode[3],
++ char CountryCode[3]);
++
+ // Undercolorremoval & black generation -------------------------------------------------------------------------------------
+
+ typedef struct {
+@@ -1424,6 +1433,7 @@
+ CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
+ CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
+ CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
++CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
+ CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
+ CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
+ CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
+--- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Tue Mar 18 12:35:25 2014 -0700
+@@ -27,7 +27,7 @@
+ // However, the following notice accompanied the original version of this
+ // file:
+ //
+-//---------------------------------------------------------------------------------
++
+ //
+ // Little Color Management System
+ // Copyright (c) 1998-2011 Marti Maria Saguer
+@@ -196,7 +196,7 @@
+ // Plug-In registering ---------------------------------------------------------------
+
+ // Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
+-void* _cmsPluginMalloc(cmsUInt32Number size);
++void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);
+
+ // Memory management
+ cmsBool _cmsRegisterMemHandlerPlugin(cmsPluginBase* Plugin);
+@@ -205,28 +205,28 @@
+ cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Plugin);
+
+ // Parametric curves
+-cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Formatters management
+-cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Tag type management
+-cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Tag management
+-cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Intent management
+-cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Multi Process elements
+-cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Optimization
+-cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // Transform
+-cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Plugin);
++cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+ // ---------------------------------------------------------------------------------------------------------
+
+@@ -263,7 +263,7 @@
+ cmsUInt16Number Country;
+
+ cmsUInt32Number StrW; // Offset to current unicode string
+- cmsUInt32Number Len; // Lenght in bytes
++ cmsUInt32Number Len; // Length in bytes
+
+ } _cmsMLUentry;
+
+@@ -330,9 +330,11 @@
+ cmsColorSpaceSignature ColorSpace;
+ cmsColorSpaceSignature PCS;
+ cmsUInt32Number RenderingIntent;
++
+ cmsUInt32Number flags;
+ cmsUInt32Number manufacturer, model;
+ cmsUInt64Number attributes;
++ cmsUInt32Number creator;
+
+ cmsProfileID ProfileID;
+
+@@ -585,6 +587,10 @@
+ cmsColorSpaceSignature EntryColorSpace;
+ cmsColorSpaceSignature ExitColorSpace;
+
++ // White points (informative only)
++ cmsCIEXYZ EntryWhitePoint;
++ cmsCIEXYZ ExitWhitePoint;
++
+ // Profiles used to create the transform
+ cmsSEQ* Sequence;
+
+--- ./jdk/src/share/native/sun/management/Flag.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/management/Flag.c Tue Mar 18 12:35:25 2014 -0700
+@@ -95,12 +95,12 @@
+ return 0;
+ }
+
+- if (count == 0) {
++ if (count <= 0) {
+ JNU_ThrowIllegalArgumentException(env, 0);
+ return 0;
+ }
+
+- gsize = count * sizeof(jmmVMGlobal);
++ gsize = (size_t)count * sizeof(jmmVMGlobal);
+ globals = (jmmVMGlobal*) malloc(gsize);
+ if (globals == NULL) {
+ JNU_ThrowOutOfMemoryError(env, 0);
+--- ./jdk/src/share/native/sun/management/GcInfoBuilder.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/share/native/sun/management/GcInfoBuilder.c Tue Mar 18 12:35:25 2014 -0700
+@@ -59,12 +59,12 @@
+ return;
+ }
+
+- if (num_attributes == 0) {
++ if (num_attributes <= 0) {
+ JNU_ThrowIllegalArgumentException(env, "Invalid num_attributes");
+ return;
+ }
+
+- ext_att_info = (jmmExtAttributeInfo*) malloc(num_attributes *
++ ext_att_info = (jmmExtAttributeInfo*) malloc((size_t)num_attributes *
+ sizeof(jmmExtAttributeInfo));
+ if (ext_att_info == NULL) {
+ JNU_ThrowOutOfMemoryError(env, 0);
+@@ -78,7 +78,7 @@
+ return;
+ }
+
+- nativeTypes = (jchar*) malloc(num_attributes * sizeof(jchar));
++ nativeTypes = (jchar*) malloc((size_t)num_attributes * sizeof(jchar));
+ if (nativeTypes == NULL) {
+ free(ext_att_info);
+ JNU_ThrowOutOfMemoryError(env, 0);
+@@ -188,11 +188,16 @@
+ return 0;
+ }
+
++ if (ext_att_count <= 0) {
++ JNU_ThrowIllegalArgumentException(env, "Invalid ext_att_count");
++ return;
++ }
++
+ gc_stat.usage_before_gc = usageBeforeGC;
+ gc_stat.usage_after_gc = usageAfterGC;
+ gc_stat.gc_ext_attribute_values_size = ext_att_count;
+ if (ext_att_count > 0) {
+- gc_stat.gc_ext_attribute_values = (jvalue*) malloc(ext_att_count *
++ gc_stat.gc_ext_attribute_values = (jvalue*) malloc((size_t)ext_att_count *
+ sizeof(jvalue));
+ if (gc_stat.gc_ext_attribute_values == NULL) {
+ JNU_ThrowOutOfMemoryError(env, 0);
+@@ -212,7 +217,7 @@
+ }
+
+ // convert the ext_att_types to native types
+- nativeTypes = (jchar*) malloc(ext_att_count * sizeof(jchar));
++ nativeTypes = (jchar*) malloc((size_t)ext_att_count * sizeof(jchar));
+ if (nativeTypes == NULL) {
+ if (gc_stat.gc_ext_attribute_values != NULL) {
+ free(gc_stat.gc_ext_attribute_values);
+--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Mar 18 12:35:25 2014 -0700
+@@ -63,11 +63,59 @@
+ private /* final */ InputStream stdout;
+ private /* final */ InputStream stderr;
+
++ private static enum LaunchMechanism {
++ FORK(1),
++ POSIX_SPAWN(2);
++
++ private int value;
++ LaunchMechanism(int x) {value = x;}
++ };
++
++ /* On BSD, the default is to spawn */
++ private static final LaunchMechanism launchMechanism;
++ private static byte[] helperpath;
++
++ private static byte[] toCString(String s) {
++ if (s == null)
++ return null;
++ byte[] bytes = s.getBytes();
++ byte[] result = new byte[bytes.length + 1];
++ System.arraycopy(bytes, 0,
++ result, 0,
++ bytes.length);
++ result[result.length-1] = (byte)0;
++ return result;
++ }
++
++ static {
++ launchMechanism = AccessController.doPrivileged(
++ new PrivilegedAction<LaunchMechanism>()
++ {
++ public LaunchMechanism run() {
++ String javahome = System.getProperty("java.home");
++
++ helperpath = toCString(javahome + "/lib/jspawnhelper");
++ String s = System.getProperty(
++ "jdk.lang.Process.launchMechanism", "posix_spawn");
++
++ try {
++ return LaunchMechanism.valueOf(s.toUpperCase());
++ } catch (IllegalArgumentException e) {
++ throw new Error(s + " is not a supported " +
++ "process launch mechanism on this platform.");
++ }
++ }
++ });
++ }
++
+ /* this is for the reaping thread */
+ private native int waitForProcessExit(int pid);
+
+ /**
+- * Create a process using fork(2) and exec(2).
++ * Create a process. Depending on the mode flag, this is done by
++ * one of the following mechanisms.
++ * - fork(2) and exec(2)
++ * - posix_spawn(2)
+ *
+ * @param fds an array of three file descriptors.
+ * Indexes 0, 1, and 2 correspond to standard input,
+@@ -80,7 +128,8 @@
+ * output.
+ * @return the pid of the subprocess
+ */
+- private native int forkAndExec(byte[] prog,
++ private native int forkAndExec(int mode, byte[] helperpath,
++ byte[] prog,
+ byte[] argBlock, int argc,
+ byte[] envBlock, int envc,
+ byte[] dir,
+@@ -132,7 +181,9 @@
+ final boolean redirectErrorStream)
+ throws IOException {
+
+- pid = forkAndExec(prog,
++ pid = forkAndExec(launchMechanism.value,
++ helperpath,
++ prog,
+ argBlock, argc,
+ envBlock, envc,
+ dir,
+@@ -236,11 +287,10 @@
+ try { stderr.close(); } catch (IOException ignored) {}
+ }
+
+- /* This routine initializes JNI field offsets for the class */
+- private static native void initIDs();
++ private static native void init();
+
+ static {
+- initIDs();
++ init();
+ }
+
+ /**
+--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Mar 18 12:35:25 2014 -0700
+@@ -63,11 +63,61 @@
+ private /* final */ InputStream stdout;
+ private /* final */ InputStream stderr;
+
++ private static enum LaunchMechanism {
++ FORK(1),
++ VFORK(3);
++
++ private int value;
++ LaunchMechanism(int x) {value = x;}
++ };
++
++ /* default is VFORK on Linux */
++ private static final LaunchMechanism launchMechanism;
++ private static byte[] helperpath;
++
++ private static byte[] toCString(String s) {
++ if (s == null)
++ return null;
++ byte[] bytes = s.getBytes();
++ byte[] result = new byte[bytes.length + 1];
++ System.arraycopy(bytes, 0,
++ result, 0,
++ bytes.length);
++ result[result.length-1] = (byte)0;
++ return result;
++ }
++
++ static {
++ launchMechanism = AccessController.doPrivileged(
++ new PrivilegedAction<LaunchMechanism>()
++ {
++ public LaunchMechanism run() {
++ String javahome = System.getProperty("java.home");
++ String osArch = System.getProperty("os.arch");
++
++ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
++ String s = System.getProperty(
++ "jdk.lang.Process.launchMechanism", "vfork");
++
++ try {
++ return LaunchMechanism.valueOf(s.toUpperCase());
++ } catch (IllegalArgumentException e) {
++ throw new Error(s + " is not a supported " +
++ "process launch mechanism on this platform.");
++ }
++ }
++ });
++ }
++
+ /* this is for the reaping thread */
+ private native int waitForProcessExit(int pid);
+
+ /**
+- * Create a process using fork(2) and exec(2).
++ * Create a process. Depending on the mode flag, this is done by
++ * one of the following mechanisms.
++ * - fork(2) and exec(2)
++ * - clone(2) and exec(2)
++ * - vfork(2) and exec(2)
+ *
+ * @param fds an array of three file descriptors.
+ * Indexes 0, 1, and 2 correspond to standard input,
+@@ -80,7 +130,8 @@
+ * output.
+ * @return the pid of the subprocess
+ */
+- private native int forkAndExec(byte[] prog,
++ private native int forkAndExec(int mode, byte[] helperpath,
++ byte[] prog,
+ byte[] argBlock, int argc,
+ byte[] envBlock, int envc,
+ byte[] dir,
+@@ -132,7 +183,9 @@
+ final boolean redirectErrorStream)
+ throws IOException {
+
+- pid = forkAndExec(prog,
++ pid = forkAndExec(launchMechanism.value,
++ helperpath,
++ prog,
+ argBlock, argc,
+ envBlock, envc,
+ dir,
+@@ -236,11 +289,10 @@
+ try { stderr.close(); } catch (IOException ignored) {}
+ }
+
+- /* This routine initializes JNI field offsets for the class */
+- private static native void initIDs();
++ private static native void init();
+
+ static {
+- initIDs();
++ init();
+ }
+
+ /**
+--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Mar 18 12:35:25 2014 -0700
+@@ -26,6 +26,8 @@
+ package java.lang;
+
+ import java.io.*;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+
+ /* java.lang.Process subclass in the UNIX environment.
+ *
+@@ -45,11 +47,65 @@
+ private DeferredCloseInputStream stdout_inner_stream;
+ private InputStream stderr_stream;
+
++ private static enum LaunchMechanism {
++ FORK(1),
++ POSIX_SPAWN(2);
++
++ private int value;
++ LaunchMechanism(int x) {value = x;}
++ };
++
++ /* On Solaris, the default is to spawn */
++ private static final LaunchMechanism launchMechanism;
++ private static byte[] helperpath;
++
++ private static byte[] toCString(String s) {
++ if (s == null)
++ return null;
++ byte[] bytes = s.getBytes();
++ byte[] result = new byte[bytes.length + 1];
++ System.arraycopy(bytes, 0,
++ result, 0,
++ bytes.length);
++ result[result.length-1] = (byte)0;
++ return result;
++ }
++
++ static {
++ launchMechanism = AccessController.doPrivileged(
++ new PrivilegedAction<LaunchMechanism>()
++ {
++ public LaunchMechanism run() {
++ String javahome = System.getProperty("java.home");
++ String osArch = System.getProperty("os.arch");
++ if (osArch.equals("x86")) {
++ osArch = "i386";
++ } else if (osArch.equals("x86_64")) {
++ osArch = "amd64";
++ }
++
++ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
++ String s = System.getProperty(
++ "jdk.lang.Process.launchMechanism", "fork");
++
++ try {
++ return LaunchMechanism.valueOf(s.toUpperCase());
++ } catch (IllegalArgumentException e) {
++ throw new Error(s + " is not a supported " +
++ "process launch mechanism on this platform.");
++ }
++ }
++ });
++ }
++
+ /* this is for the reaping thread */
+ private native int waitForProcessExit(int pid);
+
+ /**
+- * Create a process using fork(2) and exec(2).
++ * Create a process. Depending on the mode flag, this is done by
++ * one of the following mechanisms.
++ * - fork(2) and exec(2)
++ * - posix_spawn(2)
+ *
+ * @param std_fds array of file descriptors. Indexes 0, 1, and
+ * 2 correspond to standard input, standard output and
+@@ -61,7 +117,8 @@
+ * if and only if it is <em>not</em> -1 on output.
+ * @return the pid of the subprocess
+ */
+- private native int forkAndExec(byte[] prog,
++ private native int forkAndExec(int mode, byte[] helperpath,
++ byte[] prog,
+ byte[] argBlock, int argc,
+ byte[] envBlock, int envc,
+ byte[] dir,
+@@ -76,7 +133,9 @@
+ final int[] std_fds,
+ final boolean redirectErrorStream)
+ throws IOException {
+- pid = forkAndExec(prog,
++ pid = forkAndExec(launchMechanism.value,
++ helperpath,
++ prog,
+ argBlock, argc,
+ envBlock, envc,
+ dir,
+@@ -294,10 +353,9 @@
+
+ }
+
+- /* This routine initializes JNI field offsets for the class */
+- private static native void initIDs();
++ private static native void init();
+
+ static {
+- initIDs();
++ init();
+ }
+ }
+--- ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Tue Mar 18 12:35:25 2014 -0700
+@@ -84,7 +84,7 @@
+
+ protected synchronized void setContentsNative(Transferable contents) {
+ SortedMap formatMap = DataTransferer.getInstance().getFormatsForTransferable
+- (contents, DataTransferer.adaptFlavorMap(flavorMap));
++ (contents, DataTransferer.adaptFlavorMap(getDefaultFlavorTable()));
+ long[] formats = DataTransferer.keysToLongArray(formatMap);
+
+ if (!selection.setOwner(contents, formatMap, formats,
+@@ -123,7 +123,7 @@
+ private void checkChangeHere(Transferable contents) {
+ if (areFlavorListenersRegistered()) {
+ checkChange(DataTransferer.getInstance().
+- getFormatsForTransferableAsArray(contents, flavorMap));
++ getFormatsForTransferableAsArray(contents, getDefaultFlavorTable()));
+ }
+ }
+
+--- ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -49,6 +49,7 @@
+ import sun.awt.*;
+ import sun.font.FontConfigManager;
+ import sun.misc.PerformanceLogger;
++import sun.misc.ThreadGroupUtils;
+ import sun.print.PrintJob2D;
+ import sun.security.action.GetPropertyAction;
+ import sun.security.action.GetBooleanAction;
+@@ -311,13 +312,7 @@
+ }
+ PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
+ public Void run() {
+- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = mainTG.getParent();
+- while (parentTG != null) {
+- mainTG = parentTG;
+- parentTG = mainTG.getParent();
+- }
+- Thread shutdownThread = new Thread(mainTG, "XToolkt-Shutdown-Thread") {
++ Thread shutdownThread = new Thread(ThreadGroupUtils.getRootThreadGroup(), "XToolkt-Shutdown-Thread") {
+ public void run() {
+ XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
+ if (peer != null) {
+@@ -379,22 +374,16 @@
+ init();
+ XWM.init();
+ SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
+-
+- PrivilegedAction<Thread> action = new PrivilegedAction() {
++ toolkitThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
++ @Override
+ public Thread run() {
+- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = currentTG.getParent();
+- while (parentTG != null) {
+- currentTG = parentTG;
+- parentTG = currentTG.getParent();
+- }
+- Thread thread = new Thread(currentTG, XToolkit.this, "AWT-XAWT");
++ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), XToolkit.this, "AWT-XAWT");
++ thread.setContextClassLoader(null);
+ thread.setPriority(Thread.NORM_PRIORITY + 1);
+ thread.setDaemon(true);
+ return thread;
+ }
+- };
+- toolkitThread = AccessController.doPrivileged(action);
++ });
+ toolkitThread.start();
+ }
+ }
+--- ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -41,6 +41,7 @@
+ import sun.java2d.opengl.GLXGraphicsConfig;
+ import sun.java2d.xr.XRGraphicsConfig;
+ import sun.java2d.loops.SurfaceType;
++import sun.misc.ThreadGroupUtils;
+
+ /**
+ * This is an implementation of a GraphicsDevice object for a single
+@@ -424,23 +425,20 @@
+ // hook will have no effect)
+ shutdownHookRegistered = true;
+ PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
++ @Override
+ public Void run() {
+- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = mainTG.getParent();
+- while (parentTG != null) {
+- mainTG = parentTG;
+- parentTG = mainTG.getParent();
+- }
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ Runnable r = new Runnable() {
+- public void run() {
+- Window old = getFullScreenWindow();
+- if (old != null) {
+- exitFullScreenExclusive(old);
+- setDisplayMode(origDisplayMode);
+- }
++ @Override
++ public void run() {
++ Window old = getFullScreenWindow();
++ if (old != null) {
++ exitFullScreenExclusive(old);
++ setDisplayMode(origDisplayMode);
+ }
+- };
+- Thread t = new Thread(mainTG, r,"Display-Change-Shutdown-Thread-"+screen);
++ }
++ };
++ Thread t = new Thread(rootTG, r, "Display-Change-Shutdown-Thread-" + screen);
+ t.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(t);
+ return null;
+--- ./jdk/src/solaris/demo/jni/Poller/Poller.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/demo/jni/Poller/Poller.c Tue Mar 18 12:35:25 2014 -0700
+@@ -318,7 +318,7 @@
+
+ ioevent_t *ioeh;
+
+- if (handle < 0 || handle > MAX_HANDLES)
++ if (handle < 0 || handle >= MAX_HANDLES)
+ {
+ STATE_EXCEPTION("DestroyPoller - handle out of range");
+ return;
+@@ -366,7 +366,7 @@
+ int retval;
+ ioevent_t *ioeh;
+
+- if (handle < 0 || handle > MAX_HANDLES)
++ if (handle < 0 || handle >= MAX_HANDLES)
+ return STATE_EXCEPTION("AddFd - handle out of range");
+
+ ioeh = &IOE_handles[handle];
+@@ -459,7 +459,7 @@
+ return fd;
+ }
+
+- /*
++/*
+ * Class: Poller
+ * Method: nativeRemoveFd
+ * Signature: (II)I
+@@ -469,7 +469,7 @@
+ {
+ ioevent_t *ioeh;
+
+- if (handle < 0 || handle > MAX_HANDLES)
++ if (handle < 0 || handle >= MAX_HANDLES)
+ return STATE_EXCEPTION("RemoveFd - handle out of range");
+
+ ioeh = &IOE_handles[handle];
+@@ -576,7 +576,7 @@
+ int i;
+ ioevent_t *ioeh;
+
+- if (handle < 0 || handle > MAX_HANDLES)
++ if (handle < 0 || handle >= MAX_HANDLES)
+ return STATE_EXCEPTION("IsMember - handle out of range");
+
+ ioeh = &IOE_handles[handle];
+@@ -629,7 +629,7 @@
+ ioevent_t *ioeh;
+ jboolean isCopy1,isCopy2;
+
+- if (handle < 0 || handle > MAX_HANDLES)
++ if (handle < 0 || handle >= MAX_HANDLES)
+ return STATE_EXCEPTION("nativeWait - handle out of range");
+
+ ioeh = &IOE_handles[handle];
+--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Tue Mar 18 12:35:25 2014 -0700
+@@ -76,7 +76,7 @@
+ adPath[*count].st_ino = statBuf.st_ino;
+ adPath[*count].st_dev = statBuf.st_dev;
+ strncpy(adPath[*count].path, path, MAX_NAME_LENGTH);
+- adPath[*count].path[MAX_NAME_LENGTH] = 0;
++ adPath[*count].path[MAX_NAME_LENGTH - 1] = 0;
+ (*count)++;
+ TRACE1("Added audio device %s\n", path);
+ }
+--- ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Tue Mar 18 12:35:25 2014 -0700
+@@ -31,21 +31,24 @@
+ #ifdef __APPLE__
+ #include <crt_externs.h>
+ #define environ (*_NSGetEnviron())
++#else
++/* This is one of the rare times it's more portable to declare an
++ * external symbol explicitly, rather than via a system header.
++ * The declaration is standardized as part of UNIX98, but there is
++ * no standard (not even de-facto) header file where the
++ * declaration is to be found. See:
++ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
++ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
++ *
++ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
++ * environ, are defined in at least one of the headers" (!)
++ */
++extern char **environ;
+ #endif
+
+ JNIEXPORT jobjectArray JNICALL
+ Java_java_lang_ProcessEnvironment_environ(JNIEnv *env, jclass ign)
+ {
+- /* This is one of the rare times it's more portable to declare an
+- * external symbol explicitly, rather than via a system header.
+- * The declaration is standardized as part of UNIX98, but there is
+- * no standard (not even de-facto) header file where the
+- * declaration is to be found. See:
+- * http://www.opengroup.org/onlinepubs/007908799/xbd/envvar.html */
+-#ifndef __APPLE__
+- extern char ** environ; /* environ[i] looks like: VAR=VALUE\0 */
+-#endif
+-
+ jsize count = 0;
+ jsize i, j;
+ jobjectArray result;
+--- ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Mar 18 12:35:25 2014 -0700
+@@ -47,19 +47,15 @@
+ #endif
+ #include <signal.h>
+ #include <string.h>
+-#include <errno.h>
+-#include <dirent.h>
+-#include <unistd.h>
+-#include <fcntl.h>
+-#include <limits.h>
+
+-#ifdef __APPLE__
+-#include <crt_externs.h>
+-#define environ (*_NSGetEnviron())
++#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
++#include <spawn.h>
+ #endif
+
++#include "childproc.h"
++
+ /*
+- * There are 3 possible strategies we might use to "fork":
++ * There are 4 possible strategies we might use to "fork":
+ *
+ * - fork(2). Very portable and reliable but subject to
+ * failure due to overcommit (see the documentation on
+@@ -94,81 +90,21 @@
+ * http://sources.redhat.com/bugzilla/show_bug.cgi?id=10311
+ * but the glibc maintainers closed it as WONTFIX.
+ *
++ * - posix_spawn(). While posix_spawn() is a fairly elaborate and
++ * complicated system call, it can't quite do everything that the old
++ * fork()/exec() combination can do, so the only feasible way to do
++ * this, is to use posix_spawn to launch a new helper executable
++ * "jprochelper", which in turn execs the target (after cleaning
++ * up file-descriptors etc.) The end result is the same as before,
++ * a child process linked to the parent in the same way, but it
++ * avoids the problem of duplicating the parent (VM) process
++ * address space temporarily, before launching the target command.
++ *
+ * Based on the above analysis, we are currently using vfork() on
+- * Linux and fork() on other Unix systems, but the code to use clone()
+- * remains.
++ * Linux, posix_spawn() on Mac and fork() on Solaris, but the code to
++ * use clone() and fork() remains.
+ */
+
+-#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
+-
+-#ifndef START_CHILD_USE_CLONE
+- #ifdef __linux__
+- #define START_CHILD_USE_CLONE 1
+- #else
+- #define START_CHILD_USE_CLONE 0
+- #endif
+-#endif
+-
+-/* By default, use vfork() on Linux. */
+-#ifndef START_CHILD_USE_VFORK
+- #ifdef __linux__
+- #define START_CHILD_USE_VFORK 1
+- #else
+- #define START_CHILD_USE_VFORK 0
+- #endif
+-#endif
+-
+-#if START_CHILD_USE_CLONE
+-#include <sched.h>
+-#define START_CHILD_SYSTEM_CALL "clone"
+-#elif START_CHILD_USE_VFORK
+-#define START_CHILD_SYSTEM_CALL "vfork"
+-#else
+-#define START_CHILD_SYSTEM_CALL "fork"
+-#endif
+-
+-#ifndef STDIN_FILENO
+-#define STDIN_FILENO 0
+-#endif
+-
+-#ifndef STDOUT_FILENO
+-#define STDOUT_FILENO 1
+-#endif
+-
+-#ifndef STDERR_FILENO
+-#define STDERR_FILENO 2
+-#endif
+-
+-#ifndef SA_NOCLDSTOP
+-#define SA_NOCLDSTOP 0
+-#endif
+-
+-#ifndef SA_RESTART
+-#define SA_RESTART 0
+-#endif
+-
+-#define FAIL_FILENO (STDERR_FILENO + 1)
+-
+-/* TODO: Refactor. */
+-#define RESTARTABLE(_cmd, _result) do { \
+- do { \
+- _result = _cmd; \
+- } while((_result == -1) && (errno == EINTR)); \
+-} while(0)
+-
+-/* This is one of the rare times it's more portable to declare an
+- * external symbol explicitly, rather than via a system header.
+- * The declaration is standardized as part of UNIX98, but there is
+- * no standard (not even de-facto) header file where the
+- * declaration is to be found. See:
+- * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
+- * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
+- *
+- * "All identifiers in this volume of IEEE Std 1003.1-2001, except
+- * environ, are defined in at least one of the headers" (!)
+- */
+-extern char **environ;
+-
+
+ static void
+ setSIGCHLDHandler(JNIEnv *env)
+@@ -245,53 +181,35 @@
+ }
+
+ static const char * const *
+-splitPath(JNIEnv *env, const char *path)
++effectivePathv(JNIEnv *env)
+ {
+- const char *p, *q;
+- char **pathv;
++ char *p;
+ int i;
++ const char *path = effectivePath();
+ int count = countOccurrences(path, ':') + 1;
++ size_t pathvsize = sizeof(const char *) * (count+1);
++ size_t pathsize = strlen(path) + 1;
++ const char **pathv = (const char **) xmalloc(env, pathvsize + pathsize);
+
+- pathv = NEW(char*, count+1);
++ if (pathv == NULL)
++ return NULL;
++ p = (char *) pathv + pathvsize;
++ memcpy(p, path, pathsize);
++ /* split PATH by replacing ':' with NULs; empty components => "." */
++ for (i = 0; i < count; i++) {
++ char *q = p + strcspn(p, ":");
++ pathv[i] = (p == q) ? "." : p;
++ *q = '\0';
++ p = q + 1;
++ }
+ pathv[count] = NULL;
+- for (p = path, i = 0; i < count; i++, p = q + 1) {
+- for (q = p; (*q != ':') && (*q != '\0'); q++)
+- ;
+- if (q == p) /* empty PATH component => "." */
+- pathv[i] = "./";
+- else {
+- int addSlash = ((*(q - 1)) != '/');
+- pathv[i] = NEW(char, q - p + addSlash + 1);
+- memcpy(pathv[i], p, q - p);
+- if (addSlash)
+- pathv[i][q - p] = '/';
+- pathv[i][q - p + addSlash] = '\0';
+- }
+- }
+- return (const char * const *) pathv;
++ return pathv;
+ }
+
+-/**
+- * Cached value of JVM's effective PATH.
+- * (We don't support putenv("PATH=...") in native code)
+- */
+-static const char *parentPath;
+-
+-/**
+- * Split, canonicalized version of parentPath
+- */
+-static const char * const *parentPathv;
+-
+-static jfieldID field_exitcode;
+-
+ JNIEXPORT void JNICALL
+-Java_java_lang_UNIXProcess_initIDs(JNIEnv *env, jclass clazz)
++Java_java_lang_UNIXProcess_init(JNIEnv *env, jclass clazz)
+ {
+- field_exitcode = (*env)->GetFieldID(env, clazz, "exitcode", "I");
+-
+- parentPath = effectivePath();
+- parentPathv = splitPath(env, parentPath);
+-
++ parentPathv = effectivePathv(env);
+ setSIGCHLDHandler(env);
+ }
+
+@@ -358,96 +276,6 @@
+ }
+ }
+
+-static ssize_t
+-restartableWrite(int fd, const void *buf, size_t count)
+-{
+- ssize_t result;
+- RESTARTABLE(write(fd, buf, count), result);
+- return result;
+-}
+-
+-static int
+-restartableDup2(int fd_from, int fd_to)
+-{
+- int err;
+- RESTARTABLE(dup2(fd_from, fd_to), err);
+- return err;
+-}
+-
+-static int
+-restartableClose(int fd)
+-{
+- int err;
+- RESTARTABLE(close(fd), err);
+- return err;
+-}
+-
+-static int
+-closeSafely(int fd)
+-{
+- return (fd == -1) ? 0 : restartableClose(fd);
+-}
+-
+-static int
+-isAsciiDigit(char c)
+-{
+- return c >= '0' && c <= '9';
+-}
+-
+-#ifdef _ALLBSD_SOURCE
+-#define FD_DIR "/dev/fd"
+-#define dirent64 dirent
+-#define readdir64 readdir
+-#else
+-#define FD_DIR "/proc/self/fd"
+-#endif
+-
+-static int
+-closeDescriptors(void)
+-{
+- DIR *dp;
+- struct dirent64 *dirp;
+- int from_fd = FAIL_FILENO + 1;
+-
+- /* We're trying to close all file descriptors, but opendir() might
+- * itself be implemented using a file descriptor, and we certainly
+- * don't want to close that while it's in use. We assume that if
+- * opendir() is implemented using a file descriptor, then it uses
+- * the lowest numbered file descriptor, just like open(). So we
+- * close a couple explicitly. */
+-
+- restartableClose(from_fd); /* for possible use by opendir() */
+- restartableClose(from_fd + 1); /* another one for good luck */
+-
+- if ((dp = opendir(FD_DIR)) == NULL)
+- return 0;
+-
+- /* We use readdir64 instead of readdir to work around Solaris bug
+- * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
+- */
+- while ((dirp = readdir64(dp)) != NULL) {
+- int fd;
+- if (isAsciiDigit(dirp->d_name[0]) &&
+- (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
+- restartableClose(fd);
+- }
+-
+- closedir(dp);
+-
+- return 1;
+-}
+-
+-static int
+-moveDescriptor(int fd_from, int fd_to)
+-{
+- if (fd_from != fd_to) {
+- if ((restartableDup2(fd_from, fd_to) == -1) ||
+- (restartableClose(fd_from) == -1))
+- return -1;
+- }
+- return 0;
+-}
+-
+ static const char *
+ getBytes(JNIEnv *env, jbyteArray arr)
+ {
+@@ -463,19 +291,6 @@
+ }
+
+ static void
+-initVectorFromBlock(const char**vector, const char* block, int count)
+-{
+- int i;
+- const char *p;
+- for (i = 0, p = block; i < count; i++) {
+- /* Invariant: p always points to the start of a C string. */
+- vector[i] = p;
+- while (*(p++));
+- }
+- vector[count] = NULL;
+-}
+-
+-static void
+ throwIOException(JNIEnv *env, int errnum, const char *defaultDetail)
+ {
+ static const char * const format = "error=%d, %s";
+@@ -490,6 +305,9 @@
+ }
+ /* ASCII Decimal representation uses 2.4 times as many bits as binary. */
+ errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum));
++ if (errmsg == NULL)
++ return;
++
+ sprintf(errmsg, format, errnum, detail);
+ s = JNU_NewStringPlatform(env, errmsg);
+ if (s != NULL) {
+@@ -515,180 +333,6 @@
+ }
+ #endif /* DEBUG_PROCESS */
+
+-/**
+- * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
+- * If we could do it over again, we would probably not support such an ancient
+- * misfeature, but compatibility wins over sanity. The original support for
+- * this was imported accidentally from execvp().
+- */
+-static void
+-execve_as_traditional_shell_script(const char *file,
+- const char *argv[],
+- const char *const envp[])
+-{
+- /* Use the extra word of space provided for us in argv by caller. */
+- const char *argv0 = argv[0];
+- const char *const *end = argv;
+- while (*end != NULL)
+- ++end;
+- memmove(argv+2, argv+1, (end-argv) * sizeof (*end));
+- argv[0] = "/bin/sh";
+- argv[1] = file;
+- execve(argv[0], (char **) argv, (char **) envp);
+- /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
+- memmove(argv+1, argv+2, (end-argv) * sizeof (*end));
+- argv[0] = argv0;
+-}
+-
+-/**
+- * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
+- * be a shell script and the system default shell is invoked to run it.
+- */
+-static void
+-execve_with_shell_fallback(const char *file,
+- const char *argv[],
+- const char *const envp[])
+-{
+-#if START_CHILD_USE_CLONE || START_CHILD_USE_VFORK
+- /* shared address space; be very careful. */
+- execve(file, (char **) argv, (char **) envp);
+- if (errno == ENOEXEC)
+- execve_as_traditional_shell_script(file, argv, envp);
+-#else
+- /* unshared address space; we can mutate environ. */
+- environ = (char **) envp;
+- execvp(file, (char **) argv);
+-#endif
+-}
+-
+-/**
+- * 'execvpe' should have been included in the Unix standards,
+- * and is a GNU extension in glibc 2.10.
+- *
+- * JDK_execvpe is identical to execvp, except that the child environment is
+- * specified via the 3rd argument instead of being inherited from environ.
+- */
+-static void
+-JDK_execvpe(const char *file,
+- const char *argv[],
+- const char *const envp[])
+-{
+- if (envp == NULL || (char **) envp == environ) {
+- execvp(file, (char **) argv);
+- return;
+- }
+-
+- if (*file == '\0') {
+- errno = ENOENT;
+- return;
+- }
+-
+- if (strchr(file, '/') != NULL) {
+- execve_with_shell_fallback(file, argv, envp);
+- } else {
+- /* We must search PATH (parent's, not child's) */
+- char expanded_file[PATH_MAX];
+- int filelen = strlen(file);
+- int sticky_errno = 0;
+- const char * const * dirs;
+- for (dirs = parentPathv; *dirs; dirs++) {
+- const char * dir = *dirs;
+- int dirlen = strlen(dir);
+- if (filelen + dirlen + 1 >= PATH_MAX) {
+- errno = ENAMETOOLONG;
+- continue;
+- }
+- memcpy(expanded_file, dir, dirlen);
+- memcpy(expanded_file + dirlen, file, filelen);
+- expanded_file[dirlen + filelen] = '\0';
+- execve_with_shell_fallback(expanded_file, argv, envp);
+- /* There are 3 responses to various classes of errno:
+- * return immediately, continue (especially for ENOENT),
+- * or continue with "sticky" errno.
+- *
+- * From exec(3):
+- *
+- * If permission is denied for a file (the attempted
+- * execve returned EACCES), these functions will continue
+- * searching the rest of the search path. If no other
+- * file is found, however, they will return with the
+- * global variable errno set to EACCES.
+- */
+- switch (errno) {
+- case EACCES:
+- sticky_errno = errno;
+- /* FALLTHRU */
+- case ENOENT:
+- case ENOTDIR:
+-#ifdef ELOOP
+- case ELOOP:
+-#endif
+-#ifdef ESTALE
+- case ESTALE:
+-#endif
+-#ifdef ENODEV
+- case ENODEV:
+-#endif
+-#ifdef ETIMEDOUT
+- case ETIMEDOUT:
+-#endif
+- break; /* Try other directories in PATH */
+- default:
+- return;
+- }
+- }
+- if (sticky_errno != 0)
+- errno = sticky_errno;
+- }
+-}
+-
+-/*
+- * Reads nbyte bytes from file descriptor fd into buf,
+- * The read operation is retried in case of EINTR or partial reads.
+- *
+- * Returns number of bytes read (normally nbyte, but may be less in
+- * case of EOF). In case of read errors, returns -1 and sets errno.
+- */
+-static ssize_t
+-readFully(int fd, void *buf, size_t nbyte)
+-{
+- ssize_t remaining = nbyte;
+- for (;;) {
+- ssize_t n = read(fd, buf, remaining);
+- if (n == 0) {
+- return nbyte - remaining;
+- } else if (n > 0) {
+- remaining -= n;
+- if (remaining <= 0)
+- return nbyte;
+- /* We were interrupted in the middle of reading the bytes.
+- * Unlikely, but possible. */
+- buf = (void *) (((char *)buf) + n);
+- } else if (errno == EINTR) {
+- /* Strange signals like SIGJVM1 are possible at any time.
+- * See http://www.dreamsongs.com/WorseIsBetter.html */
+- } else {
+- return -1;
+- }
+- }
+-}
+-
+-typedef struct _ChildStuff
+-{
+- int in[2];
+- int out[2];
+- int err[2];
+- int fail[2];
+- int fds[3];
+- const char **argv;
+- const char **envv;
+- const char *pdir;
+- jboolean redirectErrorStream;
+-#if START_CHILD_USE_CLONE
+- void *clone_stack;
+-#endif
+-} ChildStuff;
+-
+ static void
+ copyPipe(int from[2], int to[2])
+ {
+@@ -696,97 +340,67 @@
+ to[1] = from[1];
+ }
+
+-/**
+- * Child process after a successful fork() or clone().
+- * This function must not return, and must be prepared for either all
+- * of its address space to be shared with its parent, or to be a copy.
+- * It must not modify global variables such as "environ".
++/* arg is an array of pointers to 0 terminated strings. array is terminated
++ * by a null element.
++ *
++ * *nelems and *nbytes receive the number of elements of array (incl 0)
++ * and total number of bytes (incl. 0)
++ * Note. An empty array will have one null element
++ * But if arg is null, then *nelems set to 0, and *nbytes to 0
+ */
+-static int
+-childProcess(void *arg)
++static void arraysize(const char * const *arg, int *nelems, int *nbytes)
+ {
+- const ChildStuff* p = (const ChildStuff*) arg;
++ int i, bytes, count;
++ const char * const *a = arg;
++ char *p;
++ int *q;
++ if (arg == 0) {
++ *nelems = 0;
++ *nbytes = 0;
++ return;
++ }
++ /* count the array elements and number of bytes */
++ for (count=0, bytes=0; *a != 0; count++, a++) {
++ bytes += strlen(*a)+1;
++ }
++ *nbytes = bytes;
++ *nelems = count+1;
++}
+
+- /* Close the parent sides of the pipes.
+- Closing pipe fds here is redundant, since closeDescriptors()
+- would do it anyways, but a little paranoia is a good thing. */
+- if ((closeSafely(p->in[1]) == -1) ||
+- (closeSafely(p->out[0]) == -1) ||
+- (closeSafely(p->err[0]) == -1) ||
+- (closeSafely(p->fail[0]) == -1))
+- goto WhyCantJohnnyExec;
++/* copy the strings from arg[] into buf, starting at given offset
++ * return new offset to next free byte
++ */
++static int copystrings(char *buf, int offset, const char * const *arg) {
++ char *p;
++ const char * const *a;
++ int count=0;
+
+- /* Give the child sides of the pipes the right fileno's. */
+- /* Note: it is possible for in[0] == 0 */
+- if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
+- STDIN_FILENO) == -1) ||
+- (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
+- STDOUT_FILENO) == -1))
+- goto WhyCantJohnnyExec;
+-
+- if (p->redirectErrorStream) {
+- if ((closeSafely(p->err[1]) == -1) ||
+- (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
+- goto WhyCantJohnnyExec;
+- } else {
+- if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
+- STDERR_FILENO) == -1)
+- goto WhyCantJohnnyExec;
++ if (arg == 0) {
++ return offset;
+ }
+-
+- if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
+- goto WhyCantJohnnyExec;
+-
+- /* close everything */
+- if (closeDescriptors() == 0) { /* failed, close the old way */
+- int max_fd = (int)sysconf(_SC_OPEN_MAX);
+- int fd;
+- for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
+- if (restartableClose(fd) == -1 && errno != EBADF)
+- goto WhyCantJohnnyExec;
++ for (p=buf+offset, a=arg; *a != 0; a++) {
++ int len = strlen(*a) +1;
++ memcpy(p, *a, len);
++ p += len;
++ count += len;
+ }
+-
+- /* change to the new working directory */
+- if (p->pdir != NULL && chdir(p->pdir) < 0)
+- goto WhyCantJohnnyExec;
+-
+- if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
+- goto WhyCantJohnnyExec;
+-
+- JDK_execvpe(p->argv[0], p->argv, p->envv);
+-
+- WhyCantJohnnyExec:
+- /* We used to go to an awful lot of trouble to predict whether the
+- * child would fail, but there is no reliable way to predict the
+- * success of an operation without *trying* it, and there's no way
+- * to try a chdir or exec in the parent. Instead, all we need is a
+- * way to communicate any failure back to the parent. Easy; we just
+- * send the errno back to the parent over a pipe in case of failure.
+- * The tricky thing is, how do we communicate the *success* of exec?
+- * We use FD_CLOEXEC together with the fact that a read() on a pipe
+- * yields EOF when the write ends (we have two of them!) are closed.
+- */
+- {
+- int errnum = errno;
+- restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
+- }
+- restartableClose(FAIL_FILENO);
+- _exit(-1);
+- return 0; /* Suppress warning "no return value from function" */
++ return offset+count;
+ }
+
+ /**
+- * Start a child process running function childProcess.
+- * This function only returns in the parent.
+ * We are unusually paranoid; use of clone/vfork is
+ * especially likely to tickle gcc/glibc bugs.
+ */
+ #ifdef __attribute_noinline__ /* See: sys/cdefs.h */
+ __attribute_noinline__
+ #endif
++
++#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
++
++#ifdef START_CHILD_USE_CLONE
+ static pid_t
+-startChild(ChildStuff *c) {
+-#if START_CHILD_USE_CLONE
++cloneChild(ChildStuff *c) {
++#ifdef __linux__
+ #define START_CHILD_CLONE_STACK_SIZE (64 * 1024)
+ /*
+ * See clone(2).
+@@ -800,33 +414,161 @@
+ c->clone_stack + START_CHILD_CLONE_STACK_SIZE,
+ CLONE_VFORK | CLONE_VM | SIGCHLD, c);
+ #else
+- #if START_CHILD_USE_VFORK
++/* not available on Solaris / Mac */
++ assert(0);
++ return -1;
++#endif
++}
++#endif
++
++static pid_t
++vforkChild(ChildStuff *c) {
++ volatile pid_t resultPid;
++
+ /*
+ * We separate the call to vfork into a separate function to make
+ * very sure to keep stack of child from corrupting stack of parent,
+ * as suggested by the scary gcc warning:
+ * warning: variable 'foo' might be clobbered by 'longjmp' or 'vfork'
+ */
+- volatile pid_t resultPid = vfork();
+- #else
++ resultPid = vfork();
++
++ if (resultPid == 0) {
++ childProcess(c);
++ }
++ assert(resultPid != 0); /* childProcess never returns */
++ return resultPid;
++}
++
++static pid_t
++forkChild(ChildStuff *c) {
++ pid_t resultPid;
++
+ /*
+ * From Solaris fork(2): In Solaris 10, a call to fork() is
+ * identical to a call to fork1(); only the calling thread is
+ * replicated in the child process. This is the POSIX-specified
+ * behavior for fork().
+ */
+- pid_t resultPid = fork();
+- #endif
+- if (resultPid == 0)
++ resultPid = fork();
++
++ if (resultPid == 0) {
+ childProcess(c);
++ }
+ assert(resultPid != 0); /* childProcess never returns */
+ return resultPid;
+-#endif /* ! START_CHILD_USE_CLONE */
++}
++
++#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
++static pid_t
++spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
++ pid_t resultPid;
++ jboolean isCopy;
++ int i, offset, rval, bufsize, magic;
++ char *buf, buf1[16];
++ char *hlpargs[2];
++ SpawnInfo sp;
++
++ /* need to tell helper which fd is for receiving the childstuff
++ * and which fd to send response back on
++ */
++ snprintf(buf1, sizeof(buf1), "%d:%d", c->childenv[0], c->fail[1]);
++ /* put the fd string as argument to the helper cmd */
++ hlpargs[0] = buf1;
++ hlpargs[1] = 0;
++
++ /* Following items are sent down the pipe to the helper
++ * after it is spawned.
++ * All strings are null terminated. All arrays of strings
++ * have an empty string for termination.
++ * - the ChildStuff struct
++ * - the SpawnInfo struct
++ * - the argv strings array
++ * - the envv strings array
++ * - the home directory string
++ * - the parentPath string
++ * - the parentPathv array
++ */
++ /* First calculate the sizes */
++ arraysize(c->argv, &sp.nargv, &sp.argvBytes);
++ bufsize = sp.argvBytes;
++ arraysize(c->envv, &sp.nenvv, &sp.envvBytes);
++ bufsize += sp.envvBytes;
++ sp.dirlen = c->pdir == 0 ? 0 : strlen(c->pdir)+1;
++ bufsize += sp.dirlen;
++ arraysize(parentPathv, &sp.nparentPathv, &sp.parentPathvBytes);
++ bufsize += sp.parentPathvBytes;
++ /* We need to clear FD_CLOEXEC if set in the fds[].
++ * Files are created FD_CLOEXEC in Java.
++ * Otherwise, they will be closed when the target gets exec'd */
++ for (i=0; i<3; i++) {
++ if (c->fds[i] != -1) {
++ int flags = fcntl(c->fds[i], F_GETFD);
++ if (flags & FD_CLOEXEC) {
++ fcntl(c->fds[i], F_SETFD, flags & (~1));
++ }
++ }
++ }
++
++ rval = posix_spawn(&resultPid, helperpath, 0, 0, (char * const *) hlpargs, environ);
++
++ if (rval != 0) {
++ return -1;
++ }
++
++ /* now the lengths are known, copy the data */
++ buf = NEW(char, bufsize);
++ if (buf == 0) {
++ return -1;
++ }
++ offset = copystrings(buf, 0, &c->argv[0]);
++ offset = copystrings(buf, offset, &c->envv[0]);
++ memcpy(buf+offset, c->pdir, sp.dirlen);
++ offset += sp.dirlen;
++ offset = copystrings(buf, offset, parentPathv);
++ assert(offset == bufsize);
++
++ magic = magicNumber();
++
++ /* write the two structs and the data buffer */
++ write(c->childenv[1], (char *)&magic, sizeof(magic)); // magic number first
++ write(c->childenv[1], (char *)c, sizeof(*c));
++ write(c->childenv[1], (char *)&sp, sizeof(sp));
++ write(c->childenv[1], buf, bufsize);
++ free(buf);
++
++ /* In this mode an external main() in invoked which calls back into
++ * childProcess() in this file, rather than directly
++ * via the statement below */
++ return resultPid;
++}
++#endif
++
++/*
++ * Start a child process running function childProcess.
++ * This function only returns in the parent.
++ */
++static pid_t
++startChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
++ switch (c->mode) {
++ case MODE_VFORK:
++ return vforkChild(c);
++ case MODE_FORK:
++ return forkChild(c);
++#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
++ case MODE_POSIX_SPAWN:
++ return spawnChild(env, process, c, helperpath);
++#endif
++ default:
++ return -1;
++ }
+ }
+
+ JNIEXPORT jint JNICALL
+ Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
+ jobject process,
++ jint mode,
++ jbyteArray helperpath,
+ jbyteArray prog,
+ jbyteArray argBlock, jint argc,
+ jbyteArray envBlock, jint envc,
+@@ -836,32 +578,35 @@
+ {
+ int errnum;
+ int resultPid = -1;
+- int in[2], out[2], err[2], fail[2];
++ int in[2], out[2], err[2], fail[2], childenv[2];
+ jint *fds = NULL;
++ const char *phelperpath = NULL;
+ const char *pprog = NULL;
+ const char *pargBlock = NULL;
+ const char *penvBlock = NULL;
+ ChildStuff *c;
+
+ in[0] = in[1] = out[0] = out[1] = err[0] = err[1] = fail[0] = fail[1] = -1;
++ childenv[0] = childenv[1] = -1;
+
+ if ((c = NEW(ChildStuff, 1)) == NULL) return -1;
+ c->argv = NULL;
+ c->envv = NULL;
+ c->pdir = NULL;
+-#if START_CHILD_USE_CLONE
+ c->clone_stack = NULL;
+-#endif
+
+ /* Convert prog + argBlock into a char ** argv.
+ * Add one word room for expansion of argv for use by
+ * execve_as_traditional_shell_script.
++ * This word is also used when using spawn mode
+ */
+ assert(prog != NULL && argBlock != NULL);
++ if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
+ if ((pprog = getBytes(env, prog)) == NULL) goto Catch;
+ if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch;
+ if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch;
+ c->argv[0] = pprog;
++ c->argc = argc + 2;
+ initVectorFromBlock(c->argv+1, pargBlock, argc);
+
+ if (envBlock != NULL) {
+@@ -882,6 +627,7 @@
+ if ((fds[0] == -1 && pipe(in) < 0) ||
+ (fds[1] == -1 && pipe(out) < 0) ||
+ (fds[2] == -1 && pipe(err) < 0) ||
++ (pipe(childenv) < 0) ||
+ (pipe(fail) < 0)) {
+ throwIOException(env, errno, "Bad file descriptor");
+ goto Catch;
+@@ -894,18 +640,29 @@
+ copyPipe(out, c->out);
+ copyPipe(err, c->err);
+ copyPipe(fail, c->fail);
++ copyPipe(childenv, c->childenv);
+
+ c->redirectErrorStream = redirectErrorStream;
++ c->mode = mode;
+
+- resultPid = startChild(c);
++ resultPid = startChild(env, process, c, phelperpath);
+ assert(resultPid != 0);
+
+ if (resultPid < 0) {
+- throwIOException(env, errno, START_CHILD_SYSTEM_CALL " failed");
++ switch (c->mode) {
++ case MODE_VFORK:
++ throwIOException(env, errno, "vfork failed");
++ break;
++ case MODE_FORK:
++ throwIOException(env, errno, "fork failed");
++ break;
++ case MODE_POSIX_SPAWN:
++ throwIOException(env, errno, "spawn failed");
++ break;
++ }
+ goto Catch;
+ }
+-
+- restartableClose(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec */
++ close(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec (childproc.c) */
+
+ switch (readFully(fail[0], &errnum, sizeof(errnum))) {
+ case 0: break; /* Exec succeeded */
+@@ -923,18 +680,18 @@
+ fds[2] = (err[0] != -1) ? err[0] : -1;
+
+ Finally:
+-#if START_CHILD_USE_CLONE
+ free(c->clone_stack);
+-#endif
+
+ /* Always clean up the child's side of the pipes */
+ closeSafely(in [0]);
+ closeSafely(out[1]);
+ closeSafely(err[1]);
+
+- /* Always clean up fail descriptors */
++ /* Always clean up fail and childEnv descriptors */
+ closeSafely(fail[0]);
+ closeSafely(fail[1]);
++ closeSafely(childenv[0]);
++ closeSafely(childenv[1]);
+
+ releaseBytes(env, prog, pprog);
+ releaseBytes(env, argBlock, pargBlock);
+@@ -952,9 +709,9 @@
+
+ Catch:
+ /* Clean up the parent's side of the pipes in case of failure only */
+- closeSafely(in [1]);
+- closeSafely(out[0]);
+- closeSafely(err[0]);
++ closeSafely(in [1]); in[1] = -1;
++ closeSafely(out[0]); out[0] = -1;
++ closeSafely(err[0]); err[0] = -1;
+ goto Finally;
+ }
+
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/solaris/native/java/lang/childproc.c Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,376 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++#include <dirent.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <limits.h>
++
++#include "childproc.h"
++
++
++ssize_t
++restartableWrite(int fd, const void *buf, size_t count)
++{
++ ssize_t result;
++ RESTARTABLE(write(fd, buf, count), result);
++ return result;
++}
++
++int
++restartableDup2(int fd_from, int fd_to)
++{
++ int err;
++ RESTARTABLE(dup2(fd_from, fd_to), err);
++ return err;
++}
++
++int
++closeSafely(int fd)
++{
++ return (fd == -1) ? 0 : close(fd);
++}
++
++int
++isAsciiDigit(char c)
++{
++ return c >= '0' && c <= '9';
++}
++
++#ifdef _ALLBSD_SOURCE
++#define FD_DIR "/dev/fd"
++#define dirent64 dirent
++#define readdir64 readdir
++#else
++#define FD_DIR "/proc/self/fd"
++#endif
++
++int
++closeDescriptors(void)
++{
++ DIR *dp;
++ struct dirent64 *dirp;
++ int from_fd = FAIL_FILENO + 1;
++
++ /* We're trying to close all file descriptors, but opendir() might
++ * itself be implemented using a file descriptor, and we certainly
++ * don't want to close that while it's in use. We assume that if
++ * opendir() is implemented using a file descriptor, then it uses
++ * the lowest numbered file descriptor, just like open(). So we
++ * close a couple explicitly. */
++
++ close(from_fd); /* for possible use by opendir() */
++ close(from_fd + 1); /* another one for good luck */
++
++ if ((dp = opendir(FD_DIR)) == NULL)
++ return 0;
++
++ /* We use readdir64 instead of readdir to work around Solaris bug
++ * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
++ */
++ while ((dirp = readdir64(dp)) != NULL) {
++ int fd;
++ if (isAsciiDigit(dirp->d_name[0]) &&
++ (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
++ close(fd);
++ }
++
++ closedir(dp);
++
++ return 1;
++}
++
++int
++moveDescriptor(int fd_from, int fd_to)
++{
++ if (fd_from != fd_to) {
++ if ((restartableDup2(fd_from, fd_to) == -1) ||
++ (close(fd_from) == -1))
++ return -1;
++ }
++ return 0;
++}
++
++int
++magicNumber() {
++ return 43110;
++}
++
++/*
++ * Reads nbyte bytes from file descriptor fd into buf,
++ * The read operation is retried in case of EINTR or partial reads.
++ *
++ * Returns number of bytes read (normally nbyte, but may be less in
++ * case of EOF). In case of read errors, returns -1 and sets errno.
++ */
++ssize_t
++readFully(int fd, void *buf, size_t nbyte)
++{
++ ssize_t remaining = nbyte;
++ for (;;) {
++ ssize_t n = read(fd, buf, remaining);
++ if (n == 0) {
++ return nbyte - remaining;
++ } else if (n > 0) {
++ remaining -= n;
++ if (remaining <= 0)
++ return nbyte;
++ /* We were interrupted in the middle of reading the bytes.
++ * Unlikely, but possible. */
++ buf = (void *) (((char *)buf) + n);
++ } else if (errno == EINTR) {
++ /* Strange signals like SIGJVM1 are possible at any time.
++ * See http://www.dreamsongs.com/WorseIsBetter.html */
++ } else {
++ return -1;
++ }
++ }
++}
++
++void
++initVectorFromBlock(const char**vector, const char* block, int count)
++{
++ int i;
++ const char *p;
++ for (i = 0, p = block; i < count; i++) {
++ /* Invariant: p always points to the start of a C string. */
++ vector[i] = p;
++ while (*(p++));
++ }
++ vector[count] = NULL;
++}
++
++/**
++ * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
++ * If we could do it over again, we would probably not support such an ancient
++ * misfeature, but compatibility wins over sanity. The original support for
++ * this was imported accidentally from execvp().
++ */
++void
++execve_as_traditional_shell_script(const char *file,
++ const char *argv[],
++ const char *const envp[])
++{
++ /* Use the extra word of space provided for us in argv by caller. */
++ const char *argv0 = argv[0];
++ const char *const *end = argv;
++ while (*end != NULL)
++ ++end;
++ memmove(argv+2, argv+1, (end-argv) * sizeof(*end));
++ argv[0] = "/bin/sh";
++ argv[1] = file;
++ execve(argv[0], (char **) argv, (char **) envp);
++ /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
++ memmove(argv+1, argv+2, (end-argv) * sizeof(*end));
++ argv[0] = argv0;
++}
++
++/**
++ * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
++ * be a shell script and the system default shell is invoked to run it.
++ */
++void
++execve_with_shell_fallback(int mode, const char *file,
++ const char *argv[],
++ const char *const envp[])
++{
++ if (mode == MODE_CLONE || mode == MODE_VFORK) {
++ /* shared address space; be very careful. */
++ execve(file, (char **) argv, (char **) envp);
++ if (errno == ENOEXEC)
++ execve_as_traditional_shell_script(file, argv, envp);
++ } else {
++ /* unshared address space; we can mutate environ. */
++ environ = (char **) envp;
++ execvp(file, (char **) argv);
++ }
++}
++
++/**
++ * 'execvpe' should have been included in the Unix standards,
++ * and is a GNU extension in glibc 2.10.
++ *
++ * JDK_execvpe is identical to execvp, except that the child environment is
++ * specified via the 3rd argument instead of being inherited from environ.
++ */
++void
++JDK_execvpe(int mode, const char *file,
++ const char *argv[],
++ const char *const envp[])
++{
++ if (envp == NULL || (char **) envp == environ) {
++ execvp(file, (char **) argv);
++ return;
++ }
++
++ if (*file == '\0') {
++ errno = ENOENT;
++ return;
++ }
++
++ if (strchr(file, '/') != NULL) {
++ execve_with_shell_fallback(mode, file, argv, envp);
++ } else {
++ /* We must search PATH (parent's, not child's) */
++ char expanded_file[PATH_MAX];
++ int filelen = strlen(file);
++ int sticky_errno = 0;
++ const char * const * dirs;
++ for (dirs = parentPathv; *dirs; dirs++) {
++ const char * dir = *dirs;
++ int dirlen = strlen(dir);
++ if (filelen + dirlen + 2 >= PATH_MAX) {
++ errno = ENAMETOOLONG;
++ continue;
++ }
++ memcpy(expanded_file, dir, dirlen);
++ if (expanded_file[dirlen - 1] != '/')
++ expanded_file[dirlen++] = '/';
++ memcpy(expanded_file + dirlen, file, filelen);
++ expanded_file[dirlen + filelen] = '\0';
++ execve_with_shell_fallback(mode, expanded_file, argv, envp);
++ /* There are 3 responses to various classes of errno:
++ * return immediately, continue (especially for ENOENT),
++ * or continue with "sticky" errno.
++ *
++ * From exec(3):
++ *
++ * If permission is denied for a file (the attempted
++ * execve returned EACCES), these functions will continue
++ * searching the rest of the search path. If no other
++ * file is found, however, they will return with the
++ * global variable errno set to EACCES.
++ */
++ switch (errno) {
++ case EACCES:
++ sticky_errno = errno;
++ /* FALLTHRU */
++ case ENOENT:
++ case ENOTDIR:
++#ifdef ELOOP
++ case ELOOP:
++#endif
++#ifdef ESTALE
++ case ESTALE:
++#endif
++#ifdef ENODEV
++ case ENODEV:
++#endif
++#ifdef ETIMEDOUT
++ case ETIMEDOUT:
++#endif
++ break; /* Try other directories in PATH */
++ default:
++ return;
++ }
++ }
++ if (sticky_errno != 0)
++ errno = sticky_errno;
++ }
++}
++
++/**
++ * Child process after a successful fork() or clone().
++ * This function must not return, and must be prepared for either all
++ * of its address space to be shared with its parent, or to be a copy.
++ * It must not modify global variables such as "environ".
++ */
++int
++childProcess(void *arg)
++{
++ const ChildStuff* p = (const ChildStuff*) arg;
++
++ /* Close the parent sides of the pipes.
++ Closing pipe fds here is redundant, since closeDescriptors()
++ would do it anyways, but a little paranoia is a good thing. */
++ if ((closeSafely(p->in[1]) == -1) ||
++ (closeSafely(p->out[0]) == -1) ||
++ (closeSafely(p->err[0]) == -1) ||
++ (closeSafely(p->childenv[0]) == -1) ||
++ (closeSafely(p->childenv[1]) == -1) ||
++ (closeSafely(p->fail[0]) == -1))
++ goto WhyCantJohnnyExec;
++
++ /* Give the child sides of the pipes the right fileno's. */
++ /* Note: it is possible for in[0] == 0 */
++ if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
++ STDIN_FILENO) == -1) ||
++ (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
++ STDOUT_FILENO) == -1))
++ goto WhyCantJohnnyExec;
++
++ if (p->redirectErrorStream) {
++ if ((closeSafely(p->err[1]) == -1) ||
++ (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
++ goto WhyCantJohnnyExec;
++ } else {
++ if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
++ STDERR_FILENO) == -1)
++ goto WhyCantJohnnyExec;
++ }
++
++ if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
++ goto WhyCantJohnnyExec;
++
++ /* close everything */
++ if (closeDescriptors() == 0) { /* failed, close the old way */
++ int max_fd = (int)sysconf(_SC_OPEN_MAX);
++ int fd;
++ for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
++ if (close(fd) == -1 && errno != EBADF)
++ goto WhyCantJohnnyExec;
++ }
++
++ /* change to the new working directory */
++ if (p->pdir != NULL && chdir(p->pdir) < 0)
++ goto WhyCantJohnnyExec;
++
++ if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
++ goto WhyCantJohnnyExec;
++
++ JDK_execvpe(p->mode, p->argv[0], p->argv, p->envv);
++
++ WhyCantJohnnyExec:
++ /* We used to go to an awful lot of trouble to predict whether the
++ * child would fail, but there is no reliable way to predict the
++ * success of an operation without *trying* it, and there's no way
++ * to try a chdir or exec in the parent. Instead, all we need is a
++ * way to communicate any failure back to the parent. Easy; we just
++ * send the errno back to the parent over a pipe in case of failure.
++ * The tricky thing is, how do we communicate the *success* of exec?
++ * We use FD_CLOEXEC together with the fact that a read() on a pipe
++ * yields EOF when the write ends (we have two of them!) are closed.
++ */
++ {
++ int errnum = errno;
++ restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
++ }
++ close(FAIL_FILENO);
++ _exit(-1);
++ return 0; /* Suppress warning "no return value from function" */
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/solaris/native/java/lang/childproc.h Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,145 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++#ifndef CHILDPROC_MD_H
++#define CHILDPROC_MD_H
++
++#include <sys/types.h>
++
++#ifdef __APPLE__
++#include <crt_externs.h>
++#define environ (*_NSGetEnviron())
++#else
++/* This is one of the rare times it's more portable to declare an
++ * external symbol explicitly, rather than via a system header.
++ * The declaration is standardized as part of UNIX98, but there is
++ * no standard (not even de-facto) header file where the
++ * declaration is to be found. See:
++ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
++ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
++ *
++ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
++ * environ, are defined in at least one of the headers" (!)
++ */
++extern char **environ;
++#endif
++
++#ifdef __linux__
++#include <sched.h>
++#endif
++
++#ifndef STDIN_FILENO
++#define STDIN_FILENO 0
++#endif
++
++#ifndef STDOUT_FILENO
++#define STDOUT_FILENO 1
++#endif
++
++#ifndef STDERR_FILENO
++#define STDERR_FILENO 2
++#endif
++
++#ifndef SA_NOCLDSTOP
++#define SA_NOCLDSTOP 0
++#endif
++
++#ifndef SA_RESTART
++#define SA_RESTART 0
++#endif
++
++#define FAIL_FILENO (STDERR_FILENO + 1)
++
++/* TODO: Refactor. */
++#define RESTARTABLE(_cmd, _result) do { \
++ do { \
++ _result = _cmd; \
++ } while((_result == -1) && (errno == EINTR)); \
++} while(0)
++
++/* These numbers must be the same as the Enum in UNIXProcess.java
++ * Must be a better way of doing this.
++ */
++#define MODE_FORK 1
++#define MODE_POSIX_SPAWN 2
++#define MODE_VFORK 3
++#define MODE_CLONE 4
++
++typedef struct _ChildStuff
++{
++ int in[2];
++ int out[2];
++ int err[2];
++ int fail[2];
++ int childenv[2];
++ int fds[3];
++ int mode;
++ const char **argv;
++ int argc;
++ const char **envv;
++ const char *pdir;
++ int redirectErrorStream;
++ void *clone_stack;
++} ChildStuff;
++
++/* following used in addition when mode is SPAWN */
++typedef struct _SpawnInfo {
++ int nargv; /* number of argv array elements */
++ int argvBytes; /* total number of bytes in argv array */
++ int nenvv; /* number of envv array elements */
++ int envvBytes; /* total number of bytes in envv array */
++ int dirlen; /* length of home directory string */
++ int nparentPathv; /* number of elements in parentPathv array */
++ int parentPathvBytes; /* total number of bytes in parentPathv array */
++} SpawnInfo;
++
++/**
++ * The cached and split version of the JDK's effective PATH.
++ * (We don't support putenv("PATH=...") in native code)
++ */
++const char * const *parentPathv;
++
++ssize_t restartableWrite(int fd, const void *buf, size_t count);
++int restartableDup2(int fd_from, int fd_to);
++int closeSafely(int fd);
++int isAsciiDigit(char c);
++int closeDescriptors(void);
++int moveDescriptor(int fd_from, int fd_to);
++
++int magicNumber();
++ssize_t readFully(int fd, void *buf, size_t nbyte);
++void initVectorFromBlock(const char**vector, const char* block, int count);
++void execve_as_traditional_shell_script(const char *file,
++ const char *argv[],
++ const char *const envp[]);
++void execve_with_shell_fallback(int mode, const char *file,
++ const char *argv[],
++ const char *const envp[]);
++void JDK_execvpe(int mode, const char *file,
++ const char *argv[],
++ const char *const envp[]);
++int childProcess(void *arg);
++
++#endif
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/solaris/native/java/lang/jspawnhelper.c Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,149 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation. Oracle designates this
++ * particular file as subject to the "Classpath" exception as provided
++ * by Oracle in the LICENSE file that accompanied this code.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++#include <errno.h>
++#include <fcntl.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++
++#include "childproc.h"
++
++extern int errno;
++
++#define ALLOC(X,Y) { \
++ void *mptr; \
++ mptr = malloc (Y); \
++ if (mptr == 0) { \
++ error (fdout, ERR_MALLOC); \
++ } \
++ X = mptr; \
++}
++
++#define ERR_MALLOC 1
++#define ERR_PIPE 2
++#define ERR_ARGS 3
++
++void error (int fd, int err) {
++ write (fd, &err, sizeof(err));
++ exit (1);
++}
++
++void shutItDown() {
++ fprintf(stdout, "This command is not for general use and should ");
++ fprintf(stdout, "only be run as the result of a call to\n");
++ fprintf(stdout, "ProcessBuilder.start() or Runtime.exec() in a java ");
++ fprintf(stdout, "application\n");
++ _exit(1);
++}
++
++/*
++ * read the following off the pipefd
++ * - the ChildStuff struct
++ * - the SpawnInfo struct
++ * - the data strings for fields in ChildStuff
++ */
++void initChildStuff (int fdin, int fdout, ChildStuff *c) {
++ int n;
++ int argvBytes, nargv, envvBytes, nenvv;
++ int dirlen;
++ char *buf;
++ SpawnInfo sp;
++ int bufsize, offset=0;
++ int magic;
++ int res;
++
++ res = readFully (fdin, &magic, sizeof(magic));
++ if (res != 4 || magic != magicNumber()) {
++ error (fdout, ERR_PIPE);
++ }
++
++ if (readFully (fdin, c, sizeof(*c)) == -1) {
++ error (fdout, ERR_PIPE);
++ }
++
++ if (readFully (fdin, &sp, sizeof(sp)) == -1) {
++ error (fdout, ERR_PIPE);
++ }
++
++ bufsize = sp.argvBytes + sp.envvBytes +
++ sp.dirlen + sp.parentPathvBytes;
++
++ ALLOC(buf, bufsize);
++
++ if (readFully (fdin, buf, bufsize) == -1) {
++ error (fdout, ERR_PIPE);
++ }
++
++ /* Initialize argv[] */
++ ALLOC(c->argv, sizeof(char *) * sp.nargv);
++ initVectorFromBlock (c->argv, buf+offset, sp.nargv-1);
++ offset += sp.argvBytes;
++
++ /* Initialize envv[] */
++ if (sp.nenvv == 0) {
++ c->envv = 0;
++ } else {
++ ALLOC(c->envv, sizeof(char *) * sp.nenvv);
++ initVectorFromBlock (c->envv, buf+offset, sp.nenvv-1);
++ offset += sp.envvBytes;
++ }
++
++ /* Initialize pdir */
++ if (sp.dirlen == 0) {
++ c->pdir = 0;
++ } else {
++ c->pdir = buf+offset;
++ offset += sp.dirlen;
++ }
++
++ /* Initialize parentPathv[] */
++ ALLOC(parentPathv, sizeof (char *) * sp.nparentPathv)
++ initVectorFromBlock ((const char**)parentPathv, buf+offset, sp.nparentPathv-1);
++ offset += sp.parentPathvBytes;
++}
++
++int main(int argc, char *argv[]) {
++ ChildStuff c;
++ int t;
++ struct stat buf;
++ /* argv[0] contains the fd number to read all the child info */
++ int r, fdin, fdout;
++
++ r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout);
++ if (r == 2 && fcntl(fdin, F_GETFD) != -1) {
++ fstat(fdin, &buf);
++ if (!S_ISFIFO(buf.st_mode))
++ shutItDown();
++ } else {
++ shutItDown();
++ }
++ initChildStuff (fdin, fdout, &c);
++
++ childProcess (&c);
++ return 0; /* NOT REACHED */
++}
+--- ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -96,7 +96,7 @@
+ jvm = vm;
+
+ /* Get address of this library and the directory containing it. */
+- dladdr((void *)JNI_OnLoad, &dlinfo);
++ dladdr((void *)AWT_OnLoad, &dlinfo);
+ realpath((char *)dlinfo.dli_fname, buf);
+ len = strlen(buf);
+ p = strrchr(buf, '/');
+--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -41,6 +41,7 @@
+
+ import static sun.awt.shell.Win32ShellFolder2.*;
+ import sun.awt.OSInfo;
++import sun.misc.ThreadGroupUtils;
+
+ // NOTE: This class supersedes Win32ShellFolderManager, which was removed
+ // from distribution after version 1.4.2.
+@@ -505,23 +506,19 @@
+ }
+ }
+ };
+- comThread =
+- AccessController.doPrivileged(
+- new PrivilegedAction<Thread>() {
+- public Thread run() {
++ comThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
++ @Override
++ public Thread run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+- ThreadGroup tg = Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null;
+- tg = tgn, tgn = tg.getParent());
+- Thread thread = new Thread(tg, comRun, "Swing-Shell");
+- thread.setDaemon(true);
+- return thread;
+- }
+- }
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Thread thread = new Thread(rootTG, comRun, "Swing-Shell");
++ thread.setDaemon(true);
++ return thread;
++ }
++ }
+ );
+ return comThread;
+ }
+--- ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Tue Mar 18 12:35:25 2014 -0700
+@@ -63,7 +63,6 @@
+ }
+
+ protected void setContentsNative(Transferable contents) {
+-
+ // Don't use delayed Clipboard rendering for the Transferable's data.
+ // If we did that, we would call Transferable.getTransferData on
+ // the Toolkit thread, which is a security hole.
+@@ -72,7 +71,7 @@
+ // translated. Then, for each format, translate the data and post
+ // it to the Clipboard.
+ Map formatMap = WDataTransferer.getInstance().
+- getFormatsForTransferable(contents, flavorMap);
++ getFormatsForTransferable(contents, getDefaultFlavorTable());
+
+ openClipboard(this);
+
+--- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -38,6 +38,7 @@
+ import java.security.PrivilegedAction;
+ import sun.awt.AWTAutoShutdown;
+ import sun.awt.SunToolkit;
++import sun.misc.ThreadGroupUtils;
+ import sun.awt.Win32GraphicsDevice;
+ import sun.awt.Win32GraphicsEnvironment;
+ import sun.java2d.d3d.D3DRenderQueue;
+@@ -215,7 +216,7 @@
+
+ private static native void postDispose();
+
+- private static native boolean startToolkitThread(Runnable thread);
++ private static native boolean startToolkitThread(Runnable thread, ThreadGroup rootThreadGroup);
+
+ public WToolkit() {
+ // Startup toolkit threads
+@@ -232,8 +233,15 @@
+ */
+ AWTAutoShutdown.notifyToolkitThreadBusy();
+
+- if (!startToolkitThread(this)) {
+- Thread toolkitThread = new Thread(this, "AWT-Windows");
++ // Find a root TG and attach Appkit thread to it
++ ThreadGroup rootTG = AccessController.doPrivileged(new PrivilegedAction<ThreadGroup>() {
++ @Override
++ public ThreadGroup run() {
++ return ThreadGroupUtils.getRootThreadGroup();
++ }
++ });
++ if (!startToolkitThread(this, rootTG)) {
++ Thread toolkitThread = new Thread(rootTG, this, "AWT-Windows");
+ toolkitThread.setDaemon(true);
+ toolkitThread.start();
+ }
+@@ -263,14 +271,7 @@
+ private final void registerShutdownHook() {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+- ThreadGroup currentTG =
+- Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = currentTG.getParent();
+- while (parentTG != null) {
+- currentTG = parentTG;
+- parentTG = currentTG.getParent();
+- }
+- Thread shutdown = new Thread(currentTG, new Runnable() {
++ Thread shutdown = new Thread(ThreadGroupUtils.getRootThreadGroup(), new Runnable() {
+ public void run() {
+ shutdown();
+ }
+@@ -283,7 +284,14 @@
+ }
+
+ public void run() {
+- Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
++ AccessController.doPrivileged(new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ Thread.currentThread().setContextClassLoader(null);
++ return null;
++ }
++ });
++ Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 1);
+ boolean startPump = init();
+
+ if (startPump) {
+--- ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -36,8 +36,9 @@
+ import java.security.PrivilegedAction;
+ import java.util.ArrayList;
+ import java.util.HashMap;
+-import sun.awt.SunToolkit;
++
+ import sun.awt.AWTAccessor;
++import sun.misc.ThreadGroupUtils;
+ import sun.awt.Win32GraphicsConfig;
+ import sun.awt.windows.WComponentPeer;
+ import sun.java2d.InvalidPipeException;
+@@ -92,30 +93,26 @@
+ public D3DScreenUpdateManager() {
+ done = false;
+ AccessController.doPrivileged(
+- new PrivilegedAction() {
+- public Object run() {
+- ThreadGroup currentTG =
+- Thread.currentThread().getThreadGroup();
+- ThreadGroup parentTG = currentTG.getParent();
+- while (parentTG != null) {
+- currentTG = parentTG;
+- parentTG = currentTG.getParent();
+- }
+- Thread shutdown = new Thread(currentTG, new Runnable() {
++ new PrivilegedAction<Void>() {
++ @Override
++ public Void run() {
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Thread shutdown = new Thread(rootTG, new Runnable() {
++ @Override
+ public void run() {
+ done = true;
+ wakeUpUpdateThread();
+ }
+ });
+- shutdown.setContextClassLoader(null);
+- try {
+- Runtime.getRuntime().addShutdownHook(shutdown);
+- } catch (Exception e) {
+- done = true;
++ shutdown.setContextClassLoader(null);
++ try {
++ Runtime.getRuntime().addShutdownHook(shutdown);
++ } catch (Exception e) {
++ done = true;
++ }
++ return null;
+ }
+- return null;
+ }
+- }
+ );
+ }
+
+@@ -354,21 +351,20 @@
+ */
+ private synchronized void startUpdateThread() {
+ if (screenUpdater == null) {
+- screenUpdater = (Thread)java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction() {
+- public Object run() {
+- ThreadGroup tg =
+- Thread.currentThread().getThreadGroup();
+- for (ThreadGroup tgn = tg;
+- tgn != null; tg = tgn, tgn = tg.getParent());
+- Thread t = new Thread(tg, D3DScreenUpdateManager.this,
+- "D3D Screen Updater");
+- // REMIND: should it be higher?
+- t.setPriority(Thread.NORM_PRIORITY + 2);
+- t.setDaemon(true);
+- return t;
+- }
+- });
++ screenUpdater = AccessController.doPrivileged(
++ new PrivilegedAction<Thread>() {
++ @Override
++ public Thread run() {
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Thread t = new Thread(rootTG,
++ D3DScreenUpdateManager.this,
++ "D3D Screen Updater");
++ // REMIND: should it be higher?
++ t.setPriority(Thread.NORM_PRIORITY + 2);
++ t.setDaemon(true);
++ return t;
++ }
++ });
+ screenUpdater.start();
+ } else {
+ wakeUpUpdateThread();
+--- ./jdk/src/windows/native/java/lang/java_props_md.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/native/java/lang/java_props_md.c Tue Mar 18 12:35:25 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -448,6 +448,7 @@
+ case 0: sprops.os_name = "Windows Vista"; break;
+ case 1: sprops.os_name = "Windows 7"; break;
+ case 2: sprops.os_name = "Windows 8"; break;
++ case 3: sprops.os_name = "Windows 8.1"; break;
+ default: sprops.os_name = "Windows NT (unknown)";
+ }
+ } else {
+@@ -455,6 +456,7 @@
+ case 0: sprops.os_name = "Windows Server 2008"; break;
+ case 1: sprops.os_name = "Windows Server 2008 R2"; break;
+ case 2: sprops.os_name = "Windows Server 2012"; break;
++ case 3: sprops.os_name = "Windows Server 2012 R2"; break;
+ default: sprops.os_name = "Windows NT (unknown)";
+ }
+ }
+--- ./jdk/src/windows/native/sun/font/fontpath.c Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/native/sun/font/fontpath.c Tue Mar 18 12:35:25 2014 -0700
+@@ -185,6 +185,12 @@
+ return 0;
+ }
+
++/* This HDC is initialised and released in the populate family map
++ * JNI entry point, and used within the call which would otherwise
++ * create many DCs.
++ */
++static HDC screenDC = NULL;
++
+ static int DifferentFamily(wchar_t *family, wchar_t* fullName) {
+ LOGFONTW lfw;
+ CheckFamilyInfo info;
+@@ -202,7 +208,7 @@
+ memset(&lfw, 0, sizeof(lfw));
+ wcscpy(lfw.lfFaceName, fullName);
+ lfw.lfCharSet = DEFAULT_CHARSET;
+- EnumFontFamiliesExW(GetDC(NULL), &lfw,
++ EnumFontFamiliesExW(screenDC, &lfw,
+ (FONTENUMPROCW)CheckFontFamilyProcW,
+ (LPARAM)(&info), 0L);
+
+@@ -299,7 +305,7 @@
+ memset(&lfa, 0, sizeof(lfa));
+ strcpy(lfa.lfFaceName, lpelfe->elfLogFont.lfFaceName);
+ lfa.lfCharSet = lpelfe->elfLogFont.lfCharSet;
+- EnumFontFamiliesExA(GetDC(NULL), &lfa,
++ EnumFontFamiliesExA(screenDC, &lfa,
+ (FONTENUMPROCA)EnumFontFacesInFamilyProcA,
+ lParam, 0L);
+ return 1;
+@@ -353,7 +359,7 @@
+ memset(&lfw, 0, sizeof(lfw));
+ wcscpy(lfw.lfFaceName, lpelfe->elfLogFont.lfFaceName);
+ lfw.lfCharSet = lpelfe->elfLogFont.lfCharSet;
+- EnumFontFamiliesExW(GetDC(NULL), &lfw,
++ EnumFontFamiliesExW(screenDC, &lfw,
+ (FONTENUMPROCW)EnumFontFacesInFamilyProcW,
+ lParam, 0L);
+ return 1;
+@@ -613,13 +619,17 @@
+ return;
+ }
+
++ screenDC = GetDC(NULL);
++ if (screenDC == NULL) {
++ return;
++ }
+ /* Enumerate fonts via GDI to build maps of fonts and families */
+ if (IS_NT) {
+ LOGFONTW lfw;
+ memset(&lfw, 0, sizeof(lfw));
+ lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */
+ wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */
+- EnumFontFamiliesExW(GetDC(NULL), &lfw,
++ EnumFontFamiliesExW(screenDC, &lfw,
+ (FONTENUMPROCW)EnumFamilyNamesW,
+ (LPARAM)(&fmi), 0L);
+ } else {
+@@ -627,7 +637,7 @@
+ memset(&lfa, 0, sizeof(lfa));
+ lfa.lfCharSet = DEFAULT_CHARSET; /* all charsets */
+ strcpy(lfa.lfFaceName, ""); /* one face per family */
+- ret = EnumFontFamiliesExA(GetDC(NULL), &lfa,
++ ret = EnumFontFamiliesExA(screenDC, &lfa,
+ (FONTENUMPROCA)EnumFamilyNamesA,
+ (LPARAM)(&fmi), 0L);
+ }
+@@ -637,6 +647,8 @@
+ ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ fontKeyName, 0L, KEY_READ, &hkeyFonts);
+ if (ret != ERROR_SUCCESS) {
++ ReleaseDC(NULL, screenDC);
++ screenDC = NULL;
+ return;
+ }
+
+@@ -653,6 +665,8 @@
+ dwMaxValueNameLen >= MAX_BUFFER ||
+ dwMaxValueDataLen >= MAX_BUFFER) {
+ RegCloseKey(hkeyFonts);
++ ReleaseDC(NULL, screenDC);
++ screenDC = NULL;
+ return;
+ }
+ for (nval = 0; nval < dwNumValues; nval++ ) {
+@@ -692,4 +706,6 @@
+ }
+ }
+ RegCloseKey(hkeyFonts);
++ ReleaseDC(NULL, screenDC);
++ screenDC = NULL;
+ }
+--- ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Tue Mar 18 12:35:25 2014 -0700
+@@ -365,6 +365,7 @@
+ HANDLE hCompleted;
+
+ jobject thread;
++ jobject threadGroup;
+ };
+
+ void ToolkitThreadProc(void *param)
+@@ -377,7 +378,7 @@
+ JavaVMAttachArgs attachArgs;
+ attachArgs.version = JNI_VERSION_1_2;
+ attachArgs.name = "AWT-Windows";
+- attachArgs.group = NULL;
++ attachArgs.group = data->threadGroup;
+
+ jint res = jvm->AttachCurrentThreadAsDaemon((void **)&env, &attachArgs);
+ if (res < 0) {
+@@ -416,17 +417,18 @@
+ /*
+ * Class: sun_awt_windows_WToolkit
+ * Method: startToolkitThread
+- * Signature: (Ljava/lang/Runnable;)Z
++ * Signature: (Ljava/lang/Runnable;Ljava/lang/ThreadGroup)Z
+ */
+ JNIEXPORT jboolean JNICALL
+-Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread)
++Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread, jobject threadGroup)
+ {
+ AwtToolkit& tk = AwtToolkit::GetInstance();
+
+ ToolkitThreadProc_Data data;
+ data.result = false;
+ data.thread = env->NewGlobalRef(thread);
+- if (data.thread == NULL) {
++ data.threadGroup = env->NewGlobalRef(threadGroup);
++ if (data.thread == NULL || data.threadGroup == NULL) {
+ return JNI_FALSE;
+ }
+ data.hCompleted = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+@@ -444,6 +446,7 @@
+ ::CloseHandle(data.hCompleted);
+
+ env->DeleteGlobalRef(data.thread);
++ env->DeleteGlobalRef(data.threadGroup);
+
+ return result ? JNI_TRUE : JNI_FALSE;
+ }
+--- ./jdk/src/windows/resource/java.manifest Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/src/windows/resource/java.manifest Tue Mar 18 12:35:25 2014 -0700
+@@ -44,9 +44,15 @@
+ <!-- Indicate this JDK version is Windows 7 compatible -->
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
++ <!-- Windows Vista -->
++ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
++ <!-- Windows 7 -->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+- <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
++ <!-- Windows 8 -->
++ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
++ <!-- Windows 8.1 -->
++ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+ </application>
+- </compatibility>
++ </compatibility>
+
+ </assembly>
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Graphics2D/DrawString/DrawRotatedString.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,81 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++import java.awt.Color;
++import java.awt.Graphics2D;
++import java.awt.RenderingHints;
++import java.awt.image.BufferedImage;
++import java.io.File;
++import java.io.IOException;
++
++import javax.imageio.ImageIO;
++
++/**
++ * @test
++ * @bug 7190349
++ * @summary Verifies that we get correct direction, when draw rotated string.
++ * @author Sergey Bylokhov
++ * @run main/othervm DrawRotatedString
++ */
++public final class DrawRotatedString {
++
++ private static final int SIZE = 500;
++
++ public static void main(final String[] args) throws IOException {
++ BufferedImage bi = createBufferedImage(true);
++ verify(bi);
++ bi = createBufferedImage(false);
++ verify(bi);
++ System.out.println("Passed");
++ }
++
++ private static void verify(BufferedImage bi) throws IOException {
++ for (int i = 0; i < SIZE; ++i) {
++ for (int j = 0; j < 99; ++j) {
++ //Text should not appear before 100
++ if (bi.getRGB(i, j) != Color.RED.getRGB()) {
++ ImageIO.write(bi, "png", new File("image.png"));
++ throw new RuntimeException("Failed: wrong text location");
++ }
++ }
++ }
++ }
++
++ private static BufferedImage createBufferedImage(final boolean aa) {
++ final BufferedImage bi = new BufferedImage(SIZE, SIZE,
++ BufferedImage.TYPE_INT_RGB);
++ final Graphics2D bg = bi.createGraphics();
++ bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
++ aa ? RenderingHints.VALUE_ANTIALIAS_ON
++ : RenderingHints.VALUE_ANTIALIAS_OFF);
++ bg.setColor(Color.RED);
++ bg.fillRect(0, 0, SIZE, SIZE);
++ bg.translate(100, 100);
++ bg.rotate(Math.toRadians(90));
++ bg.setColor(Color.BLACK);
++ bg.setFont(bg.getFont().deriveFont(20.0f));
++ bg.drawString("MMMMMMMMMMMMMMMM", 0, 0);
++ bg.dispose();
++ return bi;
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Graphics2D/IncorrectTextSize/IncorrectTextSize.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,77 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++import java.awt.Color;
++import java.awt.Font;
++import java.awt.Graphics2D;
++import java.awt.image.BufferedImage;
++import java.io.File;
++import java.io.IOException;
++
++import javax.imageio.ImageIO;
++
++/**
++ * @test
++ * @bug 8013569
++ * @author Sergey Bylokhov
++ */
++public final class IncorrectTextSize {
++
++ static final int scale = 2;
++ static final int width = 1200;
++ static final int height = 100;
++ static BufferedImage bi = new BufferedImage(width, height,
++ BufferedImage.TYPE_INT_ARGB);
++ static final String TEXT = "The quick brown fox jumps over the lazy dog"
++ + "The quick brown fox jumps over the lazy dog";
++
++ public static void main(final String[] args) throws IOException {
++ for (int point = 5; point < 11; ++point) {
++ Graphics2D g2d = bi.createGraphics();
++ g2d.setFont(new Font(Font.DIALOG, Font.PLAIN, point));
++ g2d.scale(scale, scale);
++ g2d.setColor(Color.WHITE);
++ g2d.fillRect(0, 0, width, height);
++ g2d.setColor(Color.green);
++ g2d.drawString(TEXT, 0, 20);
++ int length = g2d.getFontMetrics().stringWidth(TEXT);
++ if (length < 0) {
++ throw new RuntimeException("Negative length");
++ }
++ for (int i = (length + 1) * scale; i < width; ++i) {
++ for (int j = 0; j < height; ++j) {
++ if (bi.getRGB(i, j) != Color.white.getRGB()) {
++ g2d.drawLine(length, 0, length, height);
++ ImageIO.write(bi, "png", new File("image.png"));
++ System.out.println("length = " + length);
++ System.err.println("Wrong color at x=" + i + ",y=" + j);
++ System.err.println("Color is:" + new Color(bi.getRGB(i,
++ j)));
++ throw new RuntimeException("Test failed.");
++ }
++ }
++ }
++ g2d.dispose();
++ }
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Toolkit/LoadAWTCrashTest/LoadAWTCrashTest.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,37 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++/*
++ @test
++ @bug 8031477
++ @summary Crash while awt starting
++ @author Petr Pchelko
++ @run main/othervm LoadAWTCrashTest
++*/
++
++public class LoadAWTCrashTest {
++ public static void main(String[] args) {
++ System.loadLibrary("awt");
++ // If the bug is present JVM would crash or deadlock
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/font/TextLayout/TestAATMorxFont.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ *
++ */
++
++/* @test
++ * @summary verify rendering of MORX fonts on OS X.
++ * @bug 8031462
++ */
++
++import javax.swing.*;
++import javax.swing.border.LineBorder;
++import java.awt.*;
++import java.awt.event.ActionEvent;
++
++public class TestAATMorxFont extends JComponent {
++ public static void main(String[] args) {
++ String osName = System.getProperty("os.name");
++ System.out.println("OS is " + osName);
++ osName = osName.toLowerCase();
++ if (!osName.startsWith("mac")) {
++ return;
++ }
++ SwingUtilities.invokeLater(new Runnable() {
++ public void run() {
++ JFrame frame = new JFrame("Test Morx");
++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
++ TestAATMorxFont panel = new TestAATMorxFont();
++ frame.add(panel);
++ frame.pack();
++ frame.setVisible(true);
++ }
++ });
++ }
++
++ public Dimension getPreferredSize() {
++ return new Dimension(1200, 400);
++ }
++
++ public void paintComponent(Graphics g) {
++ Graphics2D g2d = (Graphics2D)g;
++ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
++ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
++ int y = 50;
++ g.setFont(new Font("Gujarati MT", Font.PLAIN, 40));
++ System.out.println(g.getFont());
++ g.drawString("\u0A95\u0ACD \u0A95\u0A95\u0A95 \u0A95\u0ACD\u0A95\u0ACD\u0A95", 20, y);
++ y += 50;
++ g.setFont(new Font("Tamil Sangam MN", Font.PLAIN, 40));
++ System.out.println(g.getFont());
++ g.drawString("\u0b95\u0bCD \u0b95\u0b95\u0b95 \u0b95\u0bCD\u0b95\u0bCD\u0b95", 20, y);
++ y += 50;
++ g.setFont(new Font("Telugu Sangam MN", Font.PLAIN, 40));
++ System.out.println(g.getFont());
++ g.drawString("\u0c15\u0c4D \u0c15\u0c15\u0c15 \u0c15\u0c4D\u0c15\u0c4D\u0c15", 20, y);
++ y += 50;
++ g.setFont(new Font("Devanagari Sangam MN", Font.PLAIN, 40));
++ System.out.println(g.getFont());
++ g.drawString("\u0915\u0940 \u0915\u0947 \u0915\u0942", 20, y);
++ y += 50;
++ g.drawString("\u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
++ y += 50;
++ g.drawString("\u0930\u093F\u0935\u094D\u092F\u0942 \u0915\u0947 \u092C\u093E\u0926 \u0935\u093F\u0915\u093E\u0938 \u0913\u0932\u0902\u092A\u093F\u0915 \u0938\u0947 \u092C\u093E\u0939\u0930 (\u0926\u0947\u0935\u0928\u093E\u0917\u0930\u0940) (\u0939\u093F\u0928\u094D\u0926\u0940) \u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
++
++ }
++}
++
+--- ./jdk/test/java/beans/Introspector/TestTypeResolver.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/test/java/beans/Introspector/TestTypeResolver.java Tue Mar 18 12:35:25 2014 -0700
+@@ -113,6 +113,8 @@
+ // by private implementations of the various Type interfaces
+ if (expect.equals(t) && t.equals(expect))
+ System.out.println(", as expected");
++ else if ((expect.equals(t) || t.equals(expect)) && expect.toString().equals(t.toString()))
++ System.out.println(", as workaround of the 8023301 bug");
+ else {
+ System.out.println(" BUT SHOULD BE " + expect);
+ failedCases.add(c);
+--- ./jdk/test/java/lang/ProcessBuilder/Basic.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/test/java/lang/ProcessBuilder/Basic.java Tue Mar 18 12:35:25 2014 -0700
+@@ -29,6 +29,7 @@
+ * 4947220 7018606 7034570
+ * @summary Basic tests for Process and Environment Variable code
+ * @run main/othervm/timeout=300 Basic
++ * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic
+ * @author Martin Buchholz
+ */
+
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/ProcessBuilder/BasicLauncher.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,99 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++/*
++ * @test
++ * @bug 5049299
++ * @summary (process) Use posix_spawn, not fork, on S10 to avoid swap exhaustion
++ * @compile BasicLauncher.java Basic.java
++ * @run main BasicLauncher
++ */
++
++import java.io.*;
++import java.nio.file.*;
++
++public class BasicLauncher {
++
++ private static boolean passed = false;
++
++ public static void main(String args[]) throws Exception {
++ String osName = System.getProperty("os.name");
++ if (osName.startsWith("SunOS")) {
++ BasicLauncher l = new BasicLauncher();
++ l.start();
++ }
++ }
++
++ private void start() throws Exception {
++ String separator = System.getProperty("file.separator");
++ String jdkpath = System.getProperty("test.jdk") + separator + "bin" + separator;
++ String srcpath = System.getProperty("test.src", ".") + separator;
++ String testClasses = System.getProperty("test.classes", ".");
++
++ ProcessBuilder builder = new ProcessBuilder(
++ jdkpath + "java",
++ "-cp",
++ testClasses,
++ "-Djdk.lang.Process.launchMechanism=posix_spawn",
++ "Basic");
++ builder.redirectErrorStream(true);
++ Process testProc = builder.start();
++ printProcessThread ppt =
++ new printProcessThread(testProc, "testproc");
++ ppt.start();
++ testProc.waitFor();
++ System.out.println("testproc done");
++
++ if (!passed)
++ throw new RuntimeException("Test Failed: ");
++ }
++
++
++ class printProcessThread extends Thread {
++ Process p;
++ String pName;
++
++ public printProcessThread(Process p, String pName) {
++ this.p = p;
++ this.pName = pName;
++ }
++
++ @Override
++ public void run() {
++ try (BufferedReader reader =
++ new BufferedReader(new InputStreamReader(p.getInputStream()))) {
++ String line;
++ while ((line = reader.readLine()) != null) {
++ System.out.println("[Output: " + pName + "]" + line);
++ if (line.contains("failed = 0")) {
++ passed = true;
++ }
++ }
++
++ } catch (Exception e) {
++ System.out.println("Exception encountered in " + pName
++ + " thread\n" + e);
++ }
++ }
++ }
++}
+--- ./jdk/test/java/util/logging/TestAppletLoggerContext.java Thu Dec 19 09:01:16 2013 -0800
++++ ./jdk/test/java/util/logging/TestAppletLoggerContext.java Tue Mar 18 12:35:25 2014 -0700
+@@ -110,28 +110,19 @@
+ }
+
+ TestExc exc;
+- TestExc global = new TestExc();
+
+ @Override
+- public Object getContext() { return active ? global : null; }
++ public Object getAppletContext() { return active ? exc : null; }
+ @Override
+- public Object getExecutionContext() { return active ? exc : null; }
++ public Object get(Object o) { return exc.get(o); }
+ @Override
+- public Object get(Object o, Object o1) { return TestExc.exc(o).get(o1); }
++ public void put(Object o, Object o1) { exc.put(o, o1); }
+ @Override
+- public void put(Object o, Object o1, Object o2) { TestExc.exc(o).put(o1, o2); }
+- @Override
+- public void remove(Object o, Object o1) { TestExc.exc(o).remove(o1); }
+- @Override
+- public Object get(Object o) { return global.get(o); }
+- @Override
+- public void put(Object o, Object o1) { global.put(o, o1); }
+- @Override
+- public void remove(Object o) { global.remove(o); }
++ public void remove(Object o) { exc.remove(o); }
+ @Override
+ public boolean isDisposed() { return false; }
+ @Override
+- public boolean isMainAppContext() { return exc == null; }
++ public boolean isMainAppContext() { return !active || exc == null; }
+ }
+
+ final static JavaAWTAccessStub javaAwtAccess = new JavaAWTAccessStub();
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/util/logging/TestLoggingWithMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,75 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++import java.io.ByteArrayInputStream;
++import java.io.IOException;
++import java.util.logging.Logger;
++import javax.imageio.ImageIO;
++
++/**
++ * @test
++ * @bug 8019853 8023258
++ * @summary Test that the default user context is used when in the main
++ * application context. This test must not be run in same VM or agent
++ * VM mode: it would not test the intended behavior.
++ * @run main/othervm TestLoggingWithMainAppContext
++ */
++public class TestLoggingWithMainAppContext {
++
++ public static void main(String[] args) throws IOException {
++ System.out.println("Creating loggers.");
++
++ // These loggers will be created in the default user context.
++ final Logger foo1 = Logger.getLogger( "foo" );
++ final Logger bar1 = Logger.getLogger( "foo.bar" );
++ if (bar1.getParent() != foo1) {
++ throw new RuntimeException("Parent logger of bar1 "+bar1+" is not "+foo1);
++ }
++ System.out.println("bar1.getParent() is the same as foo1");
++
++ // Set a security manager
++ System.setSecurityManager(new SecurityManager());
++ System.out.println("Now running with security manager");
++
++ // Triggers the creation of the main AppContext
++ ByteArrayInputStream is = new ByteArrayInputStream(new byte[] { 0, 1 });
++ ImageIO.read(is); // triggers calls to system loggers & creation of main AppContext
++
++ // verify that we're still using the default user context
++ final Logger bar2 = Logger.getLogger( "foo.bar" );
++ if (bar1 != bar2) {
++ throw new RuntimeException("bar2 "+bar2+" is not the same as bar1 "+bar1);
++ }
++ System.out.println("bar2 is the same as bar1");
++ if (bar2.getParent() != foo1) {
++ throw new RuntimeException("Parent logger of bar2 "+bar2+" is not foo1 "+foo1);
++ }
++ System.out.println("bar2.getParent() is the same as foo1");
++ final Logger foo2 = Logger.getLogger("foo");
++ if (foo1 != foo2) {
++ throw new RuntimeException("foo2 "+foo2+" is not the same as foo1 "+foo1);
++ }
++ System.out.println("foo2 is the same as foo1");
++
++ System.out.println("Test passed.");
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/util/logging/TestMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,85 @@
++/*
++ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++import java.util.logging.Logger;
++import sun.awt.AppContext;
++import sun.awt.SunToolkit;
++
++
++/**
++ * @test
++ * @bug 8026404
++ * @summary checks that calling getLogger() from a Thread whose ThreadGroup is
++ * a child of the main root group doesn't throw an exception.
++ * @build TestMainAppContext
++ * @run main/othervm TestMainAppContext
++ * @author danielfuchs
++ */
++public class TestMainAppContext {
++
++ static volatile Throwable thrown = null;
++
++ public static void main(String... args) throws Exception {
++ ThreadGroup rootTG = Thread.currentThread().getThreadGroup();
++ while (rootTG.getParent() != null) {
++ rootTG = rootTG.getParent();
++ }
++
++ ThreadGroup tg = new ThreadGroup(rootTG, "FakeApplet");
++ final Thread t1 = new Thread(tg, "createNewAppContext") {
++ @Override
++ public void run() {
++ try {
++ AppContext context = SunToolkit.createNewAppContext();
++ } catch(Throwable t) {
++ thrown = t;
++ }
++ }
++ };
++ t1.start();
++ t1.join();
++ if (thrown != null) {
++ throw new RuntimeException("Unexpected exception: " + thrown, thrown);
++ }
++ Thread t2 = new Thread(tg, "BugDetector") {
++
++ @Override
++ public void run() {
++ try {
++ Logger.getLogger("foo").info("Done");
++ } catch (Throwable x) {
++ thrown = x;
++ }
++ }
++
++ };
++
++ System.setSecurityManager(new SecurityManager());
++ t2.start();
++ t2.join();
++ if (thrown != null) {
++ throw new RuntimeException("Test failed: " + thrown, thrown);
++ }
++
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/javax/imageio/plugins/jpeg/TruncatedImageWarningTest.java Tue Mar 18 12:35:25 2014 -0700
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code 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
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++import java.io.File;
++import java.io.IOException;
++import javax.imageio.ImageIO;
++import javax.imageio.ImageReader;
++import javax.imageio.event.IIOReadWarningListener;
++import javax.imageio.stream.ImageInputStream;
++
++public class TruncatedImageWarningTest implements IIOReadWarningListener {
++
++ private static String fileName = "truncated.jpg";
++ boolean receivedWarning = false;
++
++ public static void main(String[] args) throws IOException {
++
++ String sep = System.getProperty("file.separator");
++ String dir = System.getProperty("test.src", ".");
++ String filePath = dir+sep+fileName;
++ System.out.println("Test file: " + filePath);
++ File f = new File(filePath);
++ ImageInputStream in = ImageIO.createImageInputStream(f);
++ ImageReader reader = ImageIO.getImageReaders(in).next();
++ TruncatedImageWarningTest twt = new TruncatedImageWarningTest();
++ reader.addIIOReadWarningListener(twt);
++ reader.setInput(in);
++ reader.read(0);
++ if (!twt.receivedWarning) {
++ throw new RuntimeException("No expected warning");
++ }
++ }
++
++ public void warningOccurred(ImageReader source, String warning) {
++ System.out.println("Expected warning: " + warning);
++ receivedWarning = true;
++ }
++}
+Binary file test/javax/imageio/plugins/jpeg/truncated.jpg has changed
+--- ./langtools/.hgtags Thu Dec 19 09:01:27 2013 -0800
++++ ./langtools/.hgtags Tue Mar 18 12:45:26 2014 -0700
+@@ -381,6 +381,9 @@
+ ba3ff27d4082f2cf0d06e635b2b6e01f80e78589 jdk7u45-b18
+ 164cf7491ba2f371354ba343a604eee4c61c529d jdk7u45-b30
+ 7f5cfaedb25c2c2774d6839810d6ae543557ca01 jdk7u45-b31
++ef7bdbe7f1fa42fd58723e541d9cdedcacb2649a jdk7u45-b33
++bcb3e939d046d75436c7c8511600b6edce42e6da jdk7u45-b34
++efbda7abd821f280ec3a3aa6819ad62d45595e55 jdk7u45-b35
+ 18d1864abca976ca68cb71612e9b20c908455d3d jdk7u51-b00
+ 14d1cf2630aea549cfba9d052200c7ebcabd875c jdk7u51-b01
+ f0168ccf171ed6080267fe0a7f7aed0b46bd5713 jdk7u51-b02
+@@ -395,3 +398,21 @@
+ c9d8d8793d9330d592190c334260ccf26c986df6 jdk7u51-b11
+ 5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u51-b12
+ 4d0807934c302f2e35e6a5acc6cdc720c82b5671 jdk7u51-b13
++ada23e55d76a378cb2fc2cd7ffae8c147aaf0055 jdk7u51-b30
++e3d4896d52ab4ad0fc0b7a45d60340dbdcb8826d jdk7u51-b31
++fb3ff30ecd8ea1637551461bfaf09fc8204b536c jdk7u51-b33
++4adc6c094545774b324d2e5511723ada2b32e6c4 jdk7u51-b34
++5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u55-b00
++3e64e49131b88c839733c9869ff8aebcd15cf828 jdk7u55-b01
++2a9f5c00ba46f895bc9d16a584bf7d80c1822268 jdk7u55-b02
++0479d260ac835eb3f0c7f3d7d15be0599b92a20a jdk7u55-b03
++a244cc40ae0b29028ff8503ee516cb5f9e3db6e3 jdk7u55-b04
++25d63d986653d81522b01bbd2664083ae5fdc243 jdk7u55-b05
++76eeeaace70d38795eef5215f758493421cee0ac jdk7u55-b06
++08f7914d6aa947e73269b4e60110ed12573ffa28 jdk7u55-b07
++e64301b473b43609cb28d8cfe7e5db17d9bf8a4a jdk7u55-b08
++a296112a3fd774c258375912c7ada38daf8eee1e jdk7u55-b09
++faa9f8c51a6e3fcb444729012a798e3ad09c3da4 jdk7u55-b10
++2bdd105e433da7fbf7f37ec2f75fc4bed4e54280 jdk7u55-b11
++a3cdca5d3773f67a49091f9131a4d073bc6b83d9 jdk7u55-b12
++81bf1ca3a3a71c628b7d952ba47c6f200a223f27 jdk7u55-b13
+--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Thu Dec 19 09:01:27 2013 -0800
++++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Tue Mar 18 12:45:26 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -235,7 +235,7 @@
+ } else if (opt.equals("-doctitle")) {
+ doctitle = os[1];
+ } else if (opt.equals("-windowtitle")) {
+- windowtitle = os[1];
++ windowtitle = os[1].replaceAll("\\<.*?>", "");
+ } else if (opt.equals("-top")) {
+ top = os[1];
+ } else if (opt.equals("-bottom")) {
+--- ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Thu Dec 19 09:01:27 2013 -0800
++++ ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Tue Mar 18 12:45:26 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -23,7 +23,7 @@
+
+ /*
+ * @test
+- * @bug 8016675
++ * @bug 8016675 8026736
+ * @summary Test for window title.
+ * @author Bhavesh Patel
+ * @library ../lib/
+@@ -34,26 +34,153 @@
+ public class TestWindowTitle extends JavadocTester {
+
+ private static final String BUG_ID = "8016675";
+- private static final String WIN_TITLE =
++ //Window title with JavaScript special characters.
++ private static final String TITLE_JS_CHARS =
+ "Testing \"Window 'Title'\" with a \\ backslash and a / " +
+ "forward slash and a \u00e8 unicode char also a tab and also a " +
+ "\t special character another \u0002 unicode)";
+- private static final String[][] TEST = {
+- {BUG_ID + FS + "overview-summary.html",
++ private static final String[] ARGS_JS_CHARS = new String[]{
++ "-d", BUG_ID + "-1", "-windowtitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_JS_CHARS = {
++ {BUG_ID + "-1" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
+ "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
+ "also a tab and also a \\t special character another \\u0002 unicode))\";"
+ },
+ };
+- private static final String[][] NEG_TEST = {
+- {BUG_ID + FS + "overview-summary.html",
++ private static final String[][] NEG_TEST_JS_CHARS = {
++ {BUG_ID + "-1" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " +
+ "with a \\ backslash and a / forward slash and a \u00E8 unicode char " +
+ "also a tab and also a \t special character another \u0002 unicode))\";"
++ }
++ };
++
++ //Window title with a script tag.
++ private static final String TITLE_SCRIPT_TAG =
++ "Testing script tag in title </title><script>alert(\"Should not pop up\")</script>.";
++ private static final String[] ARGS_SCRIPT_TAG = new String[]{
++ "-d", BUG_ID + "-2", "-windowtitle", TITLE_SCRIPT_TAG, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_SCRIPT_TAG = {
++ {BUG_ID + "-2" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing script tag in title alert" +
++ "(\\\"Should not pop up\\\").)\";"
+ },
++ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
++ "parent.document.title=\"C2 (Testing script tag in title alert" +
++ "(\\\"Should not pop up\\\").)\";"
++ }
+ };
+- private static final String[] ARGS = new String[]{
+- "-d", BUG_ID, "-windowtitle", WIN_TITLE, "-sourcepath", SRC_DIR, "p1", "p2"
++ private static final String[][] NEG_TEST_SCRIPT_TAG = {
++ {BUG_ID + "-2" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing script tag in title </title><script>" +
++ "alert(\\\"Should not pop up\\\")</script>.)\";"
++ },
++ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
++ "parent.document.title=\"C2 (Testing script tag in title </title><script>" +
++ "alert(\\\"Should not pop up\\\")</script>.)\";"
++ }
++ };
++
++ //Window title with other HTML tags.
++ private static final String TITLE_HTML_TAGS =
++ "Testing another <p>HTML</p> tag. Another <h1>tag</h1>. A " +
++ "<span id=\"testTag\">tag with attributes</span>. <script and </p are not tags.";
++ private static final String[] ARGS_HTML_TAGS = new String[]{
++ "-d", BUG_ID + "-3", "-windowtitle", TITLE_HTML_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_HTML_TAGS = {
++ {BUG_ID + "-3" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing another HTML tag. Another tag. A " +
++ "tag with attributes. <script and </p are not tags.)\";"
++ }
++ };
++ private static final String[][] NEG_TEST_HTML_TAGS = {
++ {BUG_ID + "-3" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing another <p>HTML</p> tag. Another " +
++ "<h1>tag</h1>. A <span id=\"testTag\">tag with attributes</span>. <script and " +
++ "</p are not tags.)\";"
++ }
++ };
++
++ //Window title using entities.
++ private static final String TITLE_HTML_ENTITIES =
++ "Testing entities &lt;script&gt;alert(\"Should not pop up\")&lt;/script&gt;.";
++ private static final String[] ARGS_HTML_ENTITIES = new String[]{
++ "-d", BUG_ID + "-4", "-windowtitle", TITLE_HTML_ENTITIES, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_HTML_ENTITIES = {
++ {BUG_ID + "-4" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing entities &lt;script&gt;alert(\\\"Should " +
++ "not pop up\\\")&lt;/script&gt;.)\";"
++ }
++ };
++ private static final String[][] NEG_TEST_HTML_ENTITIES = {
++ {BUG_ID + "-4" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing entities alert(\\\"Should not pop up\\\").)\";"
++ }
++ };
++
++ //Window title with just empty HTML tags.
++ private static final String TITLE_EMPTY_TAGS =
++ "</title><script></script>";
++ private static final String[] ARGS_EMPTY_TAGS = new String[]{
++ "-d", BUG_ID + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_EMPTY_TAGS = {
++ {BUG_ID + "-5" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview\";"
++ }
++ };
++ private static final String[][] NEG_TEST_EMPTY_TAGS = {
++ {BUG_ID + "-5" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (</title><script></script>)\";"
++ }
++ };
++
++ //Window title with unicode characters.
++ private static final String TITLE_UNICODE_CHARS =
++ "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e.";
++ private static final String[] ARGS_UNICODE_CHARS = new String[]{
++ "-d", BUG_ID + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_UNICODE_CHARS = {
++ {BUG_ID + "-6" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " +
++ "not pop up\\\").)\";"
++ }
++ };
++ private static final String[][] NEG_TEST_UNICODE_CHARS = {
++ {BUG_ID + "-6" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing unicode <script>alert(\\\"Should not pop up\\\")" +
++ "</script>.)\";"
++ }
++ };
++
++ //An empty window title.
++ private static final String TITLE_EMPTY =
++ "";
++ private static final String[] ARGS_EMPTY_TITLE = new String[]{
++ "-d", BUG_ID + "-7", "-windowtitle", TITLE_EMPTY, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] TEST_EMPTY = {
++ {BUG_ID + "-7" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview\";"
++ }
++ };
++
++ //Test doctitle.
++ private static final String[] ARGS_DOCTITLE = new String[]{
++ "-d", BUG_ID + "-8", "-doctitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
++ };
++ private static final String[][] NEG_TEST_DOCTITLE = {
++ {BUG_ID + "-8" + FS + "overview-summary.html",
++ "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
++ "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
++ "also a tab and also a \\t special character another \\u0002 unicode)\";"
++ },
+ };
+
+ /**
+@@ -62,7 +189,14 @@
+ */
+ public static void main(String[] args) {
+ TestWindowTitle tester = new TestWindowTitle();
+- run(tester, ARGS, TEST, NEG_TEST);
++ run(tester, ARGS_JS_CHARS, TEST_JS_CHARS, NEG_TEST_JS_CHARS);
++ run(tester, ARGS_SCRIPT_TAG, TEST_SCRIPT_TAG, NEG_TEST_SCRIPT_TAG);
++ run(tester, ARGS_HTML_TAGS, TEST_HTML_TAGS, NEG_TEST_HTML_TAGS);
++ run(tester, ARGS_HTML_ENTITIES, TEST_HTML_ENTITIES, NEG_TEST_HTML_ENTITIES);
++ run(tester, ARGS_EMPTY_TAGS, TEST_EMPTY_TAGS, NEG_TEST_EMPTY_TAGS);
++ run(tester, ARGS_UNICODE_CHARS, TEST_UNICODE_CHARS, NEG_TEST_UNICODE_CHARS);
++ run(tester, ARGS_EMPTY_TITLE, TEST_EMPTY, NO_TEST);
++ run(tester, ARGS_DOCTITLE, NO_TEST, NEG_TEST_DOCTITLE);
+ tester.printSummary();
+ }
+