diff options
Diffstat (limited to 'java/openjdk7/files/patch-7u55-b31')
-rw-r--r-- | java/openjdk7/files/patch-7u55-b31 | 17206 |
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 <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 <script>alert(\"Should not pop up\")</script>."; ++ 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 <script>alert(\\\"Should " + ++ "not pop up\\\")</script>.)\";" ++ } ++ }; ++ 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(); + } + |