diff options
author | Greg Lewis <glewis@FreeBSD.org> | 2015-09-09 09:40:53 +0000 |
---|---|---|
committer | Greg Lewis <glewis@FreeBSD.org> | 2015-09-09 09:40:53 +0000 |
commit | 9472c7f5ccf4a56917f2a3c6fe9d3032849f26bd (patch) | |
tree | a0a31c6adebc33bf8e7a7f021d9894dab0acdd86 /java/openjdk7/files/patch-7u55-b31 | |
parent | . Switch to xz for the new remote patches to decrease download size. (diff) |
. Move the large patches which contain the changes between updates of the
JDK to being fetched remotely using PATCHFILES and PATCH_SITES.
This cuts the size taken by openjdk7 in the ports repository.
Notes
Notes:
svn path=/head/; revision=396460
Diffstat (limited to 'java/openjdk7/files/patch-7u55-b31')
-rw-r--r-- | java/openjdk7/files/patch-7u55-b31 | 17206 |
1 files changed, 0 insertions, 17206 deletions
diff --git a/java/openjdk7/files/patch-7u55-b31 b/java/openjdk7/files/patch-7u55-b31 deleted file mode 100644 index 3ad355a0eb09..000000000000 --- a/java/openjdk7/files/patch-7u55-b31 +++ /dev/null @@ -1,17206 +0,0 @@ ---- ./.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(); - } - |