summaryrefslogtreecommitdiff
path: root/java/openjdk7/files/patch-7u55-b31
diff options
context:
space:
mode:
authorGreg Lewis <glewis@FreeBSD.org>2015-09-09 09:40:53 +0000
committerGreg Lewis <glewis@FreeBSD.org>2015-09-09 09:40:53 +0000
commit9472c7f5ccf4a56917f2a3c6fe9d3032849f26bd (patch)
treea0a31c6adebc33bf8e7a7f021d9894dab0acdd86 /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-b3117206
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 &lt;jaxb:bindings> customizations in the given forest.
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -27,9 +27,14 @@
-
- import java.math.BigDecimal;
- import java.math.BigInteger;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.Calendar;
-+import java.util.Collections;
- import java.util.GregorianCalendar;
-+import java.util.Map;
- import java.util.TimeZone;
-+import java.util.WeakHashMap;
-
- import javax.xml.bind.DatatypeConverter;
- import javax.xml.bind.DatatypeConverterInterface;
-@@ -352,7 +357,7 @@
-
- public static GregorianCalendar _parseDateTime(CharSequence s) {
- String val = WhiteSpaceProcessor.trim(s).toString();
-- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
-+ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
- }
-
- public static String _printDateTime(Calendar val) {
-@@ -718,14 +723,30 @@
- }
- return false;
- }
-- private static final DatatypeFactory datatypeFactory;
-
-- static {
-- try {
-- datatypeFactory = DatatypeFactory.newInstance();
-- } catch (DatatypeConfigurationException e) {
-- throw new Error(e);
-+ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
-+
-+ public static DatatypeFactory getDatatypeFactory() {
-+ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
-+ public ClassLoader run() {
-+ return Thread.currentThread().getContextClassLoader();
-+ }
-+ });
-+ DatatypeFactory df = DF_CACHE.get(tccl);
-+ if (df == null) {
-+ synchronized (DatatypeConverterImpl.class) {
-+ df = DF_CACHE.get(tccl);
-+ if (df == null) { // to prevent multiple initialization
-+ try {
-+ df = DatatypeFactory.newInstance();
-+ } catch (DatatypeConfigurationException e) {
-+ throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
-+ }
-+ DF_CACHE.put(tccl, df);
-+ }
-+ }
- }
-+ return df;
- }
-
- private static final class CalendarFormatter {
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,48 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.bind;
-+
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+
-+/**
-+ * Message resources
-+ */
-+enum Messages {
-+ FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
-+ ;
-+
-+ private static final ResourceBundle rb = ResourceBundle.getBundle(Messages.class.getName());
-+
-+ @Override
-+ public String toString() {
-+ return format();
-+ }
-+
-+ public String format( Object... args ) {
-+ return MessageFormat.format( rb.getString(name()), args );
-+ }
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+
-+FAILED_TO_INITIALE_DATATYPE_FACTORY = \
-+ Failed to initialize JAXP 1.3 DatatypeFactory class.
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -60,7 +60,6 @@
- PROPERTY_ORDER_CONTAINS_UNUSED_ENTRY, // 2 args
-
- INVALID_XML_ENUM_VALUE, // 2 arg
-- FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
- NO_IMAGE_WRITER, // 1 arg
-
- ILLEGAL_MIME_TYPE, // 2 args
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- #
--# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+# Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- #
- # This code is free software; you can redistribute it and/or modify it
-@@ -86,9 +86,6 @@
- INVALID_XML_ENUM_VALUE = \
- "{0}" is not a valid value for {1}.
-
--FAILED_TO_INITIALE_DATATYPE_FACTORY = \
-- Failed to initialize JAXP 1.3 DatatypeFactory class.
--
- NO_IMAGE_WRITER = \
- No javax.imageio.ImageWriter is available for the specified MIME type "{0}"
-
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -60,9 +60,7 @@
- import javax.imageio.stream.ImageOutputStream;
- import javax.xml.bind.ValidationEvent;
- import javax.xml.bind.helpers.ValidationEventImpl;
--import javax.xml.datatype.DatatypeConfigurationException;
- import javax.xml.datatype.DatatypeConstants;
--import javax.xml.datatype.DatatypeFactory;
- import javax.xml.datatype.Duration;
- import javax.xml.datatype.XMLGregorianCalendar;
- import javax.xml.namespace.QName;
-@@ -565,7 +563,8 @@
-
- public XMLGregorianCalendar parse(CharSequence lexical) throws SAXException {
- try {
-- return datatypeFactory.newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
-+ return DatatypeConverterImpl.getDatatypeFactory()
-+ .newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
- } catch (Exception e) {
- UnmarshallingContext.getInstance().handleError(e);
- return null;
-@@ -835,7 +834,7 @@
-
- public Duration parse(CharSequence lexical) {
- TODO.checkSpec("JSR222 Issue #42");
-- return datatypeFactory.newDuration(lexical.toString());
-+ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
- }
- });
- primaryList.add(
-@@ -876,21 +875,6 @@
- }
- }
-
--
-- /**
-- * Cached instance of {@link DatatypeFactory} to create
-- * {@link XMLGregorianCalendar} and {@link Duration}.
-- */
-- private static final DatatypeFactory datatypeFactory = init();
--
-- private static DatatypeFactory init() {
-- try {
-- return DatatypeFactory.newInstance();
-- } catch (DatatypeConfigurationException e) {
-- throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
-- }
-- }
--
- private static void checkXmlGregorianCalendarFieldRef(QName type,
- XMLGregorianCalendar cal)throws javax.xml.bind.MarshalException{
- StringBuilder buf = new StringBuilder();
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -33,7 +33,6 @@
-
- import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl;
- import com.sun.xml.internal.bind.v2.runtime.XMLSerializer;
--import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
-
- import org.xml.sax.SAXException;
-
-@@ -153,7 +152,6 @@
- }
- }
-
--
- /**
- * Reference to FI's XMLStreamWriter class, if FI can be loaded.
- */
-@@ -162,9 +160,8 @@
-
- private static Class initFIStAXWriterClass() {
- try {
-- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
-- Class llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter", true, loader);
-- Class sds = loader.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
-+ Class<?> llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter");
-+ Class<?> sds = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
- // Check if StAXDocumentSerializer implements LowLevelFastInfosetStreamWriter
- if (llfisw.isAssignableFrom(sds))
- return sds;
-@@ -179,8 +176,7 @@
- try {
- if (FI_STAX_WRITER_CLASS == null)
- return null;
-- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
-- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput", true, loader);
-+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput");
- return c.getConstructor(FI_STAX_WRITER_CLASS, JAXBContextImpl.class);
- } catch (Throwable e) {
- return null;
-@@ -195,8 +191,7 @@
-
- private static Class initStAXExWriterClass() {
- try {
-- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
-- return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx",true,loader);
-+ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx");
- } catch (Throwable e) {
- return null;
- }
-@@ -204,8 +199,7 @@
-
- private static Constructor<? extends XmlOutput> initStAXExOutputClass() {
- try {
-- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
-- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput",true, loader);
-+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput");
- return c.getConstructor(STAXEX_WRITER_CLASS);
- } catch (Throwable e) {
- return null;
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -33,7 +33,6 @@
- import javax.xml.stream.XMLStreamReader;
-
- import com.sun.xml.internal.bind.WhiteSpaceProcessor;
--import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
-
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
-@@ -337,9 +336,8 @@
-
- private static Class initFIStAXReaderClass() {
- try {
-- ClassLoader cl = getClassLoader();
-- Class fisr = cl.loadClass("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
-- Class sdp = cl.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
-+ Class<?> fisr = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
-+ Class<?> sdp = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
- // Check if StAXDocumentParser implements FastInfosetStreamReader
- if (fisr.isAssignableFrom(sdp))
- return sdp;
-@@ -355,7 +353,7 @@
- if (FI_STAX_READER_CLASS == null)
- return null;
-
-- Class c = getClassLoader().loadClass(
-+ Class c = Class.forName(
- "com.sun.xml.internal.bind.v2.runtime.unmarshaller.FastInfosetConnector");
- return c.getConstructor(FI_STAX_READER_CLASS,XmlVisitor.class);
- } catch (Throwable e) {
-@@ -371,7 +369,7 @@
-
- private static Class initStAXExReader() {
- try {
-- return getClassLoader().loadClass("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
-+ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
- } catch (Throwable e) {
- return null;
- }
-@@ -379,15 +377,10 @@
-
- private static Constructor<? extends StAXConnector> initStAXExConnector() {
- try {
-- Class c = getClassLoader().loadClass("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
-+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
- return c.getConstructor(STAX_EX_READER_CLASS,XmlVisitor.class);
- } catch (Throwable e) {
- return null;
- }
- }
--
-- public static ClassLoader getClassLoader() {
-- return ClassLoaderRetriever.getClassLoader();
-- }
--
- }
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -62,61 +62,6 @@
- Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
- "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
-
-- static {
-- try {
-- CommandMap map = CommandMap.getDefaultCommandMap();
-- if (map instanceof MailcapCommandMap) {
-- MailcapCommandMap mailMap = (MailcapCommandMap) map;
-- String hndlrStr = ";;x-java-content-handler=";
-- mailMap.addMailcap(
-- "text/xml"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
-- mailMap.addMailcap(
-- "application/xml"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
-- mailMap.addMailcap(
-- "application/fastinfoset"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
-- /* Image DataContentHandler handles all image types
-- mailMap.addMailcap(
-- "image/jpeg"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.JpegDataContentHandler");
-- mailMap.addMailcap(
-- "image/gif"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.GifDataContentHandler"); */
-- /*mailMap.addMailcap(
-- "multipart/*"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");*/
-- mailMap.addMailcap(
-- "image/*"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
-- mailMap.addMailcap(
-- "text/plain"
-- + hndlrStr
-- + "com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
-- } else {
-- throw new SOAPExceptionImpl("Default CommandMap is not a MailcapCommandMap");
-- }
-- } catch (Throwable t) {
-- log.log(
-- Level.SEVERE,
-- "SAAJ0508.soap.cannot.register.handlers",
-- t);
-- if (t instanceof RuntimeException) {
-- throw (RuntimeException) t;
-- } else {
-- throw new RuntimeException(t.getLocalizedMessage());
-- }
-- }
-- };
--
- private final MimeHeaders headers;
- private MimeBodyPart rawContent = null;
- private DataHandler dataHandler = null;
-@@ -126,6 +71,12 @@
-
- public AttachmentPartImpl() {
- headers = new MimeHeaders();
-+
-+ // initialization from here should cover most of cases;
-+ // if not, it would be necessary to call
-+ // AttachmentPartImpl.initializeJavaActivationHandlers()
-+ // explicitly by programmer
-+ initializeJavaActivationHandlers();
- }
-
- public AttachmentPartImpl(MIMEPart part) {
-@@ -263,7 +214,7 @@
- log.log(
- Level.FINE,
- "SAAJ0580.soap.set.Content-Type",
-- new String[] { dataHandler.getContentType()});
-+ new String[] { dataHandler.getContentType() });
- setMimeHeader("Content-Type", dataHandler.getContentType());
- }
-
-@@ -405,7 +356,7 @@
- throw new SOAPExceptionImpl(e.getLocalizedMessage());
- } finally {
- try {
-- decoded.close();
-+ decoded.close();
- } catch (IOException ex) {
- throw new SOAPException(ex);
- }
-@@ -608,4 +559,43 @@
- return headers;
- }
-
--}
-+ public static void initializeJavaActivationHandlers() {
-+ // DataHandler.writeTo() may search for DCH. So adding some default ones.
-+ try {
-+ CommandMap map = CommandMap.getDefaultCommandMap();
-+ if (map instanceof MailcapCommandMap) {
-+ MailcapCommandMap mailMap = (MailcapCommandMap) map;
-+
-+ // registering our DCH since javamail's DCH doesn't handle
-+ if (!cmdMapInitialized(mailMap)) {
-+ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
-+ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
-+ mailMap.addMailcap("application/fastinfoset;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
-+ mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");
-+ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
-+ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
-+ }
-+ }
-+ } catch (Throwable t) {
-+ // ignore the exception.
-+ }
-+ }
-+
-+ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
-+
-+ // checking fastinfoset handler, since this one is specific to SAAJ
-+ CommandInfo[] commands = mailMap.getAllCommands("application/fastinfoset");
-+ if (commands == null || commands.length == 0) {
-+ return false;
-+ }
-+
-+ String saajClassName = "com.sun.xml.internal.ws.binding.FastInfosetDataContentHandler";
-+ for (CommandInfo command : commands) {
-+ String commandClass = command.getCommandClass();
-+ if (saajClassName.equals(commandClass)) {
-+ return true;
-+ }
-+ }
-+ return false;
-+ }
-+}
-\ No newline at end of file
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.messaging.saaj.soap;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for StaticCache utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -25,7 +25,14 @@
-
- package com.sun.xml.internal.messaging.saaj.soap;
-
--import java.util.logging.Logger;
-+import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
-+import com.sun.xml.internal.messaging.saaj.util.JAXMStreamSource;
-+import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
-+import com.sun.xml.internal.messaging.saaj.util.ParserPool;
-+import com.sun.xml.internal.messaging.saaj.util.RejectDoctypeSaxFilter;
-+import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
-+import org.xml.sax.InputSource;
-+import org.xml.sax.XMLReader;
-
- import javax.xml.parsers.SAXParser;
- import javax.xml.soap.SOAPException;
-@@ -34,14 +41,7 @@
- import javax.xml.transform.dom.DOMResult;
- import javax.xml.transform.sax.SAXSource;
- import javax.xml.transform.stream.StreamSource;
--
--import org.xml.sax.InputSource;
--import org.xml.sax.XMLReader;
--
--import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
--import com.sun.xml.internal.messaging.saaj.util.*;
--
--import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
-+import java.util.logging.Logger;
-
- /**
- * EnvelopeFactory creates SOAP Envelope objects using different
-@@ -50,14 +50,19 @@
- public class EnvelopeFactory {
-
- protected static final Logger
-- log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
-- "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
-+ log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
-+ "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
-
-- private static ParserPool parserPool = new ParserPool(5);
-+ private static ContextClassloaderLocal<ParserPool> parserPool =
-+ new ContextClassloaderLocal<ParserPool>() {
-+ @Override
-+ protected ParserPool initialValue() throws Exception {
-+ return new ParserPool(5);
-+ }
-+ };
-
- public static Envelope createEnvelope(Source src, SOAPPartImpl soapPart)
-- throws SOAPException
-- {
-+ throws SOAPException {
- // Insert SAX filter to disallow Document Type Declarations since
- // they are not legal in SOAP
- SAXParser saxParser = null;
-@@ -73,15 +78,15 @@
- }
- }
- try {
-- saxParser = parserPool.get();
-+ saxParser = parserPool.get().get();
- } catch (Exception e) {
- log.severe("SAAJ0601.util.newSAXParser.exception");
- throw new SOAPExceptionImpl(
-- "Couldn't get a SAX parser while constructing a envelope",
-- e);
-+ "Couldn't get a SAX parser while constructing a envelope",
-+ e);
- }
- InputSource is = SAXSource.sourceToInputSource(src);
-- if (is.getEncoding()== null && soapPart.getSourceCharsetEncoding() != null) {
-+ if (is.getEncoding() == null && soapPart.getSourceCharsetEncoding() != null) {
- is.setEncoding(soapPart.getSourceCharsetEncoding());
- }
- XMLReader rejectFilter;
-@@ -90,15 +95,15 @@
- } catch (Exception ex) {
- log.severe("SAAJ0510.soap.cannot.create.envelope");
- throw new SOAPExceptionImpl(
-- "Unable to create envelope from given source: ",
-- ex);
-+ "Unable to create envelope from given source: ",
-+ ex);
- }
- src = new SAXSource(rejectFilter, is);
- }
-
- try {
- Transformer transformer =
-- EfficientStreamingTransformer.newTransformer();
-+ EfficientStreamingTransformer.newTransformer();
- DOMResult result = new DOMResult(soapPart);
- transformer.transform(src, result);
-
-@@ -110,11 +115,11 @@
- }
- log.severe("SAAJ0511.soap.cannot.create.envelope");
- throw new SOAPExceptionImpl(
-- "Unable to create envelope from given source: ",
-- ex);
-+ "Unable to create envelope from given source: ",
-+ ex);
- } finally {
- if (saxParser != null) {
-- parserPool.returnParser(saxParser);
-+ parserPool.get().returnParser(saxParser);
- }
- }
- }
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.stream.buffer;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for ContextClassloaderLocal utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -370,7 +370,12 @@
- writeTo(handler, errorHandler, isFragment());
- }
-
-- private static final TransformerFactory trnsformerFactory = TransformerFactory.newInstance();
-+ private static final ContextClassloaderLocal<TransformerFactory> trnsformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
-+ @Override
-+ protected TransformerFactory initialValue() throws Exception {
-+ return TransformerFactory.newInstance();
-+ }
-+ };
-
- /**
- * Writes out the contents of this buffer as DOM node and append that to the given node.
-@@ -382,7 +387,7 @@
- */
- public final Node writeTo(Node n) throws XMLStreamBufferException {
- try {
-- Transformer t = trnsformerFactory.newTransformer();
-+ Transformer t = trnsformerFactory.get().newTransformer();
- t.transform(new XMLStreamBufferSource(this), new DOMResult(n));
- return n.getLastChild();
- } catch (TransformerException e) {
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.ws.api.streaming;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for ContextClassloaderLocal utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -61,29 +61,32 @@
- /**
- * Singleton instance.
- */
-- private static volatile @NotNull XMLStreamReaderFactory theInstance;
-+ private static volatile ContextClassloaderLocal<XMLStreamReaderFactory> streamReader =
-+ new ContextClassloaderLocal<XMLStreamReaderFactory>() {
-
-- static {
-- XMLInputFactory xif = getXMLInputFactory();
-- XMLStreamReaderFactory f=null;
-+ @Override
-+ protected XMLStreamReaderFactory initialValue() {
-+ XMLInputFactory xif = getXMLInputFactory();
-+ XMLStreamReaderFactory f=null;
-
-- // this system property can be used to disable the pooling altogether,
-- // in case someone hits an issue with pooling in the production system.
-- if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
-- f = Zephyr.newInstance(xif);
-+ // this system property can be used to disable the pooling altogether,
-+ // in case someone hits an issue with pooling in the production system.
-+ if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
-+ f = Zephyr.newInstance(xif);
-
-- if(f==null) {
-- // is this Woodstox?
-- if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
-- f = new Woodstox(xif);
-+ if(f==null) {
-+ // is this Woodstox?
-+ if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
-+ f = new Woodstox(xif);
-+ }
-+
-+ if(f==null)
-+ f = new Default();
-+
-+ LOGGER.fine("XMLStreamReaderFactory instance is = "+f);
-+ return f;
- }
--
-- if(f==null)
-- f = new Default();
--
-- theInstance = f;
-- LOGGER.fine("XMLStreamReaderFactory instance is = "+theInstance);
-- }
-+ };
-
- private static XMLInputFactory getXMLInputFactory() {
- XMLInputFactory xif = null;
-@@ -109,11 +112,11 @@
- */
- public static void set(XMLStreamReaderFactory f) {
- if(f==null) throw new IllegalArgumentException();
-- theInstance = f;
-+ streamReader.set(f);
- }
-
- public static XMLStreamReaderFactory get() {
-- return theInstance;
-+ return streamReader.get();
- }
-
- public static XMLStreamReader create(InputSource source, boolean rejectDTDs) {
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -57,39 +57,41 @@
- /**
- * Singleton instance.
- */
-- private static volatile @NotNull XMLStreamWriterFactory theInstance;
-+ private static volatile ContextClassloaderLocal<XMLStreamWriterFactory> writerFactory =
-+ new ContextClassloaderLocal<XMLStreamWriterFactory>() {
-
-+ @Override
-+ protected XMLStreamWriterFactory initialValue() {
-+ XMLOutputFactory xof = null;
-+ if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
-+ try {
-+ xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
-+ } catch (Exception e) {
-+ // Ignore and fallback to default XMLOutputFactory
-+ }
-+ }
-+ if (xof == null) {
-+ xof = XMLOutputFactory.newInstance();
-+ }
-
-- static {
-- XMLOutputFactory xof = null;
-- if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
-- try {
-- xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
-- } catch (Exception e) {
-- // Ignore and fallback to default XMLOutputFactory
-+ XMLStreamWriterFactory f=null;
-+
-+ // this system property can be used to disable the pooling altogether,
-+ // in case someone hits an issue with pooling in the production system.
-+ if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
-+ f = Zephyr.newInstance(xof);
-+ if(f==null) {
-+ // is this Woodstox?
-+ if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
-+ f = new NoLock(xof);
- }
-+ if (f == null)
-+ f = new Default(xof);
-+
-+ LOGGER.fine("XMLStreamWriterFactory instance is = "+ f);
-+ return f;
- }
-- if (xof == null) {
-- xof = XMLOutputFactory.newInstance();
-- }
--
-- XMLStreamWriterFactory f=null;
--
-- // this system property can be used to disable the pooling altogether,
-- // in case someone hits an issue with pooling in the production system.
-- if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
-- f = Zephyr.newInstance(xof);
-- if(f==null) {
-- // is this Woodstox?
-- if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
-- f = new NoLock(xof);
-- }
-- if (f == null)
-- f = new Default(xof);
--
-- theInstance = f;
-- LOGGER.fine("XMLStreamWriterFactory instance is = "+theInstance);
-- }
-+ };
-
- /**
- * See {@link #create(OutputStream)} for the contract.
-@@ -152,7 +154,7 @@
- * Gets the singleton instance.
- */
- public static @NotNull XMLStreamWriterFactory get() {
-- return theInstance;
-+ return writerFactory.get();
- }
-
- /**
-@@ -164,7 +166,7 @@
- */
- public static void set(@NotNull XMLStreamWriterFactory f) {
- if(f==null) throw new IllegalArgumentException();
-- theInstance = f;
-+ writerFactory.set(f);
- }
-
- /**
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -36,6 +36,9 @@
- import com.sun.xml.internal.ws.developer.MemberSubmissionAddressingFeature;
- import com.sun.xml.internal.ws.developer.BindingTypeFeature;
-
-+import javax.activation.CommandInfo;
-+import javax.activation.CommandMap;
-+import javax.activation.MailcapCommandMap;
- import javax.xml.ws.Service;
- import javax.xml.ws.WebServiceFeature;
- import javax.xml.ws.soap.AddressingFeature;
-@@ -109,9 +112,15 @@
- return addressingVersion;
- }
-
-- public final
- @NotNull
-- Codec createCodec() {
-+ public final Codec createCodec() {
-+
-+ // initialization from here should cover most of cases;
-+ // if not, it would be necessary to call
-+ // BindingImpl.initializeJavaActivationHandlers()
-+ // explicitly by programmer
-+ initializeJavaActivationHandlers();
-+
- return bindingId.createEncoder(this);
- }
-
-@@ -169,4 +178,48 @@
- public void addFeature(@NotNull WebServiceFeature newFeature) {
- features.add(newFeature);
- }
-+
-+ public static void initializeJavaActivationHandlers() {
-+ // DataHandler.writeTo() may search for DCH. So adding some default ones.
-+ try {
-+ CommandMap map = CommandMap.getDefaultCommandMap();
-+ if (map instanceof MailcapCommandMap) {
-+ MailcapCommandMap mailMap = (MailcapCommandMap) map;
-+
-+ // registering our DCH since javamail's DCH doesn't handle
-+ if (!cmdMapInitialized(mailMap)) {
-+ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
-+ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
-+ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.ws.encoding.ImageDataContentHandler");
-+ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.ws.encoding.StringDataContentHandler");
-+ }
-+ }
-+ } catch (Throwable t) {
-+ // ignore the exception.
-+ }
-+ }
-+
-+ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
-+ CommandInfo[] commands = mailMap.getAllCommands("text/xml");
-+ if (commands == null || commands.length == 0) {
-+ return false;
-+ }
-+
-+ // SAAJ RI implements it's own DataHandlers which can be used for JAX-WS too;
-+ // see com.sun.xml.internal.messaging.saaj.soap.AttachmentPartImpl#initializeJavaActivationHandlers
-+ // so if found any of SAAJ or our own handler registered, we are ok; anyway using SAAJ directly here
-+ // is not good idea since we don't want standalone JAX-WS to depend on specific SAAJ impl.
-+ // This is also reason for duplication of Handler's code by JAX-WS
-+ String saajClassName = "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler";
-+ String jaxwsClassName = "com.sun.xml.internal.ws.encoding.XmlDataContentHandler";
-+ for (CommandInfo command : commands) {
-+ String commandClass = command.getCommandClass();
-+ if (saajClassName.equals(commandClass) ||
-+ jaxwsClassName.equals(commandClass)) {
-+ return true;
-+ }
-+ }
-+ return false;
-+ }
-+
- }
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.ws.developer;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for ContextClassloaderLocal utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -64,7 +64,12 @@
- @XmlType(name = "EndpointReferenceType", namespace = MemberSubmissionEndpointReference.MSNS)
- public final class MemberSubmissionEndpointReference extends EndpointReference implements MemberSubmissionAddressingConstants {
-
-- private final static JAXBContext msjc = MemberSubmissionEndpointReference.getMSJaxbContext();
-+ private final static ContextClassloaderLocal<JAXBContext> msjc = new ContextClassloaderLocal<JAXBContext>() {
-+ @Override
-+ protected JAXBContext initialValue() throws Exception {
-+ return MemberSubmissionEndpointReference.getMSJaxbContext();
-+ }
-+ };
-
- public MemberSubmissionEndpointReference() {
- }
-@@ -85,7 +90,7 @@
- throw new WebServiceException("Source parameter can not be null on constructor");
-
- try {
-- Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.createUnmarshaller();
-+ Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.get().createUnmarshaller();
- MemberSubmissionEndpointReference epr = unmarshaller.unmarshal(source,MemberSubmissionEndpointReference.class).getValue();
-
- this.addr = epr.addr;
-@@ -104,7 +109,7 @@
-
- public void writeTo(Result result) {
- try {
-- Marshaller marshaller = MemberSubmissionEndpointReference.msjc.createMarshaller();
-+ Marshaller marshaller = MemberSubmissionEndpointReference.msjc.get().createMarshaller();
- //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
- marshaller.marshal(this, result);
- } catch (JAXBException e) {
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -34,9 +34,6 @@
- import com.sun.xml.internal.ws.api.pipe.ContentType;
- import com.sun.xml.internal.ws.developer.StreamingAttachmentFeature;
-
--import javax.activation.CommandMap;
--import javax.activation.MailcapCommandMap;
--import javax.activation.DataContentHandler;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
-@@ -62,33 +59,6 @@
- */
- abstract class MimeCodec implements Codec {
-
-- static {
-- // DataHandler.writeTo() may search for DCH. So adding some default ones.
-- try {
-- CommandMap map = CommandMap.getDefaultCommandMap();
-- if (map instanceof MailcapCommandMap) {
-- MailcapCommandMap mailMap = (MailcapCommandMap) map;
-- String hndlrStr = ";;x-java-content-handler=";
-- // registering our DCH since javamail's DCH doesn't handle
-- // Source
-- mailMap.addMailcap(
-- "text/xml" + hndlrStr + XmlDataContentHandler.class.getName());
-- mailMap.addMailcap(
-- "application/xml" + hndlrStr + XmlDataContentHandler.class.getName());
-- if (map.createDataContentHandler("image/*") == null) {
-- mailMap.addMailcap(
-- "image/*" + hndlrStr + ImageDataContentHandler.class.getName());
-- }
-- if (map.createDataContentHandler("text/plain") == null) {
-- mailMap.addMailcap(
-- "text/plain" + hndlrStr + StringDataContentHandler.class.getName());
-- }
-- }
-- } catch (Throwable t) {
-- // ignore the exception.
-- }
-- }
--
- public static final String MULTIPART_RELATED_MIME_TYPE = "multipart/related";
-
- private String boundary;
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.ws.policy.sourcemodel.attach;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for ContextClassloaderLocal utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -83,7 +83,13 @@
- private static final QName POLICY = new QName("http://www.w3.org/ns/ws-policy", "Policy");
- private static final QName URI = new QName("http://www.w3.org/ns/ws-policy", "URI");
- private static final QName POLICIES = new QName(PolicyConstants.SUN_MANAGEMENT_NAMESPACE, "Policies");
-- private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory.newInstance();
-+ private static final ContextClassloaderLocal<XMLInputFactory> XML_INPUT_FACTORY = new ContextClassloaderLocal<XMLInputFactory>() {
-+ @Override
-+ protected XMLInputFactory initialValue() throws Exception {
-+ return XMLInputFactory.newInstance();
-+ }
-+ };
-+
- private static final PolicyModelUnmarshaller POLICY_UNMARSHALLER = PolicyModelUnmarshaller.getXmlUnmarshaller();
-
- private final Map<URI, Policy> map = new HashMap<URI, Policy>();
-@@ -93,7 +99,7 @@
- public static Map<URI, Policy> unmarshal(final Reader source) throws PolicyException {
- LOGGER.entering(source);
- try {
-- XMLEventReader reader = XML_INPUT_FACTORY.createXMLEventReader(source);
-+ XMLEventReader reader = XML_INPUT_FACTORY.get().createXMLEventReader(source);
- ExternalAttachmentsUnmarshaller instance = new ExternalAttachmentsUnmarshaller();
- final Map<URI, Policy> map = instance.unmarshal(reader, null);
- LOGGER.exiting(map);
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.ws.spi;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for StaticCache utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -77,7 +77,12 @@
- */
- public class ProviderImpl extends Provider {
-
-- private final static JAXBContext eprjc = getEPRJaxbContext();
-+ private final static ContextClassloaderLocal<JAXBContext> eprjc = new ContextClassloaderLocal<JAXBContext>() {
-+ @Override
-+ protected JAXBContext initialValue() throws Exception {
-+ return getEPRJaxbContext();
-+ }
-+ };
-
- /**
- * Convenient singleton instance.
-@@ -140,7 +145,7 @@
- return AccessController.doPrivileged(new PrivilegedAction<EndpointReference>() {
- public EndpointReference run() {
- try {
-- Unmarshaller unmarshaller = eprjc.createUnmarshaller();
-+ Unmarshaller unmarshaller = eprjc.get().createUnmarshaller();
- return (EndpointReference) unmarshaller.unmarshal(eprInfoset);
- } catch (JAXBException e) {
- throw new WebServiceException("Error creating Marshaller or marshalling.", e);
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.ws.util.xml;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for StaticCache utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -199,20 +199,28 @@
- }
- }
-
-- static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
-+ static final ContextClassloaderLocal<TransformerFactory> transformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
-+ @Override
-+ protected TransformerFactory initialValue() throws Exception {
-+ return TransformerFactory.newInstance();
-+ }
-+ };
-
-- static final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
--
-- static {
-- saxParserFactory.setNamespaceAware(true);
-- }
-+ static final ContextClassloaderLocal<SAXParserFactory> saxParserFactory = new ContextClassloaderLocal<SAXParserFactory>() {
-+ @Override
-+ protected SAXParserFactory initialValue() throws Exception {
-+ SAXParserFactory factory = SAXParserFactory.newInstance();
-+ factory.setNamespaceAware(true);
-+ return factory;
-+ }
-+ };
-
- /**
- * Creates a new identity transformer.
- */
- public static Transformer newTransformer() {
- try {
-- return transformerFactory.newTransformer();
-+ return transformerFactory.get().newTransformer();
- } catch (TransformerConfigurationException tex) {
- throw new IllegalStateException("Unable to create a JAXP transformer");
- }
-@@ -227,9 +235,9 @@
- // work around a bug in JAXP in JDK6u4 and earlier where the namespace processing
- // is not turned on by default
- StreamSource ssrc = (StreamSource) src;
-- TransformerHandler th = ((SAXTransformerFactory) transformerFactory).newTransformerHandler();
-+ TransformerHandler th = ((SAXTransformerFactory) transformerFactory.get()).newTransformerHandler();
- th.setResult(result);
-- XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();
-+ XMLReader reader = saxParserFactory.get().newSAXParser().getXMLReader();
- reader.setContentHandler(th);
- reader.setProperty(LEXICAL_HANDLER_PROPERTY, th);
- reader.parse(toInputSource(ssrc));
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package com.sun.xml.internal.xsom.util;
-+
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-+import java.text.MessageFormat;
-+import java.util.ResourceBundle;
-+import java.util.WeakHashMap;
-+
-+/**
-+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
-+ */
-+abstract class ContextClassloaderLocal<V> {
-+
-+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
-+
-+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
-+
-+ public V get() throws Error {
-+ ClassLoader tccl = getContextClassLoader();
-+ V instance = CACHE.get(tccl);
-+ if (instance == null) {
-+ instance = createNewInstance();
-+ CACHE.put(tccl, instance);
-+ }
-+ return instance;
-+ }
-+
-+ public void set(V instance) {
-+ CACHE.put(getContextClassLoader(), instance);
-+ }
-+
-+ protected abstract V initialValue() throws Exception;
-+
-+ private V createNewInstance() {
-+ try {
-+ return initialValue();
-+ } catch (Exception e) {
-+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
-+ }
-+ }
-+
-+ private static String format(String property, Object... args) {
-+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
-+ return MessageFormat.format(text, args);
-+ }
-+
-+ private static ClassLoader getContextClassLoader() {
-+ return (ClassLoader)
-+ AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ ClassLoader cl = null;
-+ try {
-+ cl = Thread.currentThread().getContextClassLoader();
-+ } catch (SecurityException ex) {
-+ }
-+ return cl;
-+ }
-+ });
-+ }
-+}
-+
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -0,0 +1,27 @@
-+#
-+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+#
-+# This code is free software; you can redistribute it and/or modify it
-+# under the terms of the GNU General Public License version 2 only, as
-+# published by the Free Software Foundation. Oracle designates this
-+# particular file as subject to the "Classpath" exception as provided
-+# by Oracle in the LICENSE file that accompanied this code.
-+#
-+# This code is distributed in the hope that it will be useful, but WITHOUT
-+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+# version 2 for more details (a copy is included in the LICENSE file that
-+# accompanied this code).
-+#
-+# You should have received a copy of the GNU General Public License version
-+# 2 along with this work; if not, write to the Free Software Foundation,
-+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+#
-+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+# or visit www.oracle.com if you need additional information or have any
-+# questions.
-+#
-+# Error messages for ContextClassloaderLocal utility class
-+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
-+
---- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -60,7 +60,12 @@
- return new AnnotationParserImpl();
- }
-
-- private static final SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-+ private static final ContextClassloaderLocal<SAXTransformerFactory> stf = new ContextClassloaderLocal<SAXTransformerFactory>() {
-+ @Override
-+ protected SAXTransformerFactory initialValue() throws Exception {
-+ return (SAXTransformerFactory) SAXTransformerFactory.newInstance();
-+ }
-+ };
-
- private static class AnnotationParserImpl extends AnnotationParser {
-
-@@ -72,7 +77,7 @@
-
- AnnotationParserImpl() {
- try {
-- transformer = stf.newTransformerHandler();
-+ transformer = stf.get().newTransformerHandler();
- } catch (TransformerConfigurationException e) {
- throw new Error(e); // impossible
- }
---- ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -27,9 +27,14 @@
-
- import java.math.BigDecimal;
- import java.math.BigInteger;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.Calendar;
-+import java.util.Collections;
- import java.util.GregorianCalendar;
-+import java.util.Map;
- import java.util.TimeZone;
-+import java.util.WeakHashMap;
-
- import javax.xml.namespace.QName;
- import javax.xml.namespace.NamespaceContext;
-@@ -418,7 +423,7 @@
-
- public static GregorianCalendar _parseDateTime(CharSequence s) {
- String val = WhiteSpaceProcessor.trim(s).toString();
-- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
-+ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
- }
-
- public String printDateTime(Calendar val) {
-@@ -492,7 +497,7 @@
- }
-
- public Calendar parseTime(String lexicalXSDTime) {
-- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
-+ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
- }
-
- public String printTime(Calendar val) {
-@@ -500,7 +505,7 @@
- }
-
- public Calendar parseDate(String lexicalXSDDate) {
-- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
-+ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
- }
-
- public String printDate(Calendar val) {
-@@ -882,14 +887,30 @@
- }
- return false;
- }
-- private static final DatatypeFactory datatypeFactory;
-
-- static {
-- try {
-- datatypeFactory = DatatypeFactory.newInstance();
-- } catch (DatatypeConfigurationException e) {
-- throw new Error(e);
-+ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
-+
-+ public static DatatypeFactory getDatatypeFactory() {
-+ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
-+ public ClassLoader run() {
-+ return Thread.currentThread().getContextClassLoader();
-+ }
-+ });
-+ DatatypeFactory df = DF_CACHE.get(tccl);
-+ if (df == null) {
-+ synchronized (DatatypeConverterImpl.class) {
-+ df = DF_CACHE.get(tccl);
-+ if (df == null) { // to prevent multiple initialization
-+ try {
-+ df = DatatypeFactory.newInstance();
-+ } catch (DatatypeConfigurationException e) {
-+ throw new Error(Messages.format(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY), e);
-+ }
-+ DF_CACHE.put(tccl, df);
-+ }
-+ }
- }
-+ return df;
- }
-
- private static final class CalendarFormatter {
---- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -88,4 +88,6 @@
-
- static final String ILLEGAL_CAST = // 2 args
- "JAXBContext.IllegalCast";
-+
-+ static final String FAILED_TO_INITIALE_DATATYPE_FACTORY = "FAILED_TO_INITIALE_DATATYPE_FACTORY";
- }
---- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- #
--# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
-+# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
- # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- #
- # This code is free software; you can redistribute it and/or modify it
-@@ -49,3 +49,6 @@
-
- JAXBContext.IllegalCast = \
- ClassCastException: attempting to cast {0} to {1}. Please make sure that you are specifying the proper ClassLoader.
-+
-+FAILED_TO_INITIALE_DATATYPE_FACTORY = \
-+ Failed to initialize JAXP 1.3 DatatypeFactory class.
---- ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
-+++ ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -69,7 +69,7 @@
- @XmlType(name="EndpointReferenceType",namespace=W3CEndpointReference.NS)
- public final class W3CEndpointReference extends EndpointReference {
-
-- private final static JAXBContext w3cjc = getW3CJaxbContext();
-+ private final JAXBContext w3cjc = getW3CJaxbContext();
-
- protected W3CEndpointReference() {
- }
---- ./jdk/.hgtags Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/.hgtags Tue Mar 18 12:35:25 2014 -0700
-@@ -365,6 +365,9 @@
- c5ca4daec23b5e7f99ac8d684f5016ff8bfebbb0 jdk7u45-b18
- 4797f984f6c93c433aa797e9b2d8f904cf083f96 jdk7u45-b30
- 8c343a783777b8728cb819938f387db0acf7f3ac jdk7u45-b31
-+402d54c7d8ce95f3945cc3d698e528e4adec7b9b jdk7u45-b33
-+34e8f9f26ae612ebac36357eecbe70ea20e0233c jdk7u45-b34
-+3dbb06a924cdf73d39b8543824ec88ae501ba5c6 jdk7u45-b35
- 3c9a6d9eafd31be44b0ade0354e60f5078b417a4 jdk7u51-b00
- d76613074ff357d0664b97b4aaf99fbb65dcec47 jdk7u51-b01
- fb057871f094ebe4906ad6856326768b01a62c45 jdk7u51-b02
-@@ -379,3 +382,22 @@
- f0425ecbbb0ca9d8c87c250c19e8f9524b38833d jdk7u51-b11
- f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u51-b12
- d19a89fdfb9b959b8638441d9d396685d6c7ab7b jdk7u51-b13
-+ef58b2b9a9a1e1a42b0139b57816a160c4681371 jdk7u51-b30
-+5bca0d0969b13b1d9b8caba3cce8293a98d68318 jdk7u51-b31
-+e9143dc3dc2a8f4b896e74f70d6c503d73c40533 jdk7u51-b33
-+c1eaf405fb8d7beddd75c6f81671970f6baa70d8 jdk7u51-b34
-+f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u55-b00
-+5010db5b9b5ab07a9409a5c557d3f43ab32dc428 jdk7u55-b01
-+2ca3e1fa4455ad564228ad6e654498167af2f20d jdk7u55-b02
-+c12b3c81366cb067ff4444952209d54bfa387353 jdk7u55-b03
-+476d1bddaa32bf440953c3b1814ba38f16886c03 jdk7u55-b04
-+7fa6d3ba2cc77cd1e6f24e33f0c39788cb2893b8 jdk7u55-b05
-+795654fce29c38d4c8504f760d8d8a36248d38ed jdk7u55-b06
-+4b2ed892b195e95f7541aaa3b129a2caa5faae1d jdk7u55-b07
-+db1323224053a18ecc62bdc1d3902d93b33f0b70 jdk7u55-b08
-+534eeff29ac9fcbbb99ef8908548dbb368d04baf jdk7u55-b09
-+d39dd4135844ca5c707bc39ae1d7e020d49880ce jdk7u55-b09
-+b231536550067c3b00c77d0e035afe8faaa15581 jdk7u55-b10
-+2d80b7cd7aae76f0909a210414317dcf846ad651 jdk7u55-b11
-+07be5d5508733ed37c11fcd21a13ae3c8288313b jdk7u55-b12
-+92fd166252c2701092a510002f4cf9285a20473d jdk7u55-b13
---- ./jdk/make/common/Defs-embedded.gmk Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/common/Defs-embedded.gmk Tue Mar 18 12:35:25 2014 -0700
-@@ -71,7 +71,9 @@
- # and it must be linked after fdlibm - this places it at the end after libc
- # -z muldefs avoids linker errors for duplicate symbols.
- ifeq ($(CROSS_COMPILE_ARCH), arm)
-- EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
-+ ifneq ($(EXT_LIBS_PATH),)
-+ EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
-+ endif
- endif
- endif
-
---- ./jdk/make/java/java/Exportedfiles.gmk Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/java/java/Exportedfiles.gmk Tue Mar 18 12:35:25 2014 -0700
-@@ -50,6 +50,7 @@
- java/lang/SecurityManager.java \
- java/lang/Shutdown.java \
- java/lang/Package.java \
-+ java/lang/UNIXProcess.java \
- java/lang/ref/Finalizer.java \
- java/lang/reflect/AccessibleObject.java \
- java/lang/reflect/Field.java \
---- ./jdk/make/java/java/Makefile Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/java/java/Makefile Tue Mar 18 12:35:25 2014 -0700
-@@ -84,6 +84,7 @@
- java/util/prefs/FileSystemPreferencesFactory.java \
-
- FILES_c += UNIXProcess_md.c \
-+ childproc.c \
- UnixFileSystem_md.c \
- canonicalize_md.c \
- TimeZone.c \
-@@ -451,3 +452,36 @@
- clean::
- $(RM) $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java
-
-+
-+HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper
-+BUILDHELPER =
-+ifeq ($(PLATFORM), solaris)
-+ BUILDHELPER = 1
-+endif
-+ifeq ($(PLATFORM), macosx)
-+ HELPER_EXE = $(LIBDIR)/jspawnhelper
-+ BUILDHELPER = 1
-+endif
-+
-+ARCHFLAG =
-+ifeq ($(ARCH_DATA_MODEL), 64)
-+ARCHFLAG = -m64
-+endif
-+
-+ifdef BUILDHELPER
-+
-+HELPER_EXE_FILES_c = jspawnhelper.c
-+HELPER_EXE_FILES_o = $(OBJDIR)/jspawnhelper.o \
-+ $(OBJDIR)/childproc.o
-+
-+$(HELPER_EXE): $(HELPER_EXE_FILES_o)
-+ $(CC) $(ARCHFLAG) $(HELPER_EXE_FILES_o) \
-+ -o $(TEMPDIR)/jspawnhelper
-+ $(CP) $(TEMPDIR)/jspawnhelper $(HELPER_EXE)
-+
-+build: $(HELPER_EXE)
-+
-+clean clobber::
-+ $(RM) $(HELPER_EXE_FILES_o) $(HELPER_EXE)
-+
-+endif #BUILDHELPER
---- ./jdk/make/java/java/mapfile-vers Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/java/java/mapfile-vers Tue Mar 18 12:35:25 2014 -0700
-@@ -215,7 +215,7 @@
- Java_java_lang_Throwable_fillInStackTrace;
- Java_java_lang_Throwable_getStackTraceDepth;
- Java_java_lang_Throwable_getStackTraceElement;
-- Java_java_lang_UNIXProcess_initIDs;
-+ Java_java_lang_UNIXProcess_init;
- Java_java_lang_UNIXProcess_waitForProcessExit;
- Java_java_lang_UNIXProcess_forkAndExec;
- Java_java_lang_UNIXProcess_destroyProcess;
---- ./jdk/make/sun/javazic/tzdata/VERSION Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/sun/javazic/tzdata/VERSION Tue Mar 18 12:35:25 2014 -0700
-@@ -21,4 +21,4 @@
- # or visit www.oracle.com if you need additional information or have any
- # questions.
- #
--tzdata2013h
-+tzdata2013i
---- ./jdk/make/sun/javazic/tzdata/africa Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/sun/javazic/tzdata/africa Tue Mar 18 12:35:25 2014 -0700
-@@ -500,14 +500,13 @@
- Rule Libya 1997 only - Oct 4 0:00 0 -
- Rule Libya 2013 only - Mar lastFri 1:00 1:00 S
- Rule Libya 2013 only - Oct lastFri 2:00 0 -
--
--# The 1996 and 1997 entries are from Shanks & Pottenger;
--# the IATA SSIM data contain some obvious errors.
- # Zone NAME GMTOFF RULES FORMAT [UNTIL]
- Zone Africa/Tripoli 0:52:44 - LMT 1920
- 1:00 Libya CE%sT 1959
- 2:00 - EET 1982
- 1:00 Libya CE%sT 1990 May 4
-+# The 1996 and 1997 entries are from Shanks & Pottenger;
-+# the IATA SSIM data contain some obvious errors.
- 2:00 - EET 1996 Sep 30
- 1:00 Libya CE%sT 1997 Oct 4
- 2:00 - EET 2012 Nov 10 2:00
---- ./jdk/make/sun/javazic/tzdata/asia Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/sun/javazic/tzdata/asia Tue Mar 18 12:35:25 2014 -0700
-@@ -1403,12 +1403,22 @@
- # switch back to standard time this winter, so the will stay on DST
- # until about the same time next year (at least).
- # http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?NewsID=88950
--#
--# From Paul Eggert (2013-09-21):
--# It's looking like this change will be permanent; see
--# Petra News Agency, Cancelling winter saved Jordan $7 million (2013-02-20)
--# <http://www.albawaba.com/business/jordan-winter-electricity--472005>.
--# So move Jordan to UTC+3 as of the abovementioned date.
-+
-+# From Steffen Thorsen (2013-12-11):
-+# Jordan Times and other sources say that Jordan is going back to
-+# UTC+2 on 2013-12-19 at midnight:
-+# http://jordantimes.com/govt-decides-to-switch-back-to-wintertime
-+# Official, in Arabic:
-+# http://www.petra.gov.jo/public_news/Nws_NewsDetails.aspx?Menu_ID=&Site_Id=2&lang=1&NewsID=133230&CatID=14
-+# ... Our background/permalink about it
-+# http://www.timeanddate.com/news/time/jordan-reverses-dst-decision.html
-+# ...
-+# http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?lang=2&site_id=1&NewsID=133313&Type=P
-+# ... says midnight for the coming one and 1:00 for the ones in the future
-+# (and they will use DST again next year, using the normal schedule).
-+
-+# From Paul Eggert (2013-12-11):
-+# As Steffen suggested, consider the past 21-month experiment to be DST.
-
- # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
- Rule Jordan 1973 only - Jun 6 0:00 1:00 S
-@@ -1438,11 +1448,13 @@
- Rule Jordan 2003 only - Oct 24 0:00s 0 -
- Rule Jordan 2004 only - Oct 15 0:00s 0 -
- Rule Jordan 2005 only - Sep lastFri 0:00s 0 -
--Rule Jordan 2006 2012 - Oct lastFri 0:00s 0 -
-+Rule Jordan 2006 2011 - Oct lastFri 0:00s 0 -
-+Rule Jordan 2013 only - Dec 20 0:00 0 -
-+Rule Jordan 2014 max - Mar lastThu 24:00 1:00 S
-+Rule Jordan 2014 max - Oct lastFri 0:00s 0 -
- # Zone NAME GMTOFF RULES FORMAT [UNTIL]
- Zone Asia/Amman 2:23:44 - LMT 1931
-- 2:00 Jordan EE%sT 2012 Oct 26 0:00s
-- 3:00 - AST
-+ 2:00 Jordan EE%sT
-
-
- # Kazakhstan
---- ./jdk/make/sun/javazic/tzdata/northamerica Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/make/sun/javazic/tzdata/northamerica Tue Mar 18 12:35:25 2014 -0700
-@@ -2688,6 +2688,11 @@
- # to DST--and one more hour on 1999-04-04--when the announcers will have
- # returned to Baltimore, which switches on that date.)
-
-+# From Steffen Thorsen (2013-11-11):
-+# DST start in Cuba in 2004 ... does not follow the same rules as the
-+# years before. The correct date should be Sunday 2004-03-28 00:00 ...
-+# https://web.archive.org/web/20040402060750/http://www.granma.cu/espanol/2004/marzo/sab27/reloj.html
-+
- # From Evert van der Veer via Steffen Thorsen (2004-10-28):
- # Cuba is not going back to standard time this year.
- # From Paul Eggert (2006-03-22):
-@@ -2877,7 +2882,8 @@
- Rule Cuba 1997 only - Oct 12 0:00s 0 S
- Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D
- Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S
--Rule Cuba 2000 2004 - Apr Sun>=1 0:00s 1:00 D
-+Rule Cuba 2000 2003 - Apr Sun>=1 0:00s 1:00 D
-+Rule Cuba 2004 only - Mar lastSun 0:00s 1:00 D
- Rule Cuba 2006 2010 - Oct lastSun 0:00s 0 S
- Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D
- Rule Cuba 2008 only - Mar Sun>=15 0:00s 1:00 D
---- ./jdk/src/macosx/classes/sun/font/CFontManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/font/CFontManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -27,6 +27,8 @@
-
- import java.awt.*;
- import java.io.File;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Hashtable;
-@@ -38,6 +40,7 @@
-
- import sun.awt.FontConfiguration;
- import sun.awt.HeadlessToolkit;
-+import sun.misc.ThreadGroupUtils;
- import sun.lwawt.macosx.*;
-
- public class CFontManager extends SunFontManager {
-@@ -215,24 +218,22 @@
- });
- }
- };
-- java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction<Object>() {
-- public Object run() {
-+ AccessController.doPrivileged(
-+ new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
- /* The thread must be a member of a thread group
- * which will not get GCed before VM exit.
- * Make its parent the top-level thread group.
- */
-- ThreadGroup tg =
-- Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null;
-- tg = tgn, tgn = tg.getParent());
-- fileCloser = new Thread(tg, fileCloserRunnable);
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ fileCloser = new Thread(rootTG, fileCloserRunnable);
- fileCloser.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(fileCloser);
- return null;
- }
-- });
-+ }
-+ );
- }
- }
- }
---- ./jdk/src/macosx/classes/sun/font/CStrike.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/font/CStrike.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -31,7 +31,7 @@
-
- import sun.awt.SunHints;
-
--public class CStrike extends FontStrike {
-+public final class CStrike extends FontStrike {
-
- // Creates the native strike
- private static native long createNativeStrikePtr(long nativeFontPtr,
-@@ -68,10 +68,10 @@
- Rectangle2D.Float result,
- double x, double y);
-
-- private CFont nativeFont;
-+ private final CFont nativeFont;
- private AffineTransform invDevTx;
-- private GlyphInfoCache glyphInfoCache;
-- private GlyphAdvanceCache glyphAdvanceCache;
-+ private final GlyphInfoCache glyphInfoCache;
-+ private final GlyphAdvanceCache glyphAdvanceCache;
- private long nativeStrikePtr;
-
- CStrike(final CFont font, final FontStrikeDesc inDesc) {
-@@ -84,11 +84,11 @@
- // Normally the device transform should be the identity transform
- // for screen operations. The device transform only becomes
- // interesting when we are outputting between different dpi surfaces,
-- // like when we are printing to postscript.
-+ // like when we are printing to postscript or use retina.
- if (inDesc.devTx != null && !inDesc.devTx.isIdentity()) {
- try {
- invDevTx = inDesc.devTx.createInverse();
-- } catch (NoninvertibleTransformException e) {
-+ } catch (NoninvertibleTransformException ignored) {
- // ignored, since device transforms should not be that
- // complicated, and if they are - there is nothing we can do,
- // so we won't worry about it.
-@@ -134,15 +134,13 @@
- nativeStrikePtr = 0;
- }
-
-- // the fractional metrics default on our platform is OFF
-- private boolean useFractionalMetrics() {
-- return desc.fmHint == SunHints.INTVAL_FRACTIONALMETRICS_ON;
-- }
-
-+ @Override
- public int getNumGlyphs() {
- return nativeFont.getNumGlyphs();
- }
-
-+ @Override
- StrikeMetrics getFontMetrics() {
- if (strikeMetrics == null) {
- StrikeMetrics metrics = getFontMetrics(getNativeStrikePtr());
-@@ -155,74 +153,24 @@
- return strikeMetrics;
- }
-
-- float getGlyphAdvance(int glyphCode) {
-- return getScaledAdvanceForAdvance(getCachedNativeGlyphAdvance(glyphCode));
-+ @Override
-+ float getGlyphAdvance(final int glyphCode) {
-+ return getCachedNativeGlyphAdvance(glyphCode);
- }
-
-- float getCodePointAdvance(int cp) {
-- float advance = getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
--
-- double glyphScaleX = desc.glyphTx.getScaleX();
-- double devScaleX = desc.devTx.getScaleX();
--
-- if (devScaleX == 0) {
-- glyphScaleX = Math.sqrt(desc.glyphTx.getDeterminant());
-- devScaleX = Math.sqrt(desc.devTx.getDeterminant());
-- }
--
-- if (devScaleX == 0) {
-- devScaleX = Double.NaN; // this an undefined graphics state
-- }
-- advance = (float) (advance * glyphScaleX / devScaleX);
-- return useFractionalMetrics() ? advance : Math.round(advance);
-+ @Override
-+ float getCodePointAdvance(final int cp) {
-+ return getGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
- }
-
-- // calculate an advance, and round if not using fractional metrics
-- private float getScaledAdvanceForAdvance(float advance) {
-- if (invDevTx != null) {
-- advance *= invDevTx.getScaleX();
-- }
-- advance *= desc.glyphTx.getScaleX();
-- return useFractionalMetrics() ? advance : Math.round(advance);
-+ @Override
-+ Point2D.Float getCharMetrics(final char ch) {
-+ return getGlyphMetrics(nativeFont.getMapper().charToGlyph(ch));
- }
-
-- Point2D.Float getCharMetrics(char ch) {
-- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(ch)));
-- }
--
-- Point2D.Float getGlyphMetrics(int glyphCode) {
-- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(glyphCode));
-- }
--
-- // calculate an advance point, and round if not using fractional metrics
-- private Point2D.Float getScaledPointForAdvance(float advance) {
-- Point2D.Float pt = new Point2D.Float(advance, 0);
--
-- if (!desc.glyphTx.isIdentity()) {
-- return scalePoint(pt);
-- }
--
-- if (!useFractionalMetrics()) {
-- pt.x = Math.round(pt.x);
-- }
-- return pt;
-- }
--
-- private Point2D.Float scalePoint(Point2D.Float pt) {
-- if (invDevTx != null) {
-- // transform the point out of the device space first
-- invDevTx.transform(pt, pt);
-- }
-- desc.glyphTx.transform(pt, pt);
-- pt.x -= desc.glyphTx.getTranslateX();
-- pt.y -= desc.glyphTx.getTranslateY();
--
-- if (!useFractionalMetrics()) {
-- pt.x = Math.round(pt.x);
-- pt.y = Math.round(pt.y);
-- }
--
-- return pt;
-+ @Override
-+ Point2D.Float getGlyphMetrics(final int glyphCode) {
-+ return new Point2D.Float(getGlyphAdvance(glyphCode), 0.0f);
- }
-
- Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
-@@ -414,9 +362,7 @@
- private SparseBitShiftingTwoLayerArray secondLayerCache;
- private HashMap<Integer, Long> generalCache;
-
-- public GlyphInfoCache(final Font2D nativeFont,
-- final FontStrikeDesc desc)
-- {
-+ GlyphInfoCache(final Font2D nativeFont, final FontStrikeDesc desc) {
- super(nativeFont, desc);
- firstLayerCache = new long[FIRST_LAYER_SIZE];
- }
-@@ -527,7 +473,7 @@
- final int shift;
- final int secondLayerLength;
-
-- public SparseBitShiftingTwoLayerArray(final int size, final int shift) {
-+ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
- this.shift = shift;
- this.cache = new long[1 << shift][];
- this.secondLayerLength = size >> shift;
-@@ -559,6 +505,12 @@
- private SparseBitShiftingTwoLayerArray secondLayerCache;
- private HashMap<Integer, Float> generalCache;
-
-+ // Empty non private constructor was added because access to this
-+ // class shouldn't be emulated by a synthetic accessor method.
-+ GlyphAdvanceCache() {
-+ super();
-+ }
-+
- public synchronized float get(final int index) {
- if (index < 0) {
- if (-index < SECOND_LAYER_SIZE) {
-@@ -609,9 +561,7 @@
- final int shift;
- final int secondLayerLength;
-
-- public SparseBitShiftingTwoLayerArray(final int size,
-- final int shift)
-- {
-+ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
- this.shift = shift;
- this.cache = new float[1 << shift][];
- this.secondLayerLength = size >> shift;
---- ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -37,6 +37,7 @@
-
- import sun.awt.*;
- import sun.lwawt.macosx.*;
-+import sun.misc.ThreadGroupUtils;
- import sun.print.*;
-
- public abstract class LWToolkit extends SunToolkit implements Runnable {
-@@ -66,22 +67,17 @@
- protected final void init() {
- AWTAutoShutdown.notifyToolkitThreadBusy();
-
-- ThreadGroup mainTG = AccessController.doPrivileged(
-- new PrivilegedAction<ThreadGroup>() {
-- public ThreadGroup run() {
-- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = currentTG.getParent();
-- while (parentTG != null) {
-- currentTG = parentTG;
-- parentTG = currentTG.getParent();
-+ ThreadGroup rootTG = AccessController.doPrivileged(
-+ new PrivilegedAction<ThreadGroup>() {
-+ @Override
-+ public ThreadGroup run() {
-+ return ThreadGroupUtils.getRootThreadGroup();
- }
-- return currentTG;
-- }
-- }
-- );
-+ });
-
- Runtime.getRuntime().addShutdownHook(
-- new Thread(mainTG, new Runnable() {
-+ new Thread(rootTG, new Runnable() {
-+ @Override
- public void run() {
- shutdown();
- waitForRunState(STATE_CLEANUP);
-@@ -89,7 +85,7 @@
- })
- );
-
-- Thread toolkitThread = new Thread(mainTG, this, "AWT-LW");
-+ Thread toolkitThread = new Thread(rootTG, this, "AWT-LW");
- toolkitThread.setDaemon(true);
- toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
- toolkitThread.start();
---- ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Tue Mar 18 12:35:25 2014 -0700
-@@ -53,7 +53,7 @@
- }
-
- protected void setContentsNative(Transferable contents) {
--
-+ FlavorTable flavorMap = getDefaultFlavorTable();
- // Don't use delayed Clipboard rendering for the Transferable's data.
- // If we did that, we would call Transferable.getTransferData on
- // the Toolkit thread, which is a security hole.
---- ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Tue Mar 18 12:35:25 2014 -0700
-@@ -620,8 +620,7 @@
- retString[0] = new String(selectedText);
- }}
- }, fAwtFocussedComponent);
-- } catch (InterruptedException ie) { ie.printStackTrace(); }
-- catch (InvocationTargetException ite) { ite.printStackTrace(); }
-+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
-
- synchronized(retString) { return retString[0]; }
- }
-@@ -669,8 +668,7 @@
-
- }}
- }, fAwtFocussedComponent);
-- } catch (InterruptedException ie) { ie.printStackTrace(); }
-- catch (InvocationTargetException ite) { ite.printStackTrace(); }
-+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
-
- synchronized(returnValue) { return returnValue; }
- }
-@@ -695,8 +693,7 @@
- returnValue[0] = fIMContext.getInsertPositionOffset();
- }}
- }, fAwtFocussedComponent);
-- } catch (InterruptedException ie) { ie.printStackTrace(); }
-- catch (InvocationTargetException ite) { ite.printStackTrace(); }
-+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
-
- returnValue[1] = fCurrentTextLength;
- synchronized(returnValue) { return returnValue; }
-@@ -743,8 +740,7 @@
- }
- }}
- }, fAwtFocussedComponent);
-- } catch (InterruptedException ie) { ie.printStackTrace(); }
-- catch (InvocationTargetException ite) { ite.printStackTrace(); }
-+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
-
- synchronized(rect) { return rect; }
- }
-@@ -764,8 +760,7 @@
- insertPositionOffset[0] = fIMContext.getInsertPositionOffset();
- }}
- }, fAwtFocussedComponent);
-- } catch (InterruptedException ie) { ie.printStackTrace(); }
-- catch (InvocationTargetException ite) { ite.printStackTrace(); }
-+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
-
- // This bit of gymnastics ensures that the returned location is within the composed text.
- // If it falls outside that region, the input method will commit the text, which is inconsistent with native
---- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Mar 18 12:35:25 2014 -0700
-@@ -918,7 +918,7 @@
- //Posting an empty to flush the EventQueue without blocking the main thread
- }
- }, target);
-- } catch (InterruptedException | InvocationTargetException e) {
-+ } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
---- ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Tue Mar 18 12:35:25 2014 -0700
-@@ -97,6 +97,6 @@
- setVisible(true);
- }
- }, this);
-- } catch (InterruptedException | InvocationTargetException ex) {}
-+ } catch (InvocationTargetException ex) {}
- }
- }
---- ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Mar 18 12:35:25 2014 -0700
-@@ -414,8 +414,15 @@
- }
-
- // Intended to be called from the LWCToolkit.m only.
-- private static void installToolkitThreadNameInJava() {
-+ private static void installToolkitThreadInJava() {
- Thread.currentThread().setName(CThreading.APPKIT_THREAD_NAME);
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ Thread.currentThread().setContextClassLoader(null);
-+ return null;
-+ }
-+ });
- }
-
- @Override
-@@ -518,22 +525,21 @@
- // Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop
- // The InvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop
- // Does not dispatch native events while in the loop
-- public static void invokeAndWait(Runnable event, Component component) throws InterruptedException, InvocationTargetException {
-+ public static void invokeAndWait(Runnable runnable, Component component) throws InvocationTargetException {
- final long mediator = createAWTRunLoopMediator();
-
-- InvocationEvent invocationEvent =
-- new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event) {
-- @Override
-- public void dispatch() {
-- try {
-- super.dispatch();
-- } finally {
-- if (mediator != 0) {
-- stopAWTRunLoop(mediator);
-+ InvocationEvent invocationEvent = AWTAccessor.getInvocationEventAccessor()
-+ .createEvent(component != null ? component : Toolkit.getDefaultToolkit(),
-+ runnable,
-+ new Runnable() {
-+ @Override
-+ public void run() {
-+ if (mediator != 0) {
-+ stopAWTRunLoop(mediator);
-+ }
- }
-- }
-- }
-- };
-+ },
-+ true);
-
- if (component != null) {
- AppContext appContext = SunToolkit.targetToAppContext(component);
---- ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Tue Mar 18 12:35:25 2014 -0700
-@@ -193,8 +193,8 @@
-
- JNIEnv *env = [ThreadUtilities getJNIEnv];
- static JNF_CLASS_CACHE(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
-- static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadNameInJava, jc_LWCToolkit, "installToolkitThreadNameInJava", "()V");
-- JNFCallStaticVoidMethod(env, jsm_installToolkitThreadNameInJava);
-+ static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
-+ JNFCallStaticVoidMethod(env, jsm_installToolkitThreadInJava);
- });
-
- gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
---- ./jdk/src/macosx/native/sun/awt/awt.m Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/awt/awt.m Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -432,6 +432,16 @@
- forceEmbeddedMode = YES;
- }
-
-+ JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
-+ jclass jc_ThreadGroupUtils = (*env)->FindClass(env, "sun/misc/ThreadGroupUtils");
-+ jmethodID sjm_getRootThreadGroup = (*env)->GetStaticMethodID(env, jc_ThreadGroupUtils, "getRootThreadGroup", "()Ljava/lang/ThreadGroup;");
-+ jobject rootThreadGroup = (*env)->CallStaticObjectMethod(env, jc_ThreadGroupUtils, sjm_getRootThreadGroup);
-+ [ThreadUtilities setAppkitThreadGroup:(*env)->NewGlobalRef(env, rootThreadGroup)];
-+
-+ // The current thread was attached in getJNIEnvUncached.
-+ // Detach it back. It will be reattached later if needed with a proper TG
-+ [ThreadUtilities detachCurrentThread];
-+
- BOOL headless = isHeadless(env);
-
- // We need to let Foundation know that this is a multithreaded application, if it isn't already.
---- ./jdk/src/macosx/native/sun/font/AWTStrike.h Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/font/AWTStrike.h Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -31,11 +31,12 @@
- @interface AWTStrike : NSObject {
- @public
- AWTFont * fAWTFont;
-- CGFloat fSize;
-+ CGFloat fSize;
- JRSFontRenderingStyle fStyle;
-- jint fAAStyle;
-+ jint fAAStyle;
-
- CGAffineTransform fTx;
-+ CGAffineTransform fDevTx;
- CGAffineTransform fAltTx; // alternate strike tx used for Sun2D
- CGAffineTransform fFontTx;
- }
---- ./jdk/src/macosx/native/sun/font/AWTStrike.m Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/font/AWTStrike.m Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -60,6 +60,7 @@
- invDevTx.b *= -1;
- invDevTx.c *= -1;
- fFontTx = CGAffineTransformConcat(CGAffineTransformConcat(tx, invDevTx), sInverseTX);
-+ fDevTx = CGAffineTransformInvert(invDevTx);
-
- // the "font size" is the square root of the determinant of the matrix
- fSize = sqrt(abs(fFontTx.a * fFontTx.d - fFontTx.b * fFontTx.c));
-@@ -143,7 +144,8 @@
- {
- CGSize advance;
- JNF_COCOA_ENTER(env);
-- AWTFont *awtFont = ((AWTStrike *)jlong_to_ptr(awtStrikePtr))->fAWTFont;
-+ AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
-+ AWTFont *awtFont = awtStrike->fAWTFont;
-
- // negative glyph codes are really unicodes, which were placed there by the mapper
- // to indicate we should use CoreText to substitute the character
-@@ -151,6 +153,10 @@
- const CTFontRef fallback = CTS_CopyCTFallbackFontAndGlyphForJavaGlyphCode(awtFont, glyphCode, &glyph);
- CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
- CFRelease(fallback);
-+ advance = CGSizeApplyAffineTransform(advance, awtStrike->fFontTx);
-+ if (!JRSFontStyleUsesFractionalMetrics(awtStrike->fStyle)) {
-+ advance.width = round(advance.width);
-+ }
-
- JNF_COCOA_EXIT(env);
- return advance.width;
---- ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -455,6 +455,7 @@
- #define CGGI_GLYPH_BBOX_PADDING 2.0f
- static inline GlyphInfo *
- CGGI_CreateNewGlyphInfoFrom(CGSize advance, CGRect bbox,
-+ const AWTStrike *strike,
- const CGGI_RenderingMode *mode)
- {
- size_t pixelSize = mode->glyphDescriptor->pixelSize;
-@@ -477,6 +478,12 @@
- width = 1;
- height = 1;
- }
-+ advance = CGSizeApplyAffineTransform(advance, strike->fFontTx);
-+ if (!JRSFontStyleUsesFractionalMetrics(strike->fStyle)) {
-+ advance.width = round(advance.width);
-+ advance.height = round(advance.height);
-+ }
-+ advance = CGSizeApplyAffineTransform(advance, strike->fDevTx);
-
- #ifdef USE_IMAGE_ALIGNED_MEMORY
- // create separate memory
-@@ -564,10 +571,10 @@
- JRSFontGetBoundingBoxesForGlyphsAndStyle(fallback, &tx, style, &glyph, 1, &bbox);
-
- CGSize advance;
-- JRSFontGetAdvancesForGlyphsAndStyle(fallback, &tx, strike->fStyle, &glyph, 1, &advance);
-+ CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
-
- // create the Sun2D GlyphInfo we are going to strike into
-- GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
-+ GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
-
- // fix the context size, just in case the substituted character is unexpectedly large
- CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode);
-@@ -715,7 +722,7 @@
- JRSFontRenderingStyle bboxCGMode = JRSFontAlignStyleForFractionalMeasurement(strike->fStyle);
-
- JRSFontGetBoundingBoxesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, bboxCGMode, glyphs, len, bboxes);
-- JRSFontGetAdvancesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, strike->fStyle, glyphs, len, advances);
-+ CTFontGetAdvancesForGlyphs((CTFontRef)font->fFont, kCTFontDefaultOrientation, glyphs, advances, len);
-
- size_t maxWidth = 1;
- size_t maxHeight = 1;
-@@ -732,7 +739,7 @@
- CGSize advance = advances[i];
- CGRect bbox = bboxes[i];
-
-- GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
-+ GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
-
- if (maxWidth < glyphInfo->width) maxWidth = glyphInfo->width;
- if (maxHeight < glyphInfo->height) maxHeight = glyphInfo->height;
---- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -127,6 +127,8 @@
-
- + (JNIEnv*)getJNIEnv;
- + (JNIEnv*)getJNIEnvUncached;
-++ (void)detachCurrentThread;
-++ (void)setAppkitThreadGroup:(jobject)group;
-
- //Wrappers for the corresponding JNFRunLoop methods with a check for main thread
- + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
---- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -33,23 +33,44 @@
- // The following must be named "jvm", as there are extern references to it in AWT
- JavaVM *jvm = NULL;
- static JNIEnv *appKitEnv = NULL;
-+static jobject appkitThreadGroup = NULL;
-+
-+inline void attachCurrentThread(void** env) {
-+ if ([NSThread isMainThread]) {
-+ JavaVMAttachArgs args;
-+ args.version = JNI_VERSION_1_4;
-+ args.name = "AppKit Thread";
-+ args.group = appkitThreadGroup;
-+ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, &args);
-+ } else {
-+ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, NULL);
-+ }
-+}
-
- @implementation ThreadUtilities
-
- + (JNIEnv*)getJNIEnv {
- AWT_ASSERT_APPKIT_THREAD;
- if (appKitEnv == NULL) {
-- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&appKitEnv, NULL);
-+ attachCurrentThread((void **)&appKitEnv);
- }
- return appKitEnv;
- }
-
- + (JNIEnv*)getJNIEnvUncached {
- JNIEnv *env = NULL;
-- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&env, nil);
-+ attachCurrentThread((void **)&env);
- return env;
- }
-
-++ (void)detachCurrentThread {
-+ (*jvm)->DetachCurrentThread(jvm);
-+}
-+
-++ (void)setAppkitThreadGroup:(jobject)group {
-+ appkitThreadGroup = group;
-+}
-+
- + (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
- if ([NSThread isMainThread] && wait == YES) {
- block();
---- ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Tue Mar 18 12:35:25 2014 -0700
-@@ -35,6 +35,8 @@
- import javax.management.remote.SubjectDelegationPermission;
-
- import com.sun.jmx.remote.util.CacheMap;
-+import java.util.ArrayList;
-+import java.util.Collection;
-
- public class SubjectDelegator {
- private static final int PRINCIPALS_CACHE_SIZE = 10;
-@@ -53,11 +55,14 @@
- boolean removeCallerContext)
- throws SecurityException {
-
-+ if (System.getSecurityManager() != null && authenticatedACC == null) {
-+ throw new SecurityException("Illegal AccessControlContext: null");
-+ }
- if (principalsCache == null || accCache == null) {
- principalsCache =
-- new CacheMap<Subject, Principal[]>(PRINCIPALS_CACHE_SIZE);
-+ new CacheMap<>(PRINCIPALS_CACHE_SIZE);
- accCache =
-- new CacheMap<Subject, AccessControlContext>(ACC_CACHE_SIZE);
-+ new CacheMap<>(ACC_CACHE_SIZE);
- }
-
- // Retrieve the principals for the given
-@@ -101,14 +106,15 @@
- // principal in the delegated subject
- //
- final Principal[] dp = delegatedPrincipals;
-+ final Collection<Permission> permissions = new ArrayList<>(dp.length);
-+ for(Principal p : dp) {
-+ final String pname = p.getClass().getName() + "." + p.getName();
-+ permissions.add(new SubjectDelegationPermission(pname));
-+ }
- PrivilegedAction<Void> action =
- new PrivilegedAction<Void>() {
- public Void run() {
-- for (int i = 0 ; i < dp.length ; i++) {
-- final String pname =
-- dp[i].getClass().getName() + "." + dp[i].getName();
-- Permission sdp =
-- new SubjectDelegationPermission(pname);
-+ for (Permission sdp : permissions) {
- AccessController.checkPermission(sdp);
- }
- return null;
---- ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -30,13 +30,14 @@
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.Socket;
-+import java.security.SecureRandom;
- import javax.naming.*;
-
- import java.util.Collections;
- import java.util.Map;
- import java.util.HashMap;
--import java.util.Set;
--import java.util.HashSet;
-+
-+import sun.security.jca.JCAUtil;
-
- // Some of this code began life as part of sun.javaos.net.DnsClient
- // originally by sritchie@eng 1/96. It was first hacked up for JNDI
-@@ -77,6 +78,8 @@
- };
-
- private static final int DEFAULT_PORT = 53;
-+ private static final int TRANSACTION_ID_BOUND = 0x10000;
-+ private static final SecureRandom random = JCAUtil.getSecureRandom();
- private InetAddress[] servers;
- private int[] serverPorts;
- private int timeout; // initial timeout on UDP queries in ms
-@@ -85,7 +88,7 @@
- private DatagramSocket udpSocket;
-
- // Requests sent
-- private Set<Integer> reqs;
-+ private Map<Integer, ResourceRecord> reqs;
-
- // Responses received
- private Map<Integer, byte[]> resps;
-@@ -134,7 +137,8 @@
- throw ne;
- }
- }
-- reqs = Collections.synchronizedSet(new HashSet<Integer>());
-+ reqs = Collections.synchronizedMap(
-+ new HashMap<Integer, ResourceRecord>());
- resps = Collections.synchronizedMap(new HashMap<Integer, byte[]>());
- }
-
-@@ -153,10 +157,6 @@
- }
- }
-
--
-- private int ident = 0; // used to set the msg ID field
-- private Object identLock = new Object();
--
- /*
- * If recursion is true, recursion is requested on the query.
- * If auth is true, only authoritative responses are accepted; other
-@@ -167,15 +167,22 @@
- throws NamingException {
-
- int xid;
-- synchronized (identLock) {
-- ident = 0xFFFF & (ident + 1);
-- xid = ident;
-- }
-+ Packet pkt;
-+ ResourceRecord collision;
-
-- // enqueue the outstanding request
-- reqs.add(xid);
-+ do {
-+ // Generate a random transaction ID
-+ xid = random.nextInt(TRANSACTION_ID_BOUND);
-+ pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
-
-- Packet pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
-+ // enqueue the outstanding request
-+ synchronized (reqs) {
-+ if ((collision = reqs.put(xid, new ResourceRecord(pkt.getData(),
-+ pkt.length(), Header.HEADER_SIZE, true, false))) != null) {
-+ reqs.put(xid, collision); // revert
-+ }
-+ }
-+ } while (collision != null);
-
- Exception caughtException = null;
- boolean[] doNotRetry = new boolean[servers.length];
-@@ -305,11 +312,8 @@
- ResourceRecords queryZone(DnsName zone, int qclass, boolean recursion)
- throws NamingException {
-
-- int xid;
-- synchronized (identLock) {
-- ident = 0xFFFF & (ident + 1);
-- xid = ident;
-- }
-+ int xid = random.nextInt(TRANSACTION_ID_BOUND);
-+
- Packet pkt = makeQueryPacket(zone, xid, qclass,
- ResourceRecord.QTYPE_AXFR, recursion);
- Exception caughtException = null;
-@@ -390,6 +394,7 @@
- DatagramPacket opkt = new DatagramPacket(
- pkt.getData(), pkt.length(), server, port);
- DatagramPacket ipkt = new DatagramPacket(new byte[8000], 8000);
-+ // Packets may only be sent to or received from this server address
- udpSocket.connect(server, port);
- int pktTimeout = (timeout * (1 << retry));
- try {
-@@ -524,7 +529,7 @@
- "\tResponse Q:" + resps);
- }
- byte[] pkt;
-- if ((pkt = (byte[]) resps.get(xid)) != null) {
-+ if ((pkt = resps.get(xid)) != null) {
- checkResponseCode(new Header(pkt, pkt.length));
- synchronized (queuesLock) {
- resps.remove(xid);
-@@ -543,6 +548,9 @@
- * Checks the header of an incoming DNS response.
- * Returns true if it matches the given xid and throws a naming
- * exception, if appropriate, based on the response code.
-+ *
-+ * Also checks that the domain name, type and class in the response
-+ * match those in the original query.
- */
- private boolean isMatchResponse(byte[] pkt, int xid)
- throws NamingException {
-@@ -552,7 +560,7 @@
- throw new CommunicationException("DNS error: expecting response");
- }
-
-- if (!reqs.contains(xid)) { // already received, ignore the response
-+ if (!reqs.containsKey(xid)) { // already received, ignore the response
- return false;
- }
-
-@@ -561,14 +569,47 @@
- if (debug) {
- dprint("XID MATCH:" + xid);
- }
-+ checkResponseCode(hdr);
-+ if (!hdr.query && hdr.numQuestions == 1) {
-
-- checkResponseCode(hdr);
-- // remove the response for the xid if received by some other thread.
-- synchronized (queuesLock) {
-- resps.remove(xid);
-- reqs.remove(xid);
-+ ResourceRecord rr = new ResourceRecord(pkt, pkt.length,
-+ Header.HEADER_SIZE, true, false);
-+
-+ // Retrieve the original query
-+ ResourceRecord query = reqs.get(xid);
-+ int qtype = query.getType();
-+ int qclass = query.getRrclass();
-+ DnsName qname = query.getName();
-+
-+ // Check that the type/class/name in the query section of the
-+ // response match those in the original query
-+ if ((qtype == ResourceRecord.QTYPE_STAR ||
-+ qtype == rr.getType()) &&
-+ (qclass == ResourceRecord.QCLASS_STAR ||
-+ qclass == rr.getRrclass()) &&
-+ qname.equals(rr.getName())) {
-+
-+ if (debug) {
-+ dprint("MATCH NAME:" + qname + " QTYPE:" + qtype +
-+ " QCLASS:" + qclass);
-+ }
-+
-+ // Remove the response for the xid if received by some other
-+ // thread.
-+ synchronized (queuesLock) {
-+ resps.remove(xid);
-+ reqs.remove(xid);
-+ }
-+ return true;
-+
-+ } else {
-+ if (debug) {
-+ dprint("NO-MATCH NAME:" + qname + " QTYPE:" + qtype +
-+ " QCLASS:" + qclass);
-+ }
-+ }
- }
-- return true;
-+ return false;
- }
-
- //
-@@ -577,7 +618,7 @@
- // enqueue only the first response, responses for retries are ignored.
- //
- synchronized (queuesLock) {
-- if (reqs.contains(hdr.xid)) { // enqueue only the first response
-+ if (reqs.containsKey(hdr.xid)) { // enqueue only the first response
- resps.put(hdr.xid, pkt);
- }
- }
---- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -25,6 +25,10 @@
-
- package com.sun.jndi.ldap;
-
-+import java.security.AccessControlContext;
-+import java.security.AccessController;
-+import java.security.PrivilegedActionException;
-+import java.security.PrivilegedExceptionAction;
- import java.util.Vector;
- import javax.naming.*;
- import javax.naming.directory.*;
-@@ -34,6 +38,8 @@
-
- final class LdapBindingEnumeration extends LdapNamingEnumeration {
-
-+ private final AccessControlContext acc = AccessController.getContext();
-+
- LdapBindingEnumeration(LdapCtx homeCtx, LdapResult answer, Name remain,
- Continuation cont) throws NamingException
- {
-@@ -41,7 +47,7 @@
- }
-
- protected NameClassPair
-- createItem(String dn, Attributes attrs, Vector respCtls)
-+ createItem(String dn, final Attributes attrs, Vector respCtls)
- throws NamingException {
-
- Object obj = null;
-@@ -49,7 +55,16 @@
-
- if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
- // serialized object or object reference
-- obj = Obj.decodeObject(attrs);
-+ try {
-+ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
-+ @Override
-+ public Object run() throws NamingException {
-+ return Obj.decodeObject(attrs);
-+ }
-+ }, acc);
-+ } catch (PrivilegedActionException e) {
-+ throw (NamingException)e.getException();
-+ }
- }
- if (obj == null) {
- // DirContext object
---- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -25,6 +25,10 @@
-
- package com.sun.jndi.ldap;
-
-+import java.security.AccessControlContext;
-+import java.security.AccessController;
-+import java.security.PrivilegedActionException;
-+import java.security.PrivilegedExceptionAction;
- import java.util.Vector;
- import javax.naming.*;
- import javax.naming.directory.*;
-@@ -39,6 +43,8 @@
- private Name startName; // prefix of names of search results
- private LdapCtx.SearchArgs searchArgs = null;
-
-+ private final AccessControlContext acc = AccessController.getContext();
-+
- LdapSearchEnumeration(LdapCtx homeCtx, LdapResult search_results,
- String starter, LdapCtx.SearchArgs args, Continuation cont)
- throws NamingException {
-@@ -53,7 +59,7 @@
- }
-
- protected NameClassPair
-- createItem(String dn, Attributes attrs, Vector respCtls)
-+ createItem(String dn, final Attributes attrs, Vector respCtls)
- throws NamingException {
-
- Object obj = null;
-@@ -110,8 +116,16 @@
- if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
- // Entry contains Java-object attributes (ser/ref object)
- // serialized object or object reference
-- obj = Obj.decodeObject(attrs);
--
-+ try {
-+ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
-+ @Override
-+ public Object run() throws NamingException {
-+ return Obj.decodeObject(attrs);
-+ }
-+ }, acc);
-+ } catch (PrivilegedActionException e) {
-+ throw (NamingException)e.getException();
-+ }
- }
- if (obj == null) {
- obj = new LdapCtx(homeCtx, dn);
---- ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Tue Mar 18 12:35:25 2014 -0700
-@@ -25,27 +25,33 @@
-
- package com.sun.media.sound;
-
-+import java.util.ArrayList;
- import java.util.Collections;
--import java.util.HashMap;
- import java.util.List;
--import java.util.Map;
- import java.util.Properties;
-
- import javax.sound.midi.Receiver;
- import javax.sound.midi.Sequencer;
- import javax.sound.midi.Synthesizer;
- import javax.sound.midi.Transmitter;
-+import javax.sound.midi.spi.MidiDeviceProvider;
-+import javax.sound.midi.spi.MidiFileReader;
-+import javax.sound.midi.spi.MidiFileWriter;
-+import javax.sound.midi.spi.SoundbankReader;
- import javax.sound.sampled.Clip;
- import javax.sound.sampled.Port;
- import javax.sound.sampled.SourceDataLine;
- import javax.sound.sampled.TargetDataLine;
-+import javax.sound.sampled.spi.AudioFileReader;
-+import javax.sound.sampled.spi.AudioFileWriter;
-+import javax.sound.sampled.spi.FormatConversionProvider;
-+import javax.sound.sampled.spi.MixerProvider;
-
-
- /**
-- * JDK13Services uses the Service class in JDK 1.3
-- * to discover a list of service providers installed
-- * in the system.
-- *
-+ * JDK13Services uses the Service class in JDK 1.3 to discover a list of service
-+ * providers installed in the system.
-+ * <p>
- * This class is public because it is called from javax.sound.midi.MidiSystem
- * and javax.sound.sampled.AudioSystem. The alternative would be to make
- * JSSecurityManager public, which is considered worse.
-@@ -54,80 +60,55 @@
- */
- public final class JDK13Services {
-
-- /** The default for the length of the period to hold the cache.
-- This value is given in milliseconds. It is equivalent to
-- 1 minute.
-- */
-- private static final long DEFAULT_CACHING_PERIOD = 60000;
--
-- /** Filename of the properties file for default provider properties.
-- This file is searched in the subdirectory "lib" of the JRE directory
-- (this behaviour is hardcoded).
-- */
-+ /**
-+ * Filename of the properties file for default provider properties. This
-+ * file is searched in the subdirectory "lib" of the JRE directory (this
-+ * behaviour is hardcoded).
-+ */
- private static final String PROPERTIES_FILENAME = "sound.properties";
-
-- /** Cache for the providers.
-- Class objects of the provider type (MixerProvider, MidiDeviceProvider
-- ...) are used as keys. The values are instances of ProviderCache.
-- */
-- private static final Map providersCacheMap = new HashMap();
--
--
-- /** The length of the period to hold the cache.
-- This value is given in milliseconds.
-- */
-- private static long cachingPeriod = DEFAULT_CACHING_PERIOD;
--
-- /** Properties loaded from the properties file for default provider
-- properties.
-- */
-+ /**
-+ * Properties loaded from the properties file for default provider
-+ * properties.
-+ */
- private static Properties properties;
-
--
-- /** Private, no-args constructor to ensure against instantiation.
-+ /**
-+ * Private, no-args constructor to ensure against instantiation.
- */
- private JDK13Services() {
- }
-
--
-- /** Set the period provider lists are cached.
-- This method is only intended for testing.
-+ /**
-+ * Obtains a List containing installed instances of the providers for the
-+ * requested service. The returned List is immutable.
-+ *
-+ * @param serviceClass The type of providers requested. This should be one
-+ * of AudioFileReader.class, AudioFileWriter.class,
-+ * FormatConversionProvider.class, MixerProvider.class,
-+ * MidiDeviceProvider.class, MidiFileReader.class,
-+ * MidiFileWriter.class or SoundbankReader.class.
-+ *
-+ * @return A List of providers of the requested type. This List is
-+ * immutable.
- */
-- public static void setCachingPeriod(int seconds) {
-- cachingPeriod = seconds * 1000L;
-+ public static List<?> getProviders(final Class<?> serviceClass) {
-+ final List<?> providers;
-+ if (!MixerProvider.class.equals(serviceClass)
-+ && !FormatConversionProvider.class.equals(serviceClass)
-+ && !AudioFileReader.class.equals(serviceClass)
-+ && !AudioFileWriter.class.equals(serviceClass)
-+ && !MidiDeviceProvider.class.equals(serviceClass)
-+ && !SoundbankReader.class.equals(serviceClass)
-+ && !MidiFileWriter.class.equals(serviceClass)
-+ && !MidiFileReader.class.equals(serviceClass)) {
-+ providers = new ArrayList<>(0);
-+ } else {
-+ providers = JSSecurityManager.getProviders(serviceClass);
-+ }
-+ return Collections.unmodifiableList(providers);
- }
-
--
-- /** Obtains a List containing installed instances of the
-- providers for the requested service.
-- The List of providers is cached for the period of time given by
-- {@link #cachingPeriod cachingPeriod}. During this period, the same
-- List instance is returned for the same type of provider. After this
-- period, a new instance is constructed and returned. The returned
-- List is immutable.
-- @param serviceClass The type of providers requested. This should be one
-- of AudioFileReader.class, AudioFileWriter.class,
-- FormatConversionProvider.class, MixerProvider.class,
-- MidiDeviceProvider.class, MidiFileReader.class, MidiFileWriter.class or
-- SoundbankReader.class.
-- @return A List of providers of the requested type. This List is
-- immutable.
-- */
-- public static synchronized List getProviders(Class serviceClass) {
-- ProviderCache cache = (ProviderCache) providersCacheMap.get(serviceClass);
-- if (cache == null) {
-- cache = new ProviderCache();
-- providersCacheMap.put(serviceClass, cache);
-- }
-- if (cache.providers == null ||
-- System.currentTimeMillis() > cache.lastUpdate + cachingPeriod) {
-- cache.providers = Collections.unmodifiableList(JSSecurityManager.getProviders(serviceClass));
-- cache.lastUpdate = System.currentTimeMillis();
-- }
-- return cache.providers;
-- }
--
--
- /** Obtain the provider class name part of a default provider property.
- @param typeClass The type of the default provider property. This
- should be one of Receiver.class, Transmitter.class, Sequencer.class,
-@@ -219,14 +200,4 @@
- }
- return properties;
- }
--
-- // INNER CLASSES
--
-- private static class ProviderCache {
-- // System time of the last update in milliseconds.
-- public long lastUpdate;
--
-- // The providers.
-- public List providers;
-- }
- }
---- ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -187,7 +187,7 @@
- return thread;
- }
-
-- static List getProviders(final Class providerClass) {
-+ static synchronized List getProviders(final Class providerClass) {
- List p = new ArrayList();
- // Service.providers(Class) just creates "lazy" iterator instance,
- // so it doesn't require do be called from privileged section
---- ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -69,6 +69,14 @@
- private static final String JRELIB_PROPERTY_FILE_NAME = "jndi.properties";
-
- /*
-+ * Internal environment property, that when set to "true", disables
-+ * application resource files lookup to prevent recursion issues
-+ * when validating signed JARs.
-+ */
-+ private static final String DISABLE_APP_RESOURCE_FILES =
-+ "com.sun.naming.disable.app.resource.files";
-+
-+ /*
- * The standard JNDI properties that specify colon-separated lists.
- */
- private static final String[] listProperties = {
-@@ -218,6 +226,13 @@
- }
- }
-
-+ // Return without merging if application resource files lookup
-+ // is disabled.
-+ String disableAppRes = (String)env.get(DISABLE_APP_RESOURCE_FILES);
-+ if (disableAppRes != null && disableAppRes.equalsIgnoreCase("true")) {
-+ return env;
-+ }
-+
- // Merge the above with the values read from all application
- // resource files. Colon-separated lists are concatenated.
- mergeTables(env, getApplicationResources());
---- ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -37,6 +37,7 @@
- import javax.sql.rowset.serial.*;
- import com.sun.rowset.internal.*;
- import com.sun.rowset.providers.*;
-+import sun.reflect.misc.ReflectUtil;
-
- /**
- * The standard implementation of the <code>CachedRowSet</code> interface.
-@@ -2963,13 +2964,9 @@
- // create new instance of the class
- SQLData obj = null;
- try {
-- obj = (SQLData)c.newInstance();
-- } catch (java.lang.InstantiationException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-- } catch (java.lang.IllegalAccessException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-+ obj = (SQLData) ReflectUtil.newInstance(c);
-+ } catch(Exception ex) {
-+ throw new SQLException("Unable to Instantiate: ", ex);
- }
- // get the attributes from the struct
- Object attribs[] = s.getAttributes(map);
-@@ -5714,13 +5711,9 @@
- // create new instance of the class
- SQLData obj = null;
- try {
-- obj = (SQLData)c.newInstance();
-- } catch (java.lang.InstantiationException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-- } catch (java.lang.IllegalAccessException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-+ obj = (SQLData) ReflectUtil.newInstance(c);
-+ } catch(Exception ex) {
-+ throw new SQLException("Unable to Instantiate: ", ex);
- }
- // get the attributes from the struct
- Object attribs[] = s.getAttributes(map);
---- ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -39,6 +39,7 @@
- import javax.sql.rowset.serial.SerialClob;
- import javax.sql.rowset.serial.SerialStruct;
- import javax.sql.rowset.spi.*;
-+import sun.reflect.misc.ReflectUtil;
-
-
- /**
-@@ -578,13 +579,9 @@
- // create new instance of the class
- SQLData obj = null;
- try {
-- obj = (SQLData)c.newInstance();
-- } catch (java.lang.InstantiationException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-- } catch (java.lang.IllegalAccessException ex) {
-- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
-- ex.getMessage()));
-+ obj = (SQLData)ReflectUtil.newInstance(c);
-+ } catch (Exception ex) {
-+ throw new SQLException("Unable to Instantiate: ", ex);
- }
- // get the attributes from the struct
- Object attribs[] = s.getAttributes(map);
---- ./jdk/src/share/classes/java/awt/EventQueue.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/awt/EventQueue.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -1043,11 +1043,11 @@
- t.setContextClassLoader(classLoader);
- t.setPriority(Thread.NORM_PRIORITY + 1);
- t.setDaemon(false);
-+ AWTAutoShutdown.getInstance().notifyThreadBusy(t);
- return t;
- }
- }
- );
-- AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
- dispatchThread.start();
- }
- } finally {
-@@ -1139,6 +1139,10 @@
- if (entry.event instanceof SentEvent) {
- ((SentEvent)entry.event).dispose();
- }
-+ if (entry.event instanceof InvocationEvent) {
-+ AWTAccessor.getInvocationEventAccessor()
-+ .dispose((InvocationEvent)entry.event);
-+ }
- if (prev == null) {
- queues[i].head = entry.next;
- } else {
---- ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Tue Mar 18 12:35:25 2014 -0700
-@@ -45,8 +45,8 @@
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
--import java.util.WeakHashMap;
-
-+import sun.awt.AppContext;
- import sun.awt.datatransfer.DataTransferer;
-
- /**
-@@ -72,10 +72,7 @@
- */
- private static String JavaMIME = "JAVA_DATAFLAVOR:";
-
-- /**
-- * System singleton which maps a thread's ClassLoader to a SystemFlavorMap.
-- */
-- private static final WeakHashMap flavorMaps = new WeakHashMap();
-+ private static final Object FLAVOR_MAP_KEY = new Object();
-
- /**
- * Copied from java.util.Properties.
-@@ -184,22 +181,12 @@
- * Returns the default FlavorMap for this thread's ClassLoader.
- */
- public static FlavorMap getDefaultFlavorMap() {
-- ClassLoader contextClassLoader =
-- Thread.currentThread().getContextClassLoader();
-- if (contextClassLoader == null) {
-- contextClassLoader = ClassLoader.getSystemClassLoader();
-+ AppContext context = AppContext.getAppContext();
-+ FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY);
-+ if (fm == null) {
-+ fm = new SystemFlavorMap();
-+ context.put(FLAVOR_MAP_KEY, fm);
- }
--
-- FlavorMap fm;
--
-- synchronized(flavorMaps) {
-- fm = (FlavorMap)flavorMaps.get(contextClassLoader);
-- if (fm == null) {
-- fm = new SystemFlavorMap();
-- flavorMaps.put(contextClassLoader, fm);
-- }
-- }
--
- return fm;
- }
-
-@@ -240,26 +227,11 @@
- }
- });
-
-- BufferedReader flavormapURL =
-+ String url =
- java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction<BufferedReader>() {
-- public BufferedReader run() {
-- String url = Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
--
-- if (url == null) {
-- return null;
-- }
--
-- try {
-- return new BufferedReader
-- (new InputStreamReader
-- (new URL(url).openStream(), "ISO-8859-1"));
-- } catch (MalformedURLException e) {
-- System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
-- } catch (IOException e) {
-- System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
-- }
-- return null;
-+ new java.security.PrivilegedAction<String>() {
-+ public String run() {
-+ return Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
- }
- });
-
-@@ -271,6 +243,19 @@
- }
- }
-
-+ BufferedReader flavormapURL = null;
-+ if (url != null) {
-+ try {
-+ flavormapURL = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "ISO-8859-1"));
-+ } catch (MalformedURLException e) {
-+ System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
-+ } catch (IOException e) {
-+ System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
-+ } catch (SecurityException e) {
-+ // ignored
-+ }
-+ }
-+
- if (flavormapURL != null) {
- try {
- parseAndStoreReader(flavormapURL);
---- ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Tue Mar 18 12:35:25 2014 -0700
-@@ -25,6 +25,8 @@
-
- package java.awt.event;
-
-+import sun.awt.AWTAccessor;
-+
- import java.awt.ActiveEvent;
- import java.awt.AWTEvent;
-
-@@ -56,6 +58,20 @@
- */
- public class InvocationEvent extends AWTEvent implements ActiveEvent {
-
-+ static {
-+ AWTAccessor.setInvocationEventAccessor(new AWTAccessor.InvocationEventAccessor() {
-+ @Override
-+ public void dispose(InvocationEvent invocationEvent) {
-+ invocationEvent.finishedDispatching(false);
-+ }
-+ @Override
-+ public InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
-+ boolean catchThrowables) {
-+ return new InvocationEvent(source, runnable, listener, catchThrowables);
-+ }
-+ });
-+ }
-+
- /**
- * Marks the first integer id for the range of invocation event ids.
- */
-@@ -85,6 +101,14 @@
- protected Object notifier;
-
- /**
-+ * The (potentially null) Runnable whose run() method will be called
-+ * immediately after the event was dispatched or disposed.
-+ *
-+ * @see #isDispatched
-+ */
-+ private final Runnable listener;
-+
-+ /**
- * Indicates whether the <code>run()</code> method of the <code>runnable</code>
- * was executed or not.
- *
-@@ -147,7 +171,7 @@
- * @see #InvocationEvent(Object, Runnable, Object, boolean)
- */
- public InvocationEvent(Object source, Runnable runnable) {
-- this(source, runnable, null, false);
-+ this(source, INVOCATION_DEFAULT, runnable, null, null, false);
- }
-
- /**
-@@ -185,7 +209,39 @@
- */
- public InvocationEvent(Object source, Runnable runnable, Object notifier,
- boolean catchThrowables) {
-- this(source, INVOCATION_DEFAULT, runnable, notifier, catchThrowables);
-+ this(source, INVOCATION_DEFAULT, runnable, notifier, null, catchThrowables);
-+ }
-+
-+ /**
-+ * Constructs an <code>InvocationEvent</code> with the specified
-+ * source which will execute the runnable's <code>run</code>
-+ * method when dispatched. If listener is non-<code>null</code>,
-+ * <code>listener.run()</code> will be called immediately after
-+ * <code>run</code> has returned, thrown an exception or the event
-+ * was disposed.
-+ * <p>This method throws an <code>IllegalArgumentException</code>
-+ * if <code>source</code> is <code>null</code>.
-+ *
-+ * @param source The <code>Object</code> that originated
-+ * the event
-+ * @param runnable The <code>Runnable</code> whose
-+ * <code>run</code> method will be
-+ * executed
-+ * @param listener The <code>Runnable</code>Runnable whose
-+ * <code>run()</code> method will be called
-+ * after the {@code InvocationEvent}
-+ * was dispatched or disposed
-+ * @param catchThrowables Specifies whether <code>dispatch</code>
-+ * should catch Throwable when executing
-+ * the <code>Runnable</code>'s <code>run</code>
-+ * method, or should instead propagate those
-+ * Throwables to the EventDispatchThread's
-+ * dispatch loop
-+ * @throws IllegalArgumentException if <code>source</code> is null
-+ */
-+ private InvocationEvent(Object source, Runnable runnable, Runnable listener,
-+ boolean catchThrowables) {
-+ this(source, INVOCATION_DEFAULT, runnable, null, listener, catchThrowables);
- }
-
- /**
-@@ -221,13 +277,18 @@
- */
- protected InvocationEvent(Object source, int id, Runnable runnable,
- Object notifier, boolean catchThrowables) {
-+ this(source, id, runnable, notifier, null, catchThrowables);
-+ }
-+
-+ private InvocationEvent(Object source, int id, Runnable runnable,
-+ Object notifier, Runnable listener, boolean catchThrowables) {
- super(source, id);
- this.runnable = runnable;
- this.notifier = notifier;
-+ this.listener = listener;
- this.catchExceptions = catchThrowables;
- this.when = System.currentTimeMillis();
- }
--
- /**
- * Executes the Runnable's <code>run()</code> method and notifies the
- * notifier (if any) when <code>run()</code> has returned or thrown an exception.
-@@ -251,13 +312,7 @@
- runnable.run();
- }
- } finally {
-- dispatched = true;
--
-- if (notifier != null) {
-- synchronized (notifier) {
-- notifier.notifyAll();
-- }
-- }
-+ finishedDispatching(true);
- }
- }
-
-@@ -331,6 +386,25 @@
- }
-
- /**
-+ * Called when the event was dispatched or disposed
-+ * @param dispatched true if the event was dispatched
-+ * false if the event was disposed
-+ */
-+ private void finishedDispatching(boolean dispatched) {
-+ this.dispatched = dispatched;
-+
-+ if (notifier != null) {
-+ synchronized (notifier) {
-+ notifier.notifyAll();
-+ }
-+ }
-+
-+ if (listener != null) {
-+ listener.run();
-+ }
-+ }
-+
-+ /**
- * Returns a parameter string identifying this event.
- * This method is useful for event-logging and for debugging.
- *
---- ./jdk/src/share/classes/java/lang/Thread.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/lang/Thread.java Tue Mar 18 12:35:25 2014 -0700
-@@ -366,6 +366,8 @@
- throw new NullPointerException("name cannot be null");
- }
-
-+ this.name = name.toCharArray();
-+
- Thread parent = currentThread();
- SecurityManager security = System.getSecurityManager();
- if (g == null) {
-@@ -402,7 +404,6 @@
- this.group = g;
- this.daemon = parent.isDaemon();
- this.priority = parent.getPriority();
-- this.name = name.toCharArray();
- if (security == null || isCCLOverridden(parent.getClass()))
- this.contextClassLoader = parent.getContextClassLoader();
- else
---- ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Tue Mar 18 12:35:25 2014 -0700
-@@ -140,7 +140,7 @@
- * Return the {@link SpeciesData} instance representing this BMH species. All subclasses must provide a
- * static field containing this value, and they must accordingly implement this method.
- */
-- protected abstract SpeciesData speciesData();
-+ /*non-public*/ abstract SpeciesData speciesData();
-
- @Override
- final Object internalProperties() {
-@@ -156,7 +156,7 @@
- return Arrays.asList(boundValues);
- }
-
-- public final Object arg(int i) {
-+ /*non-public*/ final Object arg(int i) {
- try {
- switch (speciesData().fieldType(i)) {
- case 'L': return argL(i);
-@@ -170,22 +170,22 @@
- }
- throw new InternalError("unexpected type: " + speciesData().types+"."+i);
- }
-- public final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
-- public final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
-- public final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
-- public final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
-- public final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
-+ /*non-public*/ final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
-+ /*non-public*/ final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
-+ /*non-public*/ final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
-+ /*non-public*/ final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
-+ /*non-public*/ final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
-
- //
- // cloning API
- //
-
-- public abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
-- public abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
-- public abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
-- public abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
-- public abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
-- public abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
-+ /*non-public*/ abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
-
- // The following is a grossly irregular hack:
- @Override MethodHandle reinvokerTarget() {
-@@ -203,39 +203,39 @@
- private // make it private to force users to access the enclosing class first
- static final class Species_L extends BoundMethodHandle {
- final Object argL0;
-- public Species_L(MethodType mt, LambdaForm lf, Object argL0) {
-+ /*non-public*/ Species_L(MethodType mt, LambdaForm lf, Object argL0) {
- super(mt, lf);
- this.argL0 = argL0;
- }
- // The following is a grossly irregular hack:
- @Override MethodHandle reinvokerTarget() { return (MethodHandle) argL0; }
- @Override
-- public SpeciesData speciesData() {
-+ /*non-public*/ SpeciesData speciesData() {
- return SPECIES_DATA;
- }
-- public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
-+ /*non-public*/ static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
- @Override
-- public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
- return new Species_L(mt, lf, argL0);
- }
- @Override
-- public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
- return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, narg);
- }
- @Override
-- public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
- return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, narg);
- }
- @Override
-- public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
- return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, narg);
- }
- @Override
-- public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
- return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, narg);
- }
- @Override
-- public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
-+ /*non-public*/ final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
- return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, narg);
- }
- }
-@@ -338,10 +338,10 @@
- final MethodHandle[] getters;
- final SpeciesData[] extensions;
-
-- public int fieldCount() {
-+ /*non-public*/ int fieldCount() {
- return types.length();
- }
-- public char fieldType(int i) {
-+ /*non-public*/ char fieldType(int i) {
- return types.charAt(i);
- }
-
-@@ -546,30 +546,30 @@
- * final Object argL0;
- * final Object argL1;
- * final int argI2;
-- * public Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
-+ * Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
- * super(mt, lf);
- * this.argL0 = argL0;
- * this.argL1 = argL1;
- * this.argI2 = argI2;
- * }
-- * public final SpeciesData speciesData() { return SPECIES_DATA; }
-- * public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
-- * public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
-+ * final SpeciesData speciesData() { return SPECIES_DATA; }
-+ * static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
-+ * final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
- * return SPECIES_DATA.constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2);
- * }
-- * public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
-+ * final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
- * return SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
- * }
-- * public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
-+ * final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
- * return SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
- * }
-- * public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
-+ * final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
- * return SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
- * }
-- * public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
-+ * final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
- * return SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
- * }
-- * public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
-+ * final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
- * return SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
- * }
- * }
-@@ -583,11 +583,12 @@
-
- final String className = SPECIES_PREFIX_PATH + types;
- final String sourceFile = SPECIES_PREFIX_NAME + types;
-- cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
-+ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
-+ cw.visit(V1_6, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
- cw.visitSource(sourceFile, null);
-
- // emit static types and SPECIES_DATA fields
-- cw.visitField(ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
-+ cw.visitField(NOT_ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
-
- // emit bound argument fields
- for (int i = 0; i < types.length(); ++i) {
-@@ -600,7 +601,7 @@
- MethodVisitor mv;
-
- // emit constructor
-- mv = cw.visitMethod(ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(ALOAD, 1);
-@@ -624,7 +625,7 @@
- mv.visitEnd();
-
- // emit implementation of reinvokerTarget()
-- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, className, "argL0", JLO_SIG);
-@@ -634,7 +635,7 @@
- mv.visitEnd();
-
- // emit implementation of speciesData()
-- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
- mv.visitCode();
- mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG);
- mv.visitInsn(ARETURN);
-@@ -642,7 +643,7 @@
- mv.visitEnd();
-
- // emit clone()
-- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
- mv.visitCode();
- // return speciesData().constructor[0].invokeBasic(mt, lf, argL0, ...)
- // obtain constructor
-@@ -665,7 +666,7 @@
- // for each type, emit cloneExtendT()
- for (Class<?> c : TYPES) {
- char t = Wrapper.basicTypeChar(c);
-- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
- mv.visitCode();
- // return SPECIES_DATA.extendWithIndex(extensionIndex(t)).constructor[0].invokeBasic(mt, lf, argL0, ..., narg)
- // obtain constructor
-@@ -692,7 +693,7 @@
- }
-
- // emit class initializer
-- mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
-+ mv = cw.visitMethod(NOT_ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
- mv.visitCode();
- mv.visitLdcInsn(types);
- mv.visitLdcInsn(Type.getObjectType(className));
---- ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Tue Mar 18 12:35:25 2014 -0700
-@@ -289,8 +289,9 @@
- * Set up class file generation.
- */
- private void classFilePrologue() {
-+ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
- cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
-- cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
-+ cw.visit(Opcodes.V1_6, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
- cw.visitSource(sourceFile, null);
-
- String invokerDesc = invokerType.toMethodDescriptorString();
---- ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1616,6 +1616,7 @@
- */
- public static
- MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) {
-+ reorder = reorder.clone();
- checkReorder(reorder, newType, target.type());
- return target.permuteArguments(newType, reorder);
- }
-@@ -1810,6 +1811,7 @@
- throw newIllegalArgumentException("no argument type to remove");
- ArrayList<Class<?>> ptypes = new ArrayList<>(oldType.parameterList());
- ptypes.addAll(pos, valueTypes);
-+ if (ptypes.size() != inargs) throw newIllegalArgumentException("valueTypes");
- MethodType newType = MethodType.methodType(oldType.returnType(), ptypes);
- return target.dropArguments(newType, pos, dropped);
- }
---- ./jdk/src/share/classes/java/util/ServiceLoader.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/util/ServiceLoader.java Tue Mar 18 12:35:25 2014 -0700
-@@ -375,7 +375,7 @@
- return p;
- } catch (Throwable x) {
- fail(service,
-- "Provider " + cn + " could not be instantiated: " + x,
-+ "Provider " + cn + " could not be instantiated",
- x);
- }
- throw new Error(); // This cannot happen
---- ./jdk/src/share/classes/java/util/jar/JarVerifier.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/util/jar/JarVerifier.java Tue Mar 18 12:35:25 2014 -0700
-@@ -677,6 +677,8 @@
- } else {
- matchUnsigned = true;
- }
-+ } else {
-+ matchUnsigned = true;
- }
- }
-
-@@ -779,23 +781,7 @@
-
- // true if file is part of the signature mechanism itself
- static boolean isSigningRelated(String name) {
-- name = name.toUpperCase(Locale.ENGLISH);
-- if (!name.startsWith("META-INF/")) {
-- return false;
-- }
-- name = name.substring(9);
-- if (name.indexOf('/') != -1) {
-- return false;
-- }
-- if (name.endsWith(".DSA")
-- || name.endsWith(".RSA")
-- || name.endsWith(".SF")
-- || name.endsWith(".EC")
-- || name.startsWith("SIG-")
-- || name.equals("MANIFEST.MF")) {
-- return true;
-- }
-- return false;
-+ return SignatureFileVerifier.isSigningRelated(name);
- }
-
- private Enumeration<String> unsignedEntryNames(JarFile jar) {
---- ./jdk/src/share/classes/java/util/logging/LogManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/util/logging/LogManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -363,6 +363,9 @@
- changes.removePropertyChangeListener(l);
- }
-
-+ // LoggerContext maps from AppContext
-+ private static WeakHashMap<Object, LoggerContext> contextsMap = null;
-+
- // Returns the LoggerContext for the user code (i.e. application or AppContext).
- // Loggers are isolated from each AppContext.
- private LoggerContext getUserContext() {
-@@ -371,33 +374,28 @@
- SecurityManager sm = System.getSecurityManager();
- JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess();
- if (sm != null && javaAwtAccess != null) {
-+ // for each applet, it has its own LoggerContext isolated from others
- synchronized (javaAwtAccess) {
-- // AppContext.getAppContext() returns the system AppContext if called
-- // from a system thread but Logger.getLogger might be called from
-- // an applet code. Instead, find the AppContext of the applet code
-- // from the execution stack.
-- Object ecx = javaAwtAccess.getExecutionContext();
-- if (ecx == null) {
-- // fall back to thread group seach of AppContext
-- ecx = javaAwtAccess.getContext();
-- }
-+ // find the AppContext of the applet code
-+ // will be null if we are in the main app context.
-+ final Object ecx = javaAwtAccess.getAppletContext();
- if (ecx != null) {
-- context = (LoggerContext)javaAwtAccess.get(ecx, LoggerContext.class);
-+ if (contextsMap == null) {
-+ contextsMap = new WeakHashMap<>();
-+ }
-+ context = contextsMap.get(ecx);
- if (context == null) {
-- if (javaAwtAccess.isMainAppContext()) {
-- context = userContext;
-- } else {
-- // Create a new LoggerContext for the applet.
-- // The new logger context has its requiresDefaultLoggers
-- // flag set to true - so that these loggers will be
-- // lazily added when the context is firt accessed.
-- context = new LoggerContext(true);
-- }
-- javaAwtAccess.put(ecx, LoggerContext.class, context);
-+ // Create a new LoggerContext for the applet.
-+ // The new logger context has its requiresDefaultLoggers
-+ // flag set to true - so that these loggers will be
-+ // lazily added when the context is firt accessed.
-+ context = new LoggerContext(true);
-+ contextsMap.put(ecx, context);
- }
- }
- }
- }
-+ // for standalone app, return userContext
- return context != null ? context : userContext;
- }
-
-@@ -424,7 +422,7 @@
- Logger result = getLogger(name);
- if (result == null) {
- // only allocate the new logger once
-- Logger newLogger = new Logger(name, resourceBundleName, caller);
-+ Logger newLogger = new Logger(name, resourceBundleName, caller, false);
- do {
- if (addLogger(newLogger)) {
- // We successfully added the new Logger that we
-@@ -471,12 +469,12 @@
- } while (logger == null);
-
- // LogManager will set the sysLogger's handlers via LogManager.addLogger method.
-- if (logger != sysLogger && sysLogger.getHandlers().length == 0) {
-+ if (logger != sysLogger && sysLogger.accessCheckedHandlers().length == 0) {
- // if logger already exists but handlers not set
- final Logger l = logger;
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
-- for (Handler hdl : l.getHandlers()) {
-+ for (Handler hdl : l.accessCheckedHandlers()) {
- sysLogger.addHandler(hdl);
- }
- return null;
-@@ -760,7 +758,7 @@
- Logger result = findLogger(name);
- if (result == null) {
- // only allocate the new system logger once
-- Logger newLogger = new Logger(name, resourceBundleName);
-+ Logger newLogger = new Logger(name, resourceBundleName, null, true);
- do {
- if (addLocalLogger(newLogger)) {
- // We successfully added the new Logger that we
-@@ -1425,31 +1423,35 @@
- // We use a subclass of Logger for the root logger, so
- // that we only instantiate the global handlers when they
- // are first needed.
-- private class RootLogger extends Logger {
-+ private final class RootLogger extends Logger {
- private RootLogger() {
-- super("", null);
-+ super("", null, null, true);
- setLevel(defaultLevel);
- }
-
-+ @Override
- public void log(LogRecord record) {
- // Make sure that the global handlers have been instantiated.
- initializeGlobalHandlers();
- super.log(record);
- }
-
-+ @Override
- public void addHandler(Handler h) {
- initializeGlobalHandlers();
- super.addHandler(h);
- }
-
-+ @Override
- public void removeHandler(Handler h) {
- initializeGlobalHandlers();
- super.removeHandler(h);
- }
-
-- public Handler[] getHandlers() {
-+ @Override
-+ Handler[] accessCheckedHandlers() {
- initializeGlobalHandlers();
-- return super.getHandlers();
-+ return super.accessCheckedHandlers();
- }
- }
-
---- ./jdk/src/share/classes/java/util/logging/Logger.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/java/util/logging/Logger.java Tue Mar 18 12:35:25 2014 -0700
-@@ -178,7 +178,7 @@
- private String name;
- private final CopyOnWriteArrayList<Handler> handlers =
- new CopyOnWriteArrayList<>();
-- private String resourceBundleName;
-+ private volatile String resourceBundleName;
- private volatile boolean useParentHandlers = true;
- private volatile Filter filter;
- private boolean anonymous;
-@@ -189,7 +189,7 @@
-
- // The fields relating to parent-child relationships and levels
- // are managed under a separate lock, the treeLock.
-- private static Object treeLock = new Object();
-+ private static final Object treeLock = new Object();
- // We keep weak references from parents to children, but strong
- // references from children to parents.
- private volatile Logger parent; // our nearest parent.
-@@ -197,6 +197,7 @@
- private volatile Level levelObject;
- private volatile int levelValue; // current effective level value
- private WeakReference<ClassLoader> callersClassLoaderRef;
-+ private final boolean isSystemLogger;
-
- /**
- * GLOBAL_LOGGER_NAME is a name for the global logger.
-@@ -257,11 +258,12 @@
- * no corresponding resource can be found.
- */
- protected Logger(String name, String resourceBundleName) {
-- this(name, resourceBundleName, null);
-+ this(name, resourceBundleName, null, false);
- }
-
-- Logger(String name, String resourceBundleName, Class<?> caller) {
-+ Logger(String name, String resourceBundleName, Class<?> caller, boolean isSystemLogger) {
- this.manager = LogManager.getLogManager();
-+ this.isSystemLogger = isSystemLogger;
- setupResourceInfo(resourceBundleName, caller);
- this.name = name;
- levelValue = Level.INFO.intValue();
-@@ -288,6 +290,7 @@
- private Logger(String name) {
- // The manager field is not initialized here.
- this.name = name;
-+ this.isSystemLogger = true;
- levelValue = Level.INFO.intValue();
- }
-
-@@ -528,7 +531,7 @@
- // cleanup some Loggers that have been GC'ed
- manager.drainLoggerRefQueueBounded();
- Logger result = new Logger(null, resourceBundleName,
-- Reflection.getCallerClass());
-+ Reflection.getCallerClass(), false);
- result.anonymous = true;
- Logger root = manager.getLogger("");
- result.doSetParent(root);
-@@ -606,15 +609,22 @@
-
- Logger logger = this;
- while (logger != null) {
-- for (Handler handler : logger.getHandlers()) {
-+ final Handler[] loggerHandlers = isSystemLogger
-+ ? logger.accessCheckedHandlers()
-+ : logger.getHandlers();
-+ for (Handler handler : loggerHandlers) {
- handler.publish(record);
- }
-
-- if (!logger.getUseParentHandlers()) {
-+ final boolean useParentHdls = isSystemLogger
-+ ? logger.useParentHandlers
-+ : logger.getUseParentHandlers();
-+
-+ if (!useParentHdls) {
- break;
- }
-
-- logger = logger.getParent();
-+ logger = isSystemLogger ? logger.parent : logger.getParent();
- }
- }
-
-@@ -1337,6 +1347,12 @@
- * @return an array of all registered Handlers
- */
- public Handler[] getHandlers() {
-+ return accessCheckedHandlers();
-+ }
-+
-+ // This method should ideally be marked final - but unfortunately
-+ // it needs to be overridden by LogManager.RootLogger
-+ Handler[] accessCheckedHandlers() {
- return handlers.toArray(emptyHandlers);
- }
-
-@@ -1669,11 +1685,13 @@
- private String getEffectiveResourceBundleName() {
- Logger target = this;
- while (target != null) {
-- String rbn = target.getResourceBundleName();
-+ final String rbn = isSystemLogger
-+ ? target.resourceBundleName
-+ : target.getResourceBundleName();
- if (rbn != null) {
- return rbn;
- }
-- target = target.getParent();
-+ target = isSystemLogger ? target.parent : target.getParent();
- }
- return null;
- }
---- ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -85,15 +85,18 @@
- nameAssociations = new HashMap<String, ScriptEngineFactory>();
- extensionAssociations = new HashMap<String, ScriptEngineFactory>();
- mimeTypeAssociations = new HashMap<String, ScriptEngineFactory>();
-- AccessController.doPrivileged(new PrivilegedAction<Object>() {
-- public Object run() {
-- initEngines(loader);
-- return null;
-- }
-- });
-+ List<ScriptEngineFactory> facList = AccessController.doPrivileged(
-+ new PrivilegedAction<List<ScriptEngineFactory>>() {
-+ public List<ScriptEngineFactory> run() {
-+ return initEngines(loader);
-+ }
-+ });
-+ for (ScriptEngineFactory fac : facList) {
-+ engineSpis.add(fac);
-+ }
- }
-
-- private void initEngines(final ClassLoader loader) {
-+ private List<ScriptEngineFactory> initEngines(final ClassLoader loader) {
- Iterator itr = null;
- try {
- if (loader != null) {
-@@ -110,14 +113,15 @@
- // do not throw any exception here. user may want to
- // manage his/her own factories using this manager
- // by explicit registratation (by registerXXX) methods.
-- return;
-+ return null;
- }
-
-+ final List<ScriptEngineFactory> facList = new ArrayList<>();
- try {
- while (itr.hasNext()) {
- try {
- ScriptEngineFactory fact = (ScriptEngineFactory) itr.next();
-- engineSpis.add(fact);
-+ facList.add(fact);
- } catch (ServiceConfigurationError err) {
- System.err.println("ScriptEngineManager providers.next(): "
- + err.getMessage());
-@@ -137,8 +141,8 @@
- // do not throw any exception here. user may want to
- // manage his/her own factories using this manager
- // by explicit registratation (by registerXXX) methods.
-- return;
- }
-+ return facList;
- }
-
- /**
---- ./jdk/src/share/classes/javax/security/auth/Subject.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/javax/security/auth/Subject.java Tue Mar 18 12:35:25 2014 -0700
-@@ -941,14 +941,30 @@
- /**
- * Reads this object from a stream (i.e., deserializes it)
- */
-+ @SuppressWarnings("unchecked")
- private void readObject(java.io.ObjectInputStream s)
- throws java.io.IOException, ClassNotFoundException {
-
-- s.defaultReadObject();
-+ ObjectInputStream.GetField gf = s.readFields();
-+
-+ readOnly = gf.get("readOnly", false);
-+
-+ Set<Principal> inputPrincs = (Set<Principal>)gf.get("principals", null);
-
- // Rewrap the principals into a SecureSet
-- principals = Collections.synchronizedSet(new SecureSet<Principal>
-- (this, PRINCIPAL_SET, principals));
-+ if (inputPrincs == null) {
-+ throw new NullPointerException
-+ (ResourcesMgr.getString("invalid.null.input.s."));
-+ }
-+ try {
-+ principals = Collections.synchronizedSet(new SecureSet<Principal>
-+ (this, PRINCIPAL_SET, inputPrincs));
-+ } catch (NullPointerException npe) {
-+ // Sometimes people deserialize the principals set only.
-+ // Subject is not accessible, so just don't fail.
-+ principals = Collections.synchronizedSet
-+ (new SecureSet<Principal>(this, PRINCIPAL_SET));
-+ }
-
- // The Credential <code>Set</code> is not serialized, but we do not
- // want the default deserialization routine to set it to null.
---- ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -30,6 +30,7 @@
- import java.sql.SQLException;
- import java.util.ServiceConfigurationError;
- import java.util.ServiceLoader;
-+import sun.reflect.misc.ReflectUtil;
-
- /**
- * A factory API that enables applications to obtain a
-@@ -127,15 +128,11 @@
- factoryClassName = getSystemProperty(ROWSET_FACTORY_NAME);
- if (factoryClassName != null) {
- trace("Found system property, value=" + factoryClassName);
-- factory = (RowSetFactory) getFactoryClass(factoryClassName, null, true).newInstance();
-+ factory = (RowSetFactory) ReflectUtil.newInstance(getFactoryClass(factoryClassName, null, true));
- }
-- } catch (ClassNotFoundException e) {
-- throw new SQLException(
-- "RowSetFactory: " + factoryClassName + " not found", e);
-- } catch (Exception e) {
-- throw new SQLException(
-- "RowSetFactory: " + factoryClassName + " could not be instantiated: " + e,
-- e);
-+ } catch (Exception e) {
-+ throw new SQLException( "RowSetFactory: " + factoryClassName +
-+ " could not be instantiated: ", e);
- }
-
- // Check to see if we found the RowSetFactory via a System property
-@@ -180,6 +177,16 @@
- throws SQLException {
-
- trace("***In newInstance()");
-+
-+ if(factoryClassName == null) {
-+ throw new SQLException("Error: factoryClassName cannot be null");
-+ }
-+ try {
-+ ReflectUtil.checkPackageAccess(factoryClassName);
-+ } catch (java.security.AccessControlException e) {
-+ throw new SQLException("Access Exception",e);
-+ }
-+
- try {
- Class providerClass = getFactoryClass(factoryClassName, cl, false);
- RowSetFactory instance = (RowSetFactory) providerClass.newInstance();
-@@ -292,6 +299,7 @@
- });
- } catch (SecurityException se) {
- if (debug) {
-+ trace("error getting " + propName + ": "+ se);
- se.printStackTrace();
- }
- }
---- ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -30,6 +30,7 @@
- import java.io.*;
- import java.math.*;
- import java.util.Map;
-+import sun.reflect.misc.ReflectUtil;
-
- /**
- * An input stream used for custom mapping user-defined types (UDTs).
-@@ -606,13 +607,9 @@
- // create new instance of the class
- SQLData obj = null;
- try {
-- obj = (SQLData)c.newInstance();
-- } catch (java.lang.InstantiationException ex) {
-- throw new SQLException("Unable to instantiate: " +
-- ex.getMessage());
-- } catch (java.lang.IllegalAccessException ex) {
-- throw new SQLException("Unable to instantiate: " +
-- ex.getMessage());
-+ obj = (SQLData)ReflectUtil.newInstance(c);
-+ } catch (Exception ex) {
-+ throw new SQLException("Unable to Instantiate: ", ex);
- }
- // get the attributes from the struct
- Object attribs[] = s.getAttributes(map);
---- ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Tue Mar 18 12:35:25 2014 -0700
-@@ -37,8 +37,11 @@
- import java.io.FileNotFoundException;
- import java.security.AccessController;
- import java.security.PrivilegedAction;
-+import java.security.PrivilegedActionException;
-+import java.security.PrivilegedExceptionAction;
-
- import javax.naming.*;
-+import sun.reflect.misc.ReflectUtil;
-
- /**
- * The Service Provider Interface (SPI) mechanism that generates <code>SyncProvider</code>
-@@ -343,7 +346,7 @@
- // Local implementation class names and keys from Properties
- // file, translate names into Class objects using Class.forName
- // and store mappings
-- Properties properties = new Properties();
-+ final Properties properties = new Properties();
-
- if (implementations == null) {
- implementations = new Hashtable();
-@@ -372,6 +375,7 @@
- }
- });
- } catch (Exception ex) {
-+ System.out.println("errorget rowset.properties: " + ex);
- strRowsetProperties = null;
- }
- if (strRowsetProperties != null) {
-@@ -391,16 +395,33 @@
- strFileSep + "rowset" + strFileSep +
- "rowset.properties";
-
-- ClassLoader cl = Thread.currentThread().getContextClassLoader();
-+ final ClassLoader cl = Thread.currentThread().getContextClassLoader();
-
-- try (InputStream stream =
-- (cl == null) ? ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
-- : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
-- if (stream == null) {
-- throw new SyncFactoryException(
-- "Resource " + ROWSET_PROPERTIES + " not found");
-+ try {
-+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
-+ @Override
-+ public Void run() throws SyncFactoryException, IOException, FileNotFoundException {
-+ try (InputStream stream = (cl == null) ?
-+ ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
-+ : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
-+ if (stream == null) {
-+ throw new SyncFactoryException("Resource " + ROWSET_PROPERTIES + " not found");
-+ }
-+ properties.load(stream);
-+ }
-+ return null;
-+ }
-+
-+ });
-+ } catch (PrivilegedActionException ex) {
-+ Throwable e = ex.getException();
-+ if (e instanceof SyncFactoryException) {
-+ throw (SyncFactoryException) e;
-+ } else {
-+ SyncFactoryException sfe = new SyncFactoryException();
-+ sfe.initCause(ex.getException());
-+ throw sfe;
- }
-- properties.load(stream);
- }
-
- parseProperties(properties);
-@@ -560,6 +581,13 @@
- return new com.sun.rowset.providers.RIOptimisticProvider();
- }
-
-+ try {
-+ ReflectUtil.checkPackageAccess(providerID);
-+ } catch (java.security.AccessControlException e) {
-+ SyncFactoryException sfe = new SyncFactoryException();
-+ sfe.initCause(e);
-+ throw sfe;
-+ }
- // Attempt to invoke classname from registered SyncProvider list
- Class c = null;
- try {
-@@ -568,7 +596,7 @@
- /**
- * The SyncProvider implementation of the user will be in
- * the classpath. We need to find the ClassLoader which loads
-- * this SyncFactory and try to laod the SyncProvider class from
-+ * this SyncFactory and try to load the SyncProvider class from
- * there.
- **/
- c = Class.forName(providerID, true, cl);
---- ./jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/AWTAccessor.java Tue Mar 18 12:35:25 2014 -0700
-@@ -29,6 +29,7 @@
- import java.awt.KeyboardFocusManager;
- import java.awt.DefaultKeyboardFocusManager;
- import java.awt.event.InputEvent;
-+import java.awt.event.InvocationEvent;
- import java.awt.event.KeyEvent;
- import java.awt.geom.Point2D;
-
-@@ -690,6 +691,25 @@
- }
-
- /*
-+ * An accessor object for the InvocationEvent class
-+ */
-+ public interface InvocationEventAccessor {
-+ /**
-+ * Disposes the InvocationEvent
-+ */
-+ void dispose(InvocationEvent event);
-+
-+ /**
-+ * Creates an InvocationEvent with a completion listener -
-+ * a Runnable whose run() method will be called immediately after
-+ * the event is dispatched or disposed
-+ */
-+ InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
-+ boolean catchThrowables);
-+ }
-+
-+
-+ /*
- * Accessor instances are initialized in the static initializers of
- * corresponding AWT classes by using setters defined below.
- */
-@@ -716,6 +736,7 @@
- private static TrayIconAccessor trayIconAccessor;
- private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
- private static SequencedEventAccessor sequencedEventAccessor;
-+ private static InvocationEventAccessor invocationEventAccessor;
-
- /*
- * Set an accessor object for the java.awt.Component class.
-@@ -1110,4 +1131,18 @@
- // (so not a single instance of the event has been created).
- return sequencedEventAccessor;
- }
-+
-+ /*
-+ * Get the accessor object for the java.awt.event.InvocationEvent class.
-+ */
-+ public static void setInvocationEventAccessor(InvocationEventAccessor invocationEventAccessor) {
-+ AWTAccessor.invocationEventAccessor = invocationEventAccessor;
-+ }
-+
-+ /*
-+ * Set the accessor object for the java.awt.event.InvocationEvent class.
-+ */
-+ public static InvocationEventAccessor getInvocationEventAccessor() {
-+ return invocationEventAccessor;
-+ }
- }
---- ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -26,10 +26,13 @@
- package sun.awt;
-
- import java.awt.AWTEvent;
--import java.util.Collections;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.HashSet;
- import java.util.IdentityHashMap;
- import java.util.Map;
-+
-+import sun.misc.ThreadGroupUtils;
- import sun.util.logging.PlatformLogger;
-
- /**
-@@ -212,7 +215,13 @@
- synchronized (activationLock) {
- synchronized (mainLock) {
- if (!isReadyToShutdown() && blockerThread == null) {
-- activateBlockerThread();
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ activateBlockerThread();
-+ return null;
-+ }
-+ });
- } else {
- mainLock.notifyAll();
- timeoutPassed = false;
-@@ -326,9 +335,12 @@
- /**
- * Creates and starts a new blocker thread. Doesn't return until
- * the new blocker thread starts.
-+ *
-+ * Must be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
- */
- private void activateBlockerThread() {
-- Thread thread = new Thread(this, "AWT-Shutdown");
-+ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), this, "AWT-Shutdown");
-+ thread.setContextClassLoader(null);
- thread.setDaemon(false);
- blockerThread = thread;
- thread.start();
---- ./jdk/src/share/classes/sun/awt/AppContext.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/AppContext.java Tue Mar 18 12:35:25 2014 -0700
-@@ -837,21 +837,68 @@
- public boolean isMainAppContext() {
- return (numAppContexts.get() == 1 && mainAppContext != null);
- }
-- public Object getContext() {
-- return getAppContext();
-+
-+ private boolean hasRootThreadGroup(final AppContext ecx) {
-+ return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
-+ @Override
-+ public Boolean run() {
-+ return ecx.threadGroup.getParent() == null;
-+ }
-+ });
- }
-- public Object getExecutionContext() {
-- return getExecutionAppContext();
-+
-+ /**
-+ * Returns the AppContext used for applet logging isolation, or null if
-+ * the default global context can be used.
-+ * If there's no applet, or if the caller is a stand alone application,
-+ * or running in the main app context, returns null.
-+ * Otherwise, returns the AppContext of the calling applet.
-+ * @return null if the global default context can be used,
-+ * an AppContext otherwise.
-+ **/
-+ public Object getAppletContext() {
-+ // There's no AppContext: return null.
-+ // No need to call getAppContext() if numAppContext == 0:
-+ // it means that no AppContext has been created yet, and
-+ // we don't want to trigger the creation of a main app
-+ // context since we don't need it.
-+ if (numAppContexts.get() == 0) return null;
-+
-+ // Get the context from the security manager
-+ AppContext ecx = getExecutionAppContext();
-+
-+ // Not sure we really need to re-check numAppContexts here.
-+ // If all applets have gone away then we could have a
-+ // numAppContexts coming back to 0. So we recheck
-+ // it here because we don't want to trigger the
-+ // creation of a main AppContext in that case.
-+ // This is probably not 100% MT-safe but should reduce
-+ // the window of opportunity in which that issue could
-+ // happen.
-+ if (numAppContexts.get() > 0) {
-+ // Defaults to thread group caching.
-+ // This is probably not required as we only really need
-+ // isolation in a deployed applet environment, in which
-+ // case ecx will not be null when we reach here
-+ // However it helps emulate the deployed environment,
-+ // in tests for instance.
-+ ecx = ecx != null ? ecx : getAppContext();
-+ }
-+
-+ // getAppletContext() may be called when initializing the main
-+ // app context - in which case mainAppContext will still be
-+ // null. To work around this issue we simply use
-+ // AppContext.threadGroup.getParent() == null instead, since
-+ // mainAppContext is the only AppContext which should have
-+ // the root TG as its thread group.
-+ // See: JDK-8023258
-+ final boolean isMainAppContext = ecx == null
-+ || mainAppContext == ecx
-+ || mainAppContext == null && hasRootThreadGroup(ecx);
-+
-+ return isMainAppContext ? null : ecx;
- }
-- public Object get(Object context, Object key) {
-- return ((AppContext)context).get(key);
-- }
-- public void put(Object context, Object key, Object value) {
-- ((AppContext)context).put(key, value);
-- }
-- public void remove(Object context, Object key) {
-- ((AppContext)context).remove(key);
-- }
-+
- });
- }
- }
---- ./jdk/src/share/classes/sun/awt/SunToolkit.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -37,6 +37,7 @@
- import java.awt.SystemTray;
- import java.awt.event.InputEvent;
- import java.net.URL;
-+import java.security.PrivilegedAction;
- import java.util.*;
- import java.util.concurrent.TimeUnit;
- import java.util.concurrent.locks.Condition;
---- ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Tue Mar 18 12:35:25 2014 -0700
-@@ -87,7 +87,7 @@
- HashMap cached_data = new HashMap(formats.length, 1.0f);
-
- Map flavorsForFormats = DataTransferer.getInstance().
-- getFlavorsForFormats(formats, SunClipboard.flavorMap);
-+ getFlavorsForFormats(formats, SunClipboard.getDefaultFlavorTable());
- for (Iterator iter = flavorsForFormats.keySet().iterator();
- iter.hasNext(); )
- {
---- ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Tue Mar 18 12:35:25 2014 -0700
-@@ -64,9 +64,6 @@
- public abstract class SunClipboard extends Clipboard
- implements PropertyChangeListener {
-
-- public static final FlavorTable flavorMap =
-- (FlavorTable)SystemFlavorMap.getDefaultFlavorMap();
--
- private AppContext contentsContext = null;
-
- private final Object CLIPBOARD_FLAVOR_LISTENER_KEY;
-@@ -172,7 +169,7 @@
- long[] formats = getClipboardFormatsOpenClose();
-
- return DataTransferer.getInstance().
-- getFlavorsForFormatsAsArray(formats, flavorMap);
-+ getFlavorsForFormatsAsArray(formats, getDefaultFlavorTable());
- }
-
- /**
-@@ -218,7 +215,7 @@
-
- long[] formats = getClipboardFormats();
- Long lFormat = (Long)DataTransferer.getInstance().
-- getFlavorsForFormats(formats, flavorMap).get(flavor);
-+ getFlavorsForFormats(formats, getDefaultFlavorTable()).get(flavor);
-
- if (lFormat == null) {
- throw new UnsupportedFlavorException(flavor);
-@@ -349,7 +346,7 @@
- private static Set formatArrayAsDataFlavorSet(long[] formats) {
- return (formats == null) ? null :
- DataTransferer.getInstance().
-- getFlavorsForFormatsAsSet(formats, flavorMap);
-+ getFlavorsForFormatsAsSet(formats, getDefaultFlavorTable());
- }
-
-
-@@ -469,4 +466,7 @@
- }
- }
-
-+ public static FlavorTable getDefaultFlavorTable() {
-+ return (FlavorTable) SystemFlavorMap.getDefaultFlavorMap();
-+ }
- }
---- ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -27,12 +27,15 @@
-
- import java.io.File;
- import java.io.OutputStream;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.Semaphore;
- import java.util.concurrent.TimeUnit;
-
- import sun.awt.AppContext;
-+import sun.misc.ThreadGroupUtils;
-
- public class CreatedFontTracker {
-
-@@ -112,28 +115,25 @@
- static void init() {
- if (t == null) {
- // Add a shutdown hook to remove the temp file.
-- java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction() {
-- public Object run() {
-- /* The thread must be a member of a thread group
-- * which will not get GCed before VM exit.
-- * Make its parent the top-level thread group.
-- */
-- ThreadGroup tg =
-- Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null;
-- tg = tgn, tgn = tg.getParent());
-- t = new Thread(tg, new Runnable() {
-- public void run() {
-- runHooks();
-- }
-- });
-- t.setContextClassLoader(null);
-- Runtime.getRuntime().addShutdownHook(t);
-- return null;
-- }
-- });
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ /* The thread must be a member of a thread group
-+ * which will not get GCed before VM exit.
-+ * Make its parent the top-level thread group.
-+ */
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ t = new Thread(rootTG, new Runnable() {
-+ @Override
-+ public void run() {
-+ runHooks();
-+ }
-+ });
-+ t.setContextClassLoader(null);
-+ Runtime.getRuntime().addShutdownHook(t);
-+ return null;
-+ }
-+ });
- }
- }
-
---- ./jdk/src/share/classes/sun/font/SunFontManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/font/SunFontManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -52,6 +52,7 @@
- import sun.awt.AppContext;
- import sun.awt.FontConfiguration;
- import sun.awt.SunToolkit;
-+import sun.misc.ThreadGroupUtils;
- import sun.java2d.FontSupport;
- import sun.util.logging.PlatformLogger;
-
-@@ -2521,24 +2522,20 @@
- });
- }
- };
-- java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction() {
-- public Object run() {
-- /* The thread must be a member of a thread group
-- * which will not get GCed before VM exit.
-- * Make its parent the top-level thread group.
-- */
-- ThreadGroup tg =
-- Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null;
-- tg = tgn, tgn = tg.getParent());
-- fileCloser = new Thread(tg, fileCloserRunnable);
-- fileCloser.setContextClassLoader(null);
-- Runtime.getRuntime().addShutdownHook(fileCloser);
-- return null;
-- }
-- });
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ /* The thread must be a member of a thread group
-+ * which will not get GCed before VM exit.
-+ * Make its parent the top-level thread group.
-+ */
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ fileCloser = new Thread(rootTG, fileCloserRunnable);
-+ fileCloser.setContextClassLoader(null);
-+ Runtime.getRuntime().addShutdownHook(fileCloser);
-+ return null;
-+ }
-+ });
- }
- }
- }
---- ./jdk/src/share/classes/sun/java2d/Disposer.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/java2d/Disposer.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -25,10 +25,14 @@
-
- package sun.java2d;
-
-+import sun.misc.ThreadGroupUtils;
-+
- import java.lang.ref.Reference;
- import java.lang.ref.ReferenceQueue;
- import java.lang.ref.PhantomReference;
- import java.lang.ref.WeakReference;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import java.util.ArrayList;
- import java.util.Hashtable;
-
-@@ -71,26 +75,22 @@
- }
- }
- disposerInstance = new Disposer();
-- java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction() {
-- public Object run() {
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
- /* The thread must be a member of a thread group
- * which will not get GCed before VM exit.
- * Make its parent the top-level thread group.
- */
-- ThreadGroup tg = Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null;
-- tg = tgn, tgn = tg.getParent());
-- Thread t =
-- new Thread(tg, disposerInstance, "Java2D Disposer");
-- t.setContextClassLoader(null);
-- t.setDaemon(true);
-- t.setPriority(Thread.MAX_PRIORITY);
-- t.start();
-- return null;
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ Thread t = new Thread(rootTG, disposerInstance, "Java2D Disposer");
-+ t.setContextClassLoader(null);
-+ t.setDaemon(true);
-+ t.setPriority(Thread.MAX_PRIORITY);
-+ t.start();
-+ return null;
-+ }
- }
-- }
- );
- }
-
---- ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -25,6 +25,7 @@
-
- package sun.java2d.opengl;
-
-+import sun.misc.ThreadGroupUtils;
- import sun.java2d.pipe.RenderBuffer;
- import sun.java2d.pipe.RenderQueue;
- import static sun.java2d.pipe.BufferedOpCodes.*;
-@@ -48,12 +49,9 @@
- * which will not get GCed before VM exit.
- */
- flusher = AccessController.doPrivileged(new PrivilegedAction<QueueFlusher>() {
-+ @Override
- public QueueFlusher run() {
-- ThreadGroup rootThreadGroup = Thread.currentThread().getThreadGroup();
-- while (rootThreadGroup.getParent() != null) {
-- rootThreadGroup = rootThreadGroup.getParent();
-- }
-- return new QueueFlusher(rootThreadGroup);
-+ return new QueueFlusher(ThreadGroupUtils.getRootThreadGroup());
- }
- });
- }
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/src/share/classes/sun/misc/InnocuousThread.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,121 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNUNSAFE General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUNSAFET
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICUNSAFELAR PUNSAFERPOSE. See the GNUNSAFE General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNUNSAFE General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 UNSAFESA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 UNSAFESA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package sun.misc;
-+
-+import java.security.AccessControlContext;
-+import java.security.ProtectionDomain;
-+
-+/**
-+ * A thread that has no permissions, is not a member of any user-defined
-+ * ThreadGroup and supports the ability to erase ThreadLocals.
-+ *
-+ * @implNote Based on the implementation of InnocuousForkJoinWorkerThread.
-+ */
-+public final class InnocuousThread extends Thread {
-+ private static final Unsafe UNSAFE;
-+ private static final ThreadGroup THREADGROUP;
-+ private static final AccessControlContext ACC;
-+ private static final long THREADLOCALS;
-+ private static final long INHERITABLETHREADLOCALS;
-+ private static final long INHERITEDACCESSCONTROLCONTEXT;
-+
-+ public InnocuousThread(Runnable target) {
-+ super(THREADGROUP, target, "anInnocuousThread");
-+ UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC);
-+ eraseThreadLocals();
-+ }
-+
-+ @Override
-+ public ClassLoader getContextClassLoader() {
-+ // always report system class loader
-+ return ClassLoader.getSystemClassLoader();
-+ }
-+
-+ @Override
-+ public void setUncaughtExceptionHandler(UncaughtExceptionHandler x) {
-+ // silently fail
-+ }
-+
-+ @Override
-+ public void setContextClassLoader(ClassLoader cl) {
-+ throw new SecurityException("setContextClassLoader");
-+ }
-+
-+ // ensure run method is run only once
-+ private volatile boolean hasRun;
-+
-+ @Override
-+ public void run() {
-+ if (Thread.currentThread() == this && !hasRun) {
-+ hasRun = true;
-+ super.run();
-+ }
-+ }
-+
-+ /**
-+ * Drops all thread locals (and inherited thread locals).
-+ */
-+ public void eraseThreadLocals() {
-+ UNSAFE.putObject(this, THREADLOCALS, null);
-+ UNSAFE.putObject(this, INHERITABLETHREADLOCALS, null);
-+ }
-+
-+ // Use Unsafe to access Thread group and ThreadGroup parent fields
-+ static {
-+ try {
-+ ACC = new AccessControlContext(new ProtectionDomain[] {
-+ new ProtectionDomain(null, null)
-+ });
-+
-+ // Find and use topmost ThreadGroup as parent of new group
-+ UNSAFE = Unsafe.getUnsafe();
-+ Class<?> tk = Thread.class;
-+ Class<?> gk = ThreadGroup.class;
-+
-+ THREADLOCALS = UNSAFE.objectFieldOffset
-+ (tk.getDeclaredField("threadLocals"));
-+ INHERITABLETHREADLOCALS = UNSAFE.objectFieldOffset
-+ (tk.getDeclaredField("inheritableThreadLocals"));
-+ INHERITEDACCESSCONTROLCONTEXT = UNSAFE.objectFieldOffset
-+ (tk.getDeclaredField("inheritedAccessControlContext"));
-+
-+ long tg = UNSAFE.objectFieldOffset(tk.getDeclaredField("group"));
-+ long gp = UNSAFE.objectFieldOffset(gk.getDeclaredField("parent"));
-+ ThreadGroup group = (ThreadGroup)
-+ UNSAFE.getObject(Thread.currentThread(), tg);
-+
-+ while (group != null) {
-+ ThreadGroup parent = (ThreadGroup)UNSAFE.getObject(group, gp);
-+ if (parent == null)
-+ break;
-+ group = parent;
-+ }
-+ THREADGROUP = new ThreadGroup(group, "InnocuousThreadGroup");
-+ } catch (Exception e) {
-+ throw new Error(e);
-+ }
-+ }
-+}
---- ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Tue Mar 18 12:35:25 2014 -0700
-@@ -26,14 +26,16 @@
- package sun.misc;
-
- public interface JavaAWTAccess {
-- public Object getContext();
-- public Object getExecutionContext();
-
-- public Object get(Object context, Object key);
-- public void put(Object context, Object key, Object value);
-- public void remove(Object context, Object key);
-+ // Returns the AppContext used for applet logging isolation, or null if
-+ // no isolation is required.
-+ // If there's no applet, or if the caller is a stand alone application,
-+ // or running in the main app context, returns null.
-+ // Otherwise, returns the AppContext of the calling applet.
-+ public Object getAppletContext();
-
-- // convenience methods whose context is the object returned by getContext()
-+ // convenience methods to cache objects in the current thread group's
-+ // AppContext
- public Object get(Object key);
- public void put(Object key, Object value);
- public void remove(Object key);
---- ./jdk/src/share/classes/sun/misc/Service.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/misc/Service.java Tue Mar 18 12:35:25 2014 -0700
-@@ -299,7 +299,7 @@
- return service.cast(c.newInstance());
- } catch (Throwable x) {
- fail(service,
-- "Provider " + cn + " could not be instantiated: " + x,
-+ "Provider " + cn + " could not be instantiated",
- x);
- }
- return null; /* This cannot happen */
---- ./jdk/src/share/classes/sun/misc/SharedSecrets.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/misc/SharedSecrets.java Tue Mar 18 12:35:25 2014 -0700
-@@ -197,9 +197,6 @@
- public static JavaAWTAccess getJavaAWTAccess() {
- // this may return null in which case calling code needs to
- // provision for.
-- if (javaAWTAccess == null || javaAWTAccess.getContext() == null) {
-- return null;
-- }
- return javaAWTAccess;
- }
- }
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/src/share/classes/sun/misc/ThreadGroupUtils.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+package sun.misc;
-+
-+/**
-+ * A utility class needed to access the root {@code ThreadGroup}
-+ *
-+ * The class should not depend on any others, because it' called from JNI_OnLoad of the AWT
-+ * native library. Triggering class loading could could lead to a deadlock.
-+ */
-+public final class ThreadGroupUtils {
-+
-+ private ThreadGroupUtils() {
-+ // Avoid instantiation
-+ }
-+
-+ /**
-+ * Returns a root thread group.
-+ * Should be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
-+ *
-+ * @return a root {@code ThreadGroup}
-+ */
-+ public static ThreadGroup getRootThreadGroup() {
-+ ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
-+ ThreadGroup parentTG = currentTG.getParent();
-+ while (parentTG != null) {
-+ currentTG = parentTG;
-+ parentTG = currentTG.getParent();
-+ }
-+ return currentTG;
-+ }
-+}
---- ./jdk/src/share/classes/sun/nio/ch/Invoker.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/nio/ch/Invoker.java Tue Mar 18 12:35:25 2014 -0700
-@@ -130,6 +130,18 @@
-
- // clear interrupt
- Thread.interrupted();
-+
-+ // clear thread locals when in default thread pool
-+ if (System.getSecurityManager() != null) {
-+ Thread me = Thread.currentThread();
-+ if (me instanceof sun.misc.InnocuousThread) {
-+ GroupAndInvokeCount thisGroupAndInvokeCount = myGroupAndInvokeCount.get();
-+ ((sun.misc.InnocuousThread)me).eraseThreadLocals();
-+ if (thisGroupAndInvokeCount != null) {
-+ myGroupAndInvokeCount.set(thisGroupAndInvokeCount);
-+ }
-+ }
-+ }
- }
-
- /**
---- ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Tue Mar 18 12:35:25 2014 -0700
-@@ -27,6 +27,7 @@
-
- import java.util.concurrent.*;
- import java.security.AccessController;
-+import java.security.PrivilegedAction;
- import sun.security.action.GetPropertyAction;
- import sun.security.action.GetIntegerAction;
-
-@@ -39,14 +40,6 @@
- "java.nio.channels.DefaultThreadPool.threadFactory";
- private static final String DEFAULT_THREAD_POOL_INITIAL_SIZE =
- "java.nio.channels.DefaultThreadPool.initialSize";
-- private static final ThreadFactory defaultThreadFactory = new ThreadFactory() {
-- @Override
-- public Thread newThread(Runnable r) {
-- Thread t = new Thread(r);
-- t.setDaemon(true);
-- return t;
-- }
-- };
-
- private final ExecutorService executor;
-
-@@ -79,7 +72,29 @@
- }
-
- static ThreadFactory defaultThreadFactory() {
-- return defaultThreadFactory;
-+ if (System.getSecurityManager() == null) {
-+ return new ThreadFactory() {
-+ @Override
-+ public Thread newThread(Runnable r) {
-+ Thread t = new Thread(r);
-+ t.setDaemon(true);
-+ return t;
-+ }
-+ };
-+ } else {
-+ return new ThreadFactory() {
-+ @Override
-+ public Thread newThread(final Runnable r) {
-+ return (Thread) AccessController.doPrivileged(new PrivilegedAction() {
-+ public Object run() {
-+ Thread t = new sun.misc.InnocuousThread(r);
-+ t.setDaemon(true);
-+ return t;
-+ }
-+ });
-+ }
-+ };
-+ }
- }
-
- private static class DefaultThreadPoolHolder {
-@@ -100,7 +115,7 @@
- // default to thread factory that creates daemon threads
- ThreadFactory threadFactory = getDefaultThreadPoolThreadFactory();
- if (threadFactory == null)
-- threadFactory = defaultThreadFactory;
-+ threadFactory = defaultThreadFactory();
- // create thread pool
- ExecutorService executor =
- new ThreadPoolExecutor(0, Integer.MAX_VALUE,
---- ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -173,8 +173,8 @@
- md.update(p.getProperty(s).getBytes());
- }
-
-- md.update
-- (InetAddress.getLocalHost().toString().getBytes());
-+ // Include network adapter names (and a Mac address)
-+ addNetworkAdapterInfo(md);
-
- // The temporary dir
- File f = new File(p.getProperty("java.io.tmpdir"));
-@@ -212,6 +212,31 @@
- return md.digest();
- }
-
-+ /*
-+ * Include network adapter names and, if available, a Mac address
-+ *
-+ * See also java.util.concurrent.ThreadLocalRandom.initialSeed()
-+ */
-+ private static void addNetworkAdapterInfo(MessageDigest md) {
-+
-+ try {
-+ Enumeration<NetworkInterface> ifcs =
-+ NetworkInterface.getNetworkInterfaces();
-+ while (ifcs.hasMoreElements()) {
-+ NetworkInterface ifc = ifcs.nextElement();
-+ md.update(ifc.toString().getBytes());
-+ if (!ifc.isVirtual()) { // skip fake addresses
-+ byte[] bs = ifc.getHardwareAddress();
-+ if (bs != null) {
-+ md.update(bs);
-+ break;
-+ }
-+ }
-+ }
-+ } catch (Exception ignore) {
-+ }
-+ }
-+
- /**
- * Helper function to convert a long into a byte array (least significant
- * byte first).
---- ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Tue Mar 18 12:35:25 2014 -0700
-@@ -75,7 +75,7 @@
- private PublicKey prevPubKey;
-
- private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
-- EnumSet.of(CryptoPrimitive.SIGNATURE);
-+ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
-
- private final static DisabledAlgorithmConstraints
- certPathDefaultConstraints = new DisabledAlgorithmConstraints(
---- ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Mar 18 12:35:25 2014 -0700
-@@ -50,6 +50,7 @@
- import sun.security.util.Cache;
- import sun.security.util.Debug;
- import sun.security.x509.X500Name;
-+import sun.security.action.GetBooleanAction;
- import sun.security.action.GetPropertyAction;
-
- /**
-@@ -135,6 +136,14 @@
- private final static String PROP_LIFETIME =
- "sun.security.certpath.ldap.cache.lifetime";
-
-+ /*
-+ * Internal system property, that when set to "true", disables the
-+ * JNDI application resource files lookup to prevent recursion issues
-+ * when validating signed JARs with LDAP URLs in certificates.
-+ */
-+ private final static String PROP_DISABLE_APP_RESOURCE_FILES =
-+ "sun.security.certpath.ldap.disable.app.resource.files";
-+
- static {
- String s = AccessController.doPrivileged(
- new GetPropertyAction(PROP_LIFETIME));
-@@ -236,6 +245,17 @@
- env.put(Context.INITIAL_CONTEXT_FACTORY,
- "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, url);
-+
-+ // If property is set to true, disable application resource file lookup.
-+ boolean disableAppResourceFiles = AccessController.doPrivileged(
-+ new GetBooleanAction(PROP_DISABLE_APP_RESOURCE_FILES));
-+ if (disableAppResourceFiles) {
-+ if (debug != null) {
-+ debug.println("LDAPCertStore disabling app resource files");
-+ }
-+ env.put("com.sun.naming.disable.app.resource.files", "true");
-+ }
-+
- try {
- ctx = new InitialDirContext(env);
- /*
---- ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Tue Mar 18 12:35:25 2014 -0700
-@@ -25,11 +25,9 @@
-
- package sun.security.rsa;
-
--import java.math.BigInteger;
- import java.util.*;
-
- import java.security.*;
--import java.security.interfaces.*;
- import java.security.spec.*;
-
- import javax.crypto.BadPaddingException;
-@@ -41,21 +39,41 @@
- /**
- * RSA padding and unpadding.
- *
-- * Format of PKCS#1 v1.5 padding is:
-+ * The various PKCS#1 versions can be found in the EMC/RSA Labs
-+ * web site, which is currently:
-+ *
-+ * http://www.emc.com/emc-plus/rsa-labs/index.htm
-+ *
-+ * or in the IETF RFCs derived from the above PKCS#1 standards.
-+ *
-+ * RFC 2313: v1.5
-+ * RFC 2437: v2.0
-+ * RFC 3447: v2.1
-+ *
-+ * The format of PKCS#1 v1.5 padding is:
-+ *
- * 0x00 | BT | PS...PS | 0x00 | data...data
-+ *
- * where BT is the blocktype (1 or 2). The length of the entire string
- * must be the same as the size of the modulus (i.e. 128 byte for a 1024 bit
- * key). Per spec, the padding string must be at least 8 bytes long. That
- * leaves up to (length of key in bytes) - 11 bytes for the data.
- *
-- * OAEP padding is a bit more complicated and has a number of options.
-- * We support:
-+ * OAEP padding was introduced in PKCS#1 v2.0 and is a bit more complicated
-+ * and has a number of options. We support:
-+ *
- * . arbitrary hash functions ('Hash' in the specification), MessageDigest
- * implementation must be available
- * . MGF1 as the mask generation function
- * . the empty string as the default value for label L and whatever
- * specified in javax.crypto.spec.OAEPParameterSpec
- *
-+ * The algorithms (representations) are forwards-compatible: that is,
-+ * the algorithm described in previous releases are in later releases.
-+ * However, additional comments/checks/clarifications were added to the
-+ * later versions based on real-world experience (e.g. stricter v1.5
-+ * format checking.)
-+ *
- * Note: RSA keys should be at least 512 bits long
- *
- * @since 1.5
-@@ -156,7 +174,8 @@
- throw new InvalidAlgorithmParameterException
- ("Unsupported MGF algo: " + mgfName);
- }
-- mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters()).getDigestAlgorithm();
-+ mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters())
-+ .getDigestAlgorithm();
- PSource pSrc = spec.getPSource();
- String pSrcAlgo = pSrc.getAlgorithm();
- if (!pSrcAlgo.equalsIgnoreCase("PSpecified")) {
-@@ -198,7 +217,7 @@
- */
- private static byte[] getInitialHash(MessageDigest md,
- byte[] digestInput) {
-- byte[] result = null;
-+ byte[] result;
- if ((digestInput == null) || (digestInput.length == 0)) {
- String digestName = md.getAlgorithm();
- result = emptyHashes.get(digestName);
-@@ -213,8 +232,8 @@
- }
-
- /**
-- * Return the maximum size of the plaintext data that can be processed using
-- * this object.
-+ * Return the maximum size of the plaintext data that can be processed
-+ * using this object.
- */
- public int getMaxDataSize() {
- return maxDataSize;
-@@ -262,7 +281,7 @@
- */
- public byte[] unpad(byte[] padded) throws BadPaddingException {
- if (padded.length != paddedSize) {
-- throw new BadPaddingException("Padded length must be " + paddedSize);
-+ throw new BadPaddingException("Decryption error");
- }
- switch (type) {
- case PAD_NONE:
-@@ -282,7 +301,8 @@
- */
- private byte[] padV15(byte[] data) throws BadPaddingException {
- byte[] padded = new byte[paddedSize];
-- System.arraycopy(data, 0, padded, paddedSize - data.length, data.length);
-+ System.arraycopy(data, 0, padded, paddedSize - data.length,
-+ data.length);
- int psSize = paddedSize - 3 - data.length;
- int k = 0;
- padded[k++] = 0;
-@@ -317,55 +337,53 @@
- }
-
- /**
-- * PKCS#1 v1.5 unpadding (blocktype 1 and 2).
-+ * PKCS#1 v1.5 unpadding (blocktype 1 (signature) and 2 (encryption)).
- *
- * Note that we want to make it a constant-time operation
- */
- private byte[] unpadV15(byte[] padded) throws BadPaddingException {
- int k = 0;
-- BadPaddingException bpe = null;
-+ boolean bp = false;
-
- if (padded[k++] != 0) {
-- bpe = new BadPaddingException("Data must start with zero");
-+ bp = true;
- }
-- if (padded[k++] != type && bpe == null) {
-- bpe = new BadPaddingException("Blocktype mismatch: " + padded[1]);
-+ if (padded[k++] != type) {
-+ bp = true;
- }
- int p = 0;
- while (k < padded.length) {
- int b = padded[k++] & 0xff;
-- if (b == 0 && p == 0) {
-+ if ((b == 0) && (p == 0)) {
- p = k;
- }
-- if (k == padded.length && p == 0 && bpe == null) {
-- bpe = new BadPaddingException("Padding string not terminated");
-+ if ((k == padded.length) && (p == 0)) {
-+ bp = true;
- }
- if ((type == PAD_BLOCKTYPE_1) && (b != 0xff) &&
-- p == 0 && bpe == null) {
-- bpe = new BadPaddingException("Padding byte not 0xff: " + b);
-+ (p == 0)) {
-+ bp = true;
- }
- }
- int n = padded.length - p;
-- if (n > maxDataSize && bpe == null) {
-- bpe = new BadPaddingException("Padding string too short");
-+ if (n > maxDataSize) {
-+ bp = true;
- }
-
- // copy useless padding array for a constant-time method
-- //
-- // Is it necessary?
- byte[] padding = new byte[p];
- System.arraycopy(padded, 0, padding, 0, p);
-
- byte[] data = new byte[n];
- System.arraycopy(padded, p, data, 0, n);
-
-- if (bpe == null) {
-- bpe = new BadPaddingException("Unused exception");
-+ BadPaddingException bpe = new BadPaddingException("Decryption error");
-+
-+ if (bp) {
-+ throw bpe;
- } else {
-- throw bpe;
-+ return data;
- }
--
-- return data;
- }
-
- /**
-@@ -424,10 +442,11 @@
- */
- private byte[] unpadOAEP(byte[] padded) throws BadPaddingException {
- byte[] EM = padded;
-+ boolean bp = false;
- int hLen = lHash.length;
-
- if (EM[0] != 0) {
-- throw new BadPaddingException("Data must start with zero");
-+ bp = true;
- }
-
- int seedStart = 1;
-@@ -442,29 +461,48 @@
- // verify lHash == lHash'
- for (int i = 0; i < hLen; i++) {
- if (lHash[i] != EM[dbStart + i]) {
-- throw new BadPaddingException("lHash mismatch");
-+ bp = true;
- }
- }
-
-- // skip over padding (0x00 bytes)
-- int i = dbStart + hLen;
-- while (EM[i] == 0) {
-- i++;
-- if (i >= EM.length) {
-- throw new BadPaddingException("Padding string not terminated");
-+ int padStart = dbStart + hLen;
-+ int onePos = -1;
-+
-+ for (int i = padStart; i < EM.length; i++) {
-+ int value = EM[i];
-+ if (onePos == -1) {
-+ if (value == 0x00) {
-+ // continue;
-+ } else if (value == 0x01) {
-+ onePos = i;
-+ } else { // Anything other than {0,1} is bad.
-+ bp = true;
-+ }
- }
- }
-
-- if (EM[i++] != 1) {
-- throw new BadPaddingException
-- ("Padding string not terminated by 0x01 byte");
-+ // We either ran off the rails or found something other than 0/1.
-+ if (onePos == -1) {
-+ bp = true;
-+ onePos = EM.length - 1; // Don't inadvertently return any data.
- }
-
-- int mLen = EM.length - i;
-- byte[] m = new byte[mLen];
-- System.arraycopy(EM, i, m, 0, mLen);
-+ int mStart = onePos + 1;
-
-- return m;
-+ // copy useless padding array for a constant-time method
-+ byte [] tmp = new byte[mStart - padStart];
-+ System.arraycopy(EM, padStart, tmp, 0, tmp.length);
-+
-+ byte [] m = new byte[EM.length - mStart];
-+ System.arraycopy(EM, mStart, m, 0, m.length);
-+
-+ BadPaddingException bpe = new BadPaddingException("Decryption error");
-+
-+ if (bp) {
-+ throw bpe;
-+ } else {
-+ return m;
-+ }
- }
-
- /**
-@@ -478,7 +516,7 @@
- private void mgf1(byte[] seed, int seedOfs, int seedLen,
- byte[] out, int outOfs, int maskLen) throws BadPaddingException {
- byte[] C = new byte[4]; // 32 bit counter
-- byte[] digest = new byte[20]; // 20 bytes is length of SHA-1 digest
-+ byte[] digest = new byte[mgfMd.getDigestLength()];
- while (maskLen > 0) {
- mgfMd.update(seed, seedOfs, seedLen);
- mgfMd.update(C);
-@@ -499,5 +537,4 @@
- }
- }
- }
--
- }
---- ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Tue Mar 18 12:35:25 2014 -0700
-@@ -68,7 +68,7 @@
-
- // performance optimization
- private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
-- EnumSet.of(CryptoPrimitive.SIGNATURE);
-+ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
-
- // supported pairs of signature and hash algorithm
- private final static Map<Integer, SignatureAndHashAlgorithm> supportedMap;
---- ./jdk/src/share/classes/sun/security/tools/JarSigner.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/tools/JarSigner.java Tue Mar 18 12:35:25 2014 -0700
-@@ -88,9 +88,6 @@
-
- private static final String META_INF = "META-INF/";
-
-- // prefix for new signature-related files in META-INF directory
-- private static final String SIG_PREFIX = META_INF + "SIG-";
--
- private static final Class[] PARAM_STRING = { String.class };
-
- private static final String NONE = "NONE";
-@@ -1516,22 +1513,7 @@
- * . META-INF/*.EC
- */
- private boolean signatureRelated(String name) {
-- String ucName = name.toUpperCase(Locale.ENGLISH);
-- if (ucName.equals(JarFile.MANIFEST_NAME) ||
-- ucName.equals(META_INF) ||
-- (ucName.startsWith(SIG_PREFIX) &&
-- ucName.indexOf("/") == ucName.lastIndexOf("/"))) {
-- return true;
-- }
--
-- if (ucName.startsWith(META_INF) &&
-- SignatureFileVerifier.isBlockOrSF(ucName)) {
-- // .SF/.DSA/.RSA/.EC files in META-INF subdirs
-- // are not considered signature-related
-- return (ucName.indexOf("/") == ucName.lastIndexOf("/"));
-- }
--
-- return false;
-+ return SignatureFileVerifier.isSigningRelated(name);
- }
-
- Map<CodeSigner,String> cacheForSignerInfo = new IdentityHashMap<>();
---- ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Tue Mar 18 12:35:25 2014 -0700
-@@ -153,6 +153,52 @@
- return false;
- }
-
-+ /**
-+ * Yet another utility method used by JarVerifier and JarSigner
-+ * to determine what files are signature related, which includes
-+ * the MANIFEST, SF files, known signature block files, and other
-+ * unknown signature related files (those starting with SIG- with
-+ * an optional [A-Z0-9]{1,3} extension right inside META-INF).
-+ *
-+ * @param s file name
-+ * @return true if the input file name is signature related
-+ */
-+ public static boolean isSigningRelated(String name) {
-+ name = name.toUpperCase(Locale.ENGLISH);
-+ if (!name.startsWith("META-INF/")) {
-+ return false;
-+ }
-+ name = name.substring(9);
-+ if (name.indexOf('/') != -1) {
-+ return false;
-+ }
-+ if (isBlockOrSF(name) || name.equals("MANIFEST.MF")) {
-+ return true;
-+ } else if (name.startsWith("SIG-")) {
-+ // check filename extension
-+ // see http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Digital_Signatures
-+ // for what filename extensions are legal
-+ int extIndex = name.lastIndexOf('.');
-+ if (extIndex != -1) {
-+ String ext = name.substring(extIndex + 1);
-+ // validate length first
-+ if (ext.length() > 3 || ext.length() < 1) {
-+ return false;
-+ }
-+ // then check chars, must be in [a-zA-Z0-9] per the jar spec
-+ for (int index = 0; index < ext.length(); index++) {
-+ char cc = ext.charAt(index);
-+ // chars are promoted to uppercase so skip lowercase checks
-+ if ((cc < 'A' || cc > 'Z') && (cc < '0' || cc > '9')) {
-+ return false;
-+ }
-+ }
-+ }
-+ return true; // no extension is OK
-+ }
-+ return false;
-+ }
-+
- /** get digest from cache */
-
- private MessageDigest getDigest(String algorithm)
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
- "Alma-Ata Summer Time", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
- "Anadyr Summer Time", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT",
- "Alma-Ata Sommerzeit", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT",
- "Anadyr Sommerzeit", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Aqtau Zeit", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT",
- "Hora de verano de Alma-Ata", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT",
- "Hora de verano de Anadyr", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Hora de Aqtau", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT",
- "Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT",
- "Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Heure d'Aqtau", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT",
- "Ora estiva di Alma-Ata", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT",
- "Ora estiva di Anadyr", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Ora di Aqtau", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"\u30a2\u30eb\u30de\u30a2\u30bf\u6642\u9593", "ALMT",
- "\u30a2\u30eb\u30de\u30a2\u30bf\u590f\u6642\u9593", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u6642\u9593", "ANAT",
- "\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u590f\u6642\u9593", "ANAST"}},
- {"Asia/Aqtau", new String[] {"\u30a2\u30af\u30bf\u30a6\u6642\u9593", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"\uc54c\ub9c8\uc544\ud0c0 \uc2dc\uac04", "ALMT",
- "\uc54c\ub9c8\uc544\ud0c0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"\uc544\ub098\ub514\ub974 \uc2dc\uac04", "ANAT",
- "\uc544\ub098\ub514\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ANAST"}},
- {"Asia/Aqtau", new String[] {"\uc545\ud0c0\uc6b0 \uc2dc\uac04", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Fuso hor\u00e1rio de Alma-Ata", "ALMT",
- "Fuso hor\u00e1rio de ver\u00e3o de Alma-Ata", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Fuso hor\u00e1rio de Anadyr", "ANAT",
- "Fuso hor\u00e1rio de ver\u00e3o de Anadyr", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Fuso hor\u00e1rio de Aqtau", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Alma-Ata, normaltid", "ALMT",
- "Alma-Ata, sommartid", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"Anadyr, normaltid", "ANAT",
- "Anadyr, sommartid", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Aqtau, normaltid", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Alma-Ata \u65f6\u95f4", "ALMT",
- "Alma-Ata \u590f\u4ee4\u65f6", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u65f6\u95f4", "ANAT",
- "\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u65f6", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Aqtau \u65f6\u95f4", "AQTT",
---- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -483,7 +483,7 @@
- {"Asia/Aden", ARAST},
- {"Asia/Almaty", new String[] {"Alma-Ata \u6642\u9593", "ALMT",
- "Alma-Ata \u590f\u4ee4\u6642\u9593", "ALMST"}},
-- {"Asia/Amman", ARAST},
-+ {"Asia/Amman", EET},
- {"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u6642\u9593", "ANAT",
- "\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u6642\u9593", "ANAST"}},
- {"Asia/Aqtau", new String[] {"Aqtau \u6642\u9593", "AQTT",
---- ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -4780,39 +4780,7 @@
- } else if (log_file[0] != '\0' && (errstrm = fopen(log_file,"a+")) != NULL) {
- return;
- } else {
-- char log_file_name[PATH_MAX+100];
-- char tmpdir[PATH_MAX];
--#ifdef WIN32
-- int n = GetTempPath(PATH_MAX,tmpdir); //API returns with trailing '\'
-- if (n < 1 || n > PATH_MAX) {
-- sprintf(tmpdir,"C:\\");
-- }
-- sprintf(log_file_name, "%sunpack.log", tmpdir);
--#else
-- sprintf(tmpdir,"/tmp");
-- sprintf(log_file_name, "/tmp/unpack.log");
--#endif
-- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
-- log_file = errstrm_name = saveStr(log_file_name);
-- return ;
-- }
--
-- char *tname = tempnam(tmpdir,"#upkg");
-- if (tname == NULL) return;
-- sprintf(log_file_name, "%s", tname);
-- ::free(tname);
-- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
-- log_file = errstrm_name = saveStr(log_file_name);
-- return ;
-- }
--#ifndef WIN32
-- sprintf(log_file_name, "/dev/null");
-- // On windows most likely it will fail.
-- if ( (errstrm = fopen(log_file_name, "a+")) != NULL) {
-- log_file = errstrm_name = saveStr(log_file_name);
-- return ;
-- }
--#endif
-+ fprintf(stderr, "Can not open log file %s\n", log_file);
- // Last resort
- // (Do not use stdout, since it might be jarout->jarfp.)
- errstrm = stderr;
---- ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Tue Mar 18 12:35:25 2014 -0700
-@@ -435,9 +435,7 @@
- Private->PixelCount = (long)GifFile->Image.Width *
- (long)GifFile->Image.Height;
-
-- DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
--
-- return GIF_OK;
-+ return DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
- }
-
- /******************************************************************************
---- ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Tue Mar 18 12:35:25 2014 -0700
-@@ -249,6 +249,7 @@
- /* fill the block */
- len = (*env)->CallIntMethod(env, this, readID,
- blockh, remain, blockLength + 1);
-+ if (len > blockLength + 1) len = blockLength + 1;
- if ((*env)->ExceptionOccurred(env)) {
- return 0;
- }
---- ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Tue Mar 18 12:35:25 2014 -0700
-@@ -939,6 +939,9 @@
- JPEGImageReader_readInputDataID,
- sb->hstreamBuffer, 0,
- sb->bufferLength);
-+ if ((ret > 0) && ((unsigned int)ret > sb->bufferLength)) {
-+ ret = sb->bufferLength;
-+ }
- if ((*env)->ExceptionOccurred(env)
- || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
- cinfo->err->error_exit((j_common_ptr) cinfo);
-@@ -1035,6 +1038,7 @@
- JPEGImageReader_readInputDataID,
- sb->hstreamBuffer,
- offset, buflen);
-+ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
- if ((*env)->ExceptionOccurred(env)
- || !GET_ARRAYS(env, data, &(src->next_input_byte))) {
- cinfo->err->error_exit((j_common_ptr) cinfo);
---- ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Tue Mar 18 12:35:25 2014 -0700
-@@ -349,6 +349,12 @@
-
- TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
- compptr->dc_tbl_no, compptr->ac_tbl_no);
-+
-+ /* This CSi (cc) should differ from the previous CSi */
-+ for (ci = 0; ci < i; ci++) {
-+ if (cinfo->cur_comp_info[ci] == compptr)
-+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
-+ }
- }
-
- /* Collect the additional scan parameters Ss, Se, Ah/Al. */
---- ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Tue Mar 18 12:35:25 2014 -0700
-@@ -289,6 +289,7 @@
- buflen = (*env)->GetArrayLength(env, src->hInputBuffer);
- ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
- src->hInputBuffer, 0, buflen);
-+ if (ret > buflen) ret = buflen;
- if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
- cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
- }
-@@ -349,6 +350,7 @@
- }
- ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
- src->hInputBuffer, offset, buflen);
-+ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
- if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
- cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
- }
-@@ -424,6 +426,7 @@
- ret = (*env)->CallIntMethod(env, src->hInputStream,
- InputStream_readID,
- src->hInputBuffer, 0, buflen);
-+ if (ret > buflen) ret = buflen;
- if ((*env)->ExceptionOccurred(env)) {
- cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
- }
---- ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Tue Mar 18 12:35:25 2014 -0700
-@@ -1862,6 +1862,9 @@
-
- info_ptr->bit_depth = 8;
- info_ptr->num_trans = 0;
-+
-+ if (png_ptr->palette == NULL)
-+ png_error (png_ptr, "Palette is NULL in indexed image");
- }
- else
- {
---- ./jdk/src/share/native/sun/awt/libpng/pngset.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/libpng/pngset.c Tue Mar 18 12:35:25 2014 -0700
-@@ -512,6 +512,17 @@
- }
- }
-
-+ if ((num_palette > 0 && palette == NULL) ||
-+ (num_palette == 0
-+# ifdef PNG_MNG_FEATURES_SUPPORTED
-+ && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
-+# endif
-+ ))
-+ {
-+ png_error(png_ptr, "Invalid palette");
-+ return;
-+ }
-+
- /* It may not actually be necessary to set png_ptr->palette here;
- * we do it for backward compatibility with the way the png_handle_tRNS
- * function used to do the allocation.
---- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue Mar 18 12:35:25 2014 -0700
-@@ -228,6 +228,49 @@
- }
- }
-
-+/*
-+ * We have to make sure that awt_setPixels can be safely applied to the given pair of
-+ * raster and mlib image.
-+ *
-+ * In particular, make sure that
-+ * - dimension is the same
-+ * - number of channels in mlib image corresponds to the number of bands in the raster
-+ * - sample size in image and raster are the same.
-+ *
-+ * Returns:
-+ * -1 to indicate failure,
-+ * 1 to indicate success
-+ */
-+static int setPixelsFormMlibImage(JNIEnv *env, RasterS_t *rasterP, mlib_image* img) {
-+ if (rasterP->width != img->width || rasterP->height != img->height) {
-+ /* dimension does not match */
-+ return -1;
-+ }
-+
-+ if (rasterP->numBands != img->channels) {
-+ /* number of bands does not match */
-+ return -1;
-+ }
-+
-+ switch (rasterP->dataType) {
-+ case BYTE_DATA_TYPE:
-+ if (img->type != MLIB_BYTE) {
-+ return -1;
-+ }
-+ break;
-+ case SHORT_DATA_TYPE:
-+ if (img->type != MLIB_SHORT && img->type != MLIB_USHORT) {
-+ return -1;
-+ }
-+ break;
-+ default:
-+ /* awt_setPixels does not support such rasters */
-+ return -1;
-+ }
-+
-+ return awt_setPixels(env, rasterP, mlib_ImageGetData(img));
-+}
-+
- /***************************************************************************
- * External Functions *
- ***************************************************************************/
-@@ -700,7 +743,9 @@
-
- /* Means that we couldn't write directly into the destination buffer */
- if (ddata == NULL) {
-- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
-+ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
-+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
-+ }
- }
-
- /* Release the pinned memory */
-@@ -1106,7 +1151,7 @@
- if (ddata == NULL) {
- /* Need to store it back into the array */
- if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
-- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
-+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
- }
- }
-
-@@ -1432,6 +1477,14 @@
- retStatus = 0;
- }
-
-+ /* Release the LUT */
-+ for (i=0; i < lut_nbands; i++) {
-+ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
-+ (jbyte *) jtable[i].table, JNI_ABORT);
-+ }
-+ free ((void *) jtable);
-+ free ((void *) tbl);
-+
- /*
- * Means that we couldn't write directly into
- * the destination buffer
-@@ -1445,13 +1498,6 @@
- }
- }
-
-- /* Release the LUT */
-- for (i=0; i < lut_nbands; i++) {
-- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
-- (jbyte *) jtable[i].table, JNI_ABORT);
-- }
-- free ((void *) jtable);
-- free ((void *) tbl);
-
- /* Release the pinned memory */
- freeArray(env, srcImageP, src, sdata, dstImageP, dst, ddata);
-@@ -1669,18 +1715,20 @@
- retStatus = 0;
- }
-
-+ /* Release the LUT */
-+ for (i=0; i < lut_nbands; i++) {
-+ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
-+ (jbyte *) jtable[i].table, JNI_ABORT);
-+ }
-+
- /*
- * Means that we couldn't write directly into
- * the destination buffer
- */
- if (ddata == NULL) {
-- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
-- }
--
-- /* Release the LUT */
-- for (i=0; i < lut_nbands; i++) {
-- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
-- (jbyte *) jtable[i].table, JNI_ABORT);
-+ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
-+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
-+ }
- }
-
- /* Release the pinned memory */
-@@ -2640,7 +2688,7 @@
- }
- }
- else if (mlibImP->type == MLIB_SHORT) {
-- return awt_setPixels(env, rasterP, mlibImP->data);
-+ return setPixelsFormMlibImage(env, rasterP, mlibImP);
- }
- }
- else {
---- ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -154,6 +154,7 @@
- TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
- if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) {
- LEReferenceToArrayOf<LookupValue> valueArray(lookupTable8, success, &lookupTable8->valueArray[0], glyphCount);
-+ if (LE_FAILURE(success)) { return newGlyph; }
- newGlyph = SWAPW(valueArray(glyphCode - firstGlyph, success));
- }
- }
---- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -110,6 +110,8 @@
- LEErrorCode &success,
- le_bool backtrack)
- {
-+ if (LE_FAILURE(success)) { return FALSE; }
-+
- le_int32 direction = 1;
- le_int32 match = 0;
-
-@@ -255,6 +257,7 @@
- le_uint16 matchCount = SWAPW(subRuleTable->glyphCount) - 1;
- le_uint16 substCount = SWAPW(subRuleTable->substCount);
- LEReferenceToArrayOf<TTGlyphID> inputGlyphArray(base, success, subRuleTable->inputGlyphArray, matchCount+2);
-+ if (LE_FAILURE(success)) { return 0; }
- if (matchGlyphIDs(inputGlyphArray, matchCount, glyphIterator)) {
- LEReferenceToArrayOf<SubstitutionLookupRecord>
- substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount], substCount);
-@@ -315,6 +318,7 @@
-
- LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1);
-
-+ if (LE_FAILURE(success)) { return 0; }
- if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) {
- LEReferenceToArrayOf<SubstitutionLookupRecord>
- substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount);
-@@ -573,7 +577,7 @@
- if (matchGlyphClasses(inputClassArray, inputGlyphCount, glyphIterator, inputClassDefinitionTable, success)) {
- LEReferenceToArrayOf<SubstitutionLookupRecord>
- substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) lookaheadClassArray.getAlias(lookaheadGlyphCount + 1, success), substCount);
--
-+ if (LE_FAILURE(success)) { return 0; }
- applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
-
- return inputGlyphCount + 1;
-@@ -601,6 +605,7 @@
- le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount);
- le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]);
- LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset
-+ if (LE_FAILURE(success)) { return 0; }
- const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]);
-
- if( LE_FAILURE(success) ) { return 0; }
---- ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -95,7 +95,7 @@
-
- if (actionOffset != 0) {
- LEReferenceTo<LigatureActionEntry> ap(stHeader, success, ligActionOffset); // byte offset
-- ap.addObject(ligActionIndex - 1, success); // index offset ( one before the actual start, because we will pre-increment)
-+ ap.addObject(ligActionIndex, success);
- LEReferenceToArrayOf<TTGlyphID> ligatureTable(stHeader, success, ligatureOffset, LE_UNBOUNDED_ARRAY);
- LigatureActionEntry action;
- le_int32 offset, i = 0;
-@@ -111,7 +111,6 @@
- do {
- le_uint32 componentGlyph = componentStack[m--]; // pop off
-
-- ap.addObject(success);
- action = SWAPL(*ap.getAlias());
-
- if (m < 0) {
-@@ -145,7 +144,8 @@
- LE_DEBUG_BAD_FONT("m<0")
- }
- #endif
-- } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
-+ ap.addObject(success);
-+ } while (LE_SUCCESS(success) && !(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
-
- while (mm >= 0) {
- if (++m >= nComponents) {
---- ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -282,6 +282,7 @@
-
- for (le_uint16 feature = 0; feature < featureCount; feature += 1) {
- LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
-+ if (LE_FAILURE(success)) { continue; }
- le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success));
-
- // don't add the required feature to the list more than once...
---- ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -67,6 +67,7 @@
-
- LEPoint markAnchor;
- LEReferenceTo<MarkArray> markArray(base, success, (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)));
-+ if(LE_FAILURE(success)) return 0;
- le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success);
- le_uint16 mcCount = SWAPW(classCount);
-
---- ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -79,8 +79,8 @@
-
- Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success)
- {
-+ if(LE_FAILURE(success)) return 0;
- const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias();
-- if(LE_FAILURE(success)) return 0;
-
- le_uint32 recordCount = records.getCount();
- le_uint8 bit = highBit(recordCount);
---- ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -73,6 +73,7 @@
-
- if (offset != 0) {
- LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY);
-+ if (LE_FAILURE(success)) { continue; }
- TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success));
- glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
- }
---- ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -97,6 +97,7 @@
-
- LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY);
- EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success);
-+ if (LE_FAILURE(success)) { break; }
- LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
- currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex);
- LE_STATE_PATIENCE_INCR(currGlyph);
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Tue Mar 18 12:35:25 2014 -0700
-@@ -81,7 +81,7 @@
- cmsUInt32Number surround;
- cmsFloat64Number n, Nbb, Ncb, z, FL, D;
-
-- cmsContext ContextID;
-+ cmsContext ContextID;
-
- } cmsCIECAM02;
-
-@@ -467,6 +467,7 @@
- CAM02COLOR clr;
- cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
-
-+ memset(&clr, 0, sizeof(clr));
- _cmsAssert(lpMod != NULL);
- _cmsAssert(pIn != NULL);
- _cmsAssert(pOut != NULL);
-@@ -491,6 +492,7 @@
- CAM02COLOR clr;
- cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
-
-+ memset(&clr, 0, sizeof(clr));
- _cmsAssert(lpMod != NULL);
- _cmsAssert(pIn != NULL);
- _cmsAssert(pOut != NULL);
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Tue Mar 18 12:35:25 2014 -0700
-@@ -59,8 +59,8 @@
- // IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
-
-
--#define MAXID 128 // Max lenght of identifier
--#define MAXSTR 1024 // Max lenght of string
-+#define MAXID 128 // Max length of identifier
-+#define MAXSTR 1024 // Max length of string
- #define MAXTABLES 255 // Max Number of tables in a single stream
- #define MAXINCLUDE 20 // Max number of nested includes
-
-@@ -383,28 +383,28 @@
- //Forward declaration of some internal functions
- static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);
-
--// Checks if c is a separator
-+// Checks whatever c is a separator
- static
- cmsBool isseparator(int c)
- {
-- return (c == ' ') || (c == '\t') || (c == '\r');
-+ return (c == ' ') || (c == '\t') ;
- }
-
--// Checks whatever if c is a valid identifier char
-+// Checks whatever c is a valid identifier char
- static
- cmsBool ismiddle(int c)
- {
- return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
- }
-
--// Checks whatsever if c is a valid identifier middle char.
-+// Checks whatsever c is a valid identifier middle char.
- static
- cmsBool isidchar(int c)
- {
- return isalnum(c) || ismiddle(c);
- }
-
--// Checks whatsever if c is a valid identifier first char.
-+// Checks whatsever c is a valid identifier first char.
- static
- cmsBool isfirstidchar(int c)
- {
-@@ -436,7 +436,6 @@
- }
-
-
--
- // Makes a file path based on a given reference path
- // NOTE: this function doesn't check if the path exists or even if it's legal
- static
-@@ -634,6 +633,9 @@
- cmsFloat64Number dnum = 0.0;
- int sign = 1;
-
-+ // keep safe
-+ if (Buffer == NULL) return 0.0;
-+
- if (*Buffer == '-' || *Buffer == '+') {
-
- sign = (*Buffer == '-') ? -1 : 1;
-@@ -867,6 +869,14 @@
-
-
- // Next line
-+ case '\r':
-+ NextCh(it8);
-+ if (it8 ->ch == '\n')
-+ NextCh(it8);
-+ it8->sy = SEOLN;
-+ it8->lineno++;
-+ break;
-+
- case '\n':
- NextCh(it8);
- it8->sy = SEOLN;
-@@ -876,7 +886,7 @@
- // Comment
- case '#':
- NextCh(it8);
-- while (it8->ch && it8->ch != '\n')
-+ while (it8->ch && it8->ch != '\n' && it8->ch != '\r')
- NextCh(it8);
-
- it8->sy = SCOMMENT;
-@@ -994,6 +1004,9 @@
- {
- switch (it8->sy) {
-
-+ case SEOLN: // Empty value
-+ Buffer[0]=0;
-+ break;
- case SIDENT: strncpy(Buffer, it8->id, max);
- Buffer[max-1]=0;
- break;
-@@ -1143,9 +1156,9 @@
- if (*Key != '#') { // Comments are ignored
-
- if (cmsstrcasecmp(Key, p->Keyword) == 0)
-- break;
-+ break;
- }
-- }
-+ }
-
- if (p == NULL)
- return FALSE;
-@@ -1155,11 +1168,13 @@
-
- for (; p != NULL; p = p->NextSubkey) {
-
-+ if (p ->Subkey == NULL) continue;
-+
- if (LastPtr) *LastPtr = p;
-
- if (cmsstrcasecmp(Subkey, p->Subkey) == 0)
-- return TRUE;
-- }
-+ return TRUE;
-+ }
-
- return FALSE;
- }
-@@ -1282,7 +1297,7 @@
-
- it8 ->nTable = nTable;
-
-- return nTable;
-+ return (cmsInt32Number) nTable;
- }
-
-
-@@ -1387,7 +1402,7 @@
- cmsIT8* it8 = (cmsIT8*) hIT8;
- char Buffer[1024];
-
-- sprintf(Buffer, "%d", Val);
-+ sprintf(Buffer, "%u", Val);
-
- return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;
- }
-@@ -1424,6 +1439,8 @@
- {
- const char *v = cmsIT8GetProperty(hIT8, cProp);
-
-+ if (v == NULL) return 0.0;
-+
- return ParseFloatNumber(v);
- }
-
-@@ -1456,7 +1473,7 @@
- t -> nSamples = 10;
- }
-
-- t -> DataFormat = (char**) AllocChunk (it8, (t->nSamples + 1) * sizeof(char *));
-+ t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));
- if (t->DataFormat == NULL) {
-
- SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
-@@ -1512,7 +1529,7 @@
- t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
- t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
-
-- t-> Data = (char**)AllocChunk (it8, (t->nSamples + 1) * (t->nPatches + 1) *sizeof (char*));
-+ t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));
- if (t->Data == NULL) {
-
- SynError(it8, "AllocateDataSet: Unable to allocate data array");
-@@ -1571,7 +1588,7 @@
- if (str == NULL)
- str = " ";
-
-- // Lenghth to write
-+ // Length to write
- len = (cmsUInt32Number) strlen(str);
- f ->Used += len;
-
-@@ -2095,7 +2112,7 @@
- NextCh(it8);
-
- // If a newline is found, then this is a type string
-- if (it8 ->ch == '\n') {
-+ if (it8 ->ch == '\n' || it8->ch == '\r') {
-
- cmsIT8SetSheetType(it8, it8 ->id);
- InSymbol(it8);
-@@ -2210,7 +2227,7 @@
- char Buffer[256];
-
- char *Type = p ->Value;
-- int nTable = k;
-+ int nTable = (int) k;
-
- snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
-
-@@ -2564,6 +2581,8 @@
-
- Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
-
-+ if (Buffer == NULL) return 0.0;
-+
- return ParseFloatNumber(Buffer);
- }
-
-@@ -2776,7 +2795,7 @@
- if (Formatter == NULL)
- strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
- else
-- strcpy(it8->DoubleFormatter, Formatter);
-+ strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));
-
- it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;
- }
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Tue Mar 18 12:35:25 2014 -0700
-@@ -270,7 +270,7 @@
- // m2 holds CHAD from output white to D50 times abs. col. scaling
-
- // Observer is not adapted, undo the chromatic adaptation
-- _cmsMAT3per(m, &m3, ChromaticAdaptationMatrixOut);
-+ _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);
-
- m3 = *ChromaticAdaptationMatrixIn;
- if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;
-@@ -411,57 +411,61 @@
- // Handle PCS mismatches. A specialized stage is added to the LUT in such case
- switch (InPCS) {
-
-- case cmsSigXYZData: // Input profile operates in XYZ
-+ case cmsSigXYZData: // Input profile operates in XYZ
-
-- switch (OutPCS) {
-+ switch (OutPCS) {
-
-- case cmsSigXYZData: // XYZ -> XYZ
-- if (!IsEmptyLayer(m, off))
-- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
-- break;
-+ case cmsSigXYZData: // XYZ -> XYZ
-+ if (!IsEmptyLayer(m, off) &&
-+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
-+ return FALSE;
-+ break;
-
-- case cmsSigLabData: // XYZ -> Lab
-- if (!IsEmptyLayer(m, off))
-- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
-- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
-- break;
-+ case cmsSigLabData: // XYZ -> Lab
-+ if (!IsEmptyLayer(m, off) &&
-+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
-+ return FALSE;
-+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
-+ return FALSE;
-+ break;
-
-- default:
-- return FALSE; // Colorspace mismatch
-- }
-- break;
-+ default:
-+ return FALSE; // Colorspace mismatch
-+ }
-+ break;
-
-+ case cmsSigLabData: // Input profile operates in Lab
-
-- case cmsSigLabData: // Input profile operates in Lab
-+ switch (OutPCS) {
-
-- switch (OutPCS) {
-+ case cmsSigXYZData: // Lab -> XYZ
-
-- case cmsSigXYZData: // Lab -> XYZ
-+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))
-+ return FALSE;
-+ if (!IsEmptyLayer(m, off) &&
-+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
-+ return FALSE;
-+ break;
-
-- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
-- if (!IsEmptyLayer(m, off))
-- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
-- break;
-+ case cmsSigLabData: // Lab -> Lab
-
-- case cmsSigLabData: // Lab -> Lab
--
-- if (!IsEmptyLayer(m, off)) {
-- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
-- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
-- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
-- }
-- break;
--
-- default:
-- return FALSE; // Mismatch
-+ if (!IsEmptyLayer(m, off)) {
-+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||
-+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||
-+ !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
-+ return FALSE;
- }
- break;
-
-+ default:
-+ return FALSE; // Mismatch
-+ }
-+ break;
-
-- // On colorspaces other than PCS, check for same space
-- default:
-- if (InPCS != OutPCS) return FALSE;
-- break;
-+ // On colorspaces other than PCS, check for same space
-+ default:
-+ if (InPCS != OutPCS) return FALSE;
-+ break;
- }
-
- return TRUE;
-@@ -497,7 +501,8 @@
- cmsFloat64Number AdaptationStates[],
- cmsUInt32Number dwFlags)
- {
-- cmsPipeline* Lut, *Result;
-+ cmsPipeline* Lut = NULL;
-+ cmsPipeline* Result;
- cmsHPROFILE hProfile;
- cmsMAT3 m;
- cmsVEC3 off;
-@@ -593,8 +598,11 @@
- }
-
- // Concatenate to the output LUT
-- cmsPipelineCat(Result, Lut);
-+ if (!cmsPipelineCat(Result, Lut))
-+ goto Error;
-+
- cmsPipelineFree(Lut);
-+ Lut = NULL;
-
- // Update current space
- CurrentColorSpace = ColorSpaceOut;
-@@ -604,6 +612,7 @@
-
- Error:
-
-+ if (Lut != NULL) cmsPipelineFree(Lut);
- if (Result != NULL) cmsPipelineFree(Result);
- return NULL;
-
-@@ -742,7 +751,8 @@
- if (CLUT == NULL) goto Error;
-
- // This is the one and only MPE in this LUT
-- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
-+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
-+ goto Error;
-
- // Sample it. We cannot afford pre/post linearization this time.
- if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))
-@@ -959,7 +969,8 @@
- CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
- if (CLUT == NULL) goto Cleanup;
-
-- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
-+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
-+ goto Cleanup;
-
- cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);
-
-@@ -1057,7 +1068,7 @@
- }
-
- // The plug-in registration. User can add new intents or override default routines
--cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;
- cmsIntentsList* fl;
-@@ -1072,7 +1083,7 @@
- fl = SearchIntent(Plugin ->Intent);
-
- if (fl == NULL) {
-- fl = (cmsIntentsList*) _cmsPluginMalloc(sizeof(cmsIntentsList));
-+ fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));
- if (fl == NULL) return FALSE;
- }
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Tue Mar 18 12:35:25 2014 -0700
-@@ -302,8 +302,6 @@
- return NULL;
- }
-
--
--
- chunk ->BlockSize = Initial;
- chunk ->Used = 0;
- chunk ->next = NULL;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Tue Mar 18 12:35:25 2014 -0700
-@@ -30,7 +30,7 @@
- //---------------------------------------------------------------------------------
- //
- // Little Color Management System
--// Copyright (c) 1998-2012 Marti Maria Saguer
-+// Copyright (c) 1998-2013 Marti Maria Saguer
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -99,7 +99,7 @@
- static _cmsParametricCurvesCollection* ParametricCurves = &DefaultCurves;
-
- // As a way to install new parametric curves
--cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;
- _cmsParametricCurvesCollection* fl;
-@@ -110,7 +110,7 @@
- return TRUE;
- }
-
-- fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(sizeof(_cmsParametricCurvesCollection));
-+ fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(id, sizeof(_cmsParametricCurvesCollection));
- if (fl == NULL) return FALSE;
-
- // Copy the parameters
-@@ -258,7 +258,8 @@
- }
-
- p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);
-- return p;
-+ if (p->InterpParams != NULL)
-+ return p;
-
- Error:
- if (p -> Segments) _cmsFree(ContextID, p ->Segments);
-@@ -423,7 +424,7 @@
- if (e > 0)
- Val = pow(e, Params[0]) + Params[5];
- else
-- Val = 0;
-+ Val = Params[5];
- }
- else
- Val = R*Params[3] + Params[6];
-@@ -458,7 +459,7 @@
- e = Params[1]*R + Params[2];
-
- if (e < 0)
-- Val = 0;
-+ Val = Params[3];
- else
- Val = pow(e, Params[0]) + Params[3];
- break;
-@@ -478,7 +479,7 @@
-
- e = Params[2] * pow(R, Params[0]) + Params[3];
- if (e <= 0)
-- Val = 0;
-+ Val = Params[4];
- else
- Val = Params[1]*log10(e) + Params[4];
- break;
-@@ -544,7 +545,7 @@
- // Type == 0 means segment is sampled
- if (g ->Segments[i].Type == 0) {
-
-- cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0);
-+ cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
- cmsFloat32Number Out;
-
- // Setup the table (TODO: clean that)
-@@ -629,20 +630,21 @@
- // Use a segmented curve to store the floating point table
- cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])
- {
-- cmsCurveSegment Seg[2];
-+ cmsCurveSegment Seg[3];
-
-- // Initialize segmented curve part up to 0
-- Seg[0].x0 = -1;
-+ // A segmented tone curve should have function segments in the first and last positions
-+ // Initialize segmented curve part up to 0 to constant value = samples[0]
-+ Seg[0].x0 = MINUS_INF;
- Seg[0].x1 = 0;
- Seg[0].Type = 6;
-
- Seg[0].Params[0] = 1;
- Seg[0].Params[1] = 0;
- Seg[0].Params[2] = 0;
-- Seg[0].Params[3] = 0;
-+ Seg[0].Params[3] = values[0];
- Seg[0].Params[4] = 0;
-
-- // From zero to any
-+ // From zero to 1
- Seg[1].x0 = 0;
- Seg[1].x1 = 1.0;
- Seg[1].Type = 0;
-@@ -650,7 +652,19 @@
- Seg[1].nGridPoints = nEntries;
- Seg[1].SampledPoints = (cmsFloat32Number*) values;
-
-- return cmsBuildSegmentedToneCurve(ContextID, 2, Seg);
-+ // Final segment is constant = lastsample
-+ Seg[2].x0 = 1.0;
-+ Seg[2].x1 = PLUS_INF;
-+ Seg[2].Type = 6;
-+
-+ Seg[2].Params[0] = 1;
-+ Seg[2].Params[1] = 0;
-+ Seg[2].Params[2] = 0;
-+ Seg[2].Params[3] = values[nEntries-1];
-+ Seg[2].Params[4] = 0;
-+
-+
-+ return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);
- }
-
- // Parametric curves
-@@ -993,7 +1007,7 @@
-
- if (Tab == NULL) return FALSE;
-
-- if (cmsIsToneCurveLinear(Tab)) return FALSE; // Nothing to do
-+ if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do
-
- nItems = Tab -> nEntries;
-
-@@ -1020,11 +1034,20 @@
-
- if (z[i] == 0.) Zeros++;
- if (z[i] >= 65535.) Poles++;
-- if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
-+ if (z[i] < z[i-1]) {
-+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic.");
-+ return FALSE;
-+ }
- }
-
-- if (Zeros > (nItems / 3)) return FALSE; // Degenerated, mostly zeros
-- if (Poles > (nItems / 3)) return FALSE; // Degenerated, mostly poles
-+ if (Zeros > (nItems / 3)) {
-+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros.");
-+ return FALSE;
-+ }
-+ if (Poles > (nItems / 3)) {
-+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles.");
-+ return FALSE;
-+ }
-
- // Seems ok
- for (i=0; i < nItems; i++) {
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Tue Mar 18 12:35:25 2014 -0700
-@@ -249,13 +249,10 @@
- cmsFloat64Number dE1, dE2, ErrorRatio;
-
- // Assume in-gamut by default.
-- dE1 = 0.;
-- dE2 = 0;
- ErrorRatio = 1.0;
-
- // Convert input to Lab
-- if (t -> hInput != NULL)
-- cmsDoTransform(t -> hInput, In, &LabIn1, 1);
-+ cmsDoTransform(t -> hInput, In, &LabIn1, 1);
-
- // converts from PCS to colorant. This always
- // does return in-gamut values,
-@@ -267,7 +264,7 @@
- memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
-
- // Try again, but this time taking Check as input
-- cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
-+ cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
- cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
-
- // Take difference of direct value
-@@ -374,7 +371,7 @@
- ProfileList[nGamutPCSposition] = hLab;
- BPCList[nGamutPCSposition] = 0;
- AdaptationList[nGamutPCSposition] = 1.0;
-- Intents[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
-+ IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
-
-
- ColorSpace = cmsGetColorSpace(hGamut);
-@@ -385,45 +382,48 @@
-
- // 16 bits to Lab double
- Chain.hInput = cmsCreateExtendedTransform(ContextID,
-- nGamutPCSposition + 1,
-- ProfileList,
-- BPCList,
-- Intents,
-- AdaptationList,
-- NULL, 0,
-- dwFormat, TYPE_Lab_DBL,
-- cmsFLAGS_NOCACHE);
-+ nGamutPCSposition + 1,
-+ ProfileList,
-+ BPCList,
-+ IntentList,
-+ AdaptationList,
-+ NULL, 0,
-+ dwFormat, TYPE_Lab_DBL,
-+ cmsFLAGS_NOCACHE);
-
-
- // Does create the forward step. Lab double to device
- dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
- Chain.hForward = cmsCreateTransformTHR(ContextID,
-- hLab, TYPE_Lab_DBL,
-- hGamut, dwFormat,
-- INTENT_RELATIVE_COLORIMETRIC,
-- cmsFLAGS_NOCACHE);
-+ hLab, TYPE_Lab_DBL,
-+ hGamut, dwFormat,
-+ INTENT_RELATIVE_COLORIMETRIC,
-+ cmsFLAGS_NOCACHE);
-
- // Does create the backwards step
- Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
-- hLab, TYPE_Lab_DBL,
-- INTENT_RELATIVE_COLORIMETRIC,
-- cmsFLAGS_NOCACHE);
-+ hLab, TYPE_Lab_DBL,
-+ INTENT_RELATIVE_COLORIMETRIC,
-+ cmsFLAGS_NOCACHE);
-
-
- // All ok?
-- if (Chain.hForward && Chain.hReverse) {
-+ if (Chain.hInput && Chain.hForward && Chain.hReverse) {
-
- // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
- // dE when doing a transform back and forth on the colorimetric intent.
-
- Gamut = cmsPipelineAlloc(ContextID, 3, 1);
--
- if (Gamut != NULL) {
-
-- CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
-- cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT);
--
-- cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
-+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
-+ if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
-+ cmsPipelineFree(Gamut);
-+ Gamut = NULL;
-+ }
-+ else {
-+ cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
-+ }
- }
- }
- else
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Tue Mar 18 12:35:25 2014 -0700
-@@ -83,7 +83,6 @@
-
-
- // Set the interpolation method
--
- cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p)
- {
- // Invoke factory, possibly in the Plug-in
-@@ -215,6 +214,11 @@
- Output[0] = LinearInterp(rest, y0, y1);
- }
-
-+// To prevent out of bounds indexing
-+cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v)
-+{
-+ return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);
-+}
-
- // Floating-point version of 1D interpolation
- static
-@@ -227,13 +231,15 @@
- int cell0, cell1;
- const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
-
-+ val2 = fclamp(Value[0]);
-+
- // if last value...
-- if (Value[0] == 1.0) {
-+ if (val2 == 1.0) {
- Output[0] = LutTable[p -> Domain[0]];
- return;
- }
-
-- val2 = p -> Domain[0] * Value[0];
-+ val2 *= p -> Domain[0];
-
- cell0 = (int) floor(val2);
- cell1 = (int) ceil(val2);
-@@ -292,13 +298,15 @@
- cmsUInt32Number OutChan;
- const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
-
-+ val2 = fclamp(Value[0]);
-+
- // if last value...
-- if (Value[0] == 1.0) {
-+ if (val2 == 1.0) {
- Output[0] = LutTable[p -> Domain[0]];
- return;
- }
-
-- val2 = p -> Domain[0] * Value[0];
-+ val2 *= p -> Domain[0];
-
- cell0 = (int) floor(val2);
- cell1 = (int) ceil(val2);
-@@ -339,8 +347,8 @@
- dxy;
-
- TotalOut = p -> nOutputs;
-- px = Input[0] * p->Domain[0];
-- py = Input[1] * p->Domain[1];
-+ px = fclamp(Input[0]) * p->Domain[0];
-+ py = fclamp(Input[1]) * p->Domain[1];
-
- x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
- y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
-@@ -454,20 +462,9 @@
- TotalOut = p -> nOutputs;
-
- // We need some clipping here
-- px = Input[0];
-- py = Input[1];
-- pz = Input[2];
--
-- if (px < 0) px = 0;
-- if (px > 1) px = 1;
-- if (py < 0) py = 0;
-- if (py > 1) py = 1;
-- if (pz < 0) pz = 0;
-- if (pz > 1) pz = 1;
--
-- px *= p->Domain[0];
-- py *= p->Domain[1];
-- pz *= p->Domain[2];
-+ px = fclamp(Input[0]) * p->Domain[0];
-+ py = fclamp(Input[1]) * p->Domain[1];
-+ pz = fclamp(Input[2]) * p->Domain[2];
-
- x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
- y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
-@@ -609,20 +606,9 @@
- TotalOut = p -> nOutputs;
-
- // We need some clipping here
-- px = Input[0];
-- py = Input[1];
-- pz = Input[2];
--
-- if (px < 0) px = 0;
-- if (px > 1) px = 1;
-- if (py < 0) py = 0;
-- if (py > 1) py = 1;
-- if (pz < 0) pz = 0;
-- if (pz > 1) pz = 1;
--
-- px *= p->Domain[0];
-- py *= p->Domain[1];
-- pz *= p->Domain[2];
-+ px = fclamp(Input[0]) * p->Domain[0];
-+ py = fclamp(Input[1]) * p->Domain[1];
-+ pz = fclamp(Input[2]) * p->Domain[2];
-
- x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);
- y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);
-@@ -844,7 +830,7 @@
- register cmsUInt16Number Output[],
- register const cmsInterpParams* p16)
- {
-- const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
-+ const cmsUInt16Number* LutTable;
- cmsS15Fixed16Number fk;
- cmsS15Fixed16Number k0, rk;
- int K0, K1;
-@@ -1039,8 +1025,7 @@
- cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
- cmsInterpParams p1;
-
--
-- pk = Input[0] * p->Domain[0];
-+ pk = fclamp(Input[0]) * p->Domain[0];
- k0 = _cmsQuickFloor(pk);
- rest = pk - (cmsFloat32Number) k0;
-
-@@ -1127,7 +1112,7 @@
- cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
- cmsInterpParams p1;
-
-- pk = Input[0] * p->Domain[0];
-+ pk = fclamp(Input[0]) * p->Domain[0];
- k0 = _cmsQuickFloor(pk);
- rest = pk - (cmsFloat32Number) k0;
-
-@@ -1214,7 +1199,7 @@
- cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
- cmsInterpParams p1;
-
-- pk = Input[0] * p->Domain[0];
-+ pk = fclamp(Input[0]) * p->Domain[0];
- k0 = _cmsQuickFloor(pk);
- rest = pk - (cmsFloat32Number) k0;
-
-@@ -1299,7 +1284,7 @@
- cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
- cmsInterpParams p1;
-
-- pk = Input[0] * p->Domain[0];
-+ pk = fclamp(Input[0]) * p->Domain[0];
- k0 = _cmsQuickFloor(pk);
- rest = pk - (cmsFloat32Number) k0;
-
-@@ -1384,7 +1369,7 @@
- cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
- cmsInterpParams p1;
-
-- pk = Input[0] * p->Domain[0];
-+ pk = fclamp(Input[0]) * p->Domain[0];
- k0 = _cmsQuickFloor(pk);
- rest = pk - (cmsFloat32Number) k0;
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Tue Mar 18 12:35:25 2014 -0700
-@@ -154,7 +154,6 @@
- return iohandler;
-
- Error:
-- if (fm) _cmsFree(ContextID, fm);
- if (iohandler) _cmsFree(ContextID, iohandler);
- return NULL;
-
-@@ -223,12 +222,17 @@
-
- // Writes data to memory, also keeps used space for further reference.
- static
--cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
-+cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
- {
- FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
-
- if (ResData == NULL) return FALSE; // Housekeeping
-
-+ // Check for available space. Clip.
-+ if (iohandler ->UsedSpace + size > ResData->Size) {
-+ size = ResData ->Size - iohandler ->UsedSpace;
-+ }
-+
- if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing
-
- memmove(ResData ->Block + ResData ->Pointer, Ptr, size);
-@@ -389,13 +393,15 @@
- return TRUE;
- }
-
--// Create a iohandler for disk based files. if FileName is NULL, then 'stream' member is also set
--// to NULL and no real writting is performed. This only happens in writting access mode
-+// Create a iohandler for disk based files.
- cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)
- {
- cmsIOHANDLER* iohandler = NULL;
- FILE* fm = NULL;
-
-+ _cmsAssert(FileName != NULL);
-+ _cmsAssert(AccessMode != NULL);
-+
- iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
- if (iohandler == NULL) return NULL;
-
-@@ -432,11 +438,8 @@
- iohandler ->UsedSpace = 0;
-
- // Keep track of the original file
-- if (FileName != NULL) {
--
-- strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
-- iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
-- }
-+ strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
-+ iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
-
- iohandler ->Read = FileRead;
- iohandler ->Seek = FileSeek;
-@@ -616,6 +619,31 @@
- return _cmsSearchTag(Icc, sig, FALSE) >= 0;
- }
-
-+/*
-+ * Enforces that the profile version is per. spec.
-+ * Operates on the big endian bytes from the profile.
-+ * Called before converting to platform endianness.
-+ * Byte 0 is BCD major version, so max 9.
-+ * Byte 1 is 2 BCD digits, one per nibble.
-+ * Reserved bytes 2 & 3 must be 0.
-+ */
-+static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
-+{
-+ cmsUInt8Number* pByte = (cmsUInt8Number*)&DWord;
-+ cmsUInt8Number temp1;
-+ cmsUInt8Number temp2;
-+
-+ if (*pByte > 0x09) *pByte = (cmsUInt8Number)9;
-+ temp1 = *(pByte+1) & 0xf0;
-+ temp2 = *(pByte+1) & 0x0f;
-+ if (temp1 > 0x90) temp1 = 0x90;
-+ if (temp2 > 9) temp2 = 0x09;
-+ *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
-+ *(pByte+2) = (cmsUInt8Number)0;
-+ *(pByte+3) = (cmsUInt8Number)0;
-+
-+ return DWord;
-+}
-
- // Read profile header and validate it
- cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
-@@ -643,12 +671,15 @@
- Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
- Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
- Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
-+
- Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);
- Icc -> flags = _cmsAdjustEndianess32(Header.flags);
- Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer);
- Icc -> model = _cmsAdjustEndianess32(Header.model);
-+ Icc -> creator = _cmsAdjustEndianess32(Header.creator);
-+
- _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
-- Icc -> Version = _cmsAdjustEndianess32(Header.version);
-+ Icc -> Version = _cmsAdjustEndianess32(_validatedVersion(Header.version));
-
- // Get size as reported in header
- HeaderSize = _cmsAdjustEndianess32(Header.size);
-@@ -815,28 +846,33 @@
- cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-- return (cmsUInt32Number) Icc ->manufacturer;
-+ return Icc ->manufacturer;
- }
-
- void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-- Icc -> manufacturer = (cmsUInt32Number) manufacturer;
-+ Icc -> manufacturer = manufacturer;
-+}
-+
-+cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)
-+{
-+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-+ return Icc ->creator;
- }
-
- cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-- return (cmsUInt32Number) Icc ->model;
-+ return Icc ->model;
- }
-
- void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-- Icc -> model = (cmsUInt32Number) model;
-+ Icc -> model = model;
- }
-
--
- void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-@@ -1073,11 +1109,16 @@
- return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
- }
-
--
- static
- cmsBool SanityCheck(_cmsICCPROFILE* profile)
- {
-- cmsIOHANDLER* io = profile->IOhandler;
-+ cmsIOHANDLER* io;
-+
-+ if (!profile) {
-+ return FALSE;
-+ }
-+
-+ io = profile->IOhandler;
- if (!io) {
- return FALSE;
- }
-@@ -1106,13 +1147,13 @@
- cmsIOHANDLER* io = Icc ->IOhandler;
- cmsTagDescriptor* TagDescriptor;
- cmsTagTypeSignature TypeBase;
-+ cmsTagTypeSignature Type;
- cmsTagTypeHandler* TypeHandler;
--
-- if (!SanityCheck(FileOrig)) return FALSE;
-+ cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc);
-+ cmsTagTypeHandler LocalTypeHandler;
-
- for (i=0; i < Icc -> TagCount; i++) {
-
--
- if (Icc ->TagNames[i] == 0) continue;
-
- // Linked tags are not written
-@@ -1126,7 +1167,7 @@
-
- // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
- // In this case a blind copy of the block data is performed
-- if (FileOrig != NULL && Icc -> TagOffsets[i]) {
-+ if (SanityCheck(FileOrig) && Icc -> TagOffsets[i]) {
-
- cmsUInt32Number TagSize = FileOrig -> TagSizes[i];
- cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
-@@ -1164,7 +1205,16 @@
- TagDescriptor = _cmsGetTagDescriptor(Icc -> TagNames[i]);
- if (TagDescriptor == NULL) continue; // Unsupported, ignore it
-
-- TypeHandler = Icc ->TagTypeHandlers[i];
-+ if (TagDescriptor ->DecideType != NULL) {
-+
-+ Type = TagDescriptor ->DecideType(Version, Data);
-+ }
-+ else {
-+
-+ Type = TagDescriptor ->SupportedTypes[0];
-+ }
-+
-+ TypeHandler = _cmsGetTagTypeHandler(Type);
-
- if (TypeHandler == NULL) {
- cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]);
-@@ -1175,9 +1225,10 @@
- if (!_cmsWriteTypeBase(io, TypeBase))
- return FALSE;
-
-- TypeHandler ->ContextID = Icc ->ContextID;
-- TypeHandler ->ICCVersion = Icc ->Version;
-- if (!TypeHandler ->WritePtr(TypeHandler, io, Data, TagDescriptor ->ElemCount)) {
-+ LocalTypeHandler = *TypeHandler;
-+ LocalTypeHandler.ContextID = Icc ->ContextID;
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {
-
- char String[5];
-
-@@ -1314,8 +1365,8 @@
- // Should we just calculate the needed space?
- if (MemPtr == NULL) {
-
-- *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
-- return (*BytesNeeded == 0 ? FALSE : TRUE);
-+ *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
-+ return (*BytesNeeded == 0 ? FALSE : TRUE);
- }
-
- // That is a real write operation
-@@ -1353,10 +1404,11 @@
- cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
-
- if (TypeHandler != NULL) {
-+ cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
-
-- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameters
-- TypeHandler ->ICCVersion = Icc ->Version;
-- TypeHandler ->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
-+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameters
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
- }
- else
- _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
-@@ -1400,6 +1452,7 @@
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- cmsIOHANDLER* io = Icc ->IOhandler;
- cmsTagTypeHandler* TypeHandler;
-+ cmsTagTypeHandler LocalTypeHandler;
- cmsTagDescriptor* TagDescriptor;
- cmsTagTypeSignature BaseType;
- cmsUInt32Number Offset, TagSize;
-@@ -1423,7 +1476,7 @@
-
- // Seek to its location
- if (!io -> Seek(io, Offset))
-- return NULL;
-+ return NULL;
-
- // Search for support on this tag
- TagDescriptor = _cmsGetTagDescriptor(sig);
-@@ -1440,14 +1493,15 @@
- // Get type handler
- TypeHandler = _cmsGetTagTypeHandler(BaseType);
- if (TypeHandler == NULL) return NULL;
-+ LocalTypeHandler = *TypeHandler;
-
-
- // Read the tag
- Icc -> TagTypeHandlers[n] = TypeHandler;
-
-- TypeHandler ->ContextID = Icc ->ContextID;
-- TypeHandler ->ICCVersion = Icc ->Version;
-- Icc -> TagPtrs[n] = TypeHandler ->ReadPtr(TypeHandler, io, &ElemCount, TagSize);
-+ LocalTypeHandler.ContextID = Icc ->ContextID;
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-+ Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
-
- // The tag type is supported, but something wrong happend and we cannot read the tag.
- // let know the user about this (although it is just a warning)
-@@ -1468,7 +1522,7 @@
-
- _cmsTagSignature2String(String, sig);
- cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d",
-- String, TagDescriptor ->ElemCount, ElemCount);
-+ String, TagDescriptor ->ElemCount, ElemCount);
- }
-
-
-@@ -1500,6 +1554,7 @@
- {
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- cmsTagTypeHandler* TypeHandler = NULL;
-+ cmsTagTypeHandler LocalTypeHandler;
- cmsTagDescriptor* TagDescriptor = NULL;
- cmsTagTypeSignature Type;
- int i;
-@@ -1530,9 +1585,10 @@
-
- if (TypeHandler != NULL) {
-
-- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameter
-- TypeHandler ->ICCVersion = Icc ->Version;
-- TypeHandler->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
-+ LocalTypeHandler = *TypeHandler;
-+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
- }
- }
- }
-@@ -1571,7 +1627,7 @@
- // Let the tag descriptor to decide the type base on depending on
- // the data. This is useful for example on parametric curves, where
- // curves specified by a table cannot be saved as parametric and needs
-- // to be revented to single v2-curves, even on v4 profiles.
-+ // to be casted to single v2-curves, even on v4 profiles.
-
- Type = TagDescriptor ->DecideType(Version, data);
- }
-@@ -1609,9 +1665,10 @@
- Icc ->TagSizes[i] = 0;
- Icc ->TagOffsets[i] = 0;
-
-- TypeHandler ->ContextID = Icc ->ContextID;
-- TypeHandler ->ICCVersion = Icc ->Version;
-- Icc ->TagPtrs[i] = TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount);
-+ LocalTypeHandler = *TypeHandler;
-+ LocalTypeHandler.ContextID = Icc ->ContextID;
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-+ Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);
-
- if (Icc ->TagPtrs[i] == NULL) {
-
-@@ -1638,6 +1695,7 @@
- int i;
- cmsIOHANDLER* MemIO;
- cmsTagTypeHandler* TypeHandler = NULL;
-+ cmsTagTypeHandler LocalTypeHandler;
- cmsTagDescriptor* TagDescriptor = NULL;
- cmsUInt32Number rc;
- cmsUInt32Number Offset, TagSize;
-@@ -1653,15 +1711,16 @@
- Offset = Icc ->TagOffsets[i];
- TagSize = Icc ->TagSizes[i];
-
--
- // read the data directly, don't keep copy
- if (data != NULL) {
-
- if (BufferSize < TagSize)
-- TagSize = BufferSize;
-+ TagSize = BufferSize;
-
- if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) return 0;
- if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) return 0;
-+
-+ return TagSize;
- }
-
- return Icc ->TagSizes[i];
-@@ -1675,9 +1734,11 @@
-
- TagSize = Icc ->TagSizes[i];
- if (BufferSize < TagSize)
-- TagSize = BufferSize;
-+ TagSize = BufferSize;
-
- memmove(data, Icc ->TagPtrs[i], TagSize);
-+
-+ return TagSize;
- }
-
- return Icc ->TagSizes[i];
-@@ -1693,7 +1754,7 @@
- if (data == NULL) {
- MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));
- } else{
-- MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
-+ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
- }
- if (MemIO == NULL) return 0;
-
-@@ -1701,20 +1762,22 @@
- TypeHandler = Icc ->TagTypeHandlers[i];
- TagDescriptor = _cmsGetTagDescriptor(sig);
- if (TagDescriptor == NULL) {
-- cmsCloseIOhandler(MemIO);
-- return 0;
-+ cmsCloseIOhandler(MemIO);
-+ return 0;
- }
-
-+ // FIXME: No handling for TypeHandler == NULL here?
- // Serialize
-- TypeHandler ->ContextID = Icc ->ContextID;
-- TypeHandler ->ICCVersion = Icc ->Version;
-+ LocalTypeHandler = *TypeHandler;
-+ LocalTypeHandler.ContextID = Icc ->ContextID;
-+ LocalTypeHandler.ICCVersion = Icc ->Version;
-
- if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {
- cmsCloseIOhandler(MemIO);
- return 0;
- }
-
-- if (!TypeHandler ->WritePtr(TypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
-+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
- cmsCloseIOhandler(MemIO);
- return 0;
- }
-@@ -1752,7 +1815,7 @@
- // Using this function you can collapse several tag entries to the same block in the profile
- cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
- {
-- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
-+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- int i;
-
- if (!_cmsNewTag(Icc, sig, &i)) return FALSE;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Tue Mar 18 12:35:25 2014 -0700
-@@ -129,7 +129,6 @@
- Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);
-
- if (Tag != NULL) {
--
- *Dest = *Tag;
- return TRUE;
- }
-@@ -193,7 +192,8 @@
- if (GrayTRC == NULL) return NULL;
-
- Lut = cmsPipelineAlloc(ContextID, 1, 3);
-- if (Lut == NULL) return NULL;
-+ if (Lut == NULL)
-+ goto Error;
-
- if (cmsGetPCS(hProfile) == cmsSigLabData) {
-
-@@ -204,28 +204,35 @@
-
- EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
-
-- if (EmptyTab == NULL) {
--
-- cmsPipelineFree(Lut);
-- return NULL;
-- }
-+ if (EmptyTab == NULL)
-+ goto Error;
-
- LabCurves[0] = GrayTRC;
- LabCurves[1] = EmptyTab;
- LabCurves[2] = EmptyTab;
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL));
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) ||
-+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {
-+ cmsFreeToneCurve(EmptyTab);
-+ goto Error;
-+ }
-
- cmsFreeToneCurve(EmptyTab);
-
- }
- else {
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC));
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL));
-+
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||
-+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL)))
-+ goto Error;
- }
-
- return Lut;
-+
-+Error:
-+ cmsFreeToneCurve(GrayTRC);
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // RGB Matrix shaper
-@@ -259,49 +266,31 @@
- Lut = cmsPipelineAlloc(ContextID, 3, 3);
- if (Lut != NULL) {
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes));
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||
-+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))
-+ goto Error;
-
- // Note that it is certainly possible a single profile would have a LUT based
- // tag for output working in lab and a matrix-shaper for the fallback cases.
- // This is not allowed by the spec, but this code is tolerant to those cases
- if (cmsGetPCS(hProfile) == cmsSigLabData) {
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))
-+ goto Error;
- }
-
- }
-
- return Lut;
-+
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
-
-
- // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
--/*static
--cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
--{
-- cmsContext ContextID = cmsGetProfileContextID(hProfile);
-- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
-- cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
--
-- if (Lut == NULL) return NULL;
--
-- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
-- // and since the formatter has already accomodated to 0..1.0, we should undo this change
-- if ( spc == cmsSigLabData)
-- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
-- }
-- else
-- if (spc == cmsSigXYZData)
-- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
-- }
--
-- return Lut;
--}
--*/
- static
- cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
- {
-@@ -316,23 +305,31 @@
- // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
- if ( spc == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
-+ goto Error;
- }
- else if (spc == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
-+ goto Error;
- }
-
- if ( PCS == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
-+ goto Error;
- }
- else if( PCS == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
-+ goto Error;
- }
-
- return Lut;
-+
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
-
-@@ -359,8 +356,11 @@
- return NULL;
- }
-
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE));
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||
-+ !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {
-+ cmsPipelineFree(Lut);
-+ return NULL;
-+ }
- return Lut;
- }
-
-@@ -395,12 +395,18 @@
- return Lut;
-
- // If the input is Lab, add also a conversion at the begin
-- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
-+ if (cmsGetColorSpace(hProfile) == cmsSigLabData &&
-+ !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
-+ goto Error;
-
- // Add a matrix for conversion V2 to V4 Lab PCS
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
-+ goto Error;
-+
- return Lut;
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // Lut was not found, try to create a matrix-shaper
-@@ -445,21 +451,27 @@
-
- if (cmsGetPCS(hProfile) == cmsSigLabData) {
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL)))
-+ goto Error;
- }
- else {
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL)))
-+ goto Error;
- }
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
-+ goto Error;
-+
- cmsFreeToneCurve(RevGrayTRC);
-+ return Lut;
-
-- return Lut;
-+Error:
-+ cmsFreeToneCurve(RevGrayTRC);
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
-
--
--
- static
- cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
- {
-@@ -506,15 +518,21 @@
- // This is not allowed by the spec, but this code is tolerant to those cases
- if (cmsGetPCS(hProfile) == cmsSigLabData) {
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))
-+ goto Error;
- }
-
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL));
-- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||
-+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))
-+ goto Error;
- }
-
- cmsFreeToneCurveTriple(InvShapes);
- return Lut;
-+Error:
-+ cmsFreeToneCurveTriple(InvShapes);
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
-
-@@ -540,30 +558,6 @@
-
-
- // Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
--/*static
--cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
--{
-- cmsContext ContextID = cmsGetProfileContextID(hProfile);
-- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
-- cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
--
-- if (Lut == NULL) return NULL;
--
-- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
-- // and since the formatter has already accomodated to 0..1.0, we should undo this change
-- if ( PCS == cmsSigLabData)
-- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
-- }
-- else
-- if (PCS == cmsSigXYZData)
-- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
-- }
--
-- return Lut;
--}*/
--
- static
- cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
- {
-@@ -578,25 +572,33 @@
- // and since the formatter has already accomodated to 0..1.0, we should undo this change
- if ( PCS == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
-+ goto Error;
- }
- else
- if (PCS == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
-+ goto Error;
- }
-
- // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
- if ( dataSpace == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
-+ goto Error;
- }
-- else if ( dataSpace == cmsSigXYZData)
-+ else if (dataSpace == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
-+ goto Error;
- }
-
- return Lut;
-+
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // Create an output MPE LUT from agiven profile. Version mismatches are handled here
-@@ -636,30 +638,35 @@
- // Now it is time for a controversial stuff. I found that for 3D LUTS using
- // Lab used as indexer space, trilinear interpolation should be used
- if (cmsGetPCS(hProfile) == cmsSigLabData)
-- ChangeInterpolationToTrilinear(Lut);
-+ ChangeInterpolationToTrilinear(Lut);
-
- // We need to adjust data only for Lab and Lut16 type
- if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
- return Lut;
-
- // Add a matrix for conversion V4 to V2 Lab PCS
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
-+ goto Error;
-
- // If the output is Lab, add also a conversion at the end
- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
-+ goto Error;
-
- return Lut;
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // Lut not found, try to create a matrix-shaper
-
- // Check if this is a grayscale profile.
-- if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
-+ if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
-
-- // if so, build appropiate conversion tables.
-- // The tables are the PCS iluminant, scaled across GrayTRC
-- return BuildGrayOutputPipeline(hProfile);
-+ // if so, build appropiate conversion tables.
-+ // The tables are the PCS iluminant, scaled across GrayTRC
-+ return BuildGrayOutputPipeline(hProfile);
- }
-
- // Not gray, create a normal matrix-shaper, which only operates in XYZ space
-@@ -681,25 +688,32 @@
-
- if (spc == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
-+ goto Error;
- }
- else
- if (spc == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
-+ goto Error;
- }
-
- if (PCS == cmsSigLabData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
-+ goto Error;
- }
- else
- if (PCS == cmsSigXYZData)
- {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
-+ goto Error;
- }
-
-- return Lut;
-+ return Lut;
-+Error:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
-@@ -721,15 +735,21 @@
- if (nc == NULL) return NULL;
-
- Lut = cmsPipelineAlloc(ContextID, 0, 0);
-- if (Lut == NULL) {
-- cmsFreeNamedColorList(nc);
-- return NULL;
-- }
-+ if (Lut == NULL)
-+ goto Error;
-
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
-+ goto Error;
-+
- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
-+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
-+ goto Error;
-+
- return Lut;
-+Error:
-+ cmsPipelineFree(Lut);
-+ cmsFreeNamedColorList(nc);
-+ return NULL;
- }
-
- if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
-@@ -760,10 +780,10 @@
- Lut = cmsPipelineDup(Lut);
- if (Lut == NULL) return NULL;
-
-- // Now it is time for a controversial stuff. I found that for 3D LUTS using
-- // Lab used as indexer space, trilinear interpolation should be used
-+ // Now it is time for a controversial stuff. I found that for 3D LUTS using
-+ // Lab used as indexer space, trilinear interpolation should be used
- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
-- ChangeInterpolationToTrilinear(Lut);
-+ ChangeInterpolationToTrilinear(Lut);
-
- // After reading it, we have info about the original type
- OriginalType = _cmsGetTagTrueType(hProfile, tag16);
-@@ -774,16 +794,20 @@
- // Here it is possible to get Lab on both sides
-
- if (cmsGetPCS(hProfile) == cmsSigLabData) {
-- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
-+ if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
-+ goto Error2;
- }
-
- if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
-- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
-+ if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
-+ goto Error2;
- }
-
- return Lut;
-
--
-+Error2:
-+ cmsPipelineFree(Lut);
-+ return NULL;
- }
-
- // ---------------------------------------------------------------------------------------------------------------
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Tue Mar 18 12:35:25 2014 -0700
-@@ -264,10 +264,10 @@
- if (NewElem ->TheCurves != NULL) {
- for (i=0; i < NewElem ->nCurves; i++) {
- if (NewElem ->TheCurves[i])
-- cmsFreeToneCurve(Data ->TheCurves[i]);
-+ cmsFreeToneCurve(NewElem ->TheCurves[i]);
- }
- }
-- _cmsFree(mpe ->ContextID, Data ->TheCurves);
-+ _cmsFree(mpe ->ContextID, NewElem ->TheCurves);
- _cmsFree(mpe ->ContextID, NewElem);
- return NULL;
- }
-@@ -392,6 +392,8 @@
- void MatrixElemTypeFree(cmsStage* mpe)
- {
- _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
-+ if (Data == NULL)
-+ return;
- if (Data ->Double)
- _cmsFree(mpe ->ContextID, Data ->Double);
-
-@@ -526,10 +528,15 @@
-
- if (Data ->Tab.T) {
-
-- if (Data ->HasFloatValues)
-+ if (Data ->HasFloatValues) {
- NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));
-- else
-+ if (NewElem ->Tab.TFloat == NULL)
-+ goto Error;
-+ } else {
- NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));
-+ if (NewElem ->Tab.TFloat == NULL)
-+ goto Error;
-+ }
- }
-
- NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID,
-@@ -538,8 +545,14 @@
- Data ->Params ->nOutputs,
- NewElem ->Tab.T,
- Data ->Params ->dwFlags);
--
-- return (void*) NewElem;
-+ if (NewElem->Params != NULL)
-+ return (void*) NewElem;
-+ Error:
-+ if (NewElem->Tab.T)
-+ // This works for both types
-+ _cmsFree(mpe ->ContextID, NewElem -> Tab.T);
-+ _cmsFree(mpe ->ContextID, NewElem);
-+ return NULL;
- }
-
-
-@@ -636,7 +649,6 @@
- for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
- Dimensions[i] = nGridPoints;
-
--
- return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);
- }
-
-@@ -706,15 +718,12 @@
- }
- }
-
--
- NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);
- if (NewElem ->Params == NULL) {
- cmsStageFree(NewMPE);
- return NULL;
- }
-
--
--
- return NewMPE;
- }
-
-@@ -772,7 +781,7 @@
- int i, t, nTotalPoints, index, rest;
- int nInputs, nOutputs;
- cmsUInt32Number* nSamples;
-- cmsUInt16Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
-+ cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
- _cmsStageCLutData* clut;
-
- if (mpe == NULL) return FALSE;
-@@ -785,7 +794,9 @@
- nInputs = clut->Params ->nInputs;
- nOutputs = clut->Params ->nOutputs;
-
-- if (nInputs >= cmsMAXCHANNELS) return FALSE;
-+ if (nInputs <= 0) return FALSE;
-+ if (nOutputs <= 0) return FALSE;
-+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
- if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
-
- nTotalPoints = CubeSize(nSamples, nInputs);
-@@ -832,14 +843,16 @@
- int i, t, nTotalPoints, index, rest;
- int nInputs, nOutputs;
- cmsUInt32Number* nSamples;
-- cmsFloat32Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
-+ cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
- _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
-
- nSamples = clut->Params ->nSamples;
- nInputs = clut->Params ->nInputs;
- nOutputs = clut->Params ->nOutputs;
-
-- if (nInputs >= cmsMAXCHANNELS) return FALSE;
-+ if (nInputs <= 0) return FALSE;
-+ if (nOutputs <= 0) return FALSE;
-+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
- if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
-
- nTotalPoints = CubeSize(nSamples, nInputs);
-@@ -1021,7 +1034,7 @@
- mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
- cmsFreeToneCurveTriple(LabTable);
-
-- if (mpe == NULL) return mpe;
-+ if (mpe == NULL) return NULL;
- mpe ->Implements = cmsSigLabV2toV4;
- return mpe;
- }
-@@ -1247,12 +1260,22 @@
- NULL);
- if (NewMPE == NULL) return NULL;
-
-- NewMPE ->Implements = mpe ->Implements;
-+ NewMPE ->Implements = mpe ->Implements;
-
-- if (mpe ->DupElemPtr)
-- NewMPE ->Data = mpe ->DupElemPtr(mpe);
-- else
-+ if (mpe ->DupElemPtr) {
-+
-+ NewMPE ->Data = mpe ->DupElemPtr(mpe);
-+
-+ if (NewMPE->Data == NULL) {
-+
-+ cmsStageFree(NewMPE);
-+ return NULL;
-+ }
-+
-+ } else {
-+
- NewMPE ->Data = NULL;
-+ }
-
- return NewMPE;
- }
-@@ -1465,12 +1488,12 @@
- }
-
-
--void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
-+int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
- {
- cmsStage* Anterior = NULL, *pt;
-
-- _cmsAssert(lut != NULL);
-- _cmsAssert(mpe != NULL);
-+ if (lut == NULL || mpe == NULL)
-+ return FALSE;
-
- switch (loc) {
-
-@@ -1494,9 +1517,11 @@
- }
- break;
- default:;
-+ return FALSE;
- }
-
- BlessLUT(lut);
-+ return TRUE;
- }
-
- // Unlink an element and return the pointer to it
-@@ -1558,7 +1583,7 @@
- // Concatenate two LUT into a new single one
- cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
- {
-- cmsStage* mpe, *NewMPE;
-+ cmsStage* mpe;
-
- // If both LUTS does not have elements, we need to inherit
- // the number of channels
-@@ -1573,17 +1598,12 @@
- mpe = mpe ->Next) {
-
- // We have to dup each element
-- NewMPE = cmsStageDup(mpe);
--
-- if (NewMPE == NULL) {
-- return FALSE;
-- }
--
-- cmsPipelineInsertStage(l1, cmsAT_END, NewMPE);
-+ if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))
-+ return FALSE;
- }
-
-- BlessLUT(l1);
-- return TRUE;
-+ BlessLUT(l1);
-+ return TRUE;
- }
-
-
-@@ -1713,16 +1733,11 @@
- cmsFloat32Number fx[4], x[4], xd[4], fxd[4];
- cmsVEC3 tmp, tmp2;
- cmsMAT3 Jacobian;
-- cmsFloat64Number LastResult[4];
--
-
- // Only 3->3 and 4->3 are supported
- if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;
- if (lut ->OutputChannels != 3) return FALSE;
-
-- // Mark result of -1
-- LastResult[0] = LastResult[1] = LastResult[2] = -1.0f;
--
- // Take the hint as starting point if specified
- if (Hint == NULL) {
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Tue Mar 18 12:35:25 2014 -0700
-@@ -338,7 +338,7 @@
- Error:
-
- // Free resources as something went wrong
-- if (MD5 != NULL) _cmsFree(ContextID, MD5);
-+ // "MD5" cannot be other than NULL here, so no need to free it
- if (Mem != NULL) _cmsFree(ContextID, Mem);
- memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
- return FALSE;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Tue Mar 18 12:35:25 2014 -0700
-@@ -359,9 +359,9 @@
- if (Best == -1)
- Best = 0;
-
-- v = mlu ->Entries + Best;
-+ v = mlu ->Entries + Best;
-
-- if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
-+ if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
- if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country;
-
- if (len != NULL) *len = v ->Len;
-@@ -475,6 +475,35 @@
- }
-
-
-+
-+// Get the number of translations in the MLU object
-+cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)
-+{
-+ if (mlu == NULL) return 0;
-+ return mlu->UsedEntries;
-+}
-+
-+// Get the language and country codes for a specific MLU index
-+cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
-+ cmsUInt32Number idx,
-+ char LanguageCode[3],
-+ char CountryCode[3])
-+{
-+ _cmsMLUentry *entry;
-+
-+ if (mlu == NULL) return FALSE;
-+
-+ if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;
-+
-+ entry = &mlu->Entries[idx];
-+
-+ *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);
-+ *(cmsUInt16Number *)CountryCode = _cmsAdjustEndianess16(entry->Country);
-+
-+ return TRUE;
-+}
-+
-+
- // Named color lists --------------------------------------------------------------------------------------------
-
- // Grow the list to keep at least NumElements
-@@ -517,9 +546,9 @@
- while (v -> Allocated < n)
- GrowNamedColorList(v);
-
-- strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix) - 1);
-- strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix) - 1);
-- v->Prefix[sizeof(v ->Prefix) - 1] = v->Suffix[sizeof(v ->Suffix) - 1] = 0;
-+ strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
-+ strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
-+ v->Prefix[32] = v->Suffix[32] = 0;
-
- v -> ColorantCount = ColorantCount;
-
-@@ -529,8 +558,9 @@
- // Free a list
- void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
- {
-+ if (v == NULL) return;
- if (v ->List) _cmsFree(v ->ContextID, v ->List);
-- if (v) _cmsFree(v ->ContextID, v);
-+ _cmsFree(v ->ContextID, v);
- }
-
- cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
-@@ -576,11 +606,8 @@
-
- if (Name != NULL) {
-
-- strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name,
-- sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1);
--
-- NamedColorList ->List[NamedColorList ->nColors].
-- Name[sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1] = 0;
-+ strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);
-+ NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;
-
- }
- else
-@@ -891,7 +918,6 @@
- {
- _cmsDICT* old_dict = (_cmsDICT*) hDict;
- cmsHANDLE hNew;
-- _cmsDICT* new_dict;
- cmsDICTentry *entry;
-
- _cmsAssert(old_dict != NULL);
-@@ -899,8 +925,6 @@
- hNew = cmsDictAlloc(old_dict ->ContextID);
- if (hNew == NULL) return NULL;
-
-- new_dict = (_cmsDICT*) hNew;
--
- // Walk the list freeing all nodes
- entry = old_dict ->head;
- while (entry != NULL) {
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Tue Mar 18 12:35:25 2014 -0700
-@@ -27,6 +27,7 @@
- // However, the following notice accompanied the original version of this
- // file:
- //
-+
- //---------------------------------------------------------------------------------
- //
- // Little Color Management System
-@@ -81,10 +82,6 @@
- int nInputs;
- int nOutputs;
-
-- // Since there is no limitation of the output number of channels, this buffer holding the connexion CLUT-shaper
-- // has to be dynamically allocated. This is not the case of first step shaper-CLUT, which is limited to max inputs
-- cmsUInt16Number* StageDEF;
--
- _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance
- cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
-
-@@ -202,8 +199,6 @@
- {
- cmsBool AnyOpt = FALSE, Opt;
-
-- AnyOpt = FALSE;
--
- do {
-
- Opt = FALSE;
-@@ -253,6 +248,7 @@
- {
- Prelin16Data* p16 = (Prelin16Data*) D;
- cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS];
-+ cmsUInt16Number StageDEF[cmsMAXCHANNELS];
- int i;
-
- for (i=0; i < p16 ->nInputs; i++) {
-@@ -260,11 +256,11 @@
- p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);
- }
-
-- p16 ->EvalCLUT(StageABC, p16 ->StageDEF, p16 ->CLUTparams);
-+ p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);
-
- for (i=0; i < p16 ->nOutputs; i++) {
-
-- p16 ->EvalCurveOut16[i](&p16->StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
-+ p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
- }
- }
-
-@@ -274,7 +270,6 @@
- {
- Prelin16Data* p16 = (Prelin16Data*) ptr;
-
-- _cmsFree(ContextID, p16 ->StageDEF);
- _cmsFree(ContextID, p16 ->EvalCurveOut16);
- _cmsFree(ContextID, p16 ->ParamsCurveOut16);
-
-@@ -289,7 +284,6 @@
-
- if (Duped == NULL) return NULL;
-
-- Duped ->StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
- Duped ->EvalCurveOut16 = _cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
- Duped ->ParamsCurveOut16 = _cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
-
-@@ -328,7 +322,6 @@
- p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16;
-
-
-- p16 -> StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
- p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));
- p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));
-
-@@ -413,7 +406,7 @@
- int i, index;
-
- if (CLUT -> Type != cmsSigCLutElemType) {
-- cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut MPE");
-+ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage");
- return FALSE;
- }
-
-@@ -548,6 +541,10 @@
- for (i=0; i < nOuts; i++) {
-
- cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);
-+ if (InversePostLin == NULL) {
-+ WhiteOut[i] = 0;
-+ continue;
-+ }
- WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);
- cmsFreeToneCurve(InversePostLin);
- }
-@@ -575,8 +572,8 @@
- static
- cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
- {
-- cmsPipeline* Src;
-- cmsPipeline* Dest;
-+ cmsPipeline* Src = NULL;
-+ cmsPipeline* Dest = NULL;
- cmsStage* mpe;
- cmsStage* CLUT;
- cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
-@@ -589,7 +586,6 @@
- cmsToneCurve** DataSetOut;
- Prelin16Data* p16;
-
--
- // This is a loosy optimization! does not apply in floating-point cases
- if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
-
-@@ -603,10 +599,10 @@
-
- Src = *Lut;
-
-- // Named color pipelines cannot be optimized either
-- for (mpe = cmsPipelineGetPtrToFirstStage(Src);
-- mpe != NULL;
-- mpe = cmsStageNext(mpe)) {
-+ // Named color pipelines cannot be optimized either
-+ for (mpe = cmsPipelineGetPtrToFirstStage(Src);
-+ mpe != NULL;
-+ mpe = cmsStageNext(mpe)) {
- if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
- }
-
-@@ -628,7 +624,8 @@
-
- // All seems ok, proceed.
- NewPreLin = cmsStageDup(PreLin);
-- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin);
-+ if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))
-+ goto Error;
-
- // Remove prelinearization. Since we have duplicated the curve
- // in destination LUT, the sampling shoud be applied after this stage.
-@@ -642,7 +639,9 @@
- if (CLUT == NULL) return FALSE;
-
- // Add the CLUT to the destination LUT
-- cmsPipelineInsertStage(Dest, cmsAT_END, CLUT);
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
-+ goto Error;
-+ }
-
- // Postlinearization tables are kept unless indicated by flags
- if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {
-@@ -658,7 +657,8 @@
-
- // All seems ok, proceed.
- NewPostLin = cmsStageDup(PostLin);
-- cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin);
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
-+ goto Error;
-
- // In destination LUT, the sampling shoud be applied after this stage.
- cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
-@@ -669,10 +669,18 @@
- // Now its time to do the sampling. We have to ignore pre/post linearization
- // The source LUT whithout pre/post curves is passed as parameter.
- if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
--
-+Error:
- // Ops, something went wrong, Restore stages
-- if (KeepPreLin != NULL) cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin);
-- if (KeepPostLin != NULL) cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin);
-+ if (KeepPreLin != NULL) {
-+ if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {
-+ _cmsAssert(0); // This never happens
-+ }
-+ }
-+ if (KeepPostLin != NULL) {
-+ if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) {
-+ _cmsAssert(0); // This never happens
-+ }
-+ }
- cmsPipelineFree(Dest);
- return FALSE;
- }
-@@ -699,12 +707,11 @@
- else {
-
- p16 = PrelinOpt16alloc(Dest ->ContextID,
-- DataCLUT ->Params,
-- Dest ->InputChannels,
-- DataSetIn,
-- Dest ->OutputChannels,
-- DataSetOut);
--
-+ DataCLUT ->Params,
-+ Dest ->InputChannels,
-+ DataSetIn,
-+ Dest ->OutputChannels,
-+ DataSetOut);
-
- _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
- }
-@@ -1058,7 +1065,8 @@
- LutPlusCurves = cmsPipelineDup(OriginalLut);
- if (LutPlusCurves == NULL) goto Error;
-
-- cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse));
-+ if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))
-+ goto Error;
-
- // Create the result LUT
- OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);
-@@ -1067,13 +1075,15 @@
- OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);
-
- // Create and insert the curves at the beginning
-- cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe);
-+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))
-+ goto Error;
-
- // Allocate the CLUT for result
- OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);
-
- // Add the CLUT to the destination LUT
-- cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe);
-+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))
-+ goto Error;
-
- // Resample the LUT
- if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;
-@@ -1201,13 +1211,14 @@
- for (i=0; i < nCurves; i++) {
-
- c16->Curves[i] = _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
-+
- if (c16->Curves[i] == NULL) {
-+
- for (j=0; j < i; j++) {
- _cmsFree(ContextID, c16->Curves[j]);
- }
- _cmsFree(ContextID, c16->Curves);
- _cmsFree(ContextID, c16);
--
- return NULL;
- }
-
-@@ -1336,7 +1347,8 @@
- // Maybe the curves are linear at the end
- if (!AllCurvesAreLinear(ObtainedCurves)) {
-
-- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves);
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))
-+ goto Error;
-
- // If the curves are to be applied in 8 bits, we can save memory
- if (_cmsFormatterIs8bit(*InputFormat)) {
-@@ -1344,6 +1356,7 @@
- _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;
- Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);
-
-+ if (c16 == NULL) goto Error;
- *dwFlags |= cmsFLAGS_NOCACHE;
- _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
-
-@@ -1353,6 +1366,7 @@
- _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
- Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
-
-+ if (c16 == NULL) goto Error;
- *dwFlags |= cmsFLAGS_NOCACHE;
- _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
- }
-@@ -1362,7 +1376,8 @@
- // LUT optimizes to nothing. Set the identity LUT
- cmsStageFree(ObtainedCurves);
-
-- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels));
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))
-+ goto Error;
-
- *dwFlags |= cmsFLAGS_NOCACHE;
- _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);
-@@ -1592,10 +1607,14 @@
- if (!Dest) return FALSE;
-
- // Assamble the new LUT
-- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1));
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
-+ goto Error;
-+
- if (!IdentityMat)
-- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset));
-- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2));
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
-+ goto Error;
-+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
-+ goto Error;
-
- // If identity on matrix, we can further optimize the curves, so call the join curves routine
- if (IdentityMat) {
-@@ -1617,6 +1636,10 @@
- cmsPipelineFree(Src);
- *Lut = Dest;
- return TRUE;
-+Error:
-+ // Leave Src unchanged
-+ cmsPipelineFree(Dest);
-+ return FALSE;
- }
-
-
-@@ -1646,7 +1669,7 @@
- static _cmsOptimizationCollection* OptimizationCollection = DefaultOptimization;
-
- // Register new ways to optimize
--cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterOptimizationPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;
- _cmsOptimizationCollection* fl;
-@@ -1660,7 +1683,7 @@
- // Optimizer callback is required
- if (Plugin ->OptimizePtr == NULL) return FALSE;
-
-- fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(sizeof(_cmsOptimizationCollection));
-+ fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(id, sizeof(_cmsOptimizationCollection));
- if (fl == NULL) return FALSE;
-
- // Copy the parameters
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Tue Mar 18 12:35:25 2014 -0700
-@@ -317,6 +317,23 @@
- }
-
- static
-+cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
-+ register cmsUInt16Number wIn[],
-+ register cmsUInt8Number* accum,
-+ register cmsUInt32Number Stride)
-+{
-+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
-+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
-+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
-+ accum++; // A
-+
-+ return accum;
-+
-+ cmsUNUSED_PARAMETER(info);
-+ cmsUNUSED_PARAMETER(Stride);
-+}
-+
-+static
- cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info,
- register cmsUInt16Number wIn[],
- register cmsUInt8Number* accum,
-@@ -2901,6 +2918,9 @@
- { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap},
- { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst},
-
-+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
-+ ANYSPACE, Unroll3BytesSkip1SwapSwapFirst},
-+
- { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes},
- { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse},
- { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst},
-@@ -3166,7 +3186,7 @@
-
-
- // Formatters management
--cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterFormattersPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
- cmsFormattersFactoryList* fl ;
-@@ -3178,7 +3198,7 @@
- return TRUE;
- }
-
-- fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(sizeof(cmsFormattersFactoryList));
-+ fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(id, sizeof(cmsFormattersFactoryList));
- if (fl == NULL) return FALSE;
-
- fl ->Factory = Plugin ->FormattersFactory;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Tue Mar 18 12:35:25 2014 -0700
-@@ -898,9 +898,11 @@
- {
- switch (ColorSpace) {
-
-+ case cmsSigMCH1Data:
- case cmsSig1colorData:
- case cmsSigGrayData: return 1;
-
-+ case cmsSigMCH2Data:
- case cmsSig2colorData: return 2;
-
- case cmsSigXYZData:
-@@ -912,10 +914,12 @@
- case cmsSigHsvData:
- case cmsSigHlsData:
- case cmsSigCmyData:
-+ case cmsSigMCH3Data:
- case cmsSig3colorData: return 3;
-
- case cmsSigLuvKData:
- case cmsSigCmykData:
-+ case cmsSigMCH4Data:
- case cmsSig4colorData: return 4;
-
- case cmsSigMCH5Data:
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Tue Mar 18 12:35:25 2014 -0700
-@@ -125,10 +125,14 @@
- pOut[0] = pIn[7];
-
- #else
--
- _cmsAssert(Result != NULL);
-
-+# ifdef CMS_DONT_USE_INT64
-+ (*Result)[0] = QWord[0];
-+ (*Result)[1] = QWord[1];
-+# else
- *Result = *QWord;
-+# endif
- #endif
- }
-
-@@ -543,10 +547,10 @@
- static _cmsSubAllocator* PluginPool = NULL;
-
- // Specialized malloc for plug-ins, that is freed upon exit.
--void* _cmsPluginMalloc(cmsUInt32Number size)
-+void* _cmsPluginMalloc(cmsContext id, cmsUInt32Number size)
- {
- if (PluginPool == NULL)
-- PluginPool = _cmsCreateSubAlloc(0, 4*1024);
-+ PluginPool = _cmsCreateSubAlloc(id, 4*1024);
-
- return _cmsSubAlloc(PluginPool, size);
- }
-@@ -555,6 +559,11 @@
- // Main plug-in dispatcher
- cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
- {
-+ return cmsPluginTHR(NULL, Plug_in);
-+}
-+
-+cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
-+{
- cmsPluginBase* Plugin;
-
- for (Plugin = (cmsPluginBase*) Plug_in;
-@@ -583,35 +592,35 @@
- break;
-
- case cmsPluginTagTypeSig:
-- if (!_cmsRegisterTagTypePlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginTagSig:
-- if (!_cmsRegisterTagPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginFormattersSig:
-- if (!_cmsRegisterFormattersPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginRenderingIntentSig:
-- if (!_cmsRegisterRenderingIntentPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginParametricCurveSig:
-- if (!_cmsRegisterParametricCurvesPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginMultiProcessElementSig:
-- if (!_cmsRegisterMultiProcessElementPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginOptimizationSig:
-- if (!_cmsRegisterOptimizationPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;
- break;
-
- case cmsPluginTransformSig:
-- if (!_cmsRegisterTransformPlugin(Plugin)) return FALSE;
-+ if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;
- break;
-
- default:
-@@ -630,14 +639,14 @@
- {
- _cmsRegisterMemHandlerPlugin(NULL);
- _cmsRegisterInterpPlugin(NULL);
-- _cmsRegisterTagTypePlugin(NULL);
-- _cmsRegisterTagPlugin(NULL);
-- _cmsRegisterFormattersPlugin(NULL);
-- _cmsRegisterRenderingIntentPlugin(NULL);
-- _cmsRegisterParametricCurvesPlugin(NULL);
-- _cmsRegisterMultiProcessElementPlugin(NULL);
-- _cmsRegisterOptimizationPlugin(NULL);
-- _cmsRegisterTransformPlugin(NULL);
-+ _cmsRegisterTagTypePlugin(NULL, NULL);
-+ _cmsRegisterTagPlugin(NULL, NULL);
-+ _cmsRegisterFormattersPlugin(NULL, NULL);
-+ _cmsRegisterRenderingIntentPlugin(NULL, NULL);
-+ _cmsRegisterParametricCurvesPlugin(NULL, NULL);
-+ _cmsRegisterMultiProcessElementPlugin(NULL, NULL);
-+ _cmsRegisterOptimizationPlugin(NULL, NULL);
-+ _cmsRegisterTransformPlugin(NULL, NULL);
-
- if (PluginPool != NULL)
- _cmsSubAllocDestroy(PluginPool);
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Tue Mar 18 12:35:25 2014 -0700
-@@ -806,7 +806,6 @@
-
- mpe = Pipeline ->Elements;
-
--
- switch (cmsStageInputChannels(mpe)) {
- case 3:
-
-@@ -838,8 +837,6 @@
- mpe = mpe ->Next;
- }
-
--
--
- if (cmsStageType(mpe) == cmsSigCLutElemType) {
-
- _cmsIOPrintf(m, "/Table ");
-@@ -854,7 +851,6 @@
- _cmsIOPrintf(m, " >>\n");
- _cmsIOPrintf(m, "]\n");
-
--
- return 1;
- }
-
-@@ -950,6 +946,7 @@
-
- rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
- cmsPipelineFree(DeviceLink);
-+ if (rc == 0) return 0;
- }
- break;
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Tue Mar 18 12:35:25 2014 -0700
-@@ -56,6 +56,8 @@
- #include "lcms2_internal.h"
-
-
-+#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))
-+#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))
-
- // This file contains routines for resampling and LUT optimization, black point detection
- // and black preservation.
-@@ -67,13 +69,13 @@
- static
- cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)
- {
-- cmsHPROFILE hLab = cmsCreateLab4Profile(NULL);
-+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
-+ cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
- cmsHTRANSFORM xform;
- cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };
- cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };
- cmsHPROFILE hProfiles[4];
- cmsUInt32Number Intents[4];
-- cmsContext ContextID = cmsGetProfileContextID(hProfile);
-
- hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;
- Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;
-@@ -141,8 +143,8 @@
- cmsCloseProfile(hLab);
-
- if (xform == NULL) {
-+
- // Something went wrong. Get rid of open resources and return zero as black
--
- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
- return FALSE;
- }
-@@ -173,7 +175,6 @@
- // Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
- static
- cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)
--
- {
- cmsHTRANSFORM hRoundTrip;
- cmsCIELab LabIn, LabOut;
-@@ -218,17 +219,27 @@
- // involves to turn BP to neutral and to use only L component.
- cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
- {
-+ cmsProfileClassSignature devClass;
-
-- // Zero for black point
-- if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {
-+ // Make sure the device class is adequate
-+ devClass = cmsGetDeviceClass(hProfile);
-+ if (devClass == cmsSigLinkClass ||
-+ devClass == cmsSigAbstractClass ||
-+ devClass == cmsSigNamedColorClass) {
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
-+ }
-
-- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-- return FALSE;
-+ // Make sure intent is adequate
-+ if (Intent != INTENT_PERCEPTUAL &&
-+ Intent != INTENT_RELATIVE_COLORIMETRIC &&
-+ Intent != INTENT_SATURATION) {
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
- }
-
- // v4 + perceptual & saturation intents does have its own black point, and it is
- // well specified enough to use it. Black point tag is deprecated in V4.
--
- if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
- (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
-
-@@ -303,7 +314,7 @@
- {
- double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;
- double sum_y = 0, sum_yx = 0, sum_yx2 = 0;
-- double disc;
-+ double d, a, b, c;
- int i;
- cmsMAT3 m;
- cmsVEC3 v, res;
-@@ -333,14 +344,32 @@
-
- if (!_cmsMAT3solve(&res, &m, &v)) return 0;
-
-- // y = t x2 + u x + c
-- // x = ( - u + Sqrt( u^2 - 4 t c ) ) / ( 2 t )
-- disc = res.n[1]*res.n[1] - 4.0 * res.n[0] * res.n[2];
-- if (disc < 0) return -1;
-
-- return ( -1.0 * res.n[1] + sqrt( disc )) / (2.0 * res.n[0]);
-+ a = res.n[2];
-+ b = res.n[1];
-+ c = res.n[0];
-+
-+ if (fabs(a) < 1.0E-10) {
-+
-+ return cmsmin(0, cmsmax(50, -c/b ));
-+ }
-+ else {
-+
-+ d = b*b - 4.0 * a * c;
-+ if (d <= 0) {
-+ return 0;
-+ }
-+ else {
-+
-+ double rt = (-b + sqrt(d)) / (2.0 * a);
-+
-+ return cmsmax(0, cmsmin(50, rt));
-+ }
-+ }
-+
- }
-
-+/*
- static
- cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
- {
-@@ -361,6 +390,7 @@
-
- return TRUE;
- }
-+*/
-
- // Calculates the black point of a destination profile.
- // This algorithm comes from the Adobe paper disclosing its black point compensation method.
-@@ -369,21 +399,30 @@
- cmsColorSpaceSignature ColorSpace;
- cmsHTRANSFORM hRoundTrip = NULL;
- cmsCIELab InitialLab, destLab, Lab;
-+ cmsFloat64Number inRamp[256], outRamp[256];
-+ cmsFloat64Number MinL, MaxL;
-+ cmsBool NearlyStraightMidrange = TRUE;
-+ cmsFloat64Number yRamp[256];
-+ cmsFloat64Number x[256], y[256];
-+ cmsFloat64Number lo, hi;
-+ int n, l;
-+ cmsProfileClassSignature devClass;
-
-- cmsFloat64Number MinL, MaxL;
-- cmsBool NearlyStraightMidRange = FALSE;
-- cmsFloat64Number L;
-- cmsFloat64Number x[101], y[101];
-- cmsFloat64Number lo, hi, NonMonoMin;
-- int n, l, i, NonMonoIndx;
--
-+ // Make sure the device class is adequate
-+ devClass = cmsGetDeviceClass(hProfile);
-+ if (devClass == cmsSigLinkClass ||
-+ devClass == cmsSigAbstractClass ||
-+ devClass == cmsSigNamedColorClass) {
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
-+ }
-
- // Make sure intent is adequate
- if (Intent != INTENT_PERCEPTUAL &&
- Intent != INTENT_RELATIVE_COLORIMETRIC &&
- Intent != INTENT_SATURATION) {
-- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-- return FALSE;
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
- }
-
-
-@@ -415,10 +454,8 @@
- return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
- }
-
-- // It is one of the valid cases!, presto chargo hocus pocus, go for the Adobe magic
-+ // It is one of the valid cases!, use Adobe algorithm
-
-- // Step 1
-- // ======
-
- // Set a first guess, that should work on good profiles.
- if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
-@@ -449,71 +486,68 @@
- hRoundTrip = CreateRoundtripXForm(hProfile, Intent);
- if (hRoundTrip == NULL) return FALSE;
-
-- // Calculate Min L*
-- Lab = InitialLab;
-- Lab.L = 0;
-- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
-- MinL = destLab.L;
-+ // Compute ramps
-
-- // Calculate Max L*
-- Lab = InitialLab;
-- Lab.L = 100;
-- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
-- MaxL = destLab.L;
-+ for (l=0; l < 256; l++) {
-
-- // Step 3
-- // ======
-+ Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
-+ Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
-+ Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
-
-- // check if quadratic estimation needs to be done.
-+ cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
-+
-+ inRamp[l] = Lab.L;
-+ outRamp[l] = destLab.L;
-+ }
-+
-+ // Make monotonic
-+ for (l = 254; l > 0; --l) {
-+ outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);
-+ }
-+
-+ // Check
-+ if (! (outRamp[0] < outRamp[255])) {
-+
-+ cmsDeleteTransform(hRoundTrip);
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
-+ }
-+
-+
-+ // Test for mid range straight (only on relative colorimetric)
-+
-+ NearlyStraightMidrange = TRUE;
-+ MinL = outRamp[0]; MaxL = outRamp[255];
- if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
-
-- // Conceptually, this code tests how close the source l and converted L are to one another in the mid-range
-- // of the values. If the converted ramp of L values is close enough to a straight line y=x, then InitialLab
-- // is good enough to be the DestinationBlackPoint,
-- NearlyStraightMidRange = TRUE;
-+ for (l=0; l < 256; l++) {
-
-- for (l=0; l <= 100; l++) {
-+ if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||
-+ (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
-+ NearlyStraightMidrange = FALSE;
-+ }
-
-- Lab.L = l;
-- Lab.a = InitialLab.a;
-- Lab.b = InitialLab.b;
-+ // If the mid range is straight (as determined above) then the
-+ // DestinationBlackPoint shall be the same as initialLab.
-+ // Otherwise, the DestinationBlackPoint shall be determined
-+ // using curve fitting.
-
-- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
-+ if (NearlyStraightMidrange) {
-
-- L = destLab.L;
--
-- // Check the mid range in 20% after MinL
-- if (L > (MinL + 0.2 * (MaxL - MinL))) {
--
-- // Is close enough?
-- if (fabs(L - l) > 4.0) {
--
-- // Too far away, profile is buggy!
-- NearlyStraightMidRange = FALSE;
-- break;
-- }
-- }
-+ cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
-+ cmsDeleteTransform(hRoundTrip);
-+ return TRUE;
- }
- }
-- else {
-- // Check is always performed for perceptual and saturation intents
-- NearlyStraightMidRange = FALSE;
-- }
-
-
-- // If no furter checking is needed, we are done
-- if (NearlyStraightMidRange) {
--
-- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
-- cmsDeleteTransform(hRoundTrip);
-- return TRUE;
-- }
--
-- // The round-trip curve normally looks like a nearly constant section at the black point,
-+ // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
- // with a corner and a nearly straight line to the white point.
-
-- // STEP 4
-- // =======
-+ for (l=0; l < 256; l++) {
-+
-+ yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
-+ }
-
- // find the black point using the least squares error quadratic curve fitting
-
-@@ -528,62 +562,32 @@
- hi = 0.25;
- }
-
-- // Capture points for the fitting.
-+ // Capture shadow points for the fitting.
- n = 0;
-- for (l=0; l <= 100; l++) {
-+ for (l=0; l < 256; l++) {
-
-- cmsFloat64Number ff;
--
-- Lab.L = (cmsFloat64Number) l;
-- Lab.a = InitialLab.a;
-- Lab.b = InitialLab.b;
--
-- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
--
-- ff = (destLab.L - MinL)/(MaxL - MinL);
-+ cmsFloat64Number ff = yRamp[l];
-
- if (ff >= lo && ff < hi) {
--
-- x[n] = Lab.L;
-- y[n] = ff;
-+ x[n] = inRamp[l];
-+ y[n] = yRamp[l];
- n++;
- }
--
-- }
--
-- // This part is not on the Adobe paper, but I found is necessary for getting any result.
--
-- if (IsMonotonic(n, y)) {
--
-- // Monotonic means lower point is stil valid
-- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
-- cmsDeleteTransform(hRoundTrip);
-- return TRUE;
-- }
--
-- // No suitable points, regret and use safer algorithm
-- if (n == 0) {
-- cmsDeleteTransform(hRoundTrip);
-- return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
-- }
--
--
-- NonMonoMin = 100;
-- NonMonoIndx = 0;
-- for (i=0; i < n; i++) {
--
-- if (y[i] < NonMonoMin) {
-- NonMonoIndx = i;
-- NonMonoMin = y[i];
-- }
- }
-
-- Lab.L = x[NonMonoIndx];
-+
-+ // No suitable points
-+ if (n < 3 ) {
-+ cmsDeleteTransform(hRoundTrip);
-+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
-+ return FALSE;
-+ }
-+
-
- // fit and get the vertex of quadratic curve
- Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);
-
-- if (Lab.L < 0.0 || Lab.L > 50.0) { // clip to zero L* if the vertex is negative
-+ if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative
- Lab.L = 0;
- }
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Tue Mar 18 12:35:25 2014 -0700
-@@ -91,7 +91,7 @@
-
- // Register a new type handler. This routine is shared between normal types and MPE
- static
--cmsBool RegisterTypesPlugin(cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
-+cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
- {
- cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;
- _cmsTagTypeLinkedList *pt, *Anterior = NULL;
-@@ -118,7 +118,7 @@
- }
-
- // Registering happens in plug-in memory pool
-- pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagTypeLinkedList));
-+ pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));
- if (pt == NULL) return FALSE;
-
- pt ->Handler = Plugin ->Handler;
-@@ -208,10 +208,10 @@
- cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
-
- // Let's take the offsets to each element
-- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
-+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
- if (ElementOffsets == NULL) goto Error;
-
-- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
-+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
- if (ElementSizes == NULL) goto Error;
-
- for (i=0; i < Count; i++) {
-@@ -257,10 +257,10 @@
- cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
-
- // Create table
-- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
-+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
- if (ElementOffsets == NULL) goto Error;
-
-- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
-+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
- if (ElementSizes == NULL) goto Error;
-
- // Keep starting position of curve offsets
-@@ -456,6 +456,7 @@
- void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
- {
- return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));
-+
- cmsUNUSED_PARAMETER(n);
- }
-
-@@ -1106,8 +1107,6 @@
- {
- cmsUInt32Number Count;
- cmsToneCurve* NewGamma;
-- cmsUInt16Number Linear[2] = { 0, 0xffff };
--
-
- *nItems = 0;
- if (!_cmsReadUInt32Number(io, &Count)) return NULL;
-@@ -1115,11 +1114,14 @@
- switch (Count) {
-
- case 0: // Linear.
--
-- NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, 2, Linear);
-- if (!NewGamma) return NULL;
-- *nItems = 1;
-- return NewGamma;
-+ {
-+ cmsFloat64Number SingleGamma = 1.0;
-+
-+ NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
-+ if (!NewGamma) return NULL;
-+ *nItems = 1;
-+ return NewGamma;
-+ }
-
- case 1: // Specified as the exponent of gamma function
- {
-@@ -1210,6 +1212,7 @@
- if (ICCVersion < 4.0) return cmsSigCurveType;
- if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric
- if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves
-+ if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves
-
- return cmsSigParametricCurveType;
- }
-@@ -1386,6 +1389,9 @@
- {
- cmsICCMeasurementConditions mc;
-
-+
-+ memset(&mc, 0, sizeof(mc));
-+
- if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;
- if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL;
- if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;
-@@ -1640,7 +1646,6 @@
- static
- cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)
- {
-- cmsStage* mpe;
- cmsUInt8Number* Temp = NULL;
- int i, j;
- cmsToneCurve* Tables[cmsMAXCHANNELS];
-@@ -1669,11 +1674,8 @@
- _cmsFree(ContextID, Temp);
- Temp = NULL;
-
--
-- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
-- if (mpe == NULL) goto Error;
--
-- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
-+ goto Error;
-
- for (i=0; i < nChannels; i++)
- cmsFreeToneCurve(Tables[i]);
-@@ -1701,21 +1703,30 @@
-
- if (Tables) {
-
-- if (Tables ->TheCurves[i]->nEntries != 256) {
-- cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
-- return FALSE;
-+ // Usual case of identity curves
-+ if ((Tables ->TheCurves[i]->nEntries == 2) &&
-+ (Tables->TheCurves[i]->Table16[0] == 0) &&
-+ (Tables->TheCurves[i]->Table16[1] == 65535)) {
-+
-+ for (j=0; j < 256; j++) {
-+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
-+ }
- }
--
-- }
--
-- for (j=0; j < 256; j++) {
--
-- if (Tables != NULL)
-- val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
- else
-- val = (cmsUInt8Number) j;
--
-- if (!_cmsWriteUInt8Number(io, val)) return FALSE;
-+ if (Tables ->TheCurves[i]->nEntries != 256) {
-+ cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
-+ return FALSE;
-+ }
-+ else
-+ for (j=0; j < 256; j++) {
-+
-+ if (Tables != NULL)
-+ val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
-+ else
-+ val = (cmsUInt8Number) j;
-+
-+ if (!_cmsWriteUInt8Number(io, val)) return FALSE;
-+ }
- }
- }
- return TRUE;
-@@ -1724,7 +1735,7 @@
-
- // Check overflow
- static
--size_t uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
-+cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
- {
- cmsUInt32Number rv = 1, rc;
-
-@@ -1736,13 +1747,13 @@
- rv *= a;
-
- // Check for overflow
-- if (rv > UINT_MAX / a) return (size_t) -1;
-+ if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;
-
- }
-
- rc = rv * n;
-
-- if (rv != rc / n) return (size_t) -1;
-+ if (rv != rc / n) return (cmsUInt32Number) -1;
- return rc;
- }
-
-@@ -1757,7 +1768,6 @@
- cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
- cmsUInt8Number* Temp = NULL;
- cmsPipeline* NewLUT = NULL;
-- cmsStage *mpemat, *mpeclut;
- cmsUInt32Number nTabSize, i;
- cmsFloat64Number Matrix[3*3];
-
-@@ -1796,9 +1806,8 @@
- // Only operates if not identity...
- if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
-
-- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
-- if (mpemat == NULL) goto Error;
-- cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, mpemat);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
-+ goto Error;
- }
-
- // Get input tables
-@@ -1806,13 +1815,10 @@
-
- // Get 3D CLUT. Check the overflow....
- nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
-- if (nTabSize == (size_t) -1) goto Error;
-+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
- if (nTabSize > 0) {
-
- cmsUInt16Number *PtrW, *T;
-- cmsUInt32Number Tsize;
--
-- Tsize = (cmsUInt32Number) nTabSize * sizeof(cmsUInt16Number);
-
- PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
- if (T == NULL) goto Error;
-@@ -1829,10 +1835,8 @@
- _cmsFree(self ->ContextID, Temp);
- Temp = NULL;
-
--
-- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
-- if (mpeclut == NULL) goto Error;
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))
-+ goto Error;
- _cmsFree(self ->ContextID, T);
- }
-
-@@ -1934,7 +1938,7 @@
- if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;
-
- nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);
-- if (nTabSize == (size_t) -1) return FALSE;
-+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
- if (nTabSize > 0) {
-
- // The 3D CLUT.
-@@ -1983,7 +1987,6 @@
- static
- cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)
- {
-- cmsStage* mpe;
- int i;
- cmsToneCurve* Tables[cmsMAXCHANNELS];
-
-@@ -2007,10 +2010,8 @@
-
-
- // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)
-- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
-- if (mpe == NULL) goto Error;
--
-- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
-+ goto Error;
-
- for (i=0; i < nChannels; i++)
- cmsFreeToneCurve(Tables[i]);
-@@ -2031,7 +2032,9 @@
- int j;
- cmsUInt32Number i;
- cmsUInt16Number val;
-- int nEntries = 256;
-+ int nEntries;
-+
-+ _cmsAssert(Tables != NULL);
-
- nEntries = Tables->TheCurves[0]->nEntries;
-
-@@ -2039,11 +2042,7 @@
-
- for (j=0; j < nEntries; j++) {
-
-- if (Tables != NULL)
-- val = Tables->TheCurves[i]->Table16[j];
-- else
-- val = _cmsQuantizeVal(j, nEntries);
--
-+ val = Tables->TheCurves[i]->Table16[j];
- if (!_cmsWriteUInt16Number(io, val)) return FALSE;
- }
- }
-@@ -2057,7 +2056,6 @@
- {
- cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
- cmsPipeline* NewLUT = NULL;
-- cmsStage *mpemat, *mpeclut;
- cmsUInt32Number nTabSize;
- cmsFloat64Number Matrix[3*3];
- cmsUInt16Number InputEntries, OutputEntries;
-@@ -2094,9 +2092,8 @@
- // Only operates on 3 channels
- if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
-
-- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
-- if (mpemat == NULL) goto Error;
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpemat);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
-+ goto Error;
- }
-
- if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;
-@@ -2110,7 +2107,7 @@
-
- // Get 3D CLUT
- nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
-- if (nTabSize == (size_t) -1) goto Error;
-+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
- if (nTabSize > 0) {
-
- cmsUInt16Number *T;
-@@ -2123,13 +2120,10 @@
- goto Error;
- }
-
-- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
-- if (mpeclut == NULL) {
-- _cmsFree(self ->ContextID, T);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {
-+ _cmsFree(self ->ContextID, T);
- goto Error;
- }
--
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
- _cmsFree(self ->ContextID, T);
- }
-
-@@ -2159,7 +2153,7 @@
- _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
- _cmsStageMatrixData* MatMPE = NULL;
- _cmsStageCLutData* clut = NULL;
-- int InputChannels, OutputChannels, clutPoints;
-+ int i, InputChannels, OutputChannels, clutPoints;
-
- // Disassemble the LUT into components.
- mpe = NewLUT -> Elements;
-@@ -2234,13 +2228,13 @@
- if (PreMPE != NULL) {
- if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;
- } else {
-- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
-+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
- }
-
- if (PostMPE != NULL) {
- if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;
- } else {
-- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
-+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
-
- }
-
-@@ -2249,9 +2243,16 @@
- if (PreMPE != NULL) {
- if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;
- }
-+ else {
-+ for (i=0; i < InputChannels; i++) {
-+
-+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
-+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
-+ }
-+ }
-
- nTabSize = uipow(OutputChannels, clutPoints, InputChannels);
-- if (nTabSize == (size_t) -1) return FALSE;
-+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
- if (nTabSize > 0) {
- // The 3D CLUT.
- if (clut != NULL) {
-@@ -2263,7 +2264,13 @@
- if (PostMPE != NULL) {
- if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;
- }
--
-+ else {
-+ for (i=0; i < OutputChannels; i++) {
-+
-+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
-+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
-+ }
-+ }
-
- return TRUE;
-
-@@ -2479,7 +2486,6 @@
- cmsUInt32Number offsetM; // Offset to first "M" curve
- cmsUInt32Number offsetC; // Offset to CLUT
- cmsUInt32Number offsetA; // Offset to first "A" curve
-- cmsStage* mpe;
- cmsPipeline* NewLUT = NULL;
-
-
-@@ -2501,37 +2507,35 @@
- if (NewLUT == NULL) return NULL;
-
- if (offsetA!= 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))
-+ goto Error;
- }
-
- if (offsetC != 0) {
-- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
-+ goto Error;
- }
-
- if (offsetM != 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))
-+ goto Error;
- }
-
- if (offsetMat != 0) {
-- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
-+ goto Error;
- }
-
- if (offsetB != 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))
-+ goto Error;
- }
-
- *nItems = 1;
- return NewLUT;
-+Error:
-+ cmsPipelineFree(NewLUT);
-+ return NULL;
-
- cmsUNUSED_PARAMETER(SizeOfTag);
- }
-@@ -2798,7 +2802,6 @@
- cmsUInt32Number offsetM; // Offset to first "M" curve
- cmsUInt32Number offsetC; // Offset to CLUT
- cmsUInt32Number offsetA; // Offset to first "A" curve
-- cmsStage* mpe;
- cmsPipeline* NewLUT = NULL;
-
-
-@@ -2821,37 +2824,35 @@
- if (NewLUT == NULL) return NULL;
-
- if (offsetB != 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))
-+ goto Error;
- }
-
- if (offsetMat != 0) {
-- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
-+ goto Error;
- }
-
- if (offsetM != 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))
-+ goto Error;
- }
-
- if (offsetC != 0) {
-- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
-+ goto Error;
- }
-
- if (offsetA!= 0) {
-- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan);
-- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))
-+ goto Error;
- }
-
- *nItems = 1;
- return NewLUT;
-+Error:
-+ cmsPipelineFree(NewLUT);
-+ return NULL;
-
- cmsUNUSED_PARAMETER(SizeOfTag);
- }
-@@ -3287,7 +3288,7 @@
- SizeOfTag -= sizeof(cmsUInt32Number);
-
- if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;
-- if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
-+ if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;
- SizeOfTag -= sizeof(cmsUInt64Number);
-
- if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;
-@@ -4292,6 +4293,9 @@
- if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
- if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
-
-+ if (InputChans == 0) goto Error;
-+ if (OutputChans == 0) goto Error;
-+
- if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
- goto Error;
-
-@@ -4381,7 +4385,6 @@
- {
- cmsStageSignature ElementSig;
- cmsTagTypeHandler* TypeHandler;
-- cmsStage *mpe = NULL;
- cmsUInt32Number nItems;
- cmsPipeline *NewLUT = (cmsPipeline *) Cargo;
-
-@@ -4409,11 +4412,8 @@
- if (TypeHandler ->ReadPtr != NULL) {
-
- // This is a real element which should be read and processed
-- mpe = (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag);
-- if (mpe == NULL) return FALSE;
--
-- // All seems ok, insert element
-- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
-+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))
-+ return FALSE;
- }
-
- return TRUE;
-@@ -4479,10 +4479,10 @@
- outputChan = cmsPipelineOutputChannels(Lut);
- ElemCount = cmsPipelineStageCount(Lut);
-
-- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
-+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
- if (ElementOffsets == NULL) goto Error;
-
-- ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
-+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
- if (ElementSizes == NULL) goto Error;
-
- // Write the head
-@@ -4825,10 +4825,10 @@
- static
- cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count)
- {
-- e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
-+ e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
- if (e->Offsets == NULL) return FALSE;
-
-- e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
-+ e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
- if (e->Sizes == NULL) {
-
- _cmsFree(ContextID, e -> Offsets);
-@@ -4844,7 +4844,7 @@
- void FreeElem(_cmsDICelem* e)
- {
- if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets);
-- if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e ->Sizes);
-+ if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes);
- e->Offsets = e ->Sizes = NULL;
- }
-
-@@ -5084,7 +5084,7 @@
- if (!_cmsReadUInt32Number(io, &Count)) return NULL;
- SizeOfTag -= sizeof(cmsUInt32Number);
-
-- // Get rec lenghth
-+ // Get rec length
- if (!_cmsReadUInt32Number(io, &Length)) return NULL;
- SizeOfTag -= sizeof(cmsUInt32Number);
-
-@@ -5118,14 +5118,22 @@
- if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;
- }
-
-+ if (NameWCS == NULL || ValueWCS == NULL) {
-+
-+ cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value");
-+ rc = FALSE;
-+ }
-+ else {
-+
- rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);
-+ }
-
- if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);
- if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);
- if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);
- if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);
-
-- if (!rc) return FALSE;
-+ if (!rc) goto Error;
- }
-
- FreeArray(&a);
-@@ -5277,14 +5285,14 @@
- #define DEFAULT_TAG_TYPE_COUNT (sizeof(SupportedTagTypes) / sizeof(_cmsTagTypeLinkedList))
-
- // Both kind of plug-ins share same structure
--cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)
- {
-- return RegisterTypesPlugin(Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
-+ return RegisterTypesPlugin(id, Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
- }
-
--cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)
- {
-- return RegisterTypesPlugin(Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
-+ return RegisterTypesPlugin(id, Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
- }
-
-
-@@ -5391,7 +5399,9 @@
- { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]},
- { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]},
- { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]},
-- { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL}, NULL}
-+ { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]},
-+ { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}
-+
-
- };
-
-@@ -5406,7 +5416,7 @@
-
- #define DEFAULT_TAG_COUNT (sizeof(SupportedTags) / sizeof(_cmsTagLinkedList))
-
--cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginTag* Plugin = (cmsPluginTag*) Data;
- _cmsTagLinkedList *pt, *Anterior;
-@@ -5430,7 +5440,7 @@
- pt = pt ->Next;
- }
-
-- pt = (_cmsTagLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagLinkedList));
-+ pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));
- if (pt == NULL) return FALSE;
-
- pt ->Signature = Plugin ->Signature;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Tue Mar 18 12:35:25 2014 -0700
-@@ -208,9 +208,26 @@
-
- if (TransferFunction) {
-
-+ // Tries to minimize space. Thanks to Richard Hughes for this nice idea
- if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error;
-- if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
-- if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
-+
-+ if (TransferFunction[1] == TransferFunction[0]) {
-+
-+ if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;
-+
-+ } else {
-+
-+ if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
-+ }
-+
-+ if (TransferFunction[2] == TransferFunction[0]) {
-+
-+ if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;
-+
-+ } else {
-+
-+ if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
-+ }
- }
-
- if (Primaries) {
-@@ -303,7 +320,6 @@
- {
- cmsHPROFILE hICC;
- cmsPipeline* Pipeline;
-- cmsStage* Lin;
- int nChannels;
-
- hICC = cmsCreateProfilePlaceholder(ContextID);
-@@ -327,10 +343,8 @@
-
-
- // Copy tables to Pipeline
-- Lin = cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions);
-- if (Lin == NULL) goto Error;
--
-- cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, Lin);
-+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))
-+ goto Error;
-
- // Create tags
- if (!SetTextTags(hICC, L"Linearization built-in")) goto Error;
-@@ -344,6 +358,7 @@
- return hICC;
-
- Error:
-+ cmsPipelineFree(Pipeline);
- if (hICC)
- cmsCloseProfile(hICC);
-
-@@ -451,9 +466,10 @@
-
- if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;
-
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels));
-- cmsPipelineInsertStage(LUT, cmsAT_END, CLUT);
-- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||
-+ !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||
-+ !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))
-+ goto Error;
-
- // Create tags
- if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error;
-@@ -504,7 +520,8 @@
- LUT = cmsPipelineAlloc(ContextID, 3, 3);
- if (LUT == NULL) goto Error;
-
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))
-+ goto Error;
-
- if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
- cmsPipelineFree(LUT);
-@@ -550,7 +567,8 @@
- LUT = cmsPipelineAlloc(ContextID, 3, 3);
- if (LUT == NULL) goto Error;
-
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
-+ goto Error;
-
- if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
- cmsPipelineFree(LUT);
-@@ -595,7 +613,8 @@
- LUT = cmsPipelineAlloc(ContextID, 3, 3);
- if (LUT == NULL) goto Error;
-
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
-+ goto Error;
-
- if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
- cmsPipelineFree(LUT);
-@@ -734,81 +753,83 @@
- // contrast, Saturation and white point displacement
-
- cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
-- int nLUTPoints,
-- cmsFloat64Number Bright,
-- cmsFloat64Number Contrast,
-- cmsFloat64Number Hue,
-- cmsFloat64Number Saturation,
-- int TempSrc,
-- int TempDest)
-+ int nLUTPoints,
-+ cmsFloat64Number Bright,
-+ cmsFloat64Number Contrast,
-+ cmsFloat64Number Hue,
-+ cmsFloat64Number Saturation,
-+ int TempSrc,
-+ int TempDest)
- {
-- cmsHPROFILE hICC;
-- cmsPipeline* Pipeline;
-- BCHSWADJUSTS bchsw;
-- cmsCIExyY WhitePnt;
-- cmsStage* CLUT;
-- cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
-- int i;
-+ cmsHPROFILE hICC;
-+ cmsPipeline* Pipeline;
-+ BCHSWADJUSTS bchsw;
-+ cmsCIExyY WhitePnt;
-+ cmsStage* CLUT;
-+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
-+ int i;
-
-+ bchsw.Brightness = Bright;
-+ bchsw.Contrast = Contrast;
-+ bchsw.Hue = Hue;
-+ bchsw.Saturation = Saturation;
-
-- bchsw.Brightness = Bright;
-- bchsw.Contrast = Contrast;
-- bchsw.Hue = Hue;
-- bchsw.Saturation = Saturation;
-+ cmsWhitePointFromTemp(&WhitePnt, TempSrc );
-+ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
-
-- cmsWhitePointFromTemp(&WhitePnt, TempSrc );
-- cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
-+ cmsWhitePointFromTemp(&WhitePnt, TempDest);
-+ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
-
-- cmsWhitePointFromTemp(&WhitePnt, TempDest);
-- cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
-+ hICC = cmsCreateProfilePlaceholder(ContextID);
-+ if (!hICC) // can't allocate
-+ return NULL;
-
-- hICC = cmsCreateProfilePlaceholder(ContextID);
-- if (!hICC) // can't allocate
-- return NULL;
-
-+ cmsSetDeviceClass(hICC, cmsSigAbstractClass);
-+ cmsSetColorSpace(hICC, cmsSigLabData);
-+ cmsSetPCS(hICC, cmsSigLabData);
-
-- cmsSetDeviceClass(hICC, cmsSigAbstractClass);
-- cmsSetColorSpace(hICC, cmsSigLabData);
-- cmsSetPCS(hICC, cmsSigLabData);
-+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
-
-- cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
-+ // Creates a Pipeline with 3D grid only
-+ Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
-+ if (Pipeline == NULL) {
-+ cmsCloseProfile(hICC);
-+ return NULL;
-+ }
-
-+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
-+ CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
-+ if (CLUT == NULL) return NULL;
-
-- // Creates a Pipeline with 3D grid only
-- Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
-- if (Pipeline == NULL) {
-- cmsCloseProfile(hICC);
-- return NULL;
-- }
-
-- for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
-- CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
-- if (CLUT == NULL) return NULL;
-+ if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
-
-+ // Shouldn't reach here
-+ goto Error;
-+ }
-
-- if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
-+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
-+ goto Error;
-+ }
-
-- // Shouldn't reach here
-- cmsPipelineFree(Pipeline);
-- cmsCloseProfile(hICC);
-- return NULL;
-- }
-+ // Create tags
-+ if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
-
-- cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT);
-+ cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
-
-- // Create tags
-+ cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
-
-- if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
-+ // Pipeline is already on virtual profile
-+ cmsPipelineFree(Pipeline);
-
-- cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
-+ // Ok, done
-+ return hICC;
-
-- cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
--
-- // Pipeline is already on virtual profile
-- cmsPipelineFree(Pipeline);
--
-- // Ok, done
-- return hICC;
-+Error:
-+ cmsPipelineFree(Pipeline);
-+ cmsCloseProfile(hICC);
-+ return NULL;
- }
-
-
-@@ -856,7 +877,8 @@
- PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);
- cmsFreeToneCurve(EmptyTab);
-
-- cmsPipelineInsertStage(LUT, cmsAT_END, PostLin);
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))
-+ goto Error;
-
- if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;
- if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
-@@ -999,6 +1021,7 @@
-
- { FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
- { FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
-+ { FALSE, 0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType}},
- { TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }},
- { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
- { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
-@@ -1059,6 +1082,7 @@
- cmsContext ContextID = cmsGetTransformContextID(hTransform);
- const cmsAllowedLUT* AllowedLUT;
- cmsTagSignature DestinationTag;
-+ cmsProfileClassSignature deviceClass;
-
- _cmsAssert(hTransform != NULL);
-
-@@ -1080,13 +1104,15 @@
- // Time to fix the Lab2/Lab4 issue.
- if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {
-
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))
-+ goto Error;
- }
-
- // On the output side too
- if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {
-
-- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))
-+ goto Error;
- }
-
-
-@@ -1108,8 +1134,9 @@
- FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);
- FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);
-
-+ deviceClass = cmsGetDeviceClass(hProfile);
-
-- if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass)
-+ if (deviceClass == cmsSigOutputClass)
- DestinationTag = cmsSigBToA0Tag;
- else
- DestinationTag = cmsSigAToB0Tag;
-@@ -1136,10 +1163,12 @@
-
- // Put identity curves if needed
- if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
-- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
-+ goto Error;
-
- if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
-- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut));
-+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
-+ goto Error;
-
- AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
- }
-@@ -1168,10 +1197,22 @@
- if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;
- }
-
-- if (xform ->Sequence != NULL) {
-+ if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {
- if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;
- }
-
-+ // Set the white point
-+ if (deviceClass == cmsSigInputClass) {
-+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;
-+ }
-+ else {
-+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;
-+ }
-+
-+
-+ // Per 7.2.15 in spec 4.3
-+ cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);
-+
- cmsPipelineFree(LUT);
- return hProfile;
-
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Tue Mar 18 12:35:25 2014 -0700
-@@ -30,7 +30,7 @@
- //---------------------------------------------------------------------------------
- //
- // Little Color Management System
--// Copyright (c) 1998-2010 Marti Maria Saguer
-+// Copyright (c) 1998-2012 Marti Maria Saguer
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -76,48 +76,48 @@
- // Obtains WhitePoint from Temperature
- cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)
- {
-- cmsFloat64Number x, y;
-- cmsFloat64Number T, T2, T3;
-- // cmsFloat64Number M1, M2;
-+ cmsFloat64Number x, y;
-+ cmsFloat64Number T, T2, T3;
-+ // cmsFloat64Number M1, M2;
-
-- _cmsAssert(WhitePoint != NULL);
-+ _cmsAssert(WhitePoint != NULL);
-
-- T = TempK;
-- T2 = T*T; // Square
-- T3 = T2*T; // Cube
-+ T = TempK;
-+ T2 = T*T; // Square
-+ T3 = T2*T; // Cube
-
-- // For correlated color temperature (T) between 4000K and 7000K:
-+ // For correlated color temperature (T) between 4000K and 7000K:
-
-- if (T >= 4000. && T <= 7000.)
-- {
-- x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
-- }
-- else
-- // or for correlated color temperature (T) between 7000K and 25000K:
-+ if (T >= 4000. && T <= 7000.)
-+ {
-+ x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
-+ }
-+ else
-+ // or for correlated color temperature (T) between 7000K and 25000K:
-
-- if (T > 7000.0 && T <= 25000.0)
-- {
-- x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
-- }
-- else {
-- cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
-- return FALSE;
-- }
-+ if (T > 7000.0 && T <= 25000.0)
-+ {
-+ x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
-+ }
-+ else {
-+ cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
-+ return FALSE;
-+ }
-
-- // Obtain y(x)
-+ // Obtain y(x)
-
-- y = -3.000*(x*x) + 2.870*x - 0.275;
-+ y = -3.000*(x*x) + 2.870*x - 0.275;
-
-- // wave factors (not used, but here for futures extensions)
-+ // wave factors (not used, but here for futures extensions)
-
-- // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
-- // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
-+ // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
-+ // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
-
-- WhitePoint -> x = x;
-- WhitePoint -> y = y;
-- WhitePoint -> Y = 1.0;
-+ WhitePoint -> x = x;
-+ WhitePoint -> y = y;
-+ WhitePoint -> Y = 1.0;
-
-- return TRUE;
-+ return TRUE;
- }
-
-
-@@ -266,7 +266,7 @@
- {{ 0.8951, 0.2664, -0.1614 }},
- {{ -0.7502, 1.7135, 0.0367 }},
- {{ 0.0389, -0.0685, 1.0296 }}
-- }};
-+ }};
-
- if (ConeMatrix == NULL)
- ConeMatrix = &LamRigg;
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Tue Mar 18 12:35:25 2014 -0700
-@@ -396,7 +396,7 @@
- static _cmsTransformCollection* TransformCollection = NULL;
-
- // Register new ways to transform
--cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Data)
-+cmsBool _cmsRegisterTransformPlugin(cmsContext id, cmsPluginBase* Data)
- {
- cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;
- _cmsTransformCollection* fl;
-@@ -412,7 +412,7 @@
- if (Plugin ->Factory == NULL) return FALSE;
-
-
-- fl = (_cmsTransformCollection*) _cmsPluginMalloc(sizeof(_cmsTransformCollection));
-+ fl = (_cmsTransformCollection*) _cmsPluginMalloc(id, sizeof(_cmsTransformCollection));
- if (fl == NULL) return FALSE;
-
- // Copy the parameters
-@@ -651,6 +651,22 @@
-
- // ----------------------------------------------------------------------------------------------------------------
-
-+static
-+void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)
-+{
-+ if (src == NULL) {
-+ wtPt ->X = cmsD50X;
-+ wtPt ->Y = cmsD50Y;
-+ wtPt ->Z = cmsD50Z;
-+ }
-+ else {
-+ wtPt ->X = src->X;
-+ wtPt ->Y = src->Y;
-+ wtPt ->Z = src->Z;
-+ }
-+
-+}
-+
- // New to lcms 2.0 -- have all parameters available.
- cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
- cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
-@@ -664,7 +680,6 @@
- cmsUInt32Number dwFlags)
- {
- _cmsTRANSFORM* xform;
-- cmsBool FloatTransform;
- cmsColorSpaceSignature EntryColorSpace;
- cmsColorSpaceSignature ExitColorSpace;
- cmsPipeline* Lut;
-@@ -681,9 +696,7 @@
- if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;
- }
-
-- // On floating point transforms, inhibit optimizations
-- FloatTransform = (_cmsFormatterIsFloat(InputFormat) && _cmsFormatterIsFloat(OutputFormat));
--
-+ // On floating point transforms, inhibit cache
- if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))
- dwFlags |= cmsFLAGS_NOCACHE;
-
-@@ -730,6 +743,10 @@
- xform ->ExitColorSpace = ExitColorSpace;
- xform ->RenderingIntent = Intents[nProfiles-1];
-
-+ // Take white points
-+ SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));
-+ SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));
-+
-
- // Create a gamut check LUT if requested
- if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Tue Mar 18 12:35:25 2014 -0700
-@@ -30,7 +30,7 @@
- //---------------------------------------------------------------------------------
- //
- // Little Color Management System
--// Copyright (c) 1998-2011 Marti Maria Saguer
-+// Copyright (c) 1998-2013 Marti Maria Saguer
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the "Software"),
-@@ -52,7 +52,7 @@
- //
- //---------------------------------------------------------------------------------
- //
--// Version 2.4
-+// Version 2.5
- //
-
- #ifndef _lcms2_H
-@@ -101,7 +101,7 @@
- #endif
-
- // Version/release
--#define LCMS_VERSION 2040
-+#define LCMS_VERSION 2050
-
- // I will give the chance of redefining basic types for compilers that are not fully C99 compliant
- #ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
-@@ -367,6 +367,7 @@
- cmsSigPreview1Tag = 0x70726531, // 'pre1'
- cmsSigPreview2Tag = 0x70726532, // 'pre2'
- cmsSigProfileDescriptionTag = 0x64657363, // 'desc'
-+ cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm'
- cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq'
- cmsSigProfileSequenceIdTag = 0x70736964, // 'psid'
- cmsSigPs2CRD0Tag = 0x70736430, // 'psd0'
-@@ -1014,6 +1015,7 @@
- // Plug-In registering ---------------------------------------------------------------------------------------------------
-
- CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin);
-+CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
- CMSAPI void CMSEXPORT cmsUnregisterPlugins(void);
-
- // Error logging ----------------------------------------------------------------------------------------------------------
-@@ -1190,7 +1192,7 @@
- // Where to place/locate the stages in the pipeline chain
- typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
-
--CMSAPI void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
-+CMSAPI int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
- CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
-
- // This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
-@@ -1274,6 +1276,13 @@
- const char LanguageCode[3], const char CountryCode[3],
- char ObtainedLanguage[3], char ObtainedCountry[3]);
-
-+CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
-+
-+CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
-+ cmsUInt32Number idx,
-+ char LanguageCode[3],
-+ char CountryCode[3]);
-+
- // Undercolorremoval & black generation -------------------------------------------------------------------------------------
-
- typedef struct {
-@@ -1424,6 +1433,7 @@
- CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
- CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
- CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
-+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
- CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
- CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
- CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
---- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Tue Mar 18 12:35:25 2014 -0700
-@@ -27,7 +27,7 @@
- // However, the following notice accompanied the original version of this
- // file:
- //
--//---------------------------------------------------------------------------------
-+
- //
- // Little Color Management System
- // Copyright (c) 1998-2011 Marti Maria Saguer
-@@ -196,7 +196,7 @@
- // Plug-In registering ---------------------------------------------------------------
-
- // Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
--void* _cmsPluginMalloc(cmsUInt32Number size);
-+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);
-
- // Memory management
- cmsBool _cmsRegisterMemHandlerPlugin(cmsPluginBase* Plugin);
-@@ -205,28 +205,28 @@
- cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Plugin);
-
- // Parametric curves
--cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Formatters management
--cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Tag type management
--cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Tag management
--cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Intent management
--cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Multi Process elements
--cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Optimization
--cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // Transform
--cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Plugin);
-+cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
-
- // ---------------------------------------------------------------------------------------------------------
-
-@@ -263,7 +263,7 @@
- cmsUInt16Number Country;
-
- cmsUInt32Number StrW; // Offset to current unicode string
-- cmsUInt32Number Len; // Lenght in bytes
-+ cmsUInt32Number Len; // Length in bytes
-
- } _cmsMLUentry;
-
-@@ -330,9 +330,11 @@
- cmsColorSpaceSignature ColorSpace;
- cmsColorSpaceSignature PCS;
- cmsUInt32Number RenderingIntent;
-+
- cmsUInt32Number flags;
- cmsUInt32Number manufacturer, model;
- cmsUInt64Number attributes;
-+ cmsUInt32Number creator;
-
- cmsProfileID ProfileID;
-
-@@ -585,6 +587,10 @@
- cmsColorSpaceSignature EntryColorSpace;
- cmsColorSpaceSignature ExitColorSpace;
-
-+ // White points (informative only)
-+ cmsCIEXYZ EntryWhitePoint;
-+ cmsCIEXYZ ExitWhitePoint;
-+
- // Profiles used to create the transform
- cmsSEQ* Sequence;
-
---- ./jdk/src/share/native/sun/management/Flag.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/management/Flag.c Tue Mar 18 12:35:25 2014 -0700
-@@ -95,12 +95,12 @@
- return 0;
- }
-
-- if (count == 0) {
-+ if (count <= 0) {
- JNU_ThrowIllegalArgumentException(env, 0);
- return 0;
- }
-
-- gsize = count * sizeof(jmmVMGlobal);
-+ gsize = (size_t)count * sizeof(jmmVMGlobal);
- globals = (jmmVMGlobal*) malloc(gsize);
- if (globals == NULL) {
- JNU_ThrowOutOfMemoryError(env, 0);
---- ./jdk/src/share/native/sun/management/GcInfoBuilder.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/share/native/sun/management/GcInfoBuilder.c Tue Mar 18 12:35:25 2014 -0700
-@@ -59,12 +59,12 @@
- return;
- }
-
-- if (num_attributes == 0) {
-+ if (num_attributes <= 0) {
- JNU_ThrowIllegalArgumentException(env, "Invalid num_attributes");
- return;
- }
-
-- ext_att_info = (jmmExtAttributeInfo*) malloc(num_attributes *
-+ ext_att_info = (jmmExtAttributeInfo*) malloc((size_t)num_attributes *
- sizeof(jmmExtAttributeInfo));
- if (ext_att_info == NULL) {
- JNU_ThrowOutOfMemoryError(env, 0);
-@@ -78,7 +78,7 @@
- return;
- }
-
-- nativeTypes = (jchar*) malloc(num_attributes * sizeof(jchar));
-+ nativeTypes = (jchar*) malloc((size_t)num_attributes * sizeof(jchar));
- if (nativeTypes == NULL) {
- free(ext_att_info);
- JNU_ThrowOutOfMemoryError(env, 0);
-@@ -188,11 +188,16 @@
- return 0;
- }
-
-+ if (ext_att_count <= 0) {
-+ JNU_ThrowIllegalArgumentException(env, "Invalid ext_att_count");
-+ return;
-+ }
-+
- gc_stat.usage_before_gc = usageBeforeGC;
- gc_stat.usage_after_gc = usageAfterGC;
- gc_stat.gc_ext_attribute_values_size = ext_att_count;
- if (ext_att_count > 0) {
-- gc_stat.gc_ext_attribute_values = (jvalue*) malloc(ext_att_count *
-+ gc_stat.gc_ext_attribute_values = (jvalue*) malloc((size_t)ext_att_count *
- sizeof(jvalue));
- if (gc_stat.gc_ext_attribute_values == NULL) {
- JNU_ThrowOutOfMemoryError(env, 0);
-@@ -212,7 +217,7 @@
- }
-
- // convert the ext_att_types to native types
-- nativeTypes = (jchar*) malloc(ext_att_count * sizeof(jchar));
-+ nativeTypes = (jchar*) malloc((size_t)ext_att_count * sizeof(jchar));
- if (nativeTypes == NULL) {
- if (gc_stat.gc_ext_attribute_values != NULL) {
- free(gc_stat.gc_ext_attribute_values);
---- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Mar 18 12:35:25 2014 -0700
-@@ -63,11 +63,59 @@
- private /* final */ InputStream stdout;
- private /* final */ InputStream stderr;
-
-+ private static enum LaunchMechanism {
-+ FORK(1),
-+ POSIX_SPAWN(2);
-+
-+ private int value;
-+ LaunchMechanism(int x) {value = x;}
-+ };
-+
-+ /* On BSD, the default is to spawn */
-+ private static final LaunchMechanism launchMechanism;
-+ private static byte[] helperpath;
-+
-+ private static byte[] toCString(String s) {
-+ if (s == null)
-+ return null;
-+ byte[] bytes = s.getBytes();
-+ byte[] result = new byte[bytes.length + 1];
-+ System.arraycopy(bytes, 0,
-+ result, 0,
-+ bytes.length);
-+ result[result.length-1] = (byte)0;
-+ return result;
-+ }
-+
-+ static {
-+ launchMechanism = AccessController.doPrivileged(
-+ new PrivilegedAction<LaunchMechanism>()
-+ {
-+ public LaunchMechanism run() {
-+ String javahome = System.getProperty("java.home");
-+
-+ helperpath = toCString(javahome + "/lib/jspawnhelper");
-+ String s = System.getProperty(
-+ "jdk.lang.Process.launchMechanism", "posix_spawn");
-+
-+ try {
-+ return LaunchMechanism.valueOf(s.toUpperCase());
-+ } catch (IllegalArgumentException e) {
-+ throw new Error(s + " is not a supported " +
-+ "process launch mechanism on this platform.");
-+ }
-+ }
-+ });
-+ }
-+
- /* this is for the reaping thread */
- private native int waitForProcessExit(int pid);
-
- /**
-- * Create a process using fork(2) and exec(2).
-+ * Create a process. Depending on the mode flag, this is done by
-+ * one of the following mechanisms.
-+ * - fork(2) and exec(2)
-+ * - posix_spawn(2)
- *
- * @param fds an array of three file descriptors.
- * Indexes 0, 1, and 2 correspond to standard input,
-@@ -80,7 +128,8 @@
- * output.
- * @return the pid of the subprocess
- */
-- private native int forkAndExec(byte[] prog,
-+ private native int forkAndExec(int mode, byte[] helperpath,
-+ byte[] prog,
- byte[] argBlock, int argc,
- byte[] envBlock, int envc,
- byte[] dir,
-@@ -132,7 +181,9 @@
- final boolean redirectErrorStream)
- throws IOException {
-
-- pid = forkAndExec(prog,
-+ pid = forkAndExec(launchMechanism.value,
-+ helperpath,
-+ prog,
- argBlock, argc,
- envBlock, envc,
- dir,
-@@ -236,11 +287,10 @@
- try { stderr.close(); } catch (IOException ignored) {}
- }
-
-- /* This routine initializes JNI field offsets for the class */
-- private static native void initIDs();
-+ private static native void init();
-
- static {
-- initIDs();
-+ init();
- }
-
- /**
---- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Mar 18 12:35:25 2014 -0700
-@@ -63,11 +63,61 @@
- private /* final */ InputStream stdout;
- private /* final */ InputStream stderr;
-
-+ private static enum LaunchMechanism {
-+ FORK(1),
-+ VFORK(3);
-+
-+ private int value;
-+ LaunchMechanism(int x) {value = x;}
-+ };
-+
-+ /* default is VFORK on Linux */
-+ private static final LaunchMechanism launchMechanism;
-+ private static byte[] helperpath;
-+
-+ private static byte[] toCString(String s) {
-+ if (s == null)
-+ return null;
-+ byte[] bytes = s.getBytes();
-+ byte[] result = new byte[bytes.length + 1];
-+ System.arraycopy(bytes, 0,
-+ result, 0,
-+ bytes.length);
-+ result[result.length-1] = (byte)0;
-+ return result;
-+ }
-+
-+ static {
-+ launchMechanism = AccessController.doPrivileged(
-+ new PrivilegedAction<LaunchMechanism>()
-+ {
-+ public LaunchMechanism run() {
-+ String javahome = System.getProperty("java.home");
-+ String osArch = System.getProperty("os.arch");
-+
-+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
-+ String s = System.getProperty(
-+ "jdk.lang.Process.launchMechanism", "vfork");
-+
-+ try {
-+ return LaunchMechanism.valueOf(s.toUpperCase());
-+ } catch (IllegalArgumentException e) {
-+ throw new Error(s + " is not a supported " +
-+ "process launch mechanism on this platform.");
-+ }
-+ }
-+ });
-+ }
-+
- /* this is for the reaping thread */
- private native int waitForProcessExit(int pid);
-
- /**
-- * Create a process using fork(2) and exec(2).
-+ * Create a process. Depending on the mode flag, this is done by
-+ * one of the following mechanisms.
-+ * - fork(2) and exec(2)
-+ * - clone(2) and exec(2)
-+ * - vfork(2) and exec(2)
- *
- * @param fds an array of three file descriptors.
- * Indexes 0, 1, and 2 correspond to standard input,
-@@ -80,7 +130,8 @@
- * output.
- * @return the pid of the subprocess
- */
-- private native int forkAndExec(byte[] prog,
-+ private native int forkAndExec(int mode, byte[] helperpath,
-+ byte[] prog,
- byte[] argBlock, int argc,
- byte[] envBlock, int envc,
- byte[] dir,
-@@ -132,7 +183,9 @@
- final boolean redirectErrorStream)
- throws IOException {
-
-- pid = forkAndExec(prog,
-+ pid = forkAndExec(launchMechanism.value,
-+ helperpath,
-+ prog,
- argBlock, argc,
- envBlock, envc,
- dir,
-@@ -236,11 +289,10 @@
- try { stderr.close(); } catch (IOException ignored) {}
- }
-
-- /* This routine initializes JNI field offsets for the class */
-- private static native void initIDs();
-+ private static native void init();
-
- static {
-- initIDs();
-+ init();
- }
-
- /**
---- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Mar 18 12:35:25 2014 -0700
-@@ -26,6 +26,8 @@
- package java.lang;
-
- import java.io.*;
-+import java.security.AccessController;
-+import java.security.PrivilegedAction;
-
- /* java.lang.Process subclass in the UNIX environment.
- *
-@@ -45,11 +47,65 @@
- private DeferredCloseInputStream stdout_inner_stream;
- private InputStream stderr_stream;
-
-+ private static enum LaunchMechanism {
-+ FORK(1),
-+ POSIX_SPAWN(2);
-+
-+ private int value;
-+ LaunchMechanism(int x) {value = x;}
-+ };
-+
-+ /* On Solaris, the default is to spawn */
-+ private static final LaunchMechanism launchMechanism;
-+ private static byte[] helperpath;
-+
-+ private static byte[] toCString(String s) {
-+ if (s == null)
-+ return null;
-+ byte[] bytes = s.getBytes();
-+ byte[] result = new byte[bytes.length + 1];
-+ System.arraycopy(bytes, 0,
-+ result, 0,
-+ bytes.length);
-+ result[result.length-1] = (byte)0;
-+ return result;
-+ }
-+
-+ static {
-+ launchMechanism = AccessController.doPrivileged(
-+ new PrivilegedAction<LaunchMechanism>()
-+ {
-+ public LaunchMechanism run() {
-+ String javahome = System.getProperty("java.home");
-+ String osArch = System.getProperty("os.arch");
-+ if (osArch.equals("x86")) {
-+ osArch = "i386";
-+ } else if (osArch.equals("x86_64")) {
-+ osArch = "amd64";
-+ }
-+
-+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
-+ String s = System.getProperty(
-+ "jdk.lang.Process.launchMechanism", "fork");
-+
-+ try {
-+ return LaunchMechanism.valueOf(s.toUpperCase());
-+ } catch (IllegalArgumentException e) {
-+ throw new Error(s + " is not a supported " +
-+ "process launch mechanism on this platform.");
-+ }
-+ }
-+ });
-+ }
-+
- /* this is for the reaping thread */
- private native int waitForProcessExit(int pid);
-
- /**
-- * Create a process using fork(2) and exec(2).
-+ * Create a process. Depending on the mode flag, this is done by
-+ * one of the following mechanisms.
-+ * - fork(2) and exec(2)
-+ * - posix_spawn(2)
- *
- * @param std_fds array of file descriptors. Indexes 0, 1, and
- * 2 correspond to standard input, standard output and
-@@ -61,7 +117,8 @@
- * if and only if it is <em>not</em> -1 on output.
- * @return the pid of the subprocess
- */
-- private native int forkAndExec(byte[] prog,
-+ private native int forkAndExec(int mode, byte[] helperpath,
-+ byte[] prog,
- byte[] argBlock, int argc,
- byte[] envBlock, int envc,
- byte[] dir,
-@@ -76,7 +133,9 @@
- final int[] std_fds,
- final boolean redirectErrorStream)
- throws IOException {
-- pid = forkAndExec(prog,
-+ pid = forkAndExec(launchMechanism.value,
-+ helperpath,
-+ prog,
- argBlock, argc,
- envBlock, envc,
- dir,
-@@ -294,10 +353,9 @@
-
- }
-
-- /* This routine initializes JNI field offsets for the class */
-- private static native void initIDs();
-+ private static native void init();
-
- static {
-- initIDs();
-+ init();
- }
- }
---- ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Tue Mar 18 12:35:25 2014 -0700
-@@ -84,7 +84,7 @@
-
- protected synchronized void setContentsNative(Transferable contents) {
- SortedMap formatMap = DataTransferer.getInstance().getFormatsForTransferable
-- (contents, DataTransferer.adaptFlavorMap(flavorMap));
-+ (contents, DataTransferer.adaptFlavorMap(getDefaultFlavorTable()));
- long[] formats = DataTransferer.keysToLongArray(formatMap);
-
- if (!selection.setOwner(contents, formatMap, formats,
-@@ -123,7 +123,7 @@
- private void checkChangeHere(Transferable contents) {
- if (areFlavorListenersRegistered()) {
- checkChange(DataTransferer.getInstance().
-- getFormatsForTransferableAsArray(contents, flavorMap));
-+ getFormatsForTransferableAsArray(contents, getDefaultFlavorTable()));
- }
- }
-
---- ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -49,6 +49,7 @@
- import sun.awt.*;
- import sun.font.FontConfigManager;
- import sun.misc.PerformanceLogger;
-+import sun.misc.ThreadGroupUtils;
- import sun.print.PrintJob2D;
- import sun.security.action.GetPropertyAction;
- import sun.security.action.GetBooleanAction;
-@@ -311,13 +312,7 @@
- }
- PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
- public Void run() {
-- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = mainTG.getParent();
-- while (parentTG != null) {
-- mainTG = parentTG;
-- parentTG = mainTG.getParent();
-- }
-- Thread shutdownThread = new Thread(mainTG, "XToolkt-Shutdown-Thread") {
-+ Thread shutdownThread = new Thread(ThreadGroupUtils.getRootThreadGroup(), "XToolkt-Shutdown-Thread") {
- public void run() {
- XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
- if (peer != null) {
-@@ -379,22 +374,16 @@
- init();
- XWM.init();
- SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
--
-- PrivilegedAction<Thread> action = new PrivilegedAction() {
-+ toolkitThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
-+ @Override
- public Thread run() {
-- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = currentTG.getParent();
-- while (parentTG != null) {
-- currentTG = parentTG;
-- parentTG = currentTG.getParent();
-- }
-- Thread thread = new Thread(currentTG, XToolkit.this, "AWT-XAWT");
-+ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), XToolkit.this, "AWT-XAWT");
-+ thread.setContextClassLoader(null);
- thread.setPriority(Thread.NORM_PRIORITY + 1);
- thread.setDaemon(true);
- return thread;
- }
-- };
-- toolkitThread = AccessController.doPrivileged(action);
-+ });
- toolkitThread.start();
- }
- }
---- ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -41,6 +41,7 @@
- import sun.java2d.opengl.GLXGraphicsConfig;
- import sun.java2d.xr.XRGraphicsConfig;
- import sun.java2d.loops.SurfaceType;
-+import sun.misc.ThreadGroupUtils;
-
- /**
- * This is an implementation of a GraphicsDevice object for a single
-@@ -424,23 +425,20 @@
- // hook will have no effect)
- shutdownHookRegistered = true;
- PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
-+ @Override
- public Void run() {
-- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = mainTG.getParent();
-- while (parentTG != null) {
-- mainTG = parentTG;
-- parentTG = mainTG.getParent();
-- }
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
- Runnable r = new Runnable() {
-- public void run() {
-- Window old = getFullScreenWindow();
-- if (old != null) {
-- exitFullScreenExclusive(old);
-- setDisplayMode(origDisplayMode);
-- }
-+ @Override
-+ public void run() {
-+ Window old = getFullScreenWindow();
-+ if (old != null) {
-+ exitFullScreenExclusive(old);
-+ setDisplayMode(origDisplayMode);
- }
-- };
-- Thread t = new Thread(mainTG, r,"Display-Change-Shutdown-Thread-"+screen);
-+ }
-+ };
-+ Thread t = new Thread(rootTG, r, "Display-Change-Shutdown-Thread-" + screen);
- t.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(t);
- return null;
---- ./jdk/src/solaris/demo/jni/Poller/Poller.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/demo/jni/Poller/Poller.c Tue Mar 18 12:35:25 2014 -0700
-@@ -318,7 +318,7 @@
-
- ioevent_t *ioeh;
-
-- if (handle < 0 || handle > MAX_HANDLES)
-+ if (handle < 0 || handle >= MAX_HANDLES)
- {
- STATE_EXCEPTION("DestroyPoller - handle out of range");
- return;
-@@ -366,7 +366,7 @@
- int retval;
- ioevent_t *ioeh;
-
-- if (handle < 0 || handle > MAX_HANDLES)
-+ if (handle < 0 || handle >= MAX_HANDLES)
- return STATE_EXCEPTION("AddFd - handle out of range");
-
- ioeh = &IOE_handles[handle];
-@@ -459,7 +459,7 @@
- return fd;
- }
-
-- /*
-+/*
- * Class: Poller
- * Method: nativeRemoveFd
- * Signature: (II)I
-@@ -469,7 +469,7 @@
- {
- ioevent_t *ioeh;
-
-- if (handle < 0 || handle > MAX_HANDLES)
-+ if (handle < 0 || handle >= MAX_HANDLES)
- return STATE_EXCEPTION("RemoveFd - handle out of range");
-
- ioeh = &IOE_handles[handle];
-@@ -576,7 +576,7 @@
- int i;
- ioevent_t *ioeh;
-
-- if (handle < 0 || handle > MAX_HANDLES)
-+ if (handle < 0 || handle >= MAX_HANDLES)
- return STATE_EXCEPTION("IsMember - handle out of range");
-
- ioeh = &IOE_handles[handle];
-@@ -629,7 +629,7 @@
- ioevent_t *ioeh;
- jboolean isCopy1,isCopy2;
-
-- if (handle < 0 || handle > MAX_HANDLES)
-+ if (handle < 0 || handle >= MAX_HANDLES)
- return STATE_EXCEPTION("nativeWait - handle out of range");
-
- ioeh = &IOE_handles[handle];
---- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Tue Mar 18 12:35:25 2014 -0700
-@@ -76,7 +76,7 @@
- adPath[*count].st_ino = statBuf.st_ino;
- adPath[*count].st_dev = statBuf.st_dev;
- strncpy(adPath[*count].path, path, MAX_NAME_LENGTH);
-- adPath[*count].path[MAX_NAME_LENGTH] = 0;
-+ adPath[*count].path[MAX_NAME_LENGTH - 1] = 0;
- (*count)++;
- TRACE1("Added audio device %s\n", path);
- }
---- ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Tue Mar 18 12:35:25 2014 -0700
-@@ -31,21 +31,24 @@
- #ifdef __APPLE__
- #include <crt_externs.h>
- #define environ (*_NSGetEnviron())
-+#else
-+/* This is one of the rare times it's more portable to declare an
-+ * external symbol explicitly, rather than via a system header.
-+ * The declaration is standardized as part of UNIX98, but there is
-+ * no standard (not even de-facto) header file where the
-+ * declaration is to be found. See:
-+ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
-+ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
-+ *
-+ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
-+ * environ, are defined in at least one of the headers" (!)
-+ */
-+extern char **environ;
- #endif
-
- JNIEXPORT jobjectArray JNICALL
- Java_java_lang_ProcessEnvironment_environ(JNIEnv *env, jclass ign)
- {
-- /* This is one of the rare times it's more portable to declare an
-- * external symbol explicitly, rather than via a system header.
-- * The declaration is standardized as part of UNIX98, but there is
-- * no standard (not even de-facto) header file where the
-- * declaration is to be found. See:
-- * http://www.opengroup.org/onlinepubs/007908799/xbd/envvar.html */
--#ifndef __APPLE__
-- extern char ** environ; /* environ[i] looks like: VAR=VALUE\0 */
--#endif
--
- jsize count = 0;
- jsize i, j;
- jobjectArray result;
---- ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Mar 18 12:35:25 2014 -0700
-@@ -47,19 +47,15 @@
- #endif
- #include <signal.h>
- #include <string.h>
--#include <errno.h>
--#include <dirent.h>
--#include <unistd.h>
--#include <fcntl.h>
--#include <limits.h>
-
--#ifdef __APPLE__
--#include <crt_externs.h>
--#define environ (*_NSGetEnviron())
-+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
-+#include <spawn.h>
- #endif
-
-+#include "childproc.h"
-+
- /*
-- * There are 3 possible strategies we might use to "fork":
-+ * There are 4 possible strategies we might use to "fork":
- *
- * - fork(2). Very portable and reliable but subject to
- * failure due to overcommit (see the documentation on
-@@ -94,81 +90,21 @@
- * http://sources.redhat.com/bugzilla/show_bug.cgi?id=10311
- * but the glibc maintainers closed it as WONTFIX.
- *
-+ * - posix_spawn(). While posix_spawn() is a fairly elaborate and
-+ * complicated system call, it can't quite do everything that the old
-+ * fork()/exec() combination can do, so the only feasible way to do
-+ * this, is to use posix_spawn to launch a new helper executable
-+ * "jprochelper", which in turn execs the target (after cleaning
-+ * up file-descriptors etc.) The end result is the same as before,
-+ * a child process linked to the parent in the same way, but it
-+ * avoids the problem of duplicating the parent (VM) process
-+ * address space temporarily, before launching the target command.
-+ *
- * Based on the above analysis, we are currently using vfork() on
-- * Linux and fork() on other Unix systems, but the code to use clone()
-- * remains.
-+ * Linux, posix_spawn() on Mac and fork() on Solaris, but the code to
-+ * use clone() and fork() remains.
- */
-
--#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
--
--#ifndef START_CHILD_USE_CLONE
-- #ifdef __linux__
-- #define START_CHILD_USE_CLONE 1
-- #else
-- #define START_CHILD_USE_CLONE 0
-- #endif
--#endif
--
--/* By default, use vfork() on Linux. */
--#ifndef START_CHILD_USE_VFORK
-- #ifdef __linux__
-- #define START_CHILD_USE_VFORK 1
-- #else
-- #define START_CHILD_USE_VFORK 0
-- #endif
--#endif
--
--#if START_CHILD_USE_CLONE
--#include <sched.h>
--#define START_CHILD_SYSTEM_CALL "clone"
--#elif START_CHILD_USE_VFORK
--#define START_CHILD_SYSTEM_CALL "vfork"
--#else
--#define START_CHILD_SYSTEM_CALL "fork"
--#endif
--
--#ifndef STDIN_FILENO
--#define STDIN_FILENO 0
--#endif
--
--#ifndef STDOUT_FILENO
--#define STDOUT_FILENO 1
--#endif
--
--#ifndef STDERR_FILENO
--#define STDERR_FILENO 2
--#endif
--
--#ifndef SA_NOCLDSTOP
--#define SA_NOCLDSTOP 0
--#endif
--
--#ifndef SA_RESTART
--#define SA_RESTART 0
--#endif
--
--#define FAIL_FILENO (STDERR_FILENO + 1)
--
--/* TODO: Refactor. */
--#define RESTARTABLE(_cmd, _result) do { \
-- do { \
-- _result = _cmd; \
-- } while((_result == -1) && (errno == EINTR)); \
--} while(0)
--
--/* This is one of the rare times it's more portable to declare an
-- * external symbol explicitly, rather than via a system header.
-- * The declaration is standardized as part of UNIX98, but there is
-- * no standard (not even de-facto) header file where the
-- * declaration is to be found. See:
-- * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
-- * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
-- *
-- * "All identifiers in this volume of IEEE Std 1003.1-2001, except
-- * environ, are defined in at least one of the headers" (!)
-- */
--extern char **environ;
--
-
- static void
- setSIGCHLDHandler(JNIEnv *env)
-@@ -245,53 +181,35 @@
- }
-
- static const char * const *
--splitPath(JNIEnv *env, const char *path)
-+effectivePathv(JNIEnv *env)
- {
-- const char *p, *q;
-- char **pathv;
-+ char *p;
- int i;
-+ const char *path = effectivePath();
- int count = countOccurrences(path, ':') + 1;
-+ size_t pathvsize = sizeof(const char *) * (count+1);
-+ size_t pathsize = strlen(path) + 1;
-+ const char **pathv = (const char **) xmalloc(env, pathvsize + pathsize);
-
-- pathv = NEW(char*, count+1);
-+ if (pathv == NULL)
-+ return NULL;
-+ p = (char *) pathv + pathvsize;
-+ memcpy(p, path, pathsize);
-+ /* split PATH by replacing ':' with NULs; empty components => "." */
-+ for (i = 0; i < count; i++) {
-+ char *q = p + strcspn(p, ":");
-+ pathv[i] = (p == q) ? "." : p;
-+ *q = '\0';
-+ p = q + 1;
-+ }
- pathv[count] = NULL;
-- for (p = path, i = 0; i < count; i++, p = q + 1) {
-- for (q = p; (*q != ':') && (*q != '\0'); q++)
-- ;
-- if (q == p) /* empty PATH component => "." */
-- pathv[i] = "./";
-- else {
-- int addSlash = ((*(q - 1)) != '/');
-- pathv[i] = NEW(char, q - p + addSlash + 1);
-- memcpy(pathv[i], p, q - p);
-- if (addSlash)
-- pathv[i][q - p] = '/';
-- pathv[i][q - p + addSlash] = '\0';
-- }
-- }
-- return (const char * const *) pathv;
-+ return pathv;
- }
-
--/**
-- * Cached value of JVM's effective PATH.
-- * (We don't support putenv("PATH=...") in native code)
-- */
--static const char *parentPath;
--
--/**
-- * Split, canonicalized version of parentPath
-- */
--static const char * const *parentPathv;
--
--static jfieldID field_exitcode;
--
- JNIEXPORT void JNICALL
--Java_java_lang_UNIXProcess_initIDs(JNIEnv *env, jclass clazz)
-+Java_java_lang_UNIXProcess_init(JNIEnv *env, jclass clazz)
- {
-- field_exitcode = (*env)->GetFieldID(env, clazz, "exitcode", "I");
--
-- parentPath = effectivePath();
-- parentPathv = splitPath(env, parentPath);
--
-+ parentPathv = effectivePathv(env);
- setSIGCHLDHandler(env);
- }
-
-@@ -358,96 +276,6 @@
- }
- }
-
--static ssize_t
--restartableWrite(int fd, const void *buf, size_t count)
--{
-- ssize_t result;
-- RESTARTABLE(write(fd, buf, count), result);
-- return result;
--}
--
--static int
--restartableDup2(int fd_from, int fd_to)
--{
-- int err;
-- RESTARTABLE(dup2(fd_from, fd_to), err);
-- return err;
--}
--
--static int
--restartableClose(int fd)
--{
-- int err;
-- RESTARTABLE(close(fd), err);
-- return err;
--}
--
--static int
--closeSafely(int fd)
--{
-- return (fd == -1) ? 0 : restartableClose(fd);
--}
--
--static int
--isAsciiDigit(char c)
--{
-- return c >= '0' && c <= '9';
--}
--
--#ifdef _ALLBSD_SOURCE
--#define FD_DIR "/dev/fd"
--#define dirent64 dirent
--#define readdir64 readdir
--#else
--#define FD_DIR "/proc/self/fd"
--#endif
--
--static int
--closeDescriptors(void)
--{
-- DIR *dp;
-- struct dirent64 *dirp;
-- int from_fd = FAIL_FILENO + 1;
--
-- /* We're trying to close all file descriptors, but opendir() might
-- * itself be implemented using a file descriptor, and we certainly
-- * don't want to close that while it's in use. We assume that if
-- * opendir() is implemented using a file descriptor, then it uses
-- * the lowest numbered file descriptor, just like open(). So we
-- * close a couple explicitly. */
--
-- restartableClose(from_fd); /* for possible use by opendir() */
-- restartableClose(from_fd + 1); /* another one for good luck */
--
-- if ((dp = opendir(FD_DIR)) == NULL)
-- return 0;
--
-- /* We use readdir64 instead of readdir to work around Solaris bug
-- * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
-- */
-- while ((dirp = readdir64(dp)) != NULL) {
-- int fd;
-- if (isAsciiDigit(dirp->d_name[0]) &&
-- (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
-- restartableClose(fd);
-- }
--
-- closedir(dp);
--
-- return 1;
--}
--
--static int
--moveDescriptor(int fd_from, int fd_to)
--{
-- if (fd_from != fd_to) {
-- if ((restartableDup2(fd_from, fd_to) == -1) ||
-- (restartableClose(fd_from) == -1))
-- return -1;
-- }
-- return 0;
--}
--
- static const char *
- getBytes(JNIEnv *env, jbyteArray arr)
- {
-@@ -463,19 +291,6 @@
- }
-
- static void
--initVectorFromBlock(const char**vector, const char* block, int count)
--{
-- int i;
-- const char *p;
-- for (i = 0, p = block; i < count; i++) {
-- /* Invariant: p always points to the start of a C string. */
-- vector[i] = p;
-- while (*(p++));
-- }
-- vector[count] = NULL;
--}
--
--static void
- throwIOException(JNIEnv *env, int errnum, const char *defaultDetail)
- {
- static const char * const format = "error=%d, %s";
-@@ -490,6 +305,9 @@
- }
- /* ASCII Decimal representation uses 2.4 times as many bits as binary. */
- errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum));
-+ if (errmsg == NULL)
-+ return;
-+
- sprintf(errmsg, format, errnum, detail);
- s = JNU_NewStringPlatform(env, errmsg);
- if (s != NULL) {
-@@ -515,180 +333,6 @@
- }
- #endif /* DEBUG_PROCESS */
-
--/**
-- * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
-- * If we could do it over again, we would probably not support such an ancient
-- * misfeature, but compatibility wins over sanity. The original support for
-- * this was imported accidentally from execvp().
-- */
--static void
--execve_as_traditional_shell_script(const char *file,
-- const char *argv[],
-- const char *const envp[])
--{
-- /* Use the extra word of space provided for us in argv by caller. */
-- const char *argv0 = argv[0];
-- const char *const *end = argv;
-- while (*end != NULL)
-- ++end;
-- memmove(argv+2, argv+1, (end-argv) * sizeof (*end));
-- argv[0] = "/bin/sh";
-- argv[1] = file;
-- execve(argv[0], (char **) argv, (char **) envp);
-- /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
-- memmove(argv+1, argv+2, (end-argv) * sizeof (*end));
-- argv[0] = argv0;
--}
--
--/**
-- * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
-- * be a shell script and the system default shell is invoked to run it.
-- */
--static void
--execve_with_shell_fallback(const char *file,
-- const char *argv[],
-- const char *const envp[])
--{
--#if START_CHILD_USE_CLONE || START_CHILD_USE_VFORK
-- /* shared address space; be very careful. */
-- execve(file, (char **) argv, (char **) envp);
-- if (errno == ENOEXEC)
-- execve_as_traditional_shell_script(file, argv, envp);
--#else
-- /* unshared address space; we can mutate environ. */
-- environ = (char **) envp;
-- execvp(file, (char **) argv);
--#endif
--}
--
--/**
-- * 'execvpe' should have been included in the Unix standards,
-- * and is a GNU extension in glibc 2.10.
-- *
-- * JDK_execvpe is identical to execvp, except that the child environment is
-- * specified via the 3rd argument instead of being inherited from environ.
-- */
--static void
--JDK_execvpe(const char *file,
-- const char *argv[],
-- const char *const envp[])
--{
-- if (envp == NULL || (char **) envp == environ) {
-- execvp(file, (char **) argv);
-- return;
-- }
--
-- if (*file == '\0') {
-- errno = ENOENT;
-- return;
-- }
--
-- if (strchr(file, '/') != NULL) {
-- execve_with_shell_fallback(file, argv, envp);
-- } else {
-- /* We must search PATH (parent's, not child's) */
-- char expanded_file[PATH_MAX];
-- int filelen = strlen(file);
-- int sticky_errno = 0;
-- const char * const * dirs;
-- for (dirs = parentPathv; *dirs; dirs++) {
-- const char * dir = *dirs;
-- int dirlen = strlen(dir);
-- if (filelen + dirlen + 1 >= PATH_MAX) {
-- errno = ENAMETOOLONG;
-- continue;
-- }
-- memcpy(expanded_file, dir, dirlen);
-- memcpy(expanded_file + dirlen, file, filelen);
-- expanded_file[dirlen + filelen] = '\0';
-- execve_with_shell_fallback(expanded_file, argv, envp);
-- /* There are 3 responses to various classes of errno:
-- * return immediately, continue (especially for ENOENT),
-- * or continue with "sticky" errno.
-- *
-- * From exec(3):
-- *
-- * If permission is denied for a file (the attempted
-- * execve returned EACCES), these functions will continue
-- * searching the rest of the search path. If no other
-- * file is found, however, they will return with the
-- * global variable errno set to EACCES.
-- */
-- switch (errno) {
-- case EACCES:
-- sticky_errno = errno;
-- /* FALLTHRU */
-- case ENOENT:
-- case ENOTDIR:
--#ifdef ELOOP
-- case ELOOP:
--#endif
--#ifdef ESTALE
-- case ESTALE:
--#endif
--#ifdef ENODEV
-- case ENODEV:
--#endif
--#ifdef ETIMEDOUT
-- case ETIMEDOUT:
--#endif
-- break; /* Try other directories in PATH */
-- default:
-- return;
-- }
-- }
-- if (sticky_errno != 0)
-- errno = sticky_errno;
-- }
--}
--
--/*
-- * Reads nbyte bytes from file descriptor fd into buf,
-- * The read operation is retried in case of EINTR or partial reads.
-- *
-- * Returns number of bytes read (normally nbyte, but may be less in
-- * case of EOF). In case of read errors, returns -1 and sets errno.
-- */
--static ssize_t
--readFully(int fd, void *buf, size_t nbyte)
--{
-- ssize_t remaining = nbyte;
-- for (;;) {
-- ssize_t n = read(fd, buf, remaining);
-- if (n == 0) {
-- return nbyte - remaining;
-- } else if (n > 0) {
-- remaining -= n;
-- if (remaining <= 0)
-- return nbyte;
-- /* We were interrupted in the middle of reading the bytes.
-- * Unlikely, but possible. */
-- buf = (void *) (((char *)buf) + n);
-- } else if (errno == EINTR) {
-- /* Strange signals like SIGJVM1 are possible at any time.
-- * See http://www.dreamsongs.com/WorseIsBetter.html */
-- } else {
-- return -1;
-- }
-- }
--}
--
--typedef struct _ChildStuff
--{
-- int in[2];
-- int out[2];
-- int err[2];
-- int fail[2];
-- int fds[3];
-- const char **argv;
-- const char **envv;
-- const char *pdir;
-- jboolean redirectErrorStream;
--#if START_CHILD_USE_CLONE
-- void *clone_stack;
--#endif
--} ChildStuff;
--
- static void
- copyPipe(int from[2], int to[2])
- {
-@@ -696,97 +340,67 @@
- to[1] = from[1];
- }
-
--/**
-- * Child process after a successful fork() or clone().
-- * This function must not return, and must be prepared for either all
-- * of its address space to be shared with its parent, or to be a copy.
-- * It must not modify global variables such as "environ".
-+/* arg is an array of pointers to 0 terminated strings. array is terminated
-+ * by a null element.
-+ *
-+ * *nelems and *nbytes receive the number of elements of array (incl 0)
-+ * and total number of bytes (incl. 0)
-+ * Note. An empty array will have one null element
-+ * But if arg is null, then *nelems set to 0, and *nbytes to 0
- */
--static int
--childProcess(void *arg)
-+static void arraysize(const char * const *arg, int *nelems, int *nbytes)
- {
-- const ChildStuff* p = (const ChildStuff*) arg;
-+ int i, bytes, count;
-+ const char * const *a = arg;
-+ char *p;
-+ int *q;
-+ if (arg == 0) {
-+ *nelems = 0;
-+ *nbytes = 0;
-+ return;
-+ }
-+ /* count the array elements and number of bytes */
-+ for (count=0, bytes=0; *a != 0; count++, a++) {
-+ bytes += strlen(*a)+1;
-+ }
-+ *nbytes = bytes;
-+ *nelems = count+1;
-+}
-
-- /* Close the parent sides of the pipes.
-- Closing pipe fds here is redundant, since closeDescriptors()
-- would do it anyways, but a little paranoia is a good thing. */
-- if ((closeSafely(p->in[1]) == -1) ||
-- (closeSafely(p->out[0]) == -1) ||
-- (closeSafely(p->err[0]) == -1) ||
-- (closeSafely(p->fail[0]) == -1))
-- goto WhyCantJohnnyExec;
-+/* copy the strings from arg[] into buf, starting at given offset
-+ * return new offset to next free byte
-+ */
-+static int copystrings(char *buf, int offset, const char * const *arg) {
-+ char *p;
-+ const char * const *a;
-+ int count=0;
-
-- /* Give the child sides of the pipes the right fileno's. */
-- /* Note: it is possible for in[0] == 0 */
-- if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
-- STDIN_FILENO) == -1) ||
-- (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
-- STDOUT_FILENO) == -1))
-- goto WhyCantJohnnyExec;
--
-- if (p->redirectErrorStream) {
-- if ((closeSafely(p->err[1]) == -1) ||
-- (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
-- goto WhyCantJohnnyExec;
-- } else {
-- if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
-- STDERR_FILENO) == -1)
-- goto WhyCantJohnnyExec;
-+ if (arg == 0) {
-+ return offset;
- }
--
-- if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
-- goto WhyCantJohnnyExec;
--
-- /* close everything */
-- if (closeDescriptors() == 0) { /* failed, close the old way */
-- int max_fd = (int)sysconf(_SC_OPEN_MAX);
-- int fd;
-- for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
-- if (restartableClose(fd) == -1 && errno != EBADF)
-- goto WhyCantJohnnyExec;
-+ for (p=buf+offset, a=arg; *a != 0; a++) {
-+ int len = strlen(*a) +1;
-+ memcpy(p, *a, len);
-+ p += len;
-+ count += len;
- }
--
-- /* change to the new working directory */
-- if (p->pdir != NULL && chdir(p->pdir) < 0)
-- goto WhyCantJohnnyExec;
--
-- if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
-- goto WhyCantJohnnyExec;
--
-- JDK_execvpe(p->argv[0], p->argv, p->envv);
--
-- WhyCantJohnnyExec:
-- /* We used to go to an awful lot of trouble to predict whether the
-- * child would fail, but there is no reliable way to predict the
-- * success of an operation without *trying* it, and there's no way
-- * to try a chdir or exec in the parent. Instead, all we need is a
-- * way to communicate any failure back to the parent. Easy; we just
-- * send the errno back to the parent over a pipe in case of failure.
-- * The tricky thing is, how do we communicate the *success* of exec?
-- * We use FD_CLOEXEC together with the fact that a read() on a pipe
-- * yields EOF when the write ends (we have two of them!) are closed.
-- */
-- {
-- int errnum = errno;
-- restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
-- }
-- restartableClose(FAIL_FILENO);
-- _exit(-1);
-- return 0; /* Suppress warning "no return value from function" */
-+ return offset+count;
- }
-
- /**
-- * Start a child process running function childProcess.
-- * This function only returns in the parent.
- * We are unusually paranoid; use of clone/vfork is
- * especially likely to tickle gcc/glibc bugs.
- */
- #ifdef __attribute_noinline__ /* See: sys/cdefs.h */
- __attribute_noinline__
- #endif
-+
-+#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
-+
-+#ifdef START_CHILD_USE_CLONE
- static pid_t
--startChild(ChildStuff *c) {
--#if START_CHILD_USE_CLONE
-+cloneChild(ChildStuff *c) {
-+#ifdef __linux__
- #define START_CHILD_CLONE_STACK_SIZE (64 * 1024)
- /*
- * See clone(2).
-@@ -800,33 +414,161 @@
- c->clone_stack + START_CHILD_CLONE_STACK_SIZE,
- CLONE_VFORK | CLONE_VM | SIGCHLD, c);
- #else
-- #if START_CHILD_USE_VFORK
-+/* not available on Solaris / Mac */
-+ assert(0);
-+ return -1;
-+#endif
-+}
-+#endif
-+
-+static pid_t
-+vforkChild(ChildStuff *c) {
-+ volatile pid_t resultPid;
-+
- /*
- * We separate the call to vfork into a separate function to make
- * very sure to keep stack of child from corrupting stack of parent,
- * as suggested by the scary gcc warning:
- * warning: variable 'foo' might be clobbered by 'longjmp' or 'vfork'
- */
-- volatile pid_t resultPid = vfork();
-- #else
-+ resultPid = vfork();
-+
-+ if (resultPid == 0) {
-+ childProcess(c);
-+ }
-+ assert(resultPid != 0); /* childProcess never returns */
-+ return resultPid;
-+}
-+
-+static pid_t
-+forkChild(ChildStuff *c) {
-+ pid_t resultPid;
-+
- /*
- * From Solaris fork(2): In Solaris 10, a call to fork() is
- * identical to a call to fork1(); only the calling thread is
- * replicated in the child process. This is the POSIX-specified
- * behavior for fork().
- */
-- pid_t resultPid = fork();
-- #endif
-- if (resultPid == 0)
-+ resultPid = fork();
-+
-+ if (resultPid == 0) {
- childProcess(c);
-+ }
- assert(resultPid != 0); /* childProcess never returns */
- return resultPid;
--#endif /* ! START_CHILD_USE_CLONE */
-+}
-+
-+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
-+static pid_t
-+spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
-+ pid_t resultPid;
-+ jboolean isCopy;
-+ int i, offset, rval, bufsize, magic;
-+ char *buf, buf1[16];
-+ char *hlpargs[2];
-+ SpawnInfo sp;
-+
-+ /* need to tell helper which fd is for receiving the childstuff
-+ * and which fd to send response back on
-+ */
-+ snprintf(buf1, sizeof(buf1), "%d:%d", c->childenv[0], c->fail[1]);
-+ /* put the fd string as argument to the helper cmd */
-+ hlpargs[0] = buf1;
-+ hlpargs[1] = 0;
-+
-+ /* Following items are sent down the pipe to the helper
-+ * after it is spawned.
-+ * All strings are null terminated. All arrays of strings
-+ * have an empty string for termination.
-+ * - the ChildStuff struct
-+ * - the SpawnInfo struct
-+ * - the argv strings array
-+ * - the envv strings array
-+ * - the home directory string
-+ * - the parentPath string
-+ * - the parentPathv array
-+ */
-+ /* First calculate the sizes */
-+ arraysize(c->argv, &sp.nargv, &sp.argvBytes);
-+ bufsize = sp.argvBytes;
-+ arraysize(c->envv, &sp.nenvv, &sp.envvBytes);
-+ bufsize += sp.envvBytes;
-+ sp.dirlen = c->pdir == 0 ? 0 : strlen(c->pdir)+1;
-+ bufsize += sp.dirlen;
-+ arraysize(parentPathv, &sp.nparentPathv, &sp.parentPathvBytes);
-+ bufsize += sp.parentPathvBytes;
-+ /* We need to clear FD_CLOEXEC if set in the fds[].
-+ * Files are created FD_CLOEXEC in Java.
-+ * Otherwise, they will be closed when the target gets exec'd */
-+ for (i=0; i<3; i++) {
-+ if (c->fds[i] != -1) {
-+ int flags = fcntl(c->fds[i], F_GETFD);
-+ if (flags & FD_CLOEXEC) {
-+ fcntl(c->fds[i], F_SETFD, flags & (~1));
-+ }
-+ }
-+ }
-+
-+ rval = posix_spawn(&resultPid, helperpath, 0, 0, (char * const *) hlpargs, environ);
-+
-+ if (rval != 0) {
-+ return -1;
-+ }
-+
-+ /* now the lengths are known, copy the data */
-+ buf = NEW(char, bufsize);
-+ if (buf == 0) {
-+ return -1;
-+ }
-+ offset = copystrings(buf, 0, &c->argv[0]);
-+ offset = copystrings(buf, offset, &c->envv[0]);
-+ memcpy(buf+offset, c->pdir, sp.dirlen);
-+ offset += sp.dirlen;
-+ offset = copystrings(buf, offset, parentPathv);
-+ assert(offset == bufsize);
-+
-+ magic = magicNumber();
-+
-+ /* write the two structs and the data buffer */
-+ write(c->childenv[1], (char *)&magic, sizeof(magic)); // magic number first
-+ write(c->childenv[1], (char *)c, sizeof(*c));
-+ write(c->childenv[1], (char *)&sp, sizeof(sp));
-+ write(c->childenv[1], buf, bufsize);
-+ free(buf);
-+
-+ /* In this mode an external main() in invoked which calls back into
-+ * childProcess() in this file, rather than directly
-+ * via the statement below */
-+ return resultPid;
-+}
-+#endif
-+
-+/*
-+ * Start a child process running function childProcess.
-+ * This function only returns in the parent.
-+ */
-+static pid_t
-+startChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
-+ switch (c->mode) {
-+ case MODE_VFORK:
-+ return vforkChild(c);
-+ case MODE_FORK:
-+ return forkChild(c);
-+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
-+ case MODE_POSIX_SPAWN:
-+ return spawnChild(env, process, c, helperpath);
-+#endif
-+ default:
-+ return -1;
-+ }
- }
-
- JNIEXPORT jint JNICALL
- Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
- jobject process,
-+ jint mode,
-+ jbyteArray helperpath,
- jbyteArray prog,
- jbyteArray argBlock, jint argc,
- jbyteArray envBlock, jint envc,
-@@ -836,32 +578,35 @@
- {
- int errnum;
- int resultPid = -1;
-- int in[2], out[2], err[2], fail[2];
-+ int in[2], out[2], err[2], fail[2], childenv[2];
- jint *fds = NULL;
-+ const char *phelperpath = NULL;
- const char *pprog = NULL;
- const char *pargBlock = NULL;
- const char *penvBlock = NULL;
- ChildStuff *c;
-
- in[0] = in[1] = out[0] = out[1] = err[0] = err[1] = fail[0] = fail[1] = -1;
-+ childenv[0] = childenv[1] = -1;
-
- if ((c = NEW(ChildStuff, 1)) == NULL) return -1;
- c->argv = NULL;
- c->envv = NULL;
- c->pdir = NULL;
--#if START_CHILD_USE_CLONE
- c->clone_stack = NULL;
--#endif
-
- /* Convert prog + argBlock into a char ** argv.
- * Add one word room for expansion of argv for use by
- * execve_as_traditional_shell_script.
-+ * This word is also used when using spawn mode
- */
- assert(prog != NULL && argBlock != NULL);
-+ if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
- if ((pprog = getBytes(env, prog)) == NULL) goto Catch;
- if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch;
- if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch;
- c->argv[0] = pprog;
-+ c->argc = argc + 2;
- initVectorFromBlock(c->argv+1, pargBlock, argc);
-
- if (envBlock != NULL) {
-@@ -882,6 +627,7 @@
- if ((fds[0] == -1 && pipe(in) < 0) ||
- (fds[1] == -1 && pipe(out) < 0) ||
- (fds[2] == -1 && pipe(err) < 0) ||
-+ (pipe(childenv) < 0) ||
- (pipe(fail) < 0)) {
- throwIOException(env, errno, "Bad file descriptor");
- goto Catch;
-@@ -894,18 +640,29 @@
- copyPipe(out, c->out);
- copyPipe(err, c->err);
- copyPipe(fail, c->fail);
-+ copyPipe(childenv, c->childenv);
-
- c->redirectErrorStream = redirectErrorStream;
-+ c->mode = mode;
-
-- resultPid = startChild(c);
-+ resultPid = startChild(env, process, c, phelperpath);
- assert(resultPid != 0);
-
- if (resultPid < 0) {
-- throwIOException(env, errno, START_CHILD_SYSTEM_CALL " failed");
-+ switch (c->mode) {
-+ case MODE_VFORK:
-+ throwIOException(env, errno, "vfork failed");
-+ break;
-+ case MODE_FORK:
-+ throwIOException(env, errno, "fork failed");
-+ break;
-+ case MODE_POSIX_SPAWN:
-+ throwIOException(env, errno, "spawn failed");
-+ break;
-+ }
- goto Catch;
- }
--
-- restartableClose(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec */
-+ close(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec (childproc.c) */
-
- switch (readFully(fail[0], &errnum, sizeof(errnum))) {
- case 0: break; /* Exec succeeded */
-@@ -923,18 +680,18 @@
- fds[2] = (err[0] != -1) ? err[0] : -1;
-
- Finally:
--#if START_CHILD_USE_CLONE
- free(c->clone_stack);
--#endif
-
- /* Always clean up the child's side of the pipes */
- closeSafely(in [0]);
- closeSafely(out[1]);
- closeSafely(err[1]);
-
-- /* Always clean up fail descriptors */
-+ /* Always clean up fail and childEnv descriptors */
- closeSafely(fail[0]);
- closeSafely(fail[1]);
-+ closeSafely(childenv[0]);
-+ closeSafely(childenv[1]);
-
- releaseBytes(env, prog, pprog);
- releaseBytes(env, argBlock, pargBlock);
-@@ -952,9 +709,9 @@
-
- Catch:
- /* Clean up the parent's side of the pipes in case of failure only */
-- closeSafely(in [1]);
-- closeSafely(out[0]);
-- closeSafely(err[0]);
-+ closeSafely(in [1]); in[1] = -1;
-+ closeSafely(out[0]); out[0] = -1;
-+ closeSafely(err[0]); err[0] = -1;
- goto Finally;
- }
-
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/src/solaris/native/java/lang/childproc.c Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,376 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+#include <dirent.h>
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <stdlib.h>
-+#include <string.h>
-+#include <unistd.h>
-+#include <limits.h>
-+
-+#include "childproc.h"
-+
-+
-+ssize_t
-+restartableWrite(int fd, const void *buf, size_t count)
-+{
-+ ssize_t result;
-+ RESTARTABLE(write(fd, buf, count), result);
-+ return result;
-+}
-+
-+int
-+restartableDup2(int fd_from, int fd_to)
-+{
-+ int err;
-+ RESTARTABLE(dup2(fd_from, fd_to), err);
-+ return err;
-+}
-+
-+int
-+closeSafely(int fd)
-+{
-+ return (fd == -1) ? 0 : close(fd);
-+}
-+
-+int
-+isAsciiDigit(char c)
-+{
-+ return c >= '0' && c <= '9';
-+}
-+
-+#ifdef _ALLBSD_SOURCE
-+#define FD_DIR "/dev/fd"
-+#define dirent64 dirent
-+#define readdir64 readdir
-+#else
-+#define FD_DIR "/proc/self/fd"
-+#endif
-+
-+int
-+closeDescriptors(void)
-+{
-+ DIR *dp;
-+ struct dirent64 *dirp;
-+ int from_fd = FAIL_FILENO + 1;
-+
-+ /* We're trying to close all file descriptors, but opendir() might
-+ * itself be implemented using a file descriptor, and we certainly
-+ * don't want to close that while it's in use. We assume that if
-+ * opendir() is implemented using a file descriptor, then it uses
-+ * the lowest numbered file descriptor, just like open(). So we
-+ * close a couple explicitly. */
-+
-+ close(from_fd); /* for possible use by opendir() */
-+ close(from_fd + 1); /* another one for good luck */
-+
-+ if ((dp = opendir(FD_DIR)) == NULL)
-+ return 0;
-+
-+ /* We use readdir64 instead of readdir to work around Solaris bug
-+ * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
-+ */
-+ while ((dirp = readdir64(dp)) != NULL) {
-+ int fd;
-+ if (isAsciiDigit(dirp->d_name[0]) &&
-+ (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
-+ close(fd);
-+ }
-+
-+ closedir(dp);
-+
-+ return 1;
-+}
-+
-+int
-+moveDescriptor(int fd_from, int fd_to)
-+{
-+ if (fd_from != fd_to) {
-+ if ((restartableDup2(fd_from, fd_to) == -1) ||
-+ (close(fd_from) == -1))
-+ return -1;
-+ }
-+ return 0;
-+}
-+
-+int
-+magicNumber() {
-+ return 43110;
-+}
-+
-+/*
-+ * Reads nbyte bytes from file descriptor fd into buf,
-+ * The read operation is retried in case of EINTR or partial reads.
-+ *
-+ * Returns number of bytes read (normally nbyte, but may be less in
-+ * case of EOF). In case of read errors, returns -1 and sets errno.
-+ */
-+ssize_t
-+readFully(int fd, void *buf, size_t nbyte)
-+{
-+ ssize_t remaining = nbyte;
-+ for (;;) {
-+ ssize_t n = read(fd, buf, remaining);
-+ if (n == 0) {
-+ return nbyte - remaining;
-+ } else if (n > 0) {
-+ remaining -= n;
-+ if (remaining <= 0)
-+ return nbyte;
-+ /* We were interrupted in the middle of reading the bytes.
-+ * Unlikely, but possible. */
-+ buf = (void *) (((char *)buf) + n);
-+ } else if (errno == EINTR) {
-+ /* Strange signals like SIGJVM1 are possible at any time.
-+ * See http://www.dreamsongs.com/WorseIsBetter.html */
-+ } else {
-+ return -1;
-+ }
-+ }
-+}
-+
-+void
-+initVectorFromBlock(const char**vector, const char* block, int count)
-+{
-+ int i;
-+ const char *p;
-+ for (i = 0, p = block; i < count; i++) {
-+ /* Invariant: p always points to the start of a C string. */
-+ vector[i] = p;
-+ while (*(p++));
-+ }
-+ vector[count] = NULL;
-+}
-+
-+/**
-+ * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
-+ * If we could do it over again, we would probably not support such an ancient
-+ * misfeature, but compatibility wins over sanity. The original support for
-+ * this was imported accidentally from execvp().
-+ */
-+void
-+execve_as_traditional_shell_script(const char *file,
-+ const char *argv[],
-+ const char *const envp[])
-+{
-+ /* Use the extra word of space provided for us in argv by caller. */
-+ const char *argv0 = argv[0];
-+ const char *const *end = argv;
-+ while (*end != NULL)
-+ ++end;
-+ memmove(argv+2, argv+1, (end-argv) * sizeof(*end));
-+ argv[0] = "/bin/sh";
-+ argv[1] = file;
-+ execve(argv[0], (char **) argv, (char **) envp);
-+ /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
-+ memmove(argv+1, argv+2, (end-argv) * sizeof(*end));
-+ argv[0] = argv0;
-+}
-+
-+/**
-+ * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
-+ * be a shell script and the system default shell is invoked to run it.
-+ */
-+void
-+execve_with_shell_fallback(int mode, const char *file,
-+ const char *argv[],
-+ const char *const envp[])
-+{
-+ if (mode == MODE_CLONE || mode == MODE_VFORK) {
-+ /* shared address space; be very careful. */
-+ execve(file, (char **) argv, (char **) envp);
-+ if (errno == ENOEXEC)
-+ execve_as_traditional_shell_script(file, argv, envp);
-+ } else {
-+ /* unshared address space; we can mutate environ. */
-+ environ = (char **) envp;
-+ execvp(file, (char **) argv);
-+ }
-+}
-+
-+/**
-+ * 'execvpe' should have been included in the Unix standards,
-+ * and is a GNU extension in glibc 2.10.
-+ *
-+ * JDK_execvpe is identical to execvp, except that the child environment is
-+ * specified via the 3rd argument instead of being inherited from environ.
-+ */
-+void
-+JDK_execvpe(int mode, const char *file,
-+ const char *argv[],
-+ const char *const envp[])
-+{
-+ if (envp == NULL || (char **) envp == environ) {
-+ execvp(file, (char **) argv);
-+ return;
-+ }
-+
-+ if (*file == '\0') {
-+ errno = ENOENT;
-+ return;
-+ }
-+
-+ if (strchr(file, '/') != NULL) {
-+ execve_with_shell_fallback(mode, file, argv, envp);
-+ } else {
-+ /* We must search PATH (parent's, not child's) */
-+ char expanded_file[PATH_MAX];
-+ int filelen = strlen(file);
-+ int sticky_errno = 0;
-+ const char * const * dirs;
-+ for (dirs = parentPathv; *dirs; dirs++) {
-+ const char * dir = *dirs;
-+ int dirlen = strlen(dir);
-+ if (filelen + dirlen + 2 >= PATH_MAX) {
-+ errno = ENAMETOOLONG;
-+ continue;
-+ }
-+ memcpy(expanded_file, dir, dirlen);
-+ if (expanded_file[dirlen - 1] != '/')
-+ expanded_file[dirlen++] = '/';
-+ memcpy(expanded_file + dirlen, file, filelen);
-+ expanded_file[dirlen + filelen] = '\0';
-+ execve_with_shell_fallback(mode, expanded_file, argv, envp);
-+ /* There are 3 responses to various classes of errno:
-+ * return immediately, continue (especially for ENOENT),
-+ * or continue with "sticky" errno.
-+ *
-+ * From exec(3):
-+ *
-+ * If permission is denied for a file (the attempted
-+ * execve returned EACCES), these functions will continue
-+ * searching the rest of the search path. If no other
-+ * file is found, however, they will return with the
-+ * global variable errno set to EACCES.
-+ */
-+ switch (errno) {
-+ case EACCES:
-+ sticky_errno = errno;
-+ /* FALLTHRU */
-+ case ENOENT:
-+ case ENOTDIR:
-+#ifdef ELOOP
-+ case ELOOP:
-+#endif
-+#ifdef ESTALE
-+ case ESTALE:
-+#endif
-+#ifdef ENODEV
-+ case ENODEV:
-+#endif
-+#ifdef ETIMEDOUT
-+ case ETIMEDOUT:
-+#endif
-+ break; /* Try other directories in PATH */
-+ default:
-+ return;
-+ }
-+ }
-+ if (sticky_errno != 0)
-+ errno = sticky_errno;
-+ }
-+}
-+
-+/**
-+ * Child process after a successful fork() or clone().
-+ * This function must not return, and must be prepared for either all
-+ * of its address space to be shared with its parent, or to be a copy.
-+ * It must not modify global variables such as "environ".
-+ */
-+int
-+childProcess(void *arg)
-+{
-+ const ChildStuff* p = (const ChildStuff*) arg;
-+
-+ /* Close the parent sides of the pipes.
-+ Closing pipe fds here is redundant, since closeDescriptors()
-+ would do it anyways, but a little paranoia is a good thing. */
-+ if ((closeSafely(p->in[1]) == -1) ||
-+ (closeSafely(p->out[0]) == -1) ||
-+ (closeSafely(p->err[0]) == -1) ||
-+ (closeSafely(p->childenv[0]) == -1) ||
-+ (closeSafely(p->childenv[1]) == -1) ||
-+ (closeSafely(p->fail[0]) == -1))
-+ goto WhyCantJohnnyExec;
-+
-+ /* Give the child sides of the pipes the right fileno's. */
-+ /* Note: it is possible for in[0] == 0 */
-+ if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
-+ STDIN_FILENO) == -1) ||
-+ (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
-+ STDOUT_FILENO) == -1))
-+ goto WhyCantJohnnyExec;
-+
-+ if (p->redirectErrorStream) {
-+ if ((closeSafely(p->err[1]) == -1) ||
-+ (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
-+ goto WhyCantJohnnyExec;
-+ } else {
-+ if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
-+ STDERR_FILENO) == -1)
-+ goto WhyCantJohnnyExec;
-+ }
-+
-+ if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
-+ goto WhyCantJohnnyExec;
-+
-+ /* close everything */
-+ if (closeDescriptors() == 0) { /* failed, close the old way */
-+ int max_fd = (int)sysconf(_SC_OPEN_MAX);
-+ int fd;
-+ for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
-+ if (close(fd) == -1 && errno != EBADF)
-+ goto WhyCantJohnnyExec;
-+ }
-+
-+ /* change to the new working directory */
-+ if (p->pdir != NULL && chdir(p->pdir) < 0)
-+ goto WhyCantJohnnyExec;
-+
-+ if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
-+ goto WhyCantJohnnyExec;
-+
-+ JDK_execvpe(p->mode, p->argv[0], p->argv, p->envv);
-+
-+ WhyCantJohnnyExec:
-+ /* We used to go to an awful lot of trouble to predict whether the
-+ * child would fail, but there is no reliable way to predict the
-+ * success of an operation without *trying* it, and there's no way
-+ * to try a chdir or exec in the parent. Instead, all we need is a
-+ * way to communicate any failure back to the parent. Easy; we just
-+ * send the errno back to the parent over a pipe in case of failure.
-+ * The tricky thing is, how do we communicate the *success* of exec?
-+ * We use FD_CLOEXEC together with the fact that a read() on a pipe
-+ * yields EOF when the write ends (we have two of them!) are closed.
-+ */
-+ {
-+ int errnum = errno;
-+ restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
-+ }
-+ close(FAIL_FILENO);
-+ _exit(-1);
-+ return 0; /* Suppress warning "no return value from function" */
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/src/solaris/native/java/lang/childproc.h Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,145 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+#ifndef CHILDPROC_MD_H
-+#define CHILDPROC_MD_H
-+
-+#include <sys/types.h>
-+
-+#ifdef __APPLE__
-+#include <crt_externs.h>
-+#define environ (*_NSGetEnviron())
-+#else
-+/* This is one of the rare times it's more portable to declare an
-+ * external symbol explicitly, rather than via a system header.
-+ * The declaration is standardized as part of UNIX98, but there is
-+ * no standard (not even de-facto) header file where the
-+ * declaration is to be found. See:
-+ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
-+ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
-+ *
-+ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
-+ * environ, are defined in at least one of the headers" (!)
-+ */
-+extern char **environ;
-+#endif
-+
-+#ifdef __linux__
-+#include <sched.h>
-+#endif
-+
-+#ifndef STDIN_FILENO
-+#define STDIN_FILENO 0
-+#endif
-+
-+#ifndef STDOUT_FILENO
-+#define STDOUT_FILENO 1
-+#endif
-+
-+#ifndef STDERR_FILENO
-+#define STDERR_FILENO 2
-+#endif
-+
-+#ifndef SA_NOCLDSTOP
-+#define SA_NOCLDSTOP 0
-+#endif
-+
-+#ifndef SA_RESTART
-+#define SA_RESTART 0
-+#endif
-+
-+#define FAIL_FILENO (STDERR_FILENO + 1)
-+
-+/* TODO: Refactor. */
-+#define RESTARTABLE(_cmd, _result) do { \
-+ do { \
-+ _result = _cmd; \
-+ } while((_result == -1) && (errno == EINTR)); \
-+} while(0)
-+
-+/* These numbers must be the same as the Enum in UNIXProcess.java
-+ * Must be a better way of doing this.
-+ */
-+#define MODE_FORK 1
-+#define MODE_POSIX_SPAWN 2
-+#define MODE_VFORK 3
-+#define MODE_CLONE 4
-+
-+typedef struct _ChildStuff
-+{
-+ int in[2];
-+ int out[2];
-+ int err[2];
-+ int fail[2];
-+ int childenv[2];
-+ int fds[3];
-+ int mode;
-+ const char **argv;
-+ int argc;
-+ const char **envv;
-+ const char *pdir;
-+ int redirectErrorStream;
-+ void *clone_stack;
-+} ChildStuff;
-+
-+/* following used in addition when mode is SPAWN */
-+typedef struct _SpawnInfo {
-+ int nargv; /* number of argv array elements */
-+ int argvBytes; /* total number of bytes in argv array */
-+ int nenvv; /* number of envv array elements */
-+ int envvBytes; /* total number of bytes in envv array */
-+ int dirlen; /* length of home directory string */
-+ int nparentPathv; /* number of elements in parentPathv array */
-+ int parentPathvBytes; /* total number of bytes in parentPathv array */
-+} SpawnInfo;
-+
-+/**
-+ * The cached and split version of the JDK's effective PATH.
-+ * (We don't support putenv("PATH=...") in native code)
-+ */
-+const char * const *parentPathv;
-+
-+ssize_t restartableWrite(int fd, const void *buf, size_t count);
-+int restartableDup2(int fd_from, int fd_to);
-+int closeSafely(int fd);
-+int isAsciiDigit(char c);
-+int closeDescriptors(void);
-+int moveDescriptor(int fd_from, int fd_to);
-+
-+int magicNumber();
-+ssize_t readFully(int fd, void *buf, size_t nbyte);
-+void initVectorFromBlock(const char**vector, const char* block, int count);
-+void execve_as_traditional_shell_script(const char *file,
-+ const char *argv[],
-+ const char *const envp[]);
-+void execve_with_shell_fallback(int mode, const char *file,
-+ const char *argv[],
-+ const char *const envp[]);
-+void JDK_execvpe(int mode, const char *file,
-+ const char *argv[],
-+ const char *const envp[]);
-+int childProcess(void *arg);
-+
-+#endif
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/src/solaris/native/java/lang/jspawnhelper.c Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,149 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation. Oracle designates this
-+ * particular file as subject to the "Classpath" exception as provided
-+ * by Oracle in the LICENSE file that accompanied this code.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+#include <errno.h>
-+#include <fcntl.h>
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+
-+#include "childproc.h"
-+
-+extern int errno;
-+
-+#define ALLOC(X,Y) { \
-+ void *mptr; \
-+ mptr = malloc (Y); \
-+ if (mptr == 0) { \
-+ error (fdout, ERR_MALLOC); \
-+ } \
-+ X = mptr; \
-+}
-+
-+#define ERR_MALLOC 1
-+#define ERR_PIPE 2
-+#define ERR_ARGS 3
-+
-+void error (int fd, int err) {
-+ write (fd, &err, sizeof(err));
-+ exit (1);
-+}
-+
-+void shutItDown() {
-+ fprintf(stdout, "This command is not for general use and should ");
-+ fprintf(stdout, "only be run as the result of a call to\n");
-+ fprintf(stdout, "ProcessBuilder.start() or Runtime.exec() in a java ");
-+ fprintf(stdout, "application\n");
-+ _exit(1);
-+}
-+
-+/*
-+ * read the following off the pipefd
-+ * - the ChildStuff struct
-+ * - the SpawnInfo struct
-+ * - the data strings for fields in ChildStuff
-+ */
-+void initChildStuff (int fdin, int fdout, ChildStuff *c) {
-+ int n;
-+ int argvBytes, nargv, envvBytes, nenvv;
-+ int dirlen;
-+ char *buf;
-+ SpawnInfo sp;
-+ int bufsize, offset=0;
-+ int magic;
-+ int res;
-+
-+ res = readFully (fdin, &magic, sizeof(magic));
-+ if (res != 4 || magic != magicNumber()) {
-+ error (fdout, ERR_PIPE);
-+ }
-+
-+ if (readFully (fdin, c, sizeof(*c)) == -1) {
-+ error (fdout, ERR_PIPE);
-+ }
-+
-+ if (readFully (fdin, &sp, sizeof(sp)) == -1) {
-+ error (fdout, ERR_PIPE);
-+ }
-+
-+ bufsize = sp.argvBytes + sp.envvBytes +
-+ sp.dirlen + sp.parentPathvBytes;
-+
-+ ALLOC(buf, bufsize);
-+
-+ if (readFully (fdin, buf, bufsize) == -1) {
-+ error (fdout, ERR_PIPE);
-+ }
-+
-+ /* Initialize argv[] */
-+ ALLOC(c->argv, sizeof(char *) * sp.nargv);
-+ initVectorFromBlock (c->argv, buf+offset, sp.nargv-1);
-+ offset += sp.argvBytes;
-+
-+ /* Initialize envv[] */
-+ if (sp.nenvv == 0) {
-+ c->envv = 0;
-+ } else {
-+ ALLOC(c->envv, sizeof(char *) * sp.nenvv);
-+ initVectorFromBlock (c->envv, buf+offset, sp.nenvv-1);
-+ offset += sp.envvBytes;
-+ }
-+
-+ /* Initialize pdir */
-+ if (sp.dirlen == 0) {
-+ c->pdir = 0;
-+ } else {
-+ c->pdir = buf+offset;
-+ offset += sp.dirlen;
-+ }
-+
-+ /* Initialize parentPathv[] */
-+ ALLOC(parentPathv, sizeof (char *) * sp.nparentPathv)
-+ initVectorFromBlock ((const char**)parentPathv, buf+offset, sp.nparentPathv-1);
-+ offset += sp.parentPathvBytes;
-+}
-+
-+int main(int argc, char *argv[]) {
-+ ChildStuff c;
-+ int t;
-+ struct stat buf;
-+ /* argv[0] contains the fd number to read all the child info */
-+ int r, fdin, fdout;
-+
-+ r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout);
-+ if (r == 2 && fcntl(fdin, F_GETFD) != -1) {
-+ fstat(fdin, &buf);
-+ if (!S_ISFIFO(buf.st_mode))
-+ shutItDown();
-+ } else {
-+ shutItDown();
-+ }
-+ initChildStuff (fdin, fdout, &c);
-+
-+ childProcess (&c);
-+ return 0; /* NOT REACHED */
-+}
---- ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -96,7 +96,7 @@
- jvm = vm;
-
- /* Get address of this library and the directory containing it. */
-- dladdr((void *)JNI_OnLoad, &dlinfo);
-+ dladdr((void *)AWT_OnLoad, &dlinfo);
- realpath((char *)dlinfo.dli_fname, buf);
- len = strlen(buf);
- p = strrchr(buf, '/');
---- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -41,6 +41,7 @@
-
- import static sun.awt.shell.Win32ShellFolder2.*;
- import sun.awt.OSInfo;
-+import sun.misc.ThreadGroupUtils;
-
- // NOTE: This class supersedes Win32ShellFolderManager, which was removed
- // from distribution after version 1.4.2.
-@@ -505,23 +506,19 @@
- }
- }
- };
-- comThread =
-- AccessController.doPrivileged(
-- new PrivilegedAction<Thread>() {
-- public Thread run() {
-+ comThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
-+ @Override
-+ public Thread run() {
- /* The thread must be a member of a thread group
- * which will not get GCed before VM exit.
- * Make its parent the top-level thread group.
- */
-- ThreadGroup tg = Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null;
-- tg = tgn, tgn = tg.getParent());
-- Thread thread = new Thread(tg, comRun, "Swing-Shell");
-- thread.setDaemon(true);
-- return thread;
-- }
-- }
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ Thread thread = new Thread(rootTG, comRun, "Swing-Shell");
-+ thread.setDaemon(true);
-+ return thread;
-+ }
-+ }
- );
- return comThread;
- }
---- ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Tue Mar 18 12:35:25 2014 -0700
-@@ -63,7 +63,6 @@
- }
-
- protected void setContentsNative(Transferable contents) {
--
- // Don't use delayed Clipboard rendering for the Transferable's data.
- // If we did that, we would call Transferable.getTransferData on
- // the Toolkit thread, which is a security hole.
-@@ -72,7 +71,7 @@
- // translated. Then, for each format, translate the data and post
- // it to the Clipboard.
- Map formatMap = WDataTransferer.getInstance().
-- getFormatsForTransferable(contents, flavorMap);
-+ getFormatsForTransferable(contents, getDefaultFlavorTable());
-
- openClipboard(this);
-
---- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -38,6 +38,7 @@
- import java.security.PrivilegedAction;
- import sun.awt.AWTAutoShutdown;
- import sun.awt.SunToolkit;
-+import sun.misc.ThreadGroupUtils;
- import sun.awt.Win32GraphicsDevice;
- import sun.awt.Win32GraphicsEnvironment;
- import sun.java2d.d3d.D3DRenderQueue;
-@@ -215,7 +216,7 @@
-
- private static native void postDispose();
-
-- private static native boolean startToolkitThread(Runnable thread);
-+ private static native boolean startToolkitThread(Runnable thread, ThreadGroup rootThreadGroup);
-
- public WToolkit() {
- // Startup toolkit threads
-@@ -232,8 +233,15 @@
- */
- AWTAutoShutdown.notifyToolkitThreadBusy();
-
-- if (!startToolkitThread(this)) {
-- Thread toolkitThread = new Thread(this, "AWT-Windows");
-+ // Find a root TG and attach Appkit thread to it
-+ ThreadGroup rootTG = AccessController.doPrivileged(new PrivilegedAction<ThreadGroup>() {
-+ @Override
-+ public ThreadGroup run() {
-+ return ThreadGroupUtils.getRootThreadGroup();
-+ }
-+ });
-+ if (!startToolkitThread(this, rootTG)) {
-+ Thread toolkitThread = new Thread(rootTG, this, "AWT-Windows");
- toolkitThread.setDaemon(true);
- toolkitThread.start();
- }
-@@ -263,14 +271,7 @@
- private final void registerShutdownHook() {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
-- ThreadGroup currentTG =
-- Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = currentTG.getParent();
-- while (parentTG != null) {
-- currentTG = parentTG;
-- parentTG = currentTG.getParent();
-- }
-- Thread shutdown = new Thread(currentTG, new Runnable() {
-+ Thread shutdown = new Thread(ThreadGroupUtils.getRootThreadGroup(), new Runnable() {
- public void run() {
- shutdown();
- }
-@@ -283,7 +284,14 @@
- }
-
- public void run() {
-- Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
-+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ Thread.currentThread().setContextClassLoader(null);
-+ return null;
-+ }
-+ });
-+ Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 1);
- boolean startPump = init();
-
- if (startPump) {
---- ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -36,8 +36,9 @@
- import java.security.PrivilegedAction;
- import java.util.ArrayList;
- import java.util.HashMap;
--import sun.awt.SunToolkit;
-+
- import sun.awt.AWTAccessor;
-+import sun.misc.ThreadGroupUtils;
- import sun.awt.Win32GraphicsConfig;
- import sun.awt.windows.WComponentPeer;
- import sun.java2d.InvalidPipeException;
-@@ -92,30 +93,26 @@
- public D3DScreenUpdateManager() {
- done = false;
- AccessController.doPrivileged(
-- new PrivilegedAction() {
-- public Object run() {
-- ThreadGroup currentTG =
-- Thread.currentThread().getThreadGroup();
-- ThreadGroup parentTG = currentTG.getParent();
-- while (parentTG != null) {
-- currentTG = parentTG;
-- parentTG = currentTG.getParent();
-- }
-- Thread shutdown = new Thread(currentTG, new Runnable() {
-+ new PrivilegedAction<Void>() {
-+ @Override
-+ public Void run() {
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ Thread shutdown = new Thread(rootTG, new Runnable() {
-+ @Override
- public void run() {
- done = true;
- wakeUpUpdateThread();
- }
- });
-- shutdown.setContextClassLoader(null);
-- try {
-- Runtime.getRuntime().addShutdownHook(shutdown);
-- } catch (Exception e) {
-- done = true;
-+ shutdown.setContextClassLoader(null);
-+ try {
-+ Runtime.getRuntime().addShutdownHook(shutdown);
-+ } catch (Exception e) {
-+ done = true;
-+ }
-+ return null;
- }
-- return null;
- }
-- }
- );
- }
-
-@@ -354,21 +351,20 @@
- */
- private synchronized void startUpdateThread() {
- if (screenUpdater == null) {
-- screenUpdater = (Thread)java.security.AccessController.doPrivileged(
-- new java.security.PrivilegedAction() {
-- public Object run() {
-- ThreadGroup tg =
-- Thread.currentThread().getThreadGroup();
-- for (ThreadGroup tgn = tg;
-- tgn != null; tg = tgn, tgn = tg.getParent());
-- Thread t = new Thread(tg, D3DScreenUpdateManager.this,
-- "D3D Screen Updater");
-- // REMIND: should it be higher?
-- t.setPriority(Thread.NORM_PRIORITY + 2);
-- t.setDaemon(true);
-- return t;
-- }
-- });
-+ screenUpdater = AccessController.doPrivileged(
-+ new PrivilegedAction<Thread>() {
-+ @Override
-+ public Thread run() {
-+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
-+ Thread t = new Thread(rootTG,
-+ D3DScreenUpdateManager.this,
-+ "D3D Screen Updater");
-+ // REMIND: should it be higher?
-+ t.setPriority(Thread.NORM_PRIORITY + 2);
-+ t.setDaemon(true);
-+ return t;
-+ }
-+ });
- screenUpdater.start();
- } else {
- wakeUpUpdateThread();
---- ./jdk/src/windows/native/java/lang/java_props_md.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/native/java/lang/java_props_md.c Tue Mar 18 12:35:25 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -448,6 +448,7 @@
- case 0: sprops.os_name = "Windows Vista"; break;
- case 1: sprops.os_name = "Windows 7"; break;
- case 2: sprops.os_name = "Windows 8"; break;
-+ case 3: sprops.os_name = "Windows 8.1"; break;
- default: sprops.os_name = "Windows NT (unknown)";
- }
- } else {
-@@ -455,6 +456,7 @@
- case 0: sprops.os_name = "Windows Server 2008"; break;
- case 1: sprops.os_name = "Windows Server 2008 R2"; break;
- case 2: sprops.os_name = "Windows Server 2012"; break;
-+ case 3: sprops.os_name = "Windows Server 2012 R2"; break;
- default: sprops.os_name = "Windows NT (unknown)";
- }
- }
---- ./jdk/src/windows/native/sun/font/fontpath.c Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/native/sun/font/fontpath.c Tue Mar 18 12:35:25 2014 -0700
-@@ -185,6 +185,12 @@
- return 0;
- }
-
-+/* This HDC is initialised and released in the populate family map
-+ * JNI entry point, and used within the call which would otherwise
-+ * create many DCs.
-+ */
-+static HDC screenDC = NULL;
-+
- static int DifferentFamily(wchar_t *family, wchar_t* fullName) {
- LOGFONTW lfw;
- CheckFamilyInfo info;
-@@ -202,7 +208,7 @@
- memset(&lfw, 0, sizeof(lfw));
- wcscpy(lfw.lfFaceName, fullName);
- lfw.lfCharSet = DEFAULT_CHARSET;
-- EnumFontFamiliesExW(GetDC(NULL), &lfw,
-+ EnumFontFamiliesExW(screenDC, &lfw,
- (FONTENUMPROCW)CheckFontFamilyProcW,
- (LPARAM)(&info), 0L);
-
-@@ -299,7 +305,7 @@
- memset(&lfa, 0, sizeof(lfa));
- strcpy(lfa.lfFaceName, lpelfe->elfLogFont.lfFaceName);
- lfa.lfCharSet = lpelfe->elfLogFont.lfCharSet;
-- EnumFontFamiliesExA(GetDC(NULL), &lfa,
-+ EnumFontFamiliesExA(screenDC, &lfa,
- (FONTENUMPROCA)EnumFontFacesInFamilyProcA,
- lParam, 0L);
- return 1;
-@@ -353,7 +359,7 @@
- memset(&lfw, 0, sizeof(lfw));
- wcscpy(lfw.lfFaceName, lpelfe->elfLogFont.lfFaceName);
- lfw.lfCharSet = lpelfe->elfLogFont.lfCharSet;
-- EnumFontFamiliesExW(GetDC(NULL), &lfw,
-+ EnumFontFamiliesExW(screenDC, &lfw,
- (FONTENUMPROCW)EnumFontFacesInFamilyProcW,
- lParam, 0L);
- return 1;
-@@ -613,13 +619,17 @@
- return;
- }
-
-+ screenDC = GetDC(NULL);
-+ if (screenDC == NULL) {
-+ return;
-+ }
- /* Enumerate fonts via GDI to build maps of fonts and families */
- if (IS_NT) {
- LOGFONTW lfw;
- memset(&lfw, 0, sizeof(lfw));
- lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */
- wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */
-- EnumFontFamiliesExW(GetDC(NULL), &lfw,
-+ EnumFontFamiliesExW(screenDC, &lfw,
- (FONTENUMPROCW)EnumFamilyNamesW,
- (LPARAM)(&fmi), 0L);
- } else {
-@@ -627,7 +637,7 @@
- memset(&lfa, 0, sizeof(lfa));
- lfa.lfCharSet = DEFAULT_CHARSET; /* all charsets */
- strcpy(lfa.lfFaceName, ""); /* one face per family */
-- ret = EnumFontFamiliesExA(GetDC(NULL), &lfa,
-+ ret = EnumFontFamiliesExA(screenDC, &lfa,
- (FONTENUMPROCA)EnumFamilyNamesA,
- (LPARAM)(&fmi), 0L);
- }
-@@ -637,6 +647,8 @@
- ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
- fontKeyName, 0L, KEY_READ, &hkeyFonts);
- if (ret != ERROR_SUCCESS) {
-+ ReleaseDC(NULL, screenDC);
-+ screenDC = NULL;
- return;
- }
-
-@@ -653,6 +665,8 @@
- dwMaxValueNameLen >= MAX_BUFFER ||
- dwMaxValueDataLen >= MAX_BUFFER) {
- RegCloseKey(hkeyFonts);
-+ ReleaseDC(NULL, screenDC);
-+ screenDC = NULL;
- return;
- }
- for (nval = 0; nval < dwNumValues; nval++ ) {
-@@ -692,4 +706,6 @@
- }
- }
- RegCloseKey(hkeyFonts);
-+ ReleaseDC(NULL, screenDC);
-+ screenDC = NULL;
- }
---- ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Tue Mar 18 12:35:25 2014 -0700
-@@ -365,6 +365,7 @@
- HANDLE hCompleted;
-
- jobject thread;
-+ jobject threadGroup;
- };
-
- void ToolkitThreadProc(void *param)
-@@ -377,7 +378,7 @@
- JavaVMAttachArgs attachArgs;
- attachArgs.version = JNI_VERSION_1_2;
- attachArgs.name = "AWT-Windows";
-- attachArgs.group = NULL;
-+ attachArgs.group = data->threadGroup;
-
- jint res = jvm->AttachCurrentThreadAsDaemon((void **)&env, &attachArgs);
- if (res < 0) {
-@@ -416,17 +417,18 @@
- /*
- * Class: sun_awt_windows_WToolkit
- * Method: startToolkitThread
-- * Signature: (Ljava/lang/Runnable;)Z
-+ * Signature: (Ljava/lang/Runnable;Ljava/lang/ThreadGroup)Z
- */
- JNIEXPORT jboolean JNICALL
--Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread)
-+Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread, jobject threadGroup)
- {
- AwtToolkit& tk = AwtToolkit::GetInstance();
-
- ToolkitThreadProc_Data data;
- data.result = false;
- data.thread = env->NewGlobalRef(thread);
-- if (data.thread == NULL) {
-+ data.threadGroup = env->NewGlobalRef(threadGroup);
-+ if (data.thread == NULL || data.threadGroup == NULL) {
- return JNI_FALSE;
- }
- data.hCompleted = ::CreateEvent(NULL, FALSE, FALSE, NULL);
-@@ -444,6 +446,7 @@
- ::CloseHandle(data.hCompleted);
-
- env->DeleteGlobalRef(data.thread);
-+ env->DeleteGlobalRef(data.threadGroup);
-
- return result ? JNI_TRUE : JNI_FALSE;
- }
---- ./jdk/src/windows/resource/java.manifest Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/src/windows/resource/java.manifest Tue Mar 18 12:35:25 2014 -0700
-@@ -44,9 +44,15 @@
- <!-- Indicate this JDK version is Windows 7 compatible -->
- <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
- <application>
-+ <!-- Windows Vista -->
-+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
-+ <!-- Windows 7 -->
- <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
-- <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
-+ <!-- Windows 8 -->
-+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
-+ <!-- Windows 8.1 -->
-+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
- </application>
-- </compatibility>
-+ </compatibility>
-
- </assembly>
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/awt/Graphics2D/DrawString/DrawRotatedString.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,81 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+import java.awt.Color;
-+import java.awt.Graphics2D;
-+import java.awt.RenderingHints;
-+import java.awt.image.BufferedImage;
-+import java.io.File;
-+import java.io.IOException;
-+
-+import javax.imageio.ImageIO;
-+
-+/**
-+ * @test
-+ * @bug 7190349
-+ * @summary Verifies that we get correct direction, when draw rotated string.
-+ * @author Sergey Bylokhov
-+ * @run main/othervm DrawRotatedString
-+ */
-+public final class DrawRotatedString {
-+
-+ private static final int SIZE = 500;
-+
-+ public static void main(final String[] args) throws IOException {
-+ BufferedImage bi = createBufferedImage(true);
-+ verify(bi);
-+ bi = createBufferedImage(false);
-+ verify(bi);
-+ System.out.println("Passed");
-+ }
-+
-+ private static void verify(BufferedImage bi) throws IOException {
-+ for (int i = 0; i < SIZE; ++i) {
-+ for (int j = 0; j < 99; ++j) {
-+ //Text should not appear before 100
-+ if (bi.getRGB(i, j) != Color.RED.getRGB()) {
-+ ImageIO.write(bi, "png", new File("image.png"));
-+ throw new RuntimeException("Failed: wrong text location");
-+ }
-+ }
-+ }
-+ }
-+
-+ private static BufferedImage createBufferedImage(final boolean aa) {
-+ final BufferedImage bi = new BufferedImage(SIZE, SIZE,
-+ BufferedImage.TYPE_INT_RGB);
-+ final Graphics2D bg = bi.createGraphics();
-+ bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-+ aa ? RenderingHints.VALUE_ANTIALIAS_ON
-+ : RenderingHints.VALUE_ANTIALIAS_OFF);
-+ bg.setColor(Color.RED);
-+ bg.fillRect(0, 0, SIZE, SIZE);
-+ bg.translate(100, 100);
-+ bg.rotate(Math.toRadians(90));
-+ bg.setColor(Color.BLACK);
-+ bg.setFont(bg.getFont().deriveFont(20.0f));
-+ bg.drawString("MMMMMMMMMMMMMMMM", 0, 0);
-+ bg.dispose();
-+ return bi;
-+ }
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/awt/Graphics2D/IncorrectTextSize/IncorrectTextSize.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,77 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+import java.awt.Color;
-+import java.awt.Font;
-+import java.awt.Graphics2D;
-+import java.awt.image.BufferedImage;
-+import java.io.File;
-+import java.io.IOException;
-+
-+import javax.imageio.ImageIO;
-+
-+/**
-+ * @test
-+ * @bug 8013569
-+ * @author Sergey Bylokhov
-+ */
-+public final class IncorrectTextSize {
-+
-+ static final int scale = 2;
-+ static final int width = 1200;
-+ static final int height = 100;
-+ static BufferedImage bi = new BufferedImage(width, height,
-+ BufferedImage.TYPE_INT_ARGB);
-+ static final String TEXT = "The quick brown fox jumps over the lazy dog"
-+ + "The quick brown fox jumps over the lazy dog";
-+
-+ public static void main(final String[] args) throws IOException {
-+ for (int point = 5; point < 11; ++point) {
-+ Graphics2D g2d = bi.createGraphics();
-+ g2d.setFont(new Font(Font.DIALOG, Font.PLAIN, point));
-+ g2d.scale(scale, scale);
-+ g2d.setColor(Color.WHITE);
-+ g2d.fillRect(0, 0, width, height);
-+ g2d.setColor(Color.green);
-+ g2d.drawString(TEXT, 0, 20);
-+ int length = g2d.getFontMetrics().stringWidth(TEXT);
-+ if (length < 0) {
-+ throw new RuntimeException("Negative length");
-+ }
-+ for (int i = (length + 1) * scale; i < width; ++i) {
-+ for (int j = 0; j < height; ++j) {
-+ if (bi.getRGB(i, j) != Color.white.getRGB()) {
-+ g2d.drawLine(length, 0, length, height);
-+ ImageIO.write(bi, "png", new File("image.png"));
-+ System.out.println("length = " + length);
-+ System.err.println("Wrong color at x=" + i + ",y=" + j);
-+ System.err.println("Color is:" + new Color(bi.getRGB(i,
-+ j)));
-+ throw new RuntimeException("Test failed.");
-+ }
-+ }
-+ }
-+ g2d.dispose();
-+ }
-+ }
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/awt/Toolkit/LoadAWTCrashTest/LoadAWTCrashTest.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,37 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+/*
-+ @test
-+ @bug 8031477
-+ @summary Crash while awt starting
-+ @author Petr Pchelko
-+ @run main/othervm LoadAWTCrashTest
-+*/
-+
-+public class LoadAWTCrashTest {
-+ public static void main(String[] args) {
-+ System.loadLibrary("awt");
-+ // If the bug is present JVM would crash or deadlock
-+ }
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/awt/font/TextLayout/TestAATMorxFont.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,86 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ *
-+ */
-+
-+/* @test
-+ * @summary verify rendering of MORX fonts on OS X.
-+ * @bug 8031462
-+ */
-+
-+import javax.swing.*;
-+import javax.swing.border.LineBorder;
-+import java.awt.*;
-+import java.awt.event.ActionEvent;
-+
-+public class TestAATMorxFont extends JComponent {
-+ public static void main(String[] args) {
-+ String osName = System.getProperty("os.name");
-+ System.out.println("OS is " + osName);
-+ osName = osName.toLowerCase();
-+ if (!osName.startsWith("mac")) {
-+ return;
-+ }
-+ SwingUtilities.invokeLater(new Runnable() {
-+ public void run() {
-+ JFrame frame = new JFrame("Test Morx");
-+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-+ TestAATMorxFont panel = new TestAATMorxFont();
-+ frame.add(panel);
-+ frame.pack();
-+ frame.setVisible(true);
-+ }
-+ });
-+ }
-+
-+ public Dimension getPreferredSize() {
-+ return new Dimension(1200, 400);
-+ }
-+
-+ public void paintComponent(Graphics g) {
-+ Graphics2D g2d = (Graphics2D)g;
-+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
-+ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-+ int y = 50;
-+ g.setFont(new Font("Gujarati MT", Font.PLAIN, 40));
-+ System.out.println(g.getFont());
-+ g.drawString("\u0A95\u0ACD \u0A95\u0A95\u0A95 \u0A95\u0ACD\u0A95\u0ACD\u0A95", 20, y);
-+ y += 50;
-+ g.setFont(new Font("Tamil Sangam MN", Font.PLAIN, 40));
-+ System.out.println(g.getFont());
-+ g.drawString("\u0b95\u0bCD \u0b95\u0b95\u0b95 \u0b95\u0bCD\u0b95\u0bCD\u0b95", 20, y);
-+ y += 50;
-+ g.setFont(new Font("Telugu Sangam MN", Font.PLAIN, 40));
-+ System.out.println(g.getFont());
-+ g.drawString("\u0c15\u0c4D \u0c15\u0c15\u0c15 \u0c15\u0c4D\u0c15\u0c4D\u0c15", 20, y);
-+ y += 50;
-+ g.setFont(new Font("Devanagari Sangam MN", Font.PLAIN, 40));
-+ System.out.println(g.getFont());
-+ g.drawString("\u0915\u0940 \u0915\u0947 \u0915\u0942", 20, y);
-+ y += 50;
-+ g.drawString("\u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
-+ y += 50;
-+ g.drawString("\u0930\u093F\u0935\u094D\u092F\u0942 \u0915\u0947 \u092C\u093E\u0926 \u0935\u093F\u0915\u093E\u0938 \u0913\u0932\u0902\u092A\u093F\u0915 \u0938\u0947 \u092C\u093E\u0939\u0930 (\u0926\u0947\u0935\u0928\u093E\u0917\u0930\u0940) (\u0939\u093F\u0928\u094D\u0926\u0940) \u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
-+
-+ }
-+}
-+
---- ./jdk/test/java/beans/Introspector/TestTypeResolver.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/test/java/beans/Introspector/TestTypeResolver.java Tue Mar 18 12:35:25 2014 -0700
-@@ -113,6 +113,8 @@
- // by private implementations of the various Type interfaces
- if (expect.equals(t) && t.equals(expect))
- System.out.println(", as expected");
-+ else if ((expect.equals(t) || t.equals(expect)) && expect.toString().equals(t.toString()))
-+ System.out.println(", as workaround of the 8023301 bug");
- else {
- System.out.println(" BUT SHOULD BE " + expect);
- failedCases.add(c);
---- ./jdk/test/java/lang/ProcessBuilder/Basic.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/test/java/lang/ProcessBuilder/Basic.java Tue Mar 18 12:35:25 2014 -0700
-@@ -29,6 +29,7 @@
- * 4947220 7018606 7034570
- * @summary Basic tests for Process and Environment Variable code
- * @run main/othervm/timeout=300 Basic
-+ * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic
- * @author Martin Buchholz
- */
-
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/lang/ProcessBuilder/BasicLauncher.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,99 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+/*
-+ * @test
-+ * @bug 5049299
-+ * @summary (process) Use posix_spawn, not fork, on S10 to avoid swap exhaustion
-+ * @compile BasicLauncher.java Basic.java
-+ * @run main BasicLauncher
-+ */
-+
-+import java.io.*;
-+import java.nio.file.*;
-+
-+public class BasicLauncher {
-+
-+ private static boolean passed = false;
-+
-+ public static void main(String args[]) throws Exception {
-+ String osName = System.getProperty("os.name");
-+ if (osName.startsWith("SunOS")) {
-+ BasicLauncher l = new BasicLauncher();
-+ l.start();
-+ }
-+ }
-+
-+ private void start() throws Exception {
-+ String separator = System.getProperty("file.separator");
-+ String jdkpath = System.getProperty("test.jdk") + separator + "bin" + separator;
-+ String srcpath = System.getProperty("test.src", ".") + separator;
-+ String testClasses = System.getProperty("test.classes", ".");
-+
-+ ProcessBuilder builder = new ProcessBuilder(
-+ jdkpath + "java",
-+ "-cp",
-+ testClasses,
-+ "-Djdk.lang.Process.launchMechanism=posix_spawn",
-+ "Basic");
-+ builder.redirectErrorStream(true);
-+ Process testProc = builder.start();
-+ printProcessThread ppt =
-+ new printProcessThread(testProc, "testproc");
-+ ppt.start();
-+ testProc.waitFor();
-+ System.out.println("testproc done");
-+
-+ if (!passed)
-+ throw new RuntimeException("Test Failed: ");
-+ }
-+
-+
-+ class printProcessThread extends Thread {
-+ Process p;
-+ String pName;
-+
-+ public printProcessThread(Process p, String pName) {
-+ this.p = p;
-+ this.pName = pName;
-+ }
-+
-+ @Override
-+ public void run() {
-+ try (BufferedReader reader =
-+ new BufferedReader(new InputStreamReader(p.getInputStream()))) {
-+ String line;
-+ while ((line = reader.readLine()) != null) {
-+ System.out.println("[Output: " + pName + "]" + line);
-+ if (line.contains("failed = 0")) {
-+ passed = true;
-+ }
-+ }
-+
-+ } catch (Exception e) {
-+ System.out.println("Exception encountered in " + pName
-+ + " thread\n" + e);
-+ }
-+ }
-+ }
-+}
---- ./jdk/test/java/util/logging/TestAppletLoggerContext.java Thu Dec 19 09:01:16 2013 -0800
-+++ ./jdk/test/java/util/logging/TestAppletLoggerContext.java Tue Mar 18 12:35:25 2014 -0700
-@@ -110,28 +110,19 @@
- }
-
- TestExc exc;
-- TestExc global = new TestExc();
-
- @Override
-- public Object getContext() { return active ? global : null; }
-+ public Object getAppletContext() { return active ? exc : null; }
- @Override
-- public Object getExecutionContext() { return active ? exc : null; }
-+ public Object get(Object o) { return exc.get(o); }
- @Override
-- public Object get(Object o, Object o1) { return TestExc.exc(o).get(o1); }
-+ public void put(Object o, Object o1) { exc.put(o, o1); }
- @Override
-- public void put(Object o, Object o1, Object o2) { TestExc.exc(o).put(o1, o2); }
-- @Override
-- public void remove(Object o, Object o1) { TestExc.exc(o).remove(o1); }
-- @Override
-- public Object get(Object o) { return global.get(o); }
-- @Override
-- public void put(Object o, Object o1) { global.put(o, o1); }
-- @Override
-- public void remove(Object o) { global.remove(o); }
-+ public void remove(Object o) { exc.remove(o); }
- @Override
- public boolean isDisposed() { return false; }
- @Override
-- public boolean isMainAppContext() { return exc == null; }
-+ public boolean isMainAppContext() { return !active || exc == null; }
- }
-
- final static JavaAWTAccessStub javaAwtAccess = new JavaAWTAccessStub();
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/util/logging/TestLoggingWithMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+import java.io.ByteArrayInputStream;
-+import java.io.IOException;
-+import java.util.logging.Logger;
-+import javax.imageio.ImageIO;
-+
-+/**
-+ * @test
-+ * @bug 8019853 8023258
-+ * @summary Test that the default user context is used when in the main
-+ * application context. This test must not be run in same VM or agent
-+ * VM mode: it would not test the intended behavior.
-+ * @run main/othervm TestLoggingWithMainAppContext
-+ */
-+public class TestLoggingWithMainAppContext {
-+
-+ public static void main(String[] args) throws IOException {
-+ System.out.println("Creating loggers.");
-+
-+ // These loggers will be created in the default user context.
-+ final Logger foo1 = Logger.getLogger( "foo" );
-+ final Logger bar1 = Logger.getLogger( "foo.bar" );
-+ if (bar1.getParent() != foo1) {
-+ throw new RuntimeException("Parent logger of bar1 "+bar1+" is not "+foo1);
-+ }
-+ System.out.println("bar1.getParent() is the same as foo1");
-+
-+ // Set a security manager
-+ System.setSecurityManager(new SecurityManager());
-+ System.out.println("Now running with security manager");
-+
-+ // Triggers the creation of the main AppContext
-+ ByteArrayInputStream is = new ByteArrayInputStream(new byte[] { 0, 1 });
-+ ImageIO.read(is); // triggers calls to system loggers & creation of main AppContext
-+
-+ // verify that we're still using the default user context
-+ final Logger bar2 = Logger.getLogger( "foo.bar" );
-+ if (bar1 != bar2) {
-+ throw new RuntimeException("bar2 "+bar2+" is not the same as bar1 "+bar1);
-+ }
-+ System.out.println("bar2 is the same as bar1");
-+ if (bar2.getParent() != foo1) {
-+ throw new RuntimeException("Parent logger of bar2 "+bar2+" is not foo1 "+foo1);
-+ }
-+ System.out.println("bar2.getParent() is the same as foo1");
-+ final Logger foo2 = Logger.getLogger("foo");
-+ if (foo1 != foo2) {
-+ throw new RuntimeException("foo2 "+foo2+" is not the same as foo1 "+foo1);
-+ }
-+ System.out.println("foo2 is the same as foo1");
-+
-+ System.out.println("Test passed.");
-+ }
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/java/util/logging/TestMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,85 @@
-+/*
-+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+import java.util.logging.Logger;
-+import sun.awt.AppContext;
-+import sun.awt.SunToolkit;
-+
-+
-+/**
-+ * @test
-+ * @bug 8026404
-+ * @summary checks that calling getLogger() from a Thread whose ThreadGroup is
-+ * a child of the main root group doesn't throw an exception.
-+ * @build TestMainAppContext
-+ * @run main/othervm TestMainAppContext
-+ * @author danielfuchs
-+ */
-+public class TestMainAppContext {
-+
-+ static volatile Throwable thrown = null;
-+
-+ public static void main(String... args) throws Exception {
-+ ThreadGroup rootTG = Thread.currentThread().getThreadGroup();
-+ while (rootTG.getParent() != null) {
-+ rootTG = rootTG.getParent();
-+ }
-+
-+ ThreadGroup tg = new ThreadGroup(rootTG, "FakeApplet");
-+ final Thread t1 = new Thread(tg, "createNewAppContext") {
-+ @Override
-+ public void run() {
-+ try {
-+ AppContext context = SunToolkit.createNewAppContext();
-+ } catch(Throwable t) {
-+ thrown = t;
-+ }
-+ }
-+ };
-+ t1.start();
-+ t1.join();
-+ if (thrown != null) {
-+ throw new RuntimeException("Unexpected exception: " + thrown, thrown);
-+ }
-+ Thread t2 = new Thread(tg, "BugDetector") {
-+
-+ @Override
-+ public void run() {
-+ try {
-+ Logger.getLogger("foo").info("Done");
-+ } catch (Throwable x) {
-+ thrown = x;
-+ }
-+ }
-+
-+ };
-+
-+ System.setSecurityManager(new SecurityManager());
-+ t2.start();
-+ t2.join();
-+ if (thrown != null) {
-+ throw new RuntimeException("Test failed: " + thrown, thrown);
-+ }
-+
-+ }
-+
-+}
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ ./jdk/test/javax/imageio/plugins/jpeg/TruncatedImageWarningTest.java Tue Mar 18 12:35:25 2014 -0700
-@@ -0,0 +1,58 @@
-+/*
-+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
-+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-+ *
-+ * This code is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 only, as
-+ * published by the Free Software Foundation.
-+ *
-+ * This code is distributed in the hope that it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+ * version 2 for more details (a copy is included in the LICENSE file that
-+ * accompanied this code).
-+ *
-+ * You should have received a copy of the GNU General Public License version
-+ * 2 along with this work; if not, write to the Free Software Foundation,
-+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-+ *
-+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-+ * or visit www.oracle.com if you need additional information or have any
-+ * questions.
-+ */
-+
-+import java.io.File;
-+import java.io.IOException;
-+import javax.imageio.ImageIO;
-+import javax.imageio.ImageReader;
-+import javax.imageio.event.IIOReadWarningListener;
-+import javax.imageio.stream.ImageInputStream;
-+
-+public class TruncatedImageWarningTest implements IIOReadWarningListener {
-+
-+ private static String fileName = "truncated.jpg";
-+ boolean receivedWarning = false;
-+
-+ public static void main(String[] args) throws IOException {
-+
-+ String sep = System.getProperty("file.separator");
-+ String dir = System.getProperty("test.src", ".");
-+ String filePath = dir+sep+fileName;
-+ System.out.println("Test file: " + filePath);
-+ File f = new File(filePath);
-+ ImageInputStream in = ImageIO.createImageInputStream(f);
-+ ImageReader reader = ImageIO.getImageReaders(in).next();
-+ TruncatedImageWarningTest twt = new TruncatedImageWarningTest();
-+ reader.addIIOReadWarningListener(twt);
-+ reader.setInput(in);
-+ reader.read(0);
-+ if (!twt.receivedWarning) {
-+ throw new RuntimeException("No expected warning");
-+ }
-+ }
-+
-+ public void warningOccurred(ImageReader source, String warning) {
-+ System.out.println("Expected warning: " + warning);
-+ receivedWarning = true;
-+ }
-+}
-Binary file test/javax/imageio/plugins/jpeg/truncated.jpg has changed
---- ./langtools/.hgtags Thu Dec 19 09:01:27 2013 -0800
-+++ ./langtools/.hgtags Tue Mar 18 12:45:26 2014 -0700
-@@ -381,6 +381,9 @@
- ba3ff27d4082f2cf0d06e635b2b6e01f80e78589 jdk7u45-b18
- 164cf7491ba2f371354ba343a604eee4c61c529d jdk7u45-b30
- 7f5cfaedb25c2c2774d6839810d6ae543557ca01 jdk7u45-b31
-+ef7bdbe7f1fa42fd58723e541d9cdedcacb2649a jdk7u45-b33
-+bcb3e939d046d75436c7c8511600b6edce42e6da jdk7u45-b34
-+efbda7abd821f280ec3a3aa6819ad62d45595e55 jdk7u45-b35
- 18d1864abca976ca68cb71612e9b20c908455d3d jdk7u51-b00
- 14d1cf2630aea549cfba9d052200c7ebcabd875c jdk7u51-b01
- f0168ccf171ed6080267fe0a7f7aed0b46bd5713 jdk7u51-b02
-@@ -395,3 +398,21 @@
- c9d8d8793d9330d592190c334260ccf26c986df6 jdk7u51-b11
- 5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u51-b12
- 4d0807934c302f2e35e6a5acc6cdc720c82b5671 jdk7u51-b13
-+ada23e55d76a378cb2fc2cd7ffae8c147aaf0055 jdk7u51-b30
-+e3d4896d52ab4ad0fc0b7a45d60340dbdcb8826d jdk7u51-b31
-+fb3ff30ecd8ea1637551461bfaf09fc8204b536c jdk7u51-b33
-+4adc6c094545774b324d2e5511723ada2b32e6c4 jdk7u51-b34
-+5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u55-b00
-+3e64e49131b88c839733c9869ff8aebcd15cf828 jdk7u55-b01
-+2a9f5c00ba46f895bc9d16a584bf7d80c1822268 jdk7u55-b02
-+0479d260ac835eb3f0c7f3d7d15be0599b92a20a jdk7u55-b03
-+a244cc40ae0b29028ff8503ee516cb5f9e3db6e3 jdk7u55-b04
-+25d63d986653d81522b01bbd2664083ae5fdc243 jdk7u55-b05
-+76eeeaace70d38795eef5215f758493421cee0ac jdk7u55-b06
-+08f7914d6aa947e73269b4e60110ed12573ffa28 jdk7u55-b07
-+e64301b473b43609cb28d8cfe7e5db17d9bf8a4a jdk7u55-b08
-+a296112a3fd774c258375912c7ada38daf8eee1e jdk7u55-b09
-+faa9f8c51a6e3fcb444729012a798e3ad09c3da4 jdk7u55-b10
-+2bdd105e433da7fbf7f37ec2f75fc4bed4e54280 jdk7u55-b11
-+a3cdca5d3773f67a49091f9131a4d073bc6b83d9 jdk7u55-b12
-+81bf1ca3a3a71c628b7d952ba47c6f200a223f27 jdk7u55-b13
---- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Thu Dec 19 09:01:27 2013 -0800
-+++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Tue Mar 18 12:45:26 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -235,7 +235,7 @@
- } else if (opt.equals("-doctitle")) {
- doctitle = os[1];
- } else if (opt.equals("-windowtitle")) {
-- windowtitle = os[1];
-+ windowtitle = os[1].replaceAll("\\<.*?>", "");
- } else if (opt.equals("-top")) {
- top = os[1];
- } else if (opt.equals("-bottom")) {
---- ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Thu Dec 19 09:01:27 2013 -0800
-+++ ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Tue Mar 18 12:45:26 2014 -0700
-@@ -1,5 +1,5 @@
- /*
-- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
-+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
-@@ -23,7 +23,7 @@
-
- /*
- * @test
-- * @bug 8016675
-+ * @bug 8016675 8026736
- * @summary Test for window title.
- * @author Bhavesh Patel
- * @library ../lib/
-@@ -34,26 +34,153 @@
- public class TestWindowTitle extends JavadocTester {
-
- private static final String BUG_ID = "8016675";
-- private static final String WIN_TITLE =
-+ //Window title with JavaScript special characters.
-+ private static final String TITLE_JS_CHARS =
- "Testing \"Window 'Title'\" with a \\ backslash and a / " +
- "forward slash and a \u00e8 unicode char also a tab and also a " +
- "\t special character another \u0002 unicode)";
-- private static final String[][] TEST = {
-- {BUG_ID + FS + "overview-summary.html",
-+ private static final String[] ARGS_JS_CHARS = new String[]{
-+ "-d", BUG_ID + "-1", "-windowtitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_JS_CHARS = {
-+ {BUG_ID + "-1" + FS + "overview-summary.html",
- "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
- "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
- "also a tab and also a \\t special character another \\u0002 unicode))\";"
- },
- };
-- private static final String[][] NEG_TEST = {
-- {BUG_ID + FS + "overview-summary.html",
-+ private static final String[][] NEG_TEST_JS_CHARS = {
-+ {BUG_ID + "-1" + FS + "overview-summary.html",
- "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " +
- "with a \\ backslash and a / forward slash and a \u00E8 unicode char " +
- "also a tab and also a \t special character another \u0002 unicode))\";"
-+ }
-+ };
-+
-+ //Window title with a script tag.
-+ private static final String TITLE_SCRIPT_TAG =
-+ "Testing script tag in title </title><script>alert(\"Should not pop up\")</script>.";
-+ private static final String[] ARGS_SCRIPT_TAG = new String[]{
-+ "-d", BUG_ID + "-2", "-windowtitle", TITLE_SCRIPT_TAG, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_SCRIPT_TAG = {
-+ {BUG_ID + "-2" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing script tag in title alert" +
-+ "(\\\"Should not pop up\\\").)\";"
- },
-+ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
-+ "parent.document.title=\"C2 (Testing script tag in title alert" +
-+ "(\\\"Should not pop up\\\").)\";"
-+ }
- };
-- private static final String[] ARGS = new String[]{
-- "-d", BUG_ID, "-windowtitle", WIN_TITLE, "-sourcepath", SRC_DIR, "p1", "p2"
-+ private static final String[][] NEG_TEST_SCRIPT_TAG = {
-+ {BUG_ID + "-2" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing script tag in title </title><script>" +
-+ "alert(\\\"Should not pop up\\\")</script>.)\";"
-+ },
-+ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
-+ "parent.document.title=\"C2 (Testing script tag in title </title><script>" +
-+ "alert(\\\"Should not pop up\\\")</script>.)\";"
-+ }
-+ };
-+
-+ //Window title with other HTML tags.
-+ private static final String TITLE_HTML_TAGS =
-+ "Testing another <p>HTML</p> tag. Another <h1>tag</h1>. A " +
-+ "<span id=\"testTag\">tag with attributes</span>. <script and </p are not tags.";
-+ private static final String[] ARGS_HTML_TAGS = new String[]{
-+ "-d", BUG_ID + "-3", "-windowtitle", TITLE_HTML_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_HTML_TAGS = {
-+ {BUG_ID + "-3" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing another HTML tag. Another tag. A " +
-+ "tag with attributes. <script and </p are not tags.)\";"
-+ }
-+ };
-+ private static final String[][] NEG_TEST_HTML_TAGS = {
-+ {BUG_ID + "-3" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing another <p>HTML</p> tag. Another " +
-+ "<h1>tag</h1>. A <span id=\"testTag\">tag with attributes</span>. <script and " +
-+ "</p are not tags.)\";"
-+ }
-+ };
-+
-+ //Window title using entities.
-+ private static final String TITLE_HTML_ENTITIES =
-+ "Testing entities &lt;script&gt;alert(\"Should not pop up\")&lt;/script&gt;.";
-+ private static final String[] ARGS_HTML_ENTITIES = new String[]{
-+ "-d", BUG_ID + "-4", "-windowtitle", TITLE_HTML_ENTITIES, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_HTML_ENTITIES = {
-+ {BUG_ID + "-4" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing entities &lt;script&gt;alert(\\\"Should " +
-+ "not pop up\\\")&lt;/script&gt;.)\";"
-+ }
-+ };
-+ private static final String[][] NEG_TEST_HTML_ENTITIES = {
-+ {BUG_ID + "-4" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing entities alert(\\\"Should not pop up\\\").)\";"
-+ }
-+ };
-+
-+ //Window title with just empty HTML tags.
-+ private static final String TITLE_EMPTY_TAGS =
-+ "</title><script></script>";
-+ private static final String[] ARGS_EMPTY_TAGS = new String[]{
-+ "-d", BUG_ID + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_EMPTY_TAGS = {
-+ {BUG_ID + "-5" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview\";"
-+ }
-+ };
-+ private static final String[][] NEG_TEST_EMPTY_TAGS = {
-+ {BUG_ID + "-5" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (</title><script></script>)\";"
-+ }
-+ };
-+
-+ //Window title with unicode characters.
-+ private static final String TITLE_UNICODE_CHARS =
-+ "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e.";
-+ private static final String[] ARGS_UNICODE_CHARS = new String[]{
-+ "-d", BUG_ID + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_UNICODE_CHARS = {
-+ {BUG_ID + "-6" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " +
-+ "not pop up\\\").)\";"
-+ }
-+ };
-+ private static final String[][] NEG_TEST_UNICODE_CHARS = {
-+ {BUG_ID + "-6" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing unicode <script>alert(\\\"Should not pop up\\\")" +
-+ "</script>.)\";"
-+ }
-+ };
-+
-+ //An empty window title.
-+ private static final String TITLE_EMPTY =
-+ "";
-+ private static final String[] ARGS_EMPTY_TITLE = new String[]{
-+ "-d", BUG_ID + "-7", "-windowtitle", TITLE_EMPTY, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] TEST_EMPTY = {
-+ {BUG_ID + "-7" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview\";"
-+ }
-+ };
-+
-+ //Test doctitle.
-+ private static final String[] ARGS_DOCTITLE = new String[]{
-+ "-d", BUG_ID + "-8", "-doctitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
-+ };
-+ private static final String[][] NEG_TEST_DOCTITLE = {
-+ {BUG_ID + "-8" + FS + "overview-summary.html",
-+ "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
-+ "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
-+ "also a tab and also a \\t special character another \\u0002 unicode)\";"
-+ },
- };
-
- /**
-@@ -62,7 +189,14 @@
- */
- public static void main(String[] args) {
- TestWindowTitle tester = new TestWindowTitle();
-- run(tester, ARGS, TEST, NEG_TEST);
-+ run(tester, ARGS_JS_CHARS, TEST_JS_CHARS, NEG_TEST_JS_CHARS);
-+ run(tester, ARGS_SCRIPT_TAG, TEST_SCRIPT_TAG, NEG_TEST_SCRIPT_TAG);
-+ run(tester, ARGS_HTML_TAGS, TEST_HTML_TAGS, NEG_TEST_HTML_TAGS);
-+ run(tester, ARGS_HTML_ENTITIES, TEST_HTML_ENTITIES, NEG_TEST_HTML_ENTITIES);
-+ run(tester, ARGS_EMPTY_TAGS, TEST_EMPTY_TAGS, NEG_TEST_EMPTY_TAGS);
-+ run(tester, ARGS_UNICODE_CHARS, TEST_UNICODE_CHARS, NEG_TEST_UNICODE_CHARS);
-+ run(tester, ARGS_EMPTY_TITLE, TEST_EMPTY, NO_TEST);
-+ run(tester, ARGS_DOCTITLE, NO_TEST, NEG_TEST_DOCTITLE);
- tester.printSummary();
- }
-