aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2014-04-22 05:30:04 +0800
committerjkim <jkim@FreeBSD.org>2014-04-22 05:30:04 +0800
commit8d723d2d07c197e157293ace35542d8e3f086974 (patch)
treed248fa0e70adc716cfaf2bf59e2633bec798c7e9 /java
parentd0ac06f320d72257d16c3ee5400d9c904f5b3bab (diff)
downloadfreebsd-ports-gnome-8d723d2d07c197e157293ace35542d8e3f086974.tar.gz
freebsd-ports-gnome-8d723d2d07c197e157293ace35542d8e3f086974.tar.zst
freebsd-ports-gnome-8d723d2d07c197e157293ace35542d8e3f086974.zip
Update to 8u5.
Diffstat (limited to 'java')
-rw-r--r--java/openjdk8/Makefile19
-rw-r--r--java/openjdk8/files/cacertsbin82586 -> 86915 bytes
-rw-r--r--java/openjdk8/files/jdk-test-javax-imageio-plugins-jpeg-truncated.jpgbin0 -> 1960 bytes
-rw-r--r--java/openjdk8/files/patch-8u5-b1313936
-rw-r--r--java/openjdk8/files/patch-bsd11
5 files changed, 13956 insertions, 10 deletions
diff --git a/java/openjdk8/Makefile b/java/openjdk8/Makefile
index 6892d10d1d21..2782c3e5244c 100644
--- a/java/openjdk8/Makefile
+++ b/java/openjdk8/Makefile
@@ -1,14 +1,13 @@
# $FreeBSD$
PORTNAME= openjdk
-PORTVERSION= ${JDK_MAJOR_VERSION}.${PORT_MINOR_VERSION}.${PORT_BUILD_NUMBER:S/^0//}
-PORTREVISION= 1
+PORTVERSION= ${JDK_MAJOR_VERSION}.${JDK_UPDATE_VERSION}.${JDK_BUILD_NUMBER:S/^0//}
CATEGORIES= java devel
MASTER_SITES= http://download.java.net/openjdk/jdk${JDK_MAJOR_VERSION}/promoted/b${JDK_BUILD_NUMBER}/:jdk \
https://adopt-openjdk.ci.cloudbees.com/job/jtreg/${JTREG_JENKINS_BUILD}/artifact/:jtreg \
LOCAL/jkim:jdk,jtreg
PKGNAMESUFFIX= ${JDK_MAJOR_VERSION}
-DISTNAME= ${PORTNAME}-${JDK_MAJOR_VERSION}-src-b${JDK_BUILD_NUMBER}-${JDK_BUILD_DATE}
+DISTNAME= ${PORTNAME}-${JDK_MAJOR_VERSION}-src-b132-03_mar_2014
DISTFILES= ${DISTNAME}${EXTRACT_SUFX}:jdk
MAINTAINER= java@FreeBSD.org
@@ -54,18 +53,16 @@ INSTALLDIR= ${PREFIX}/${PORTNAME}${JDK_MAJOR_VERSION}
NOPRECIOUSMAKEVARS= yes
JDK_MAJOR_VERSION= 8
-JDK_BUILD_NUMBER= 132
-JDK_BUILD_DATE= 03_mar_2014
+JDK_UPDATE_VERSION= 5
+JDK_BUILD_NUMBER= 13
JTREG_VERSION= 4.1
JTREG_BUILD_NUMBER= b08
JTREG_JENKINS_BUILD= 77
-PORT_MINOR_VERSION= 0
-PORT_BUILD_NUMBER= ${JDK_BUILD_NUMBER}
CONFIGURE_ARGS= --with-boot-jdk=${BOOTSTRAPJDKDIR}
-CONFIGURE_ARGS+= --with-build-number="b${PORT_BUILD_NUMBER}"
-.if ${PORT_MINOR_VERSION} > 0
-CONFIGURE_ARGS+= --with-update-version=${PORT_MINOR_VERSION}
+CONFIGURE_ARGS+= --with-build-number="b${JDK_BUILD_NUMBER}"
+.if ${JDK_UPDATE_VERSION} > 0
+CONFIGURE_ARGS+= --with-update-version=${JDK_UPDATE_VERSION}
.endif
CONFIGURE_ARGS+= --disable-freetype-bundling \
--disable-zip-debug-info \
@@ -144,6 +141,8 @@ ICONV_LDFLAGS= -L${LOCALBASE}/lib ${ICONV_LIB}
.endif
post-extract:
+ @${CP} ${FILESDIR}/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg \
+ ${WRKSRC}/jdk/test/javax/imageio/plugins/jpeg/truncated.jpg
@${MKDIR} ${WRKSRC}/jdk/src/bsd/classes/java/net \
${WRKSRC}/jdk/src/bsd/classes/sun/nio/ch
@${MV} -f ${WRKSRC}/jdk/src/macosx/classes/java/net/DefaultInterface.java \
diff --git a/java/openjdk8/files/cacerts b/java/openjdk8/files/cacerts
index 0a37aa432dda..e799f2009ef4 100644
--- a/java/openjdk8/files/cacerts
+++ b/java/openjdk8/files/cacerts
Binary files differ
diff --git a/java/openjdk8/files/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg b/java/openjdk8/files/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg
new file mode 100644
index 000000000000..db3fca890c85
--- /dev/null
+++ b/java/openjdk8/files/jdk-test-javax-imageio-plugins-jpeg-truncated.jpg
Binary files differ
diff --git a/java/openjdk8/files/patch-8u5-b13 b/java/openjdk8/files/patch-8u5-b13
new file mode 100644
index 000000000000..35ea3209ca3a
--- /dev/null
+++ b/java/openjdk8/files/patch-8u5-b13
@@ -0,0 +1,13936 @@
+--- .hgtags
++++ .hgtags
+@@ -253,3 +253,16 @@
+ 1e5fe865491300cd0c63261ecf8d34e621e1345c jdk8-b129
+ 839546caab1285c7699a9c2aa1467f57c9ea7f30 jdk8-b130
+ 0c38dfecab2ad9f9b5b5edf54b991602147cd040 jdk8-b131
++2a8f4c022aa03e7916223f3291517dbcc38e07cd jdk8-b132
++c41935d79b8744af8b7b56cd4d4ab781027fb22e jdk8u5-b01
++6f3357d3dbf83c1ef0098bcb853e3aa3b26f4cb8 jdk8u5-b02
++794b4365b6884e9a15f0840792539f5821814127 jdk8u5-b03
++c200d6cb184056e44afe7102913004b717896aa3 jdk8u5-b04
++eb537d7c31e069ac10de0901727515743f7535d2 jdk8u5-b05
++75cdae18810a479cc3c0fe8eb9055d968ae31c63 jdk8u5-b06
++b1585984f29320737ca0da5af029b1225a75c476 jdk8u5-b07
++a445d4130af79027fd9d6675b1ad7a8990225749 jdk8u5-b08
++e5403ff707fbd828e56bf390931f236028f9617b jdk8u5-b09
++fae51c73a06d71304c9dbff22984ee501812b972 jdk8u5-b10
++dd3bd272ceedbd69fabafc531b6b1e056659f733 jdk8u5-b11
++3e05b6ae0a1e2bd7352462e9bf8e7262246fb77f jdk8u5-b12
+--- .jcheck/conf
++++ .jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- THIRD_PARTY_README
++++ THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- common/autoconf/generated-configure.sh
++++ common/autoconf/generated-configure.sh
+@@ -3865,7 +3865,7 @@
+ #CUSTOM_AUTOCONF_INCLUDE
+
+ # Do not change or remove the following line, it is needed for consistency checks:
+-DATE_WHEN_GENERATED=1389186094
++DATE_WHEN_GENERATED=1390334534
+
+ ###############################################################################
+ #
+@@ -11156,6 +11156,12 @@
+ as_fn_error $? "Update version must have a value" "$LINENO" 5
+ elif test "x$with_update_version" != x; then
+ JDK_UPDATE_VERSION="$with_update_version"
++ # On macosx 10.7, it's not possible to set --with-update-version=0X due
++ # to a bug in expr (which reduces it to just X). To work around this, we
++ # always add a 0 to one digit update versions.
++ if test "${#JDK_UPDATE_VERSION}" = "1"; then
++ JDK_UPDATE_VERSION="0${JDK_UPDATE_VERSION}"
++ fi
+ fi
+
+
+--- common/autoconf/jdk-options.m4
++++ common/autoconf/jdk-options.m4
+@@ -423,6 +423,12 @@
+ AC_MSG_ERROR([Update version must have a value])
+ elif test "x$with_update_version" != x; then
+ JDK_UPDATE_VERSION="$with_update_version"
++ # On macosx 10.7, it's not possible to set --with-update-version=0X due
++ # to a bug in expr (which reduces it to just X). To work around this, we
++ # always add a 0 to one digit update versions.
++ if test "${#JDK_UPDATE_VERSION}" = "1"; then
++ JDK_UPDATE_VERSION="0${JDK_UPDATE_VERSION}"
++ fi
+ fi
+
+ AC_ARG_WITH(user-release-suffix, [AS_HELP_STRING([--with-user-release-suffix],
+--- corba/.hgtags
++++ corba/.hgtags
+@@ -253,3 +253,16 @@
+ 5c72d74c6805d1b4f6192f7a3550d126acf37005 jdk8-b129
+ 0683ee308085785d0455f4153e764e062843f178 jdk8-b130
+ 5e5c8f0c45dd75a08089586ca50835393f00c2cb jdk8-b131
++84fed37bbe640666bfc022c2e8b9fde468de35d2 jdk8-b132
++5de8d42f9eb7ddcdc741445f3c21a63887d694b6 jdk8u5-b01
++c750098a3ef18de28a6d739666559f0333c76c78 jdk8u5-b02
++3d9b40a53134aa33031bf13581dff9fccade9048 jdk8u5-b03
++596f4e4c5587c29767345555c4e48a5be0a58b83 jdk8u5-b04
++1f95c888e5efe010550d95ef59020ddb15876463 jdk8u5-b05
++edfa8bc86fda1b2fd064abbafb4506c80a47587e jdk8u5-b06
++0a25d1c162bc046aa230577736429935716a2243 jdk8u5-b07
++df6e5fc3b585a6829c98bb91546b81dc28f8e2b4 jdk8u5-b08
++f5058197fa91153b7702214154d37b00f9714aaa jdk8u5-b09
++d9031b5525f777299554080d6beb8b077df0a614 jdk8u5-b10
++a2f7b36bfc1bc8df033fe5721b48fac1c3928a5b jdk8u5-b11
++475b96f6d8cecf720ca9fd6d332dd4bafb0f654c jdk8u5-b12
+--- corba/.jcheck/conf
++++ corba/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- corba/THIRD_PARTY_README
++++ corba/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java
++++ corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java
+@@ -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;
+@@ -80,15 +81,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() ;
+ }
+ }
+@@ -98,7 +99,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())
+@@ -110,7 +111,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.
+@@ -121,14 +122,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);
+ }
+@@ -141,7 +142,7 @@
+ if (serializable) {
+ externalizable =
+ ((superdesc != null) && superdesc.isExternalizable()) ||
+- classExternalizable.isAssignableFrom(cl);
++ Externalizable.class.isAssignableFrom(cl);
+ if (externalizable) {
+ serializable = false;
+ }
+@@ -185,7 +186,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 )
+ {
+@@ -219,7 +220,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 )
+@@ -249,7 +250,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;
+ }
+
+@@ -349,7 +350,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 */
+@@ -433,7 +434,7 @@
+ if (initialized)
+ return;
+
+- final Class cl = ofClass;
++ final Class<?> cl = ofClass;
+
+ if (!serializable ||
+ externalizable ||
+@@ -561,9 +562,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;
+ }
+@@ -589,9 +590,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);
+@@ -653,7 +654,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;
+@@ -920,9 +921,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;
+@@ -936,15 +937,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 &&
+@@ -1049,7 +1050,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);
+@@ -1103,7 +1104,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++) {
+@@ -1233,7 +1234,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;
+@@ -1253,7 +1254,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
+@@ -1309,10 +1310,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++;
+@@ -1358,7 +1359,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]));
+ }
+@@ -1375,7 +1376,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]));
+ }
+@@ -1395,7 +1396,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;
+@@ -1442,7 +1443,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();
+@@ -1476,7 +1477,7 @@
+ /*
+ * Class that is a descriptor for in this virtual machine.
+ */
+- private Class ofClass;
++ private Class<?> ofClass;
+
+ /*
+ * True if descriptor for a proxy class.
+@@ -1548,30 +1549,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) {
+ }
+
+@@ -1596,22 +1584,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;
+
+@@ -1649,8 +1621,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());
+ }
+ }
+@@ -1764,12 +1736,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);
+@@ -1801,7 +1773,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
++++ corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java
+@@ -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
++++ corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java
+@@ -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/org/omg/CORBA/ORB.java
++++ corba/src/share/classes/org/omg/CORBA/ORB.java
+@@ -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(String className) {
++ 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
++++ hotspot/.hgtags
+@@ -421,3 +421,16 @@
+ 1dbaf664a611e5d9cab6d1be42537b67d0d05f94 jdk8-b130
+ b5e7ebfe185cb4c2eeb8a919025fc6a26be2fcef jdk8-b131
+ 9f9179e8f0cfe74c08f3716cf3c38e21e1de4c4a hs25-b70
++0c94c41dcd70e9a9b4d96e31275afd5a73daa72d jdk8-b132
++4a35ef38e2a7bc64df20c7700ba69b37e3ddb8b5 jdk8u5-b01
++e5561d89fe8bfc79cd6c8fcc36d270cc6a49ec6e jdk8u5-b02
++2f9eb9fcab6c42c8c84ddb44170ea33235116d84 jdk8u5-b03
++5ac720d47ab83f8eb2f5fe3641667823a0298f41 jdk8u5-b04
++b90de55aca30678ab0fec05d6a61bb3468b783d2 jdk8u5-b05
++956c0e048ef29ee9a8026fb05858abe64b4e0ceb jdk8u5-b06
++46fa2940e6861df18a107b6b83a2df85239e5ec7 jdk8u5-b07
++21c1dfbed277791071947eed1c93806ccf48a7d8 jdk8u5-b08
++6af9ce1c56a6545ec6c992a5f61b2eec924be040 jdk8u5-b09
++629267e4f0b5155608edcd71922983be98786bd7 jdk8u5-b10
++17a75e692af397532e2b296b24f6b9b6c239c633 jdk8u5-b11
++9b289963cb9a14636fbe8faaa2dd6d3678464a7b jdk8u5-b12
+--- hotspot/.jcheck/conf
++++ hotspot/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- hotspot/THIRD_PARTY_README
++++ hotspot/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- hotspot/make/hotspot_version
++++ hotspot/make/hotspot_version
+@@ -34,8 +34,8 @@
+ HOTSPOT_VM_COPYRIGHT=Copyright 2014
+
+ HS_MAJOR_VER=25
+-HS_MINOR_VER=0
+-HS_BUILD_NUMBER=70
++HS_MINOR_VER=5
++HS_BUILD_NUMBER=02
+
+ JDK_MAJOR_VER=1
+ JDK_MINOR_VER=8
+--- hotspot/src/share/vm/classfile/classFileParser.cpp
++++ hotspot/src/share/vm/classfile/classFileParser.cpp
+@@ -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
+@@ -2777,6 +2777,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
++++ hotspot/src/share/vm/oops/objArrayKlass.cpp
+@@ -269,7 +269,7 @@
+ if (element_is_null ||
+ (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/output.cpp
++++ hotspot/src/share/vm/opto/output.cpp
+@@ -344,6 +344,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); )
+
+@@ -460,6 +465,7 @@
+ last_avoid_back_to_back_adr += max_loop_pad;
+ }
+ blk_size += max_loop_pad;
++ block_worst_case_pad[i + 1] = max_loop_pad;
+ }
+ }
+
+@@ -499,9 +505,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
++++ jaxp/.hgtags
+@@ -253,3 +253,16 @@
+ b7752cea7c813fb8b1d3bf2e05e8f93331cc7f1d jdk8-b129
+ 0cb0cd01521845c2d6f5172a9ef1783d4c8bd668 jdk8-b130
+ 79d8b7fac21d263db5e5ebd3b830a3cf98509541 jdk8-b131
++5993346020d14a1c2c7003588c584366db7921f5 jdk8-b132
++22b63601be6f04fcb2c3b563261f14869954b44a jdk8u5-b01
++bd97ff5f82588c627869218df02a9c2dbb9402d0 jdk8u5-b02
++195b74b3e57905b6d6c9ed9b32139c6781ba7d28 jdk8u5-b03
++106fdcde4b8a6981be13dac34a3de99d6fece97c jdk8u5-b04
++8f859b1b0f0b18ee7e231d6887b18b5721c2404e jdk8u5-b05
++e22bc548b58a695eede0304399777314ae473562 jdk8u5-b06
++0f96584b02b399df706bec2052a7fe48bdc6058b jdk8u5-b07
++bbe60534528d2e8118957aaa74a75bedc1c3819a jdk8u5-b08
++d9b3ef4511434cf55870d42b6caa6a5618bc47ce jdk8u5-b09
++4b32ee8d711251e90ade1d958a51e134c3d387c9 jdk8u5-b10
++c17a827bec287f4c7565c72c195667e52154772b jdk8u5-b11
++0e5317cbe451d57f9ffcbb835de07fe553a8aa34 jdk8u5-b12
+--- jaxp/.jcheck/conf
++++ jaxp/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- jaxp/THIRD_PARTY_README
++++ jaxp/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java
++++ jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java
+@@ -39,8 +39,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";
+
+ /** Set to true for debugging */
+ private static final boolean DEBUG = false;
+@@ -161,12 +161,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);
+- }
+ }
+
+ /**
+@@ -181,8 +177,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(".");
+@@ -197,16 +193,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
++++ jaxp/src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java
+@@ -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
++++ jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java
+@@ -39,7 +39,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";
+
+ /** Set to true for debugging */
+ private static final boolean DEBUG = isDebugEnabled();
+@@ -175,12 +176,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
+@@ -193,7 +190,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(".");
+@@ -205,7 +203,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
++++ jaxp/src/com/sun/org/apache/xml/internal/serializer/CharInfo.java
+@@ -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;
+-// }
+-
+-
+- 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);}
+- });
++
++ /**
++ * 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;
++ }
++
++ 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:
++ *
++ * 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
+ *
+- * Resource files must be encoded in UTF-8 and have a format like:
++ * 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
++++ jaxp/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java
+@@ -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
++++ jaxp/src/com/sun/org/apache/xml/internal/serializer/ToXMLStream.java
+@@ -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
++++ jaxws/.hgtags
+@@ -253,3 +253,16 @@
+ aabc90596123d4eb7e576ecb0e7a843a9415d8eb jdk8-b129
+ 4195c0956930bf4e161ac6b0def0d6295bfba58f jdk8-b130
+ 012b935707fa24a1a88b429255f77b386e082643 jdk8-b131
++c2be0dd15dbf0c23ee693a1af32f8f6a012abd1e jdk8-b132
++2fcd3ddb57a6c71e082c7f113f4063de9a967fcd jdk8u5-b01
++384ccf4e14cb90c89570e16a5f4ca440a69d6d93 jdk8u5-b02
++e423a4f2ec72ea0e24bea0fa77dd105095bbee67 jdk8u5-b03
++738b966ee0b00d994445d34eb7eb087bd41a5478 jdk8u5-b04
++3960c6ef7bd1782d6357c510dab393d291164045 jdk8u5-b05
++0543f4dddddc67b142b4706b2d403a654809e605 jdk8u5-b06
++0eb7f9f88e93587ace50614385f85afd221f5cb1 jdk8u5-b07
++3ee93ab2a3739ae5e4e209ac14c36e7374f3f748 jdk8u5-b08
++6cd5065081477be64e4e99ef98ec68464dde2d72 jdk8u5-b09
++22a840b408eb0242e363700843fba3f4988df749 jdk8u5-b10
++75fd3933daaf5826e7c03bfb318026ac8a4c07ef jdk8u5-b11
++e2454d30b525bcb6ebcc711bd2928fbd29c11143 jdk8u5-b12
+--- jaxws/.jcheck/conf
++++ jaxws/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- jaxws/THIRD_PARTY_README
++++ jaxws/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- jaxws/src/share/jaf_classes/javax/activation/CommandMap.java
++++ jaxws/src/share/jaf_classes/javax/activation/CommandMap.java
+@@ -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();
+-
+- return defaultCommandMap;
++ public static synchronized CommandMap getDefaultCommandMap() {
++ if (defaultCommandMap != null)
++ 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
++++ jaxws/src/share/jaf_classes/javax/activation/DataHandler.java
+@@ -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
++++ jaxws/src/share/jaf_classes/javax/activation/FileTypeMap.java
+@@ -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
++++ jaxws/src/share/jaf_classes/javax/activation/MailcapCommandMap.java
+@@ -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
++++ jaxws/src/share/jaf_classes/javax/activation/MimetypesFileTypeMap.java
+@@ -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);
+--- jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/Internalizer.java
+@@ -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
+@@ -60,12 +60,10 @@
+ */
+ public class Internalizer {
+
+- private static final XPathFactory xpf = XmlUtil.newXPathFactory(true);
+- private final XPath xpath = xpf.newXPath();
++ private final XPath xpath = xpf.get().newXPath();
+ private final DOMForest forest;
+ private final ErrorReceiver errorReceiver;
+
+-
+ public Internalizer(DOMForest forest, WsimportOptions options, ErrorReceiver errorReceiver) {
+ this.forest = forest;
+ this.errorReceiver = errorReceiver;
+@@ -77,6 +75,12 @@
+ }
+ }
+
++ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
++ @Override
++ protected XPathFactory initialValue() throws Exception {
++ return XPathFactory.newInstance();
++ }
++ };
+ /**
+ * Validates attributes of a &lt;JAXWS:bindings> element.
+ */
+--- jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java
+@@ -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
+@@ -54,8 +54,14 @@
+ public class JAXWSBindingExtensionHandler extends AbstractExtensionHandler {
+
+ // xml security enabled always, xpath used for parsing "part" attribute
+- private static final XPathFactory xpf = XmlUtil.newXPathFactory(true);
+- 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);
+--- jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/Internalizer.java
+@@ -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
+@@ -76,8 +76,6 @@
+
+ private static final String WSDL_NS = "http://schemas.xmlsoap.org/wsdl/";
+
+- private static XPathFactory xpf = null;
+-
+ private final XPath xpath;
+
+ /**
+@@ -99,12 +97,7 @@
+ this.errorHandler = forest.getErrorHandler();
+ this.forest = forest;
+ this.enableSCD = enableSCD;
+- synchronized (this) {
+- if (xpf == null) {
+- xpf = XmlFactory.createXPathFactory(disableSecureProcessing);
+- }
+- }
+- xpath = xpf.newXPath();
++ xpath = XmlFactory.createXPathFactory(disableSecureProcessing).newXPath();
+ }
+
+ /**
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java
+@@ -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
+@@ -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;
+@@ -356,7 +361,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) {
+@@ -722,14 +727,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 {
+@@ -1045,7 +1066,7 @@
+
+ @Deprecated
+ public Calendar parseTime(String lexicalXSDTime) {
+- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
+ }
+
+ @Deprecated
+@@ -1055,7 +1076,7 @@
+
+ @Deprecated
+ public Calendar parseDate(String lexicalXSDDate) {
+- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
++ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
+ }
+
+ @Deprecated
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.java
+@@ -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 );
++ }
++}
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java
+@@ -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/RuntimeBuiltinLeafInfoImpl.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java
+@@ -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
+@@ -63,9 +63,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;
+@@ -568,7 +566,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;
+@@ -838,7 +837,7 @@
+
+ public Duration parse(CharSequence lexical) {
+ TODO.checkSpec("JSR222 Issue #42");
+- return datatypeFactory.newDuration(lexical.toString());
++ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
+ }
+ });
+ primaryList.add(
+@@ -879,21 +878,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/JAXBContextImpl.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.java
+@@ -129,14 +129,6 @@
+ private final Map<TypeReference,Bridge> bridges = new LinkedHashMap<TypeReference,Bridge>();
+
+ /**
+- * Shared instance of {@link TransformerFactory}.
+- * Lock before use, because a {@link TransformerFactory} is not thread-safe
+- * whereas {@link JAXBContextImpl} is.
+- * Lazily created.
+- */
+- private volatile static SAXTransformerFactory tf;
+-
+- /**
+ * Shared instance of {@link DocumentBuilder}.
+ * Lock before use. Lazily created.
+ */
+@@ -705,13 +697,7 @@
+ */
+ static Transformer createTransformer(boolean disableSecureProcessing) {
+ try {
+- if (tf==null) {
+- synchronized(JAXBContextImpl.class) {
+- if (tf==null) {
+- tf = (SAXTransformerFactory)XmlFactory.createTransformerFactory(disableSecureProcessing);
+- }
+- }
+- }
++ SAXTransformerFactory tf = (SAXTransformerFactory)XmlFactory.createTransformerFactory(disableSecureProcessing);
+ return tf.newTransformer();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+@@ -723,13 +709,7 @@
+ */
+ public static TransformerHandler createTransformerHandler(boolean disableSecureProcessing) {
+ try {
+- if (tf==null) {
+- synchronized(JAXBContextImpl.class) {
+- if (tf==null) {
+- tf = (SAXTransformerFactory)XmlFactory.createTransformerFactory(disableSecureProcessing);
+- }
+- }
+- }
++ SAXTransformerFactory tf = (SAXTransformerFactory)XmlFactory.createTransformerFactory(disableSecureProcessing);
+ return tf.newTransformerHandler();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java
+@@ -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
+@@ -153,7 +153,6 @@
+ }
+ }
+
+-
+ /**
+ * Reference to FI's XMLStreamWriter class, if FI can be loaded.
+ */
+@@ -162,9 +161,8 @@
+
+ private static Class initFIStAXWriterClass() {
+ try {
+- ClassLoader loader = 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 +177,7 @@
+ try {
+ if (FI_STAX_WRITER_CLASS == null)
+ return null;
+- ClassLoader loader = 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 +192,7 @@
+
+ private static Class initStAXExWriterClass() {
+ try {
+- ClassLoader loader = 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,20 +200,11 @@
+
+ private static Constructor<? extends XmlOutput> initStAXExOutputClass() {
+ try {
+- ClassLoader loader = 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;
+ }
+ }
+
+- private static ClassLoader getClassLoader() {
+- ClassLoader cl = SecureLoader.getClassClassLoader(UnmarshallerImpl.class);
+- if (cl == null) {
+- cl = SecureLoader.getContextClassLoader();
+- }
+- return cl;
+- }
+-
+ }
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Messages.properties
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Messages.properties
+@@ -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
+@@ -38,3 +38,6 @@
+ NO_GETTER = \
+ The property has a setter "{0}" but no getter. \
+ For marshaller, please define getters.
++
++INVALID_XML_ENUM_VALUE = \
++ "{0}" is not a valid value for {1}.
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java
+@@ -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
+@@ -336,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;
+@@ -354,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) {
+@@ -370,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;
+ }
+@@ -378,19 +377,11 @@
+
+ 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;
+ }
+ }
+
+- private static ClassLoader getClassLoader() {
+- ClassLoader cl = SecureLoader.getClassClassLoader(UnmarshallerImpl.class);
+- if (cl == null) {
+- cl = SecureLoader.getContextClassLoader();
+- }
+- return cl;
+- }
+-
+ }
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java
+@@ -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) {
+@@ -404,7 +355,7 @@
+ throw new SOAPExceptionImpl(e.getLocalizedMessage());
+ } finally {
+ try {
+- decoded.close();
++ decoded.close();
+ } catch (IOException ex) {
+ throw new SOAPException(ex);
+ }
+@@ -613,4 +564,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;
++ }
+ }
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java
+@@ -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
+@@ -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);
+ }
+ }
+ }
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2013, 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) {
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java
+@@ -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
+@@ -63,39 +63,43 @@
+
+ private static final Logger LOGGER = Logger.getLogger(XMLStreamReaderFactory.class.getName());
+
++ private static final String CLASS_NAME_OF_WSTXINPUTFACTORY = "com.ctc.wstx.stax.WstxInputFactory";
++
+ /**
+ * Singleton instance.
+ */
+- private static volatile @NotNull XMLStreamReaderFactory theInstance;
+-
+- private static final String CLASS_NAME_OF_WSTXINPUTFACTORY = "com.ctc.wstx.stax.WstxInputFactory";
++ private static volatile ContextClassloaderLocal<XMLStreamReaderFactory> streamReader =
++ new ContextClassloaderLocal<XMLStreamReaderFactory>() {
+
+- static {
+- 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);
+- }
+-
+- if(f==null) {
+- // is this Woodstox?
+- if (xif.getClass().getName().equals(CLASS_NAME_OF_WSTXINPUTFACTORY)) {
+- f = new Woodstox(xif);
+- }
+- }
++ @Override
++ protected XMLStreamReaderFactory initialValue() {
+
+- if (f==null) {
+- f = new Default();
+- }
++ XMLInputFactory xif = getXMLInputFactory();
++ XMLStreamReaderFactory f=null;
+
+- theInstance = f;
+- if (LOGGER.isLoggable(Level.FINE)) {
+- LOGGER.log(Level.FINE, "XMLStreamReaderFactory instance is = {0}", theInstance);
+- }
+- }
++ // 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(CLASS_NAME_OF_WSTXINPUTFACTORY)) {
++ f = new Woodstox(xif);
++ }
++ }
++
++ if (f==null) {
++ f = new Default();
++ }
++
++ if (LOGGER.isLoggable(Level.FINE)) {
++ LOGGER.log(Level.FINE, "XMLStreamReaderFactory instance is = {0}", f);
++ }
++ return f;
++ }
++ };
+
+ private static XMLInputFactory getXMLInputFactory() {
+ XMLInputFactory xif = null;
+@@ -126,11 +130,11 @@
+ 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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java
+@@ -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
+@@ -62,52 +62,54 @@
+ /**
+ * Singleton instance.
+ */
+- private static volatile @NotNull XMLStreamWriterFactory theInstance;
++ private static volatile ContextClassloaderLocal<XMLStreamWriterFactory> writerFactory =
++ new ContextClassloaderLocal<XMLStreamWriterFactory>() {
+
+-
+- 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
++ @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();
+ }
+- }
+- if (xof == null) {
+- xof = XMLOutputFactory.newInstance();
+- }
+
+- XMLStreamWriterFactory f=null;
++ 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")) {
+- try {
+- Class<?> clazz = xof.createXMLStreamWriter(new StringWriter()).getClass();
+- if (clazz.getName().startsWith("com.sun.xml.internal.stream.")) {
+- f = new Zephyr(xof,clazz);
++ // 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")) {
++ try {
++ Class<?> clazz = xof.createXMLStreamWriter(new StringWriter()).getClass();
++ if (clazz.getName().startsWith("com.sun.xml.internal.stream.")) {
++ f = new Zephyr(xof,clazz);
++ }
++ } catch (XMLStreamException ex) {
++ Logger.getLogger(XMLStreamWriterFactory.class.getName()).log(Level.INFO, null, ex);
++ } catch (NoSuchMethodException ex) {
++ Logger.getLogger(XMLStreamWriterFactory.class.getName()).log(Level.INFO, null, ex);
+ }
+- } catch (XMLStreamException ex) {
+- Logger.getLogger(XMLStreamWriterFactory.class.getName()).log(Level.INFO, null, ex);
+- } catch (NoSuchMethodException ex) {
+- Logger.getLogger(XMLStreamWriterFactory.class.getName()).log(Level.INFO, null, ex);
+ }
+- }
+
+- 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);
++ 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;
+- if (LOGGER.isLoggable(Level.FINE)) {
+- LOGGER.log(Level.FINE, "XMLStreamWriterFactory instance is = {0}", f);
++ if (LOGGER.isLoggable(Level.FINE)) {
++ LOGGER.log(Level.FINE, "XMLStreamWriterFactory instance is = {0}", f);
++ }
++ return f;
+ }
+- }
++ };
+
+ /**
+ * See {@link #create(OutputStream)} for the contract.
+@@ -170,7 +172,7 @@
+ * Gets the singleton instance.
+ */
+ public static @NotNull XMLStreamWriterFactory get() {
+- return theInstance;
++ return writerFactory.get();
+ }
+
+ /**
+@@ -183,7 +185,7 @@
+ @SuppressWarnings({"null", "ConstantConditions"})
+ 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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java
+@@ -37,6 +37,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.namespace.QName;
+ import javax.xml.ws.Service;
+ import javax.xml.ws.WebServiceFeature;
+@@ -151,12 +154,61 @@
+ 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);
+ }
+
++ 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;
++ }
++
+ public static BindingImpl create(@NotNull BindingID bindingId) {
+ if (bindingId.equals(BindingID.XML_HTTP))
+ return new HTTPBindingImpl();
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/commons/xmlutil/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/commons/xmlutil/ContextClassloaderLocal.java
+@@ -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.commons.xmlutil;
++
++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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/commons/xmlutil/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/commons/xmlutil/ContextClassloaderLocal.properties
+@@ -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/commons/xmlutil/Converter.java
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/commons/xmlutil/Converter.java
+@@ -53,7 +53,12 @@
+ // prevents instantiation
+ }
+ private static final Logger LOGGER = Logger.getLogger(Converter.class);
+- private static final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
++ private static final ContextClassloaderLocal<XMLOutputFactory> xmlOutputFactory = new ContextClassloaderLocal<XMLOutputFactory>() {
++ @Override
++ protected XMLOutputFactory initialValue() throws Exception {
++ return XMLOutputFactory.newInstance();
++ }
++ };
+ private static final AtomicBoolean logMissingStaxUtilsWarning = new AtomicBoolean(false);
+
+ /**
+@@ -110,7 +115,7 @@
+ stringOut = new StringWriter();
+ XMLStreamWriter writer = null;
+ try {
+- writer = xmlOutputFactory.createXMLStreamWriter(stringOut);
++ writer = xmlOutputFactory.get().createXMLStreamWriter(stringOut);
+ if (createIndenter) {
+ writer = createIndenter(writer);
+ }
+@@ -143,7 +148,7 @@
+
+ try {
+ if (message != null) {
+- XMLStreamWriter xsw = xmlOutputFactory.createXMLStreamWriter(baos, encoding);
++ XMLStreamWriter xsw = xmlOutputFactory.get().createXMLStreamWriter(baos, encoding);
+ try {
+ message.writeTo(xsw);
+ } finally {
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java
+@@ -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
+@@ -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() {
+ }
+@@ -86,7 +91,7 @@
+ }
+
+ try {
+- Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.createUnmarshaller();
++ Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.get().createUnmarshaller();
+ MemberSubmissionEndpointReference epr = unmarshaller.unmarshal(source,MemberSubmissionEndpointReference.class).getValue();
+
+ this.addr = epr.addr;
+@@ -106,7 +111,7 @@
+ @Override
+ 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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java
+@@ -34,8 +34,6 @@
+ import com.sun.xml.internal.ws.api.pipe.Codec;
+ 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 java.io.IOException;
+ import java.io.InputStream;
+@@ -63,33 +61,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";
+
+ protected Codec mimeRootCodec;
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java
+@@ -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);
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java
+@@ -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
+@@ -80,7 +80,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.
+@@ -148,7 +153,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);
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/version.properties
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/version.properties
+@@ -26,4 +26,4 @@
+ build-id=2.2.9-b130926.1035
+ build-version=JAX-WS RI 2.2.9-b130926.1035
+ major-version=2.2.9
+-svn-revision=8c29a9a53251ff741fca1664a8221dc876b2eac8
++svn-revision=5f6196f2b90e9460065a4c2f4e30e065b245e51e
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java
+@@ -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
+@@ -215,20 +215,28 @@
+ }
+ }
+
+- static final TransformerFactory transformerFactory = newTransformerFactory();
+-
+- static final SAXParserFactory saxParserFactory = newSAXParserFactory(true);
++ static final ContextClassloaderLocal<TransformerFactory> transformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
++ @Override
++ protected TransformerFactory initialValue() throws Exception {
++ return TransformerFactory.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");
+ }
+@@ -243,9 +251,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));
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.java 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.java
+@@ -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;
++ }
++ });
++ }
++}
++
+--- jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.properties 1969-12-31 19:00:00.000000000 -0500
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.properties
+@@ -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
++++ jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java
+@@ -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
+@@ -63,10 +63,15 @@
+ }
+
+ public AnnotationParser create(boolean disableSecureProcessing) {
+- return new AnnotationParserImpl();
++ return new AnnotationParserImpl(disableSecureProcessing);
+ }
+
+- 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 {
+
+@@ -82,8 +87,9 @@
+
+ AnnotationParserImpl(boolean disableSecureProcessing) {
+ try {
+- transformer = stf.newTransformerHandler();
+- stf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, disableSecureProcessing);
++ SAXTransformerFactory factory = stf.get();
++ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, disableSecureProcessing);
++ transformer = factory.newTransformerHandler();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+ }
+--- jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java
++++ jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2013, 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
+@@ -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();
+
+ // should be changed to package private, keeping original modifier to keep backwards compatibility
+ protected static final String NS = "http://www.w3.org/2005/08/addressing";
+--- jdk/.hgtags
++++ jdk/.hgtags
+@@ -253,3 +253,16 @@
+ 80568a19aab7300bc92baf2dc225be929f5b03ed jdk8-b129
+ 43386cc9a017a9f9e704760050086bb18b778ae0 jdk8-b130
+ e291ac47c9a90366c3c0787a6f7ce547a2bda308 jdk8-b131
++43cb25339b5500871f41388a5197f1b01c4b57b8 jdk8-b132
++fa2d5a06308f3f36fb09662fa58070a02352f023 jdk8u5-b01
++343f4f8ba0982b3516e33c859b01634d919243c4 jdk8u5-b02
++c35571198602a5856280d5c7c10bda4e7b769104 jdk8u5-b03
++55e6175fb6904d771bfaec4ada4f5e20b54f4791 jdk8u5-b04
++911d590f34aaa7f7b9ef300d0c0a019e70a62d1d jdk8u5-b05
++94fe0ed14bfcca335ff72abd20cf871dab100e79 jdk8u5-b06
++469c2c1a4885ddedc114e17902bb2f7f7326a4b7 jdk8u5-b07
++e48a0e01e6e19846533ec2cf3df15a6699d7ea8b jdk8u5-b08
++cd9a093d0f63375dc323f8af59a3f7e77bc5d3e9 jdk8u5-b09
++7f905cc47d4951628d956c436c8aa95aeb8bd014 jdk8u5-b10
++f4f3b7ccd2801a0a87dd4677332f5b93191d08f2 jdk8u5-b11
++9ff7f7909e122bb54f7df80efd0fc7a03ce7efff jdk8u5-b12
+--- jdk/.jcheck/conf
++++ jdk/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- jdk/THIRD_PARTY_README
++++ jdk/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- jdk/make/CompileJavaClasses.gmk
++++ jdk/make/CompileJavaClasses.gmk
+@@ -390,7 +390,7 @@
+
+ ##########################################################################################
+
+-all: $(BUILD_JDK) $(BUILD_SECURITY) $(BUILD_JOBJC) $(BUILD_JOBJC_HEADERS) $(COPY_EXTRA) \
++all: $(BUILD_JDK) $(BUILD_SECURITY) $(COPY_EXTRA) \
+ $(JDK_OUTPUTDIR)/classes/META-INF/services/com.sun.tools.xjc.Plugin \
+ $(BUILD_ACCESSBRIDGE_32) $(BUILD_ACCESSBRIDGE_64) \
+ $(BUILD_ACCESSBRIDGE_LEGACY)
+--- jdk/make/data/tzdata/VERSION
++++ jdk/make/data/tzdata/VERSION
+@@ -21,4 +21,4 @@
+ # or visit www.oracle.com if you need additional information or have any
+ # questions.
+ #
+-tzdata2013h
++tzdata2013i
+--- jdk/make/data/tzdata/africa
++++ jdk/make/data/tzdata/africa
+@@ -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/data/tzdata/asia
++++ jdk/make/data/tzdata/asia
+@@ -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/data/tzdata/northamerica
++++ jdk/make/data/tzdata/northamerica
+@@ -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
++++ jdk/src/macosx/classes/sun/font/CFontManager.java
+@@ -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
+@@ -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,19 @@
+ });
+ }
+ };
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction<Object>() {
+- 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(
++ (PrivilegedAction<Void>) () -> {
++ /* 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/macosx/classes/sun/lwawt/LWToolkit.java
++++ jdk/src/macosx/classes/sun/lwawt/LWToolkit.java
+@@ -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
+@@ -39,6 +39,7 @@
+ import sun.lwawt.macosx.*;
+ import sun.print.*;
+ import sun.security.util.SecurityConstants;
++import sun.misc.ThreadGroupUtils;
+
+ public abstract class LWToolkit extends SunToolkit implements Runnable {
+
+@@ -72,30 +73,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();
+- }
+- return currentTG;
+- }
+- }
+- );
++ ThreadGroup rootTG = AccessController.doPrivileged(
++ (PrivilegedAction<ThreadGroup>) ThreadGroupUtils::getRootThreadGroup);
+
+ Runtime.getRuntime().addShutdownHook(
+- new Thread(mainTG, new Runnable() {
+- public void run() {
+- shutdown();
+- waitForRunState(STATE_CLEANUP);
+- }
++ new Thread(rootTG, () -> {
++ shutdown();
++ waitForRunState(STATE_CLEANUP);
+ })
+ );
+
+- 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
++++ jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java
+@@ -55,7 +55,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/LWCToolkit.java
++++ jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java
+@@ -444,8 +444,12 @@
+ }
+
+ // 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((PrivilegedAction<Void>) () -> {
++ Thread.currentThread().setContextClassLoader(null);
++ return null;
++ });
+ }
+
+ @Override
+--- jdk/src/macosx/native/sun/awt/LWCToolkit.m
++++ jdk/src/macosx/native/sun/awt/LWCToolkit.m
+@@ -188,15 +188,16 @@
+ Java_sun_lwawt_macosx_LWCToolkit_initIDs
+ (JNIEnv *env, jclass klass) {
+ // set thread names
+- dispatch_async(dispatch_get_main_queue(), ^(void){
+- [[NSThread currentThread] setName:@"AppKit Thread"];
+-
+- 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);
+- });
+-
++ if (![ThreadUtilities isAWTEmbedded]) {
++ dispatch_async(dispatch_get_main_queue(), ^(void){
++ [[NSThread currentThread] setName:@"AppKit Thread"];
++ JNIEnv *env = [ThreadUtilities getJNIEnv];
++ static JNF_CLASS_CACHE(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
++ static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
++ JNFCallStaticVoidMethod(env, jsm_installToolkitThreadInJava);
++ });
++ }
++
+ gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
+
+ jclass inputEventClazz = (*env)->FindClass(env, "java/awt/event/InputEvent");
+--- jdk/src/macosx/native/sun/awt/awt.m
++++ jdk/src/macosx/native/sun/awt/awt.m
+@@ -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
+@@ -363,6 +363,7 @@
+ // AppKit Application.
+ NSApplication *app = [NSApplicationAWT sharedApplication];
+ isEmbedded = ![NSApp isKindOfClass:[NSApplicationAWT class]];
++ [ThreadUtilities setAWTEmbedded:isEmbedded];
+
+ if (!isEmbedded) {
+ // Install run loop observers and set the AppKit Java thread name
+@@ -433,6 +434,14 @@
+ if (isSWTInWebStart(env)) {
+ 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 getJNIEnvUnchached.
++ // Detach it back. It will be reattached later if needed with a proper TG
++ [ThreadUtilities detachCurrentThread];
+
+ BOOL headless = isHeadless(env);
+
+--- jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h
++++ jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h
+@@ -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
+@@ -127,6 +127,10 @@
+
+ + (JNIEnv*)getJNIEnv;
+ + (JNIEnv*)getJNIEnvUncached;
+++ (void)detachCurrentThread;
+++ (void)setAppkitThreadGroup:(jobject)group;
+++ (void)setAWTEmbedded:(BOOL)embedded;
+++ (BOOL)isAWTEmbedded;
+
+ //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
++++ jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m
+@@ -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
+@@ -33,23 +33,45 @@
+ // 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;
++static BOOL awtEmbedded = NO;
++
++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();
+@@ -66,6 +88,14 @@
+ }
+ }
+
+++ (void)setAWTEmbedded:(BOOL)embedded {
++ awtEmbedded = embedded;
++}
++
+++ (BOOL)isAWTEmbedded {
++ return awtEmbedded;
++}
++
+ @end
+
+
+--- jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java
++++ jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java
+@@ -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
++++ jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java
+@@ -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,19 @@
+ 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);
++
++ // enqueue the outstanding request
++ collision = reqs.putIfAbsent(xid, new ResourceRecord(pkt.getData(),
++ pkt.length(), Header.HEADER_SIZE, true, false));
+
+- Packet pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
++ } while (collision != null);
+
+ Exception caughtException = null;
+ boolean[] doNotRetry = new boolean[servers.length];
+@@ -305,11 +309,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 +391,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 {
+@@ -543,6 +545,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 +557,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 +566,47 @@
+ if (debug) {
+ dprint("XID MATCH:" + xid);
+ }
+-
+ checkResponseCode(hdr);
+- // remove the response for the xid if received by some other thread.
+- synchronized (queuesLock) {
+- resps.remove(xid);
+- reqs.remove(xid);
++ if (!hdr.query && hdr.numQuestions == 1) {
++
++ 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 +615,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
++++ jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java
+@@ -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.*;
+@@ -36,6 +40,8 @@
+ final class LdapBindingEnumeration
+ extends AbstractLdapNamingEnumeration<Binding> {
+
++ private final AccessControlContext acc = AccessController.getContext();
++
+ LdapBindingEnumeration(LdapCtx homeCtx, LdapResult answer, Name remain,
+ Continuation cont) throws NamingException
+ {
+@@ -52,7 +58,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
++++ jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java
+@@ -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.*;
+@@ -40,6 +44,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 {
+@@ -112,8 +118,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
++++ jdk/src/share/classes/com/sun/media/sound/JDK13Services.java
+@@ -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.
+- */
+- public static void setCachingPeriod(int seconds) {
+- cachingPeriod = seconds * 1000L;
+- }
+-
+-
+- /** 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();
++ /**
++ * 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 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 cache.providers;
++ return Collections.unmodifiableList(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
++++ jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java
+@@ -185,8 +185,8 @@
+ return thread;
+ }
+
+- static <T> List<T> getProviders(final Class<T> providerClass) {
+- List<T> p = new ArrayList<>();
++ static synchronized <T> List<T> getProviders(final Class<T> providerClass) {
++ List<T> p = new ArrayList<>(7);
+ // ServiceLoader creates "lazy" iterator instance, but it ensures that
+ // next/hasNext run with permissions that are restricted by whatever
+ // creates the ServiceLoader instance, so it requires to be called from
+--- jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java
++++ jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java
+@@ -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.
+@@ -2959,13 +2960,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);
+@@ -5710,13 +5707,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
++++ jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2012, 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
+@@ -29,6 +29,7 @@
+ import javax.sql.*;
+ import java.util.*;
+ import java.io.*;
++import sun.reflect.misc.ReflectUtil;
+
+ import com.sun.rowset.*;
+ import java.text.MessageFormat;
+@@ -572,13 +573,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
++++ jdk/src/share/classes/java/awt/EventQueue.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2013, 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
+@@ -1062,11 +1062,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 {
+--- jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java
++++ jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java
+@@ -44,8 +44,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;
+
+ /**
+@@ -66,10 +66,7 @@
+ */
+ private static String JavaMIME = "JAVA_DATAFLAVOR:";
+
+- /**
+- * System singleton which maps a thread's ClassLoader to a SystemFlavorMap.
+- */
+- private static final WeakHashMap<ClassLoader, FlavorMap> flavorMaps = new WeakHashMap<>();
++ private static final Object FLAVOR_MAP_KEY = new Object();
+
+ /**
+ * Copied from java.util.Properties.
+@@ -183,22 +180,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();
+- }
+-
+- FlavorMap fm;
+-
+- synchronized(flavorMaps) {
+- fm = flavorMaps.get(contextClassLoader);
+- if (fm == null) {
+- fm = new SystemFlavorMap();
+- flavorMaps.put(contextClassLoader, fm);
+- }
++ AppContext context = AppContext.getAppContext();
++ FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY);
++ if (fm == null) {
++ fm = new SystemFlavorMap();
++ context.put(FLAVOR_MAP_KEY, fm);
+ }
+-
+ return fm;
+ }
+
+@@ -239,26 +226,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);
+ }
+ });
+
+@@ -270,6 +242,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/lang/Thread.java
++++ jdk/src/share/classes/java/lang/Thread.java
+@@ -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
++++ jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java
+@@ -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);
+ }
+
+@@ -551,30 +551,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);
+ * }
+ * }
+@@ -588,11 +588,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) {
+@@ -605,7 +606,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);
+@@ -629,7 +630,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);
+@@ -639,7 +640,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);
+@@ -647,7 +648,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
+@@ -670,7 +671,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
+@@ -697,7 +698,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
++++ jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java
+@@ -274,8 +274,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_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
++ cw.visit(Opcodes.V1_8, 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
++++ jdk/src/share/classes/java/lang/invoke/MethodHandles.java
+@@ -2070,6 +2070,7 @@
+ */
+ public static
+ MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) {
++ reorder = reorder.clone();
+ checkReorder(reorder, newType, target.type());
+ return target.permuteArguments(newType, reorder);
+ }
+@@ -2264,6 +2265,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/net/SocketPermission.java
++++ jdk/src/share/classes/java/net/SocketPermission.java
+@@ -235,13 +235,11 @@
+ private static Debug debug = null;
+ private static boolean debugInit = false;
+
+- // ephemeral port range for this system
+- private static final int ephemeralLow = initEphemeralPorts(
+- "low", DEF_EPH_LOW
+- );
+- private static final int ephemeralHigh = initEphemeralPorts(
+- "high", PORT_MAX
+- );
++ // lazy initializer
++ private static class EphemeralRange {
++ static final int low = initEphemeralPorts("low", DEF_EPH_LOW);
++ static final int high = initEphemeralPorts("high", PORT_MAX);
++ };
+
+ static {
+ Boolean tmp = java.security.AccessController.doPrivileged(
+@@ -1235,6 +1233,9 @@
+ int policyLow, int policyHigh, int targetLow, int targetHigh
+ )
+ {
++ final int ephemeralLow = EphemeralRange.low;
++ final int ephemeralHigh = EphemeralRange.high;
++
+ if (targetLow == 0) {
+ // check policy includes ephemeral range
+ if (!inRange(policyLow, policyHigh, ephemeralLow, ephemeralHigh)) {
+--- jdk/src/share/classes/java/util/ServiceLoader.java
++++ jdk/src/share/classes/java/util/ServiceLoader.java
+@@ -382,7 +382,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/TreeMap.java
++++ jdk/src/share/classes/java/util/TreeMap.java
+@@ -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
+@@ -1338,6 +1338,7 @@
+ */
+ abstract static class NavigableSubMap<K,V> extends AbstractMap<K,V>
+ implements NavigableMap<K,V>, java.io.Serializable {
++ private static final long serialVersionUID = -2102997345730753016L;
+ /**
+ * The backing map.
+ */
+--- jdk/src/share/classes/java/util/jar/JarVerifier.java
++++ jdk/src/share/classes/java/util/jar/JarVerifier.java
+@@ -687,6 +687,8 @@
+ } else {
+ matchUnsigned = true;
+ }
++ } else {
++ matchUnsigned = true;
+ }
+ }
+
+@@ -789,23 +791,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
++++ jdk/src/share/classes/java/util/logging/LogManager.java
+@@ -551,7 +551,7 @@
+ Logger result = getLogger(name);
+ if (result == null) {
+ // only allocate the new logger once
+- Logger newLogger = new Logger(name, resourceBundleName, caller, this);
++ Logger newLogger = new Logger(name, resourceBundleName, caller, this, false);
+ do {
+ if (addLogger(newLogger)) {
+ // We successfully added the new Logger that we
+@@ -598,13 +598,13 @@
+ } 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>() {
+ @Override
+ public Void run() {
+- for (Handler hdl : l.getHandlers()) {
++ for (Handler hdl : l.accessCheckedHandlers()) {
+ sysLogger.addHandler(hdl);
+ }
+ return null;
+@@ -922,7 +922,7 @@
+ Logger result = findLogger(name);
+ if (result == null) {
+ // only allocate the new system logger once
+- Logger newLogger = new Logger(name, resourceBundleName, null, getOwner());
++ Logger newLogger = new Logger(name, resourceBundleName, null, getOwner(), true);
+ do {
+ if (addLocalLogger(newLogger)) {
+ // We successfully added the new Logger that we
+@@ -1640,7 +1640,7 @@
+ // We do not call the protected Logger two args constructor here,
+ // to avoid calling LogManager.getLogManager() from within the
+ // RootLogger constructor.
+- super("", null, null, LogManager.this);
++ super("", null, null, LogManager.this, true);
+ }
+
+ @Override
+@@ -1663,9 +1663,9 @@
+ }
+
+ @Override
+- public Handler[] getHandlers() {
++ Handler[] accessCheckedHandlers() {
+ initializeGlobalHandlers();
+- return super.getHandlers();
++ return super.accessCheckedHandlers();
+ }
+ }
+
+--- jdk/src/share/classes/java/util/logging/Logger.java
++++ jdk/src/share/classes/java/util/logging/Logger.java
+@@ -277,6 +277,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.
+@@ -370,11 +371,12 @@
+ * no corresponding resource can be found.
+ */
+ protected Logger(String name, String resourceBundleName) {
+- this(name, resourceBundleName, null, LogManager.getLogManager());
++ this(name, resourceBundleName, null, LogManager.getLogManager(), false);
+ }
+
+- Logger(String name, String resourceBundleName, Class<?> caller, LogManager manager) {
++ Logger(String name, String resourceBundleName, Class<?> caller, LogManager manager, boolean isSystemLogger) {
+ this.manager = manager;
++ this.isSystemLogger = isSystemLogger;
+ setupResourceInfo(resourceBundleName, caller);
+ this.name = name;
+ levelValue = Level.INFO.intValue();
+@@ -401,6 +403,7 @@
+ private Logger(String name) {
+ // The manager field is not initialized here.
+ this.name = name;
++ this.isSystemLogger = true;
+ levelValue = Level.INFO.intValue();
+ }
+
+@@ -635,7 +638,7 @@
+ // cleanup some Loggers that have been GC'ed
+ manager.drainLoggerRefQueueBounded();
+ Logger result = new Logger(null, resourceBundleName,
+- Reflection.getCallerClass(), manager);
++ Reflection.getCallerClass(), manager, false);
+ result.anonymous = true;
+ Logger root = manager.getLogger("");
+ result.doSetParent(root);
+@@ -727,15 +730,23 @@
+
+ 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();
+ }
+ }
+
+@@ -1762,6 +1773,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);
+ }
+
+@@ -2150,12 +2167,14 @@
+ if (trb.userBundle != null) {
+ return trb;
+ }
+- final String rbName = target.getResourceBundleName();
++ final String rbName = isSystemLogger
++ ? trb.resourceBundleName
++ : target.getResourceBundleName();
+ if (rbName != null) {
+ return LoggerBundle.get(rbName,
+ findResourceBundle(rbName, true));
+ }
+- target = target.getParent();
++ target = isSystemLogger ? target.parent : target.getParent();
+ }
+ return NO_RESOURCE_BUNDLE;
+ }
+--- jdk/src/share/classes/javax/script/ScriptEngineManager.java
++++ jdk/src/share/classes/javax/script/ScriptEngineManager.java
+@@ -81,23 +81,28 @@
+ 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;
+- }
+- });
++ initEngines(loader);
++ }
++
++ private ServiceLoader<ScriptEngineFactory> getServiceLoader(final ClassLoader loader) {
++ if (loader != null) {
++ return ServiceLoader.load(ScriptEngineFactory.class, loader);
++ } else {
++ return ServiceLoader.loadInstalled(ScriptEngineFactory.class);
++ }
+ }
+
+ private void initEngines(final ClassLoader loader) {
+ Iterator<ScriptEngineFactory> itr = null;
+ try {
+- ServiceLoader<ScriptEngineFactory> sl;
+- if (loader != null) {
+- sl = ServiceLoader.load(ScriptEngineFactory.class, loader);
+- } else {
+- sl = ServiceLoader.loadInstalled(ScriptEngineFactory.class);
+- }
++ ServiceLoader<ScriptEngineFactory> sl = AccessController.doPrivileged(
++ new PrivilegedAction<ServiceLoader<ScriptEngineFactory>>() {
++ @Override
++ public ServiceLoader<ScriptEngineFactory> run() {
++ return getServiceLoader(loader);
++ }
++ });
++
+ itr = sl.iterator();
+ } catch (ServiceConfigurationError err) {
+ System.err.println("Can't find ScriptEngineFactory providers: " +
+--- jdk/src/share/classes/javax/security/auth/Subject.java
++++ jdk/src/share/classes/javax/security/auth/Subject.java
+@@ -959,14 +959,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} 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
++++ jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java
+@@ -28,8 +28,11 @@
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
+ import java.sql.SQLException;
++import java.util.PropertyPermission;
+ import java.util.ServiceConfigurationError;
+ import java.util.ServiceLoader;
++import javax.sql.rowset.spi.SyncFactoryException;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * A factory API that enables applications to obtain a
+@@ -129,15 +132,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
+@@ -182,6 +181,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();
+@@ -291,8 +300,9 @@
+ public String run() {
+ return System.getProperty(propName);
+ }
+- });
++ }, null, new PropertyPermission(propName, "read"));
+ } catch (SecurityException se) {
++ trace("error getting " + propName + ": "+ se);
+ if (debug) {
+ se.printStackTrace();
+ }
+--- jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java
++++ jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java
+@@ -27,6 +27,7 @@
+ import java.sql.*;
+ import java.util.Arrays;
+ import java.util.Map;
++import sun.reflect.misc.ReflectUtil;
+
+ /**
+ * An input stream used for custom mapping user-defined types (UDTs).
+@@ -476,13 +477,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
++++ jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java
+@@ -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>
+@@ -329,7 +332,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<>();
+@@ -356,10 +359,11 @@
+ public String run() {
+ return System.getProperty("rowset.properties");
+ }
+- }, null, new PropertyPermission("rowset.properties","read"));
++ }, null, new PropertyPermission("rowset.properties", "read"));
+ } catch (Exception ex) {
++ System.out.println("errorget rowset.properties: " + ex);
+ strRowsetProperties = null;
+- }
++ };
+
+ if (strRowsetProperties != null) {
+ // Load user's implementation of SyncProvider
+@@ -380,14 +384,27 @@
+
+ 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((PrivilegedExceptionAction<Void>) () -> {
++ 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);
+@@ -411,7 +428,7 @@
+ public String run() {
+ return System.getProperty(ROWSET_SYNC_PROVIDER);
+ }
+- }, null, new PropertyPermission(ROWSET_SYNC_PROVIDER,"read"));
++ }, null, new PropertyPermission(ROWSET_SYNC_PROVIDER, "read"));
+ } catch (Exception ex) {
+ providerImpls = null;
+ }
+@@ -547,6 +564,14 @@
+ 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 {
+@@ -555,7 +580,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/AWTAutoShutdown.java
++++ jdk/src/share/classes/sun/awt/AWTAutoShutdown.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2013, 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
+@@ -27,13 +27,15 @@
+
+ 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 java.util.Set;
+
+ import sun.util.logging.PlatformLogger;
++import sun.misc.ThreadGroupUtils;
+
+ /**
+ * This class is to let AWT shutdown automatically when a user is done
+@@ -215,7 +217,10 @@
+ synchronized (activationLock) {
+ synchronized (mainLock) {
+ if (!isReadyToShutdown() && blockerThread == null) {
+- activateBlockerThread();
++ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
++ activateBlockerThread();
++ return null;
++ });
+ } else {
+ mainLock.notifyAll();
+ timeoutPassed = false;
+@@ -331,9 +336,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/SunToolkit.java
++++ jdk/src/share/classes/sun/awt/SunToolkit.java
+@@ -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
+@@ -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;
+@@ -49,6 +50,7 @@
+ import sun.font.FontDesignMetrics;
+ import sun.awt.im.InputContext;
+ import sun.awt.image.*;
++import sun.net.util.URLUtil;
+ import sun.security.action.GetPropertyAction;
+ import sun.security.action.GetBooleanAction;
+ import java.lang.reflect.InvocationTargetException;
+@@ -719,7 +721,7 @@
+ if (sm != null) {
+ try {
+ java.security.Permission perm =
+- url.openConnection().getPermission();
++ URLUtil.getConnectPermission(url);
+ if (perm != null) {
+ try {
+ sm.checkPermission(perm);
+@@ -795,7 +797,7 @@
+ if (sm != null) {
+ try {
+ java.security.Permission perm =
+- url.openConnection().getPermission();
++ URLUtil.getConnectPermission(url);
+ if (perm != null) {
+ try {
+ sm.checkPermission(perm);
+--- jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java
++++ jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java
+@@ -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
++++ jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java
+@@ -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/awt/image/URLImageSource.java
++++ jdk/src/share/classes/sun/awt/image/URLImageSource.java
+@@ -31,6 +31,7 @@
+ import java.net.URL;
+ import java.net.URLConnection;
+ import java.net.MalformedURLException;
++import sun.net.util.URLUtil;
+
+ public class URLImageSource extends InputStreamImageSource {
+ URL url;
+@@ -43,7 +44,7 @@
+ if (sm != null) {
+ try {
+ java.security.Permission perm =
+- u.openConnection().getPermission();
++ URLUtil.getConnectPermission(u);
+ if (perm != null) {
+ try {
+ sm.checkPermission(perm);
+--- jdk/src/share/classes/sun/font/CreatedFontTracker.java
++++ jdk/src/share/classes/sun/font/CreatedFontTracker.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2008, 2013, 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,18 @@
+ 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(
++ (PrivilegedAction<Void>) () -> {
++ /* 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, TempFileDeletionHook::runHooks);
++ t.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(t);
++ return null;
++ });
+ }
+ }
+
+--- jdk/src/share/classes/sun/font/SunFontManager.java
++++ jdk/src/share/classes/sun/font/SunFontManager.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2008, 2013, 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,18 @@
+ });
+ }
+ };
+- 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(
++ (PrivilegedAction<Void>) () -> {
++ /* 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
++++ jdk/src/share/classes/sun/java2d/Disposer.java
+@@ -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
+@@ -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;
+
+@@ -76,26 +80,20 @@
+ }
+ }
+ disposerInstance = new Disposer();
+- java.security.AccessController.doPrivileged(
+- new java.security.PrivilegedAction() {
+- public Object run() {
++ AccessController.doPrivileged(
++ (PrivilegedAction<Void>) () -> {
+ /* 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");
++ 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
++++ jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2012, 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.*;
+@@ -47,14 +48,8 @@
+ * The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ */
+- flusher = AccessController.doPrivileged(new PrivilegedAction<QueueFlusher>() {
+- public QueueFlusher run() {
+- ThreadGroup rootThreadGroup = Thread.currentThread().getThreadGroup();
+- while (rootThreadGroup.getParent() != null) {
+- rootThreadGroup = rootThreadGroup.getParent();
+- }
+- return new QueueFlusher(rootThreadGroup);
+- }
++ flusher = AccessController.doPrivileged((PrivilegedAction<QueueFlusher>) () -> {
++ return new QueueFlusher(ThreadGroupUtils.getRootThreadGroup());
+ });
+ }
+
+--- jdk/src/share/classes/sun/misc/InnocuousThread.java 1969-12-31 19:00:00.000000000 -0500
++++ jdk/src/share/classes/sun/misc/InnocuousThread.java
+@@ -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/Service.java
++++ jdk/src/share/classes/sun/misc/Service.java
+@@ -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/ThreadGroupUtils.java 1969-12-31 19:00:00.000000000 -0500
++++ jdk/src/share/classes/sun/misc/ThreadGroupUtils.java
+@@ -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/net/util/URLUtil.java
++++ jdk/src/share/classes/sun/net/util/URLUtil.java
+@@ -25,7 +25,10 @@
+
+ package sun.net.util;
+
++import java.io.IOException;
+ import java.net.URL;
++import java.net.URLPermission;
++import java.security.Permission;
+
+ /**
+ * URL Utility class.
+@@ -76,5 +79,26 @@
+
+ return strForm.toString();
+ }
++
++ public static Permission getConnectPermission(URL url) throws IOException {
++ String urlStringLowerCase = url.toString().toLowerCase();
++ if (urlStringLowerCase.startsWith("http:") || urlStringLowerCase.startsWith("https:")) {
++ return getURLConnectPermission(url);
++ } else if (urlStringLowerCase.startsWith("jar:http:") || urlStringLowerCase.startsWith("jar:https:")) {
++ String urlString = url.toString();
++ int bangPos = urlString.indexOf("!/");
++ urlString = urlString.substring(4, bangPos > -1 ? bangPos : urlString.length());
++ URL u = new URL(urlString);
++ return getURLConnectPermission(u);
++ // If protocol is HTTP or HTTPS than use URLPermission object
++ } else {
++ return url.openConnection().getPermission();
++ }
++ }
++
++ private static Permission getURLConnectPermission(URL url) {
++ String urlString = url.getProtocol() + "://" + url.getAuthority() + url.getPath();
++ return new URLPermission(urlString);
++ }
+ }
+
+--- jdk/src/share/classes/sun/nio/ch/Invoker.java
++++ jdk/src/share/classes/sun/nio/ch/Invoker.java
+@@ -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
++++ jdk/src/share/classes/sun/nio/ch/ThreadPool.java
+@@ -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,22 @@
+ }
+
+ static ThreadFactory defaultThreadFactory() {
+- return defaultThreadFactory;
++ if (System.getSecurityManager() == null) {
++ return (Runnable r) -> {
++ Thread t = new Thread(r);
++ t.setDaemon(true);
++ return t;
++ };
++ } else {
++ return (Runnable r) -> {
++ PrivilegedAction<Thread> action = () -> {
++ Thread t = new sun.misc.InnocuousThread(r);
++ t.setDaemon(true);
++ return t;
++ };
++ return AccessController.doPrivileged(action);
++ };
++ }
+ }
+
+ private static class DefaultThreadPoolHolder {
+@@ -100,7 +108,7 @@
+ // default to thread factory that creates daemon threads
+ ThreadFactory threadFactory = getDefaultThreadPoolThreadFactory();
+ if (threadFactory == null)
+- threadFactory = defaultThreadFactory;
++ threadFactory = defaultThreadFactory();
+ // create thread pool
+ ExecutorService executor = Executors.newCachedThreadPool(threadFactory);
+ return new ThreadPool(executor, false, initialSize);
+--- jdk/src/share/classes/sun/security/provider/SeedGenerator.java
++++ jdk/src/share/classes/sun/security/provider/SeedGenerator.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2013, 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
+@@ -179,8 +179,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"));
+@@ -221,6 +221,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
++++ jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java
+@@ -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/rsa/RSAPadding.java
++++ jdk/src/share/classes/sun/security/rsa/RSAPadding.java
+@@ -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");
+- } else {
++ BadPaddingException bpe = new BadPaddingException("Decryption error");
++
++ if (bp) {
+ throw bpe;
++ } else {
++ 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;
++
++ // 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);
+
+- return m;
++ BadPaddingException bpe = new BadPaddingException("Decryption error");
++
++ if (bp) {
++ throw bpe;
++ } else {
++ return m;
++ }
+ }
+
+ /**
+@@ -499,5 +537,4 @@
+ }
+ }
+ }
+-
+ }
+--- jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java
++++ jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java
+@@ -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/Main.java
++++ jdk/src/share/classes/sun/security/tools/jarsigner/Main.java
+@@ -90,9 +90,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";
+@@ -1522,22 +1519,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
++++ jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java
+@@ -152,6 +152,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
++++ jdk/src/share/classes/sun/util/resources/TimeZoneNames.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2013, 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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
+ "Alma-Ata Summer Time", "ALMST",
+ "Alma-Ata Time", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
+ "Anadyr Summer Time", "ANAST",
+ "Anadyr Time", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java
++++ jdk/src/share/classes/sun/util/resources/TimeZoneNamesBundle.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2012, 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
+--- jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java
++++ jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT",
+ "Alma-Ata Sommerzeit", "ALMST",
+ "Alma Ata Zeit", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT",
+ "Anadyr Sommerzeit", "ANAST",
+ "Anadyr Zeit", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java
++++ jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT",
+ "Hora de verano de Alma-Ata", "ALMST",
+ "Hora de Alma-Ata", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT",
+ "Hora de verano de Anadyr", "ANAST",
+ "Hora de Anadyr", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java
++++ jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT",
+ "Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST",
+ "Heure d'Alma-Ata", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT",
+ "Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST",
+ "Heure d'Anadyr", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java
++++ jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT",
+ "Ora estiva di Alma-Ata", "ALMST",
+ "Ora di Alma-Ata", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT",
+ "Ora estiva di Anadyr", "ANAST",
+ "Ora di Anadyr", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java
++++ jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"\u30a2\u30eb\u30de\u30a2\u30bf\u6642\u9593", "ALMT",
+ "\u30a2\u30eb\u30de\u30a2\u30bf\u590f\u6642\u9593", "ALMST",
+ "\u30A2\u30EB\u30DE\u30A2\u30BF\u6642\u9593", "ALMT"}},
+- {"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",
+ "\u30A2\u30CA\u30C7\u30A3\u30EA\u6642\u9593", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java
++++ jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"\uc54c\ub9c8\uc544\ud0c0 \uc2dc\uac04", "ALMT",
+ "\uc54c\ub9c8\uc544\ud0c0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ALMST",
+ "\uC54C\uB9C8\uC544\uD0C0 \uD45C\uC900\uC2DC", "ALMT"}},
+- {"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",
+ "\uC544\uB098\uB514\uB9AC \uD45C\uC900\uC2DC", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java
++++ jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Fuso hor\u00e1rio de Alma-Ata", "ALMT",
+ "Fuso hor\u00e1rio de ver\u00e3o de Alma-Ata", "ALMST",
+ "Hor\u00E1rio de Alma-Ata", "ALMT"}},
+- {"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",
+ "Hor\u00E1rio de Anadyr", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java
++++ jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Alma-Ata, normaltid", "ALMT",
+ "Alma-Ata, sommartid", "ALMST",
+ "Alma-Ata-tid", "ALMT"}},
+- {"Asia/Amman", ARAST},
++ {"Asia/Amman", EET},
+ {"Asia/Anadyr", new String[] {"Anadyr, normaltid", "ANAT",
+ "Anadyr, sommartid", "ANAST",
+ "Anadyr-tid", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java
++++ jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Alma-Ata \u65f6\u95f4", "ALMT",
+ "Alma-Ata \u590f\u4ee4\u65f6", "ALMST",
+ "Alma-Ata \u65F6\u95F4", "ALMT"}},
+- {"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",
+ "\u963F\u90A3\u5E95\u6CB3\u65F6\u95F4", "ANAT"}},
+--- jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java
++++ jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java
+@@ -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
+@@ -578,7 +578,7 @@
+ {"Asia/Almaty", new String[] {"Alma-Ata \u6642\u9593", "ALMT",
+ "Alma-Ata \u590f\u4ee4\u6642\u9593", "ALMST",
+ "\u963F\u62C9\u6728\u5716\u6642\u9593", "ALMT"}},
+- {"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",
+ "\u963F\u90A3\u5E95\u6CB3\u6642\u9593", "ANAT"}},
+--- jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp
++++ jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2001, 2013, 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
+@@ -5166,39 +5166,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
++++ jdk/src/share/native/sun/awt/giflib/dgif_lib.c
+@@ -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
++++ jdk/src/share/native/sun/awt/image/gif/gifdecoder.c
+@@ -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
++++ jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c
+@@ -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
++++ jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c
+@@ -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
++++ jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c
+@@ -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
++++ jdk/src/share/native/sun/awt/libpng/pngrtran.c
+@@ -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
++++ jdk/src/share/native/sun/awt/libpng/pngset.c
+@@ -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
++++ jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c
+@@ -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
++++ jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp
+@@ -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
++++ jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp
+@@ -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,9 +605,10 @@
+ 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; }
++ if( LE_FAILURE(success)) { return 0; }
+ LEReferenceToArrayOf<Offset> lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2);
+
+ if( LE_FAILURE(success) ) { return 0; }
+--- jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp
++++ jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp
+@@ -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
++++ jdk/src/share/native/sun/font/layout/LookupProcessor.cpp
+@@ -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
++++ jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp
+@@ -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
++++ jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp
+@@ -79,8 +79,8 @@
+
+ Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success)
+ {
+- const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias();
+ if(LE_FAILURE(success)) return 0;
++ const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias();
+
+ le_uint32 recordCount = records.getCount();
+ le_uint8 bit = highBit(recordCount);
+--- jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
++++ jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp
+@@ -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
++++ jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c
+@@ -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,7 @@
+ cmsFloat64Number dnum = 0.0;
+ int sign = 1;
+
++ // keep safe
+ if (Buffer == NULL) return 0.0;
+
+ if (*Buffer == '-' || *Buffer == '+') {
+@@ -869,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;
+@@ -878,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;
+@@ -996,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;
+@@ -1145,9 +1156,9 @@
+ if (*Key != '#') { // Comments are ignored
+
+ if (cmsstrcasecmp(Key, p->Keyword) == 0)
+- break;
+- }
++ break;
+ }
++ }
+
+ if (p == NULL)
+ return FALSE;
+@@ -1157,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;
+ }
+@@ -1284,7 +1297,7 @@
+
+ it8 ->nTable = nTable;
+
+- return nTable;
++ return (cmsInt32Number) nTable;
+ }
+
+
+@@ -1389,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;
+ }
+@@ -1426,6 +1439,8 @@
+ {
+ const char *v = cmsIT8GetProperty(hIT8, cProp);
+
++ if (v == NULL) return 0.0;
++
+ return ParseFloatNumber(v);
+ }
+
+@@ -1458,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");
+@@ -1514,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");
+@@ -1573,7 +1588,7 @@
+ if (str == NULL)
+ str = " ";
+
+- // Lenghth to write
++ // Length to write
+ len = (cmsUInt32Number) strlen(str);
+ f ->Used += len;
+
+@@ -2097,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);
+@@ -2212,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 );
+
+@@ -2566,6 +2581,8 @@
+
+ Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+
++ if (Buffer == NULL) return 0.0;
++
+ return ParseFloatNumber(Buffer);
+ }
+
+@@ -2778,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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c
+@@ -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 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;
+-
+- default:
+- return FALSE; // Colorspace mismatch
+- }
+- 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)))
++ return FALSE;
++ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
++ return FALSE;
++ break;
+
+- case cmsSigLabData: // Input profile operates in Lab
++ default:
++ return FALSE; // Colorspace mismatch
++ }
++ break;
+
+- switch (OutPCS) {
++ case cmsSigLabData: // Input profile operates in Lab
+
+- case cmsSigXYZData: // Lab -> XYZ
++ switch (OutPCS) {
+
+- 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 cmsSigXYZData: // Lab -> XYZ
+
+- case cmsSigLabData: // Lab -> Lab
++ 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;
+
+- 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;
++ case cmsSigLabData: // Lab -> Lab
+
+- 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;
+
+-
+- // On colorspaces other than PCS, check for same space
+ default:
+- if (InPCS != OutPCS) return FALSE;
+- break;
++ return FALSE; // Mismatch
++ }
++ 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c
+@@ -83,7 +83,6 @@
+
+
+ // Set the interpolation method
+-
+ cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p)
+ {
+ // Invoke factory, possibly in the Plug-in
+@@ -831,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;
+--- jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c
+@@ -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);
+@@ -350,7 +354,7 @@
+ return nReaded;
+ }
+
+-// Position file pointer in the file
++// Postion file pointer in the file
+ static
+ cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
+ {
+@@ -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,7 +1109,6 @@
+ return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
+ }
+
+-
+ static
+ cmsBool SanityCheck(_cmsICCPROFILE* profile)
+ {
+@@ -1112,11 +1147,13 @@
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature TypeBase;
++ cmsTagTypeSignature Type;
+ cmsTagTypeHandler* TypeHandler;
++ 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
+@@ -1168,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]);
+@@ -1179,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];
+
+@@ -1318,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
+@@ -1357,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]);
+@@ -1404,6 +1452,7 @@
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagTypeHandler* TypeHandler;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature BaseType;
+ cmsUInt32Number Offset, TagSize;
+@@ -1427,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);
+@@ -1444,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)
+@@ -1472,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);
+ }
+
+
+@@ -1504,6 +1554,7 @@
+ {
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsTagTypeHandler* TypeHandler = NULL;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsTagTypeSignature Type;
+ int i;
+@@ -1534,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]);
+ }
+ }
+ }
+@@ -1575,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);
+ }
+@@ -1613,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) {
+
+@@ -1642,6 +1695,7 @@
+ int i;
+ cmsIOHANDLER* MemIO;
+ cmsTagTypeHandler* TypeHandler = NULL;
++ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsUInt32Number rc;
+ cmsUInt32Number Offset, TagSize;
+@@ -1657,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];
+@@ -1679,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];
+@@ -1697,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;
+
+@@ -1705,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;
+ }
+@@ -1756,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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c
+@@ -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,19 +451,25 @@
+
+ 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));
+- cmsFreeToneCurve(RevGrayTRC);
++ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
++ goto Error;
+
++ cmsFreeToneCurve(RevGrayTRC);
+ return Lut;
+-}
+-
+
++Error:
++ cmsFreeToneCurve(RevGrayTRC);
++ cmsPipelineFree(Lut);
++ return NULL;
++}
+
+
+ static
+@@ -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;
++
++ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
++ goto Error;
+
+- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE));
+ 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c
+@@ -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,8 +1034,7 @@
+ mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
+ cmsFreeToneCurveTriple(LabTable);
+
+- if (mpe == NULL) return mpe;
+-
++ if (mpe == NULL) return NULL;
+ mpe ->Implements = cmsSigLabV2toV4;
+ return mpe;
+ }
+@@ -1248,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);
++
++ if (NewMPE->Data == NULL) {
++
++ cmsStageFree(NewMPE);
++ return NULL;
++ }
++
++ } else {
+
+- if (mpe ->DupElemPtr)
+- NewMPE ->Data = mpe ->DupElemPtr(mpe);
+- else
+ NewMPE ->Data = NULL;
++ }
+
+ return NewMPE;
+ }
+@@ -1266,7 +1288,7 @@
+ static
+ void BlessLUT(cmsPipeline* lut)
+ {
+- // We can set the input/output channels only if we have elements.
++ // We can set the input/ouput channels only if we have elements.
+ if (lut ->Elements != NULL) {
+
+ cmsStage *First, *Last;
+@@ -1466,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) {
+
+@@ -1495,9 +1517,11 @@
+ }
+ break;
+ default:;
++ return FALSE;
+ }
+
+ BlessLUT(lut);
++ return TRUE;
+ }
+
+ // Unlink an element and return the pointer to it
+@@ -1559,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
+@@ -1574,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;
+ }
+
+
+@@ -1714,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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c
+@@ -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;
+ }
+
+@@ -579,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;
+@@ -593,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;
+
+@@ -607,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;
+ }
+
+@@ -632,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.
+@@ -646,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) {
+@@ -662,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);
+@@ -673,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;
+ }
+@@ -703,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);
+ }
+@@ -1062,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);
+@@ -1071,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;
+@@ -1205,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;
+ }
+
+@@ -1340,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)) {
+@@ -1348,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);
+
+@@ -1357,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);
+ }
+@@ -1366,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);
+@@ -1596,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) {
+@@ -1621,6 +1636,10 @@
+ cmsPipelineFree(Src);
+ *Lut = Dest;
+ return TRUE;
++Error:
++ // Leave Src unchanged
++ cmsPipelineFree(Dest);
++ return FALSE;
+ }
+
+
+@@ -1650,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;
+@@ -1664,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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c
+@@ -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
+
++ // 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 = FALSE;
+- cmsFloat64Number L;
+- cmsFloat64Number x[101], y[101];
+- cmsFloat64Number lo, hi, NonMonoMin;
+- int n, l, i, NonMonoIndx;
+-
++ cmsBool NearlyStraightMidrange = TRUE;
++ cmsFloat64Number yRamp[256];
++ cmsFloat64Number x[256], y[256];
++ cmsFloat64Number lo, hi;
++ int n, l;
++ cmsProfileClassSignature devClass;
++
++ // 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;
+-
+- // Calculate Max L*
+- Lab = InitialLab;
+- Lab.L = 100;
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+- MaxL = destLab.L;
++ // Compute ramps
+
+- // Step 3
+- // ======
++ for (l=0; l < 256; l++) {
+
+- // check if quadratic estimation needs to be done.
+- if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
++ Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
++ Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
++ Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
+
+- // 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;
++ 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]);
++ }
+
+- for (l=0; l <= 100; l++) {
++ // Check
++ if (! (outRamp[0] < outRamp[255])) {
+
+- Lab.L = l;
+- Lab.a = InitialLab.a;
+- Lab.b = InitialLab.b;
++ cmsDeleteTransform(hRoundTrip);
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
++ }
+
+- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+
+- L = destLab.L;
++ // Test for mid range straight (only on relative colorimetric)
+
+- // Check the mid range in 20% after MinL
+- if (L > (MinL + 0.2 * (MaxL - MinL))) {
++ NearlyStraightMidrange = TRUE;
++ MinL = outRamp[0]; MaxL = outRamp[255];
++ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+- // Is close enough?
+- if (fabs(L - l) > 4.0) {
++ for (l=0; l < 256; l++) {
+
+- // Too far away, profile is buggy!
+- NearlyStraightMidRange = FALSE;
+- break;
+- }
+- }
++ if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||
++ (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
++ NearlyStraightMidrange = FALSE;
+ }
+- }
+- else {
+- // Check is always performed for perceptual and saturation intents
+- NearlyStraightMidRange = FALSE;
+- }
+
++ // 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.
+
+- // If no furter checking is needed, we are done
+- if (NearlyStraightMidRange) {
++ if (NearlyStraightMidrange) {
+
+- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+- cmsDeleteTransform(hRoundTrip);
+- return TRUE;
++ 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++) {
+-
+- cmsFloat64Number ff;
+-
+- Lab.L = (cmsFloat64Number) l;
+- Lab.a = InitialLab.a;
+- Lab.b = InitialLab.b;
++ for (l=0; l < 256; l++) {
+
+- 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) {
++ // No suitable points
++ if (n < 3 ) {
+ 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];
+- }
++ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
++ return FALSE;
+ }
+
+- Lab.L = x[NonMonoIndx];
+
+ // 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c
+@@ -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.
++ {
++ cmsFloat64Number SingleGamma = 1.0;
+
+- NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, 2, Linear);
+- if (!NewGamma) return NULL;
+- *nItems = 1;
+- return NewGamma;
++ 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;
+- }
+-
+- }
+-
+- for (j=0; j < 256; j++) {
++ // Usual case of identity curves
++ if ((Tables ->TheCurves[i]->nEntries == 2) &&
++ (Tables->TheCurves[i]->Table16[0] == 0) &&
++ (Tables->TheCurves[i]->Table16[1] == 65535)) {
+
+- if (Tables != NULL)
+- val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
++ for (j=0; j < 256; j++) {
++ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
++ }
++ }
+ else
+- val = (cmsUInt8Number) j;
++ 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;
++ 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c
+@@ -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)
+-{
+- 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;
+-
+- cmsWhitePointFromTemp(&WhitePnt, TempSrc );
+- cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+-
+- cmsWhitePointFromTemp(&WhitePnt, TempDest);
+- cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+-
+- hICC = cmsCreateProfilePlaceholder(ContextID);
+- if (!hICC) // can't allocate
+- return NULL;
+-
+-
+- cmsSetDeviceClass(hICC, cmsSigAbstractClass);
+- cmsSetColorSpace(hICC, cmsSigLabData);
+- cmsSetPCS(hICC, cmsSigLabData);
+-
+- cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+-
+-
+- // Creates a Pipeline with 3D grid only
+- Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
+- if (Pipeline == NULL) {
+- cmsCloseProfile(hICC);
+- return NULL;
+- }
++ 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;
+
+- for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
+- CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
+- if (CLUT == NULL) return NULL;
++ bchsw.Brightness = Bright;
++ bchsw.Contrast = Contrast;
++ bchsw.Hue = Hue;
++ bchsw.Saturation = Saturation;
+
++ cmsWhitePointFromTemp(&WhitePnt, TempSrc );
++ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+
+- if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
++ cmsWhitePointFromTemp(&WhitePnt, TempDest);
++ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+
+- // Shouldn't reach here
+- cmsPipelineFree(Pipeline);
+- cmsCloseProfile(hICC);
+- return NULL;
+- }
++ hICC = cmsCreateProfilePlaceholder(ContextID);
++ if (!hICC) // can't allocate
++ return NULL;
+
+- cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT);
+
+- // Create tags
++ cmsSetDeviceClass(hICC, cmsSigAbstractClass);
++ cmsSetColorSpace(hICC, cmsSigLabData);
++ cmsSetPCS(hICC, cmsSigLabData);
+
+- if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
++ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+- cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
++ // 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 (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
++ goto Error;
++ }
++
++ // Create tags
++ if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
++
++ cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
+
+- cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
++ cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
+
+- // Pipeline is already on virtual profile
+- cmsPipelineFree(Pipeline);
++ // Pipeline is already on virtual profile
++ cmsPipelineFree(Pipeline);
+
+- // Ok, done
+- return hICC;
++ // 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c
+@@ -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);
+-
+- T = TempK;
+- T2 = T*T; // Square
+- T3 = T2*T; // Cube
+-
+- // For correlated color temperature (T) between 4000K and 7000K:
++ _cmsAssert(WhitePoint != NULL);
+
+- 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:
++ T = TempK;
++ T2 = T*T; // Square
++ T3 = T2*T; // Cube
++
++ // 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 > 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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h
+@@ -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
++++ jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h
+@@ -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
++++ jdk/src/share/native/sun/management/Flag.c
+@@ -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
++++ jdk/src/share/native/sun/management/GcInfoBuilder.c
+@@ -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/sun/awt/X11/XClipboard.java
++++ jdk/src/solaris/classes/sun/awt/X11/XClipboard.java
+@@ -86,7 +86,7 @@
+ protected synchronized void setContentsNative(Transferable contents) {
+ SortedMap<Long,DataFlavor> formatMap =
+ DataTransferer.getInstance().getFormatsForTransferable
+- (contents, DataTransferer.adaptFlavorMap(flavorMap));
++ (contents, DataTransferer.adaptFlavorMap(getDefaultFlavorTable()));
+ long[] formats = DataTransferer.keysToLongArray(formatMap);
+
+ if (!selection.setOwner(contents, formatMap, formats,
+@@ -125,7 +125,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
++++ jdk/src/solaris/classes/sun/awt/X11/XToolkit.java
+@@ -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
+@@ -49,7 +49,7 @@
+ import sun.awt.*;
+ import sun.font.FontConfigManager;
+ import sun.java2d.SunGraphicsEnvironment;
+-import sun.misc.PerformanceLogger;
++import sun.misc.*;
+ import sun.print.PrintJob2D;
+ import sun.security.action.GetPropertyAction;
+ import sun.security.action.GetBooleanAction;
+@@ -254,33 +254,25 @@
+ } finally {
+ awtUnlock();
+ }
+- 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") {
+- public void run() {
+- XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
+- if (peer != null) {
+- peer.dispose();
+- }
+- if (xs != null) {
+- ((XAWTXSettings)xs).dispose();
+- }
+- freeXKB();
+- if (log.isLoggable(PlatformLogger.Level.FINE)) {
+- dumpPeers();
+- }
++ PrivilegedAction<Void> a = () -> {
++ Thread shutdownThread = new Thread(sun.misc.ThreadGroupUtils.getRootThreadGroup(), "XToolkt-Shutdown-Thread") {
++ public void run() {
++ XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
++ if (peer != null) {
++ peer.dispose();
+ }
+- };
+- shutdownThread.setContextClassLoader(null);
+- Runtime.getRuntime().addShutdownHook(shutdownThread);
+- return null;
+- }
++ if (xs != null) {
++ ((XAWTXSettings)xs).dispose();
++ }
++ freeXKB();
++ if (log.isLoggable(PlatformLogger.Level.FINE)) {
++ dumpPeers();
++ }
++ }
++ };
++ shutdownThread.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(shutdownThread);
++ return null;
+ };
+ AccessController.doPrivileged(a);
+ }
+@@ -324,22 +316,13 @@
+ init();
+ XWM.init();
+ SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
+-
+- PrivilegedAction<Thread> action = new PrivilegedAction() {
+- 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.setPriority(Thread.NORM_PRIORITY + 1);
+- thread.setDaemon(true);
+- return thread;
+- }
+- };
+- toolkitThread = AccessController.doPrivileged(action);
++ toolkitThread = AccessController.doPrivileged((PrivilegedAction<Thread>) () -> {
++ Thread thread = new Thread(sun.misc.ThreadGroupUtils.getRootThreadGroup(), XToolkit.this, "AWT-XAWT");
++ thread.setContextClassLoader(null);
++ thread.setPriority(Thread.NORM_PRIORITY + 1);
++ thread.setDaemon(true);
++ return thread;
++ });
+ toolkitThread.start();
+ }
+ }
+--- jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java
++++ jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java
+@@ -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
+@@ -42,6 +42,8 @@
+ 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
+ * X11 screen.
+@@ -423,28 +425,19 @@
+ // is already in the original DisplayMode at that time, this
+ // hook will have no effect)
+ shutdownHookRegistered = true;
+- 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();
++ PrivilegedAction<Void> a = () -> {
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Runnable r = () -> {
++ Window old = getFullScreenWindow();
++ if (old != null) {
++ exitFullScreenExclusive(old);
++ setDisplayMode(origDisplayMode);
+ }
+- Runnable r = new Runnable() {
+- public void run() {
+- Window old = getFullScreenWindow();
+- if (old != null) {
+- exitFullScreenExclusive(old);
+- setDisplayMode(origDisplayMode);
+- }
+- }
+- };
+- Thread t = new Thread(mainTG, r,"Display-Change-Shutdown-Thread-"+screen);
+- t.setContextClassLoader(null);
+- Runtime.getRuntime().addShutdownHook(t);
+- return null;
+- }
++ };
++ Thread t = new Thread(rootTG, r,"Display-Change-Shutdown-Thread-"+screen);
++ t.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(t);
++ return null;
+ };
+ AccessController.doPrivileged(a);
+ }
+--- jdk/src/solaris/demo/jni/Poller/Poller.c
++++ jdk/src/solaris/demo/jni/Poller/Poller.c
+@@ -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
++++ jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c
+@@ -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/sun/awt/awt_LoadLibrary.c
++++ jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2013, 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
+@@ -109,7 +109,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
++++ jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2012, 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
+@@ -39,6 +39,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.
+@@ -509,23 +510,16 @@
+ }
+ }
+ };
+- comThread =
+- AccessController.doPrivileged(
+- new PrivilegedAction<Thread>() {
+- public Thread run() {
++ comThread = AccessController.doPrivileged((PrivilegedAction<Thread>) () -> {
+ /* 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");
++ 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
++++ jdk/src/windows/classes/sun/awt/windows/WClipboard.java
+@@ -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 <Long, DataFlavor> formatMap = WDataTransferer.getInstance().
+- getFormatsForTransferable(contents, flavorMap);
++ getFormatsForTransferable(contents, getDefaultFlavorTable());
+
+ openClipboard(this);
+
+--- jdk/src/windows/classes/sun/awt/windows/WToolkit.java
++++ jdk/src/windows/classes/sun/awt/windows/WToolkit.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1996, 2013, 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
+@@ -39,6 +39,7 @@
+ import sun.awt.AWTAutoShutdown;
+ import sun.awt.LightweightFrame;
+ import sun.awt.SunToolkit;
++import sun.misc.ThreadGroupUtils;
+ import sun.awt.Win32GraphicsDevice;
+ import sun.awt.Win32GraphicsEnvironment;
+ import sun.java2d.d3d.D3DRenderQueue;
+@@ -222,7 +223,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
+@@ -239,8 +240,11 @@
+ */
+ 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(
++ (PrivilegedAction<ThreadGroup>) ThreadGroupUtils::getRootThreadGroup);
++ if (!startToolkitThread(this, rootTG)) {
++ Thread toolkitThread = new Thread(rootTG, this, "AWT-Windows");
+ toolkitThread.setDaemon(true);
+ toolkitThread.start();
+ }
+@@ -268,29 +272,20 @@
+ }
+
+ private final void registerShutdownHook() {
+- AccessController.doPrivileged(new PrivilegedAction<Void>() {
+- public Void 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() {
+- public void run() {
+- shutdown();
+- }
+- });
+- shutdown.setContextClassLoader(null);
+- Runtime.getRuntime().addShutdownHook(shutdown);
+- return null;
+- }
++ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
++ Thread shutdown = new Thread(ThreadGroupUtils.getRootThreadGroup(), this::shutdown);
++ shutdown.setContextClassLoader(null);
++ Runtime.getRuntime().addShutdownHook(shutdown);
++ return null;
+ });
+ }
+
+ public void run() {
+- Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
++ AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
++ 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
++++ jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java
+@@ -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,21 +93,12 @@
+ 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() {
+- public void run() {
+- done = true;
+- wakeUpUpdateThread();
+- }
+- });
++ (PrivilegedAction<Void>) () -> {
++ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
++ Thread shutdown = new Thread(rootTG, () -> {
++ done = true;
++ wakeUpUpdateThread();
++ });
+ shutdown.setContextClassLoader(null);
+ try {
+ Runtime.getRuntime().addShutdownHook(shutdown);
+@@ -115,7 +107,6 @@
+ }
+ return null;
+ }
+- }
+ );
+ }
+
+@@ -354,21 +345,17 @@
+ */
+ 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");
++ screenUpdater = AccessController.doPrivileged(
++ (PrivilegedAction<Thread>) () -> {
++ 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/sun/windows/awt_Toolkit.cpp
++++ jdk/src/windows/native/sun/windows/awt_Toolkit.cpp
+@@ -364,6 +364,7 @@
+ HANDLE hCompleted;
+
+ jobject thread;
++ jobject threadGroup;
+ };
+
+ void ToolkitThreadProc(void *param)
+@@ -376,7 +377,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) {
+@@ -415,17 +416,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);
+@@ -443,6 +445,7 @@
+ ::CloseHandle(data.hCompleted);
+
+ env->DeleteGlobalRef(data.thread);
++ env->DeleteGlobalRef(data.threadGroup);
+
+ return result ? JNI_TRUE : JNI_FALSE;
+ }
+--- jdk/test/java/awt/Toolkit/LoadAWTCrashTest/LoadAWTCrashTest.java 1969-12-31 19:00:00.000000000 -0500
++++ jdk/test/java/awt/Toolkit/LoadAWTCrashTest/LoadAWTCrashTest.java
+@@ -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
++ }
++}
+--- jdk/test/java/awt/font/TextLayout/TestAATMorxFont.java 1969-12-31 19:00:00.000000000 -0500
++++ jdk/test/java/awt/font/TextLayout/TestAATMorxFont.java
+@@ -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/javax/imageio/plugins/jpeg/TruncatedImageWarningTest.java 1969-12-31 19:00:00.000000000 -0500
++++ jdk/test/javax/imageio/plugins/jpeg/TruncatedImageWarningTest.java
+@@ -0,0 +1,68 @@
++/*
++ * 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 8032370
++ *
++ * @summary Test verifies that Image I/O jpeg reader correctly handles
++ * and warns of a truncated image stream.
++ *
++ * @run main TruncatedImageWarningTest
++ */
++
++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;
++ }
++}
+Files openjdk/jdk/test/javax/imageio/plugins/jpeg/truncated.jpg and jdk8u5-b13/jdk/test/javax/imageio/plugins/jpeg/truncated.jpg differ
+--- jdk/test/sun/util/calendar/zi/tzdata/VERSION
++++ jdk/test/sun/util/calendar/zi/tzdata/VERSION
+@@ -21,4 +21,4 @@
+ # or visit www.oracle.com if you need additional information or have any
+ # questions.
+ #
+-tzdata2013h
++tzdata2013i
+--- jdk/test/sun/util/calendar/zi/tzdata/africa
++++ jdk/test/sun/util/calendar/zi/tzdata/africa
+@@ -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/test/sun/util/calendar/zi/tzdata/asia
++++ jdk/test/sun/util/calendar/zi/tzdata/asia
+@@ -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/test/sun/util/calendar/zi/tzdata/northamerica
++++ jdk/test/sun/util/calendar/zi/tzdata/northamerica
+@@ -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
+--- langtools/.hgtags
++++ langtools/.hgtags
+@@ -253,3 +253,16 @@
+ 8fe7202d3c38784f3f14368e3954fc4e0394afa4 jdk8-b129
+ 9d81ae1c417a4748f58921c1f8def7f3c401cecd jdk8-b130
+ 196ab3dcbd28fac1578590684a337f1c7cf505c9 jdk8-b131
++c8a87a58eb3efdd64055566b502c9d4a72ca0996 jdk8-b132
++519557cab6d4a7fd77b33226e71f92303090420b jdk8u5-b01
++9003a59a512e6b764d8a3f805aadc3996a58e5bd jdk8u5-b02
++30e3dad0ebbdf3129bacd04a7f4cdecd3df92bb2 jdk8u5-b03
++019dcdfffced0ca2026a0ad8c0e5fcb49d46116f jdk8u5-b04
++c9db8c800797258540e0411e58b8f7d59273de5f jdk8u5-b05
++b1920c0b701d5ff219c9f622db5cafc9bf00d5c8 jdk8u5-b06
++180df7f2c078f1efaa6fcd8ca9f55dc5f81b182c jdk8u5-b07
++9c3d7d1a70391bd772693dc5a838b53e1cad0761 jdk8u5-b08
++169c8c1a2e8d1e80a4474d91f7809aa2a6b2249a jdk8u5-b09
++026543c71810701de08cdfd906d1b8fdc69b89c0 jdk8u5-b10
++a12055904afd9f951131804868215e724c71b684 jdk8u5-b11
++2a7002626e7997e946b96530629e2787bc1864bb jdk8u5-b12
+--- langtools/.jcheck/conf
++++ langtools/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- langtools/THIRD_PARTY_README
++++ langtools/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java
++++ langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1998, 2013, 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
+@@ -247,7 +247,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/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties
++++ langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties
+@@ -419,8 +419,6 @@
+
+ compiler.err.intf.expected.here=\u3053\u3053\u306B\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u304C\u5FC5\u8981\u3067\u3059
+
+-compiler.err.intf.or.array.expected.here=\u3053\u3053\u306B\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u307E\u305F\u306F\u914D\u5217\u578B\u304C\u5FC5\u8981\u3067\u3059
+-
+ compiler.err.intf.meth.cant.have.body=\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u62BD\u8C61\u30E1\u30BD\u30C3\u30C9\u304C\u672C\u4F53\u3092\u6301\u3064\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093
+
+ # 0: symbol
+--- langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties
++++ langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties
+@@ -419,8 +419,6 @@
+
+ compiler.err.intf.expected.here=\u6B64\u5904\u9700\u8981\u63A5\u53E3
+
+-compiler.err.intf.or.array.expected.here=\u6B64\u5904\u9884\u671F\u4E3A\u63A5\u53E3\u6216\u6570\u7EC4\u7C7B\u578B
+-
+ compiler.err.intf.meth.cant.have.body=\u63A5\u53E3\u62BD\u8C61\u65B9\u6CD5\u4E0D\u80FD\u5E26\u6709\u4E3B\u4F53
+
+ # 0: symbol
+--- langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties
++++ langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties
+@@ -29,8 +29,11 @@
+
+ main.opt.dotoutput=\ -dotoutput <dir> DOT\u30D5\u30A1\u30A4\u30EB\u51FA\u529B\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA
+
++main.opt.jdkinternals=\ -jdkinternals JDK\u5185\u90E8API\u306E\u30AF\u30E9\u30B9\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\u3002\n \u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u306F\u3001-include\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6307\u5B9A\u3057\u306A\u3044\u3068\u3001\n -classpath\u306E\u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u3092\u5206\u6790\u3057\u307E\u3059\u3002\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F-p\u3001-e\u304A\u3088\u3073-s\u30AA\u30D7\u30B7\u30E7\u30F3\u3068\u4E00\u7DD2\u306B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002\n \u8B66\u544A: JDK\u5185\u90E8API\u306F\u3001\u6B21\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u30A2\u30AF\u30BB\u30B9\u3067\u304D\u306A\u304F\u306A\u308B\u53EF\u80FD\u6027\u304C\n \u3042\u308A\u307E\u3059\u3002
++
+ main.opt.depth=\ -depth=<depth> \u63A8\u79FB\u7684\u306A\u4F9D\u5B58\u6027\u5206\u6790\u306E\u6DF1\u3055\u3092\n \u6307\u5B9A\u3057\u307E\u3059
+
++
+ err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0}
+ err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+ err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2}
+--- langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties
++++ langtools/src/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties
+@@ -29,8 +29,11 @@
+
+ main.opt.dotoutput=\ -dotoutput <dir> DOT \u6587\u4EF6\u8F93\u51FA\u7684\u76EE\u6807\u76EE\u5F55
+
++main.opt.jdkinternals=\ -jdkinternals \u5728 JDK \u5185\u90E8 API \u4E0A\u67E5\u627E\u7C7B\u7EA7\u522B\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\u3002\n \u9ED8\u8BA4\u60C5\u51B5\u4E0B, \u5B83\u5206\u6790 -classpath \u4E0A\u7684\u6240\u6709\u7C7B\n \u548C\u8F93\u5165\u6587\u4EF6, \u9664\u975E\u6307\u5B9A\u4E86 -include \u9009\u9879\u3002\n \u6B64\u9009\u9879\u4E0D\u80FD\u4E0E -p, -e \u548C -s \u9009\u9879\u4E00\u8D77\u4F7F\u7528\u3002\n \u8B66\u544A: \u5728\u4E0B\u4E00\u4E2A\u53D1\u884C\u7248\u4E2D\u53EF\u80FD\u65E0\u6CD5\u8BBF\u95EE\n JDK \u5185\u90E8 API\u3002
++
+ main.opt.depth=\ -depth=<depth> \u6307\u5B9A\u8FC7\u6E21\u88AB\u4F9D\u8D56\u5BF9\u8C61\u5206\u6790\n \u7684\u6DF1\u5EA6
+
++
+ err.unknown.option=\u672A\u77E5\u9009\u9879: {0}
+ err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C
+ err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2}
+--- langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java
++++ langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java
+@@ -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[][] 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[] ARGS = new String[]{
+- "-d", BUG_ID, "-windowtitle", WIN_TITLE, "-sourcepath", SRC_DIR, "p1", "p2"
++ 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();
+ }
+
+--- nashorn/.hgtags
++++ nashorn/.hgtags
+@@ -241,3 +241,17 @@
+ 9cc3fd32fbabdd8b06771d11a319c9802e118612 jdk8-b129
+ f87eba70e9ee96255137c389db7cb4e2480e53e7 jdk8-b130
+ cca9748cfec7025ac0ddcdede9e5724fa676ad13 jdk8-b131
++5dbdae28a6f3dae3913b118c128bcb1f803317ac jdk8-b132
++13ca8f1a9eba716295fb7d9c2ddad81390931919 jdk8u5-b01
++7e7cb9977a3d1244384ffa454a4890764a07b042 jdk8u5-b02
++2abeb654b57f306f73f3f73bdfa05f93bce2a1f3 jdk8u5-b03
++7c650ceee4902249f32bdc066926b77291007859 jdk8u5-b04
++d88b60cdc8f3cfceb8ef19b095769015b441e37f jdk8u11-b00
++d88b60cdc8f3cfceb8ef19b095769015b441e37f jdk8u5-b05
++d6dfad8b7fb524780ebf4f6b62284cf5679f9ba8 jdk8u5-b06
++96ad962a6a88874830e99e0cd11aece89a1bd1f4 jdk8u5-b07
++f0b7b8b5e29a3a4e481fbeb9b346552c9819675e jdk8u5-b08
++6ca65190effb3bf8119bb4e93f1692487337ec72 jdk8u5-b09
++8bc83045abc547edb7cfb7d688d84164f0b11cea jdk8u5-b10
++bc23b19e08eb1575663044902b6442ceaafa924f jdk8u5-b11
++18b007062905dac9304605955a4b84eaf2a08553 jdk8u5-b12
+--- nashorn/.jcheck/conf
++++ nashorn/.jcheck/conf
+@@ -1 +1,2 @@
+ project=jdk8
++bugids=dup
+--- nashorn/THIRD_PARTY_README
++++ nashorn/THIRD_PARTY_README
+@@ -1399,13 +1399,13 @@
+
+ -------------------------------------------------------------------------------
+
+-%% This notice is provided with respect to Little CMS 2.4, which may be
++%% This notice is provided with respect to Little CMS 2.5, which may be
+ included with JRE 8, JDK 8, and OpenJDK 8.
+
+ --- begin of LICENSE ---
+
+ Little CMS
+-Copyright (c) 1998-2010 Marti Maria Saguer
++Copyright (c) 1998-2011 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"), to deal
+--- nashorn/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
++++ nashorn/src/jdk/internal/dynalink/beans/AccessibleMembersLookup.java
+@@ -211,7 +211,8 @@
+ if(!CheckRestrictedPackage.isRestrictedClass(clazz)) {
+ searchSuperTypes = false;
+ for(Method method: clazz.getMethods()) {
+- if(instance != Modifier.isStatic(method.getModifiers())) {
++ final boolean isStatic = Modifier.isStatic(method.getModifiers());
++ if(instance != isStatic) {
+ final MethodSignature sig = new MethodSignature(method);
+ if(!methods.containsKey(sig)) {
+ final Class<?> declaringClass = method.getDeclaringClass();
+@@ -228,7 +229,10 @@
+ //generate the said synthetic delegators.
+ searchSuperTypes = true;
+ } else {
+- methods.put(sig, method);
++ // don't allow inherited static
++ if (!isStatic || clazz == declaringClass) {
++ methods.put(sig, method);
++ }
+ }
+ }
+ }
+@@ -245,7 +249,8 @@
+ searchSuperTypes = true;
+ }
+
+- if(searchSuperTypes) {
++ // don't need to search super types for static methods
++ if(instance && searchSuperTypes) {
+ // If we reach here, the class is either not public, or it is in a restricted package. Alternatively, it is
+ // public, but some of its methods claim that their declaring class is non-public. We'll try superclasses
+ // and implemented interfaces then looking for public ones.
+--- nashorn/src/jdk/internal/dynalink/beans/FacetIntrospector.java
++++ nashorn/src/jdk/internal/dynalink/beans/FacetIntrospector.java
+@@ -136,7 +136,13 @@
+ final Field[] fields = clazz.getFields();
+ final Collection<Field> cfields = new ArrayList<>(fields.length);
+ for(Field field: fields) {
+- if(instance != Modifier.isStatic(field.getModifiers()) && isAccessible(field)) {
++ final boolean isStatic = Modifier.isStatic(field.getModifiers());
++ if(isStatic && clazz != field.getDeclaringClass()) {
++ // ignore inherited static fields
++ continue;
++ }
++
++ if(instance != isStatic && isAccessible(field)) {
+ cfields.add(field);
+ }
+ }
+--- nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
++++ nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterBytecodeGenerator.java
+@@ -131,20 +131,17 @@
+ * implemented securely.
+ */
+ final class JavaAdapterBytecodeGenerator {
+- static final Type CONTEXT_TYPE = Type.getType(Context.class);
+ static final Type OBJECT_TYPE = Type.getType(Object.class);
+- static final Type SCRIPT_OBJECT_TYPE = Type.getType(ScriptObject.class);
+
+- static final String CONTEXT_TYPE_NAME = CONTEXT_TYPE.getInternalName();
+ static final String OBJECT_TYPE_NAME = OBJECT_TYPE.getInternalName();
+
+ static final String INIT = "<init>";
+
+ static final String GLOBAL_FIELD_NAME = "global";
+
+- static final String SCRIPT_OBJECT_TYPE_DESCRIPTOR = SCRIPT_OBJECT_TYPE.getDescriptor();
++ static final String GLOBAL_TYPE_DESCRIPTOR = OBJECT_TYPE.getDescriptor();
+
+- static final String SET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE, SCRIPT_OBJECT_TYPE);
++ static final String SET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE);
+ static final String VOID_NOARG_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.VOID_TYPE);
+
+ private static final Type SCRIPT_FUNCTION_TYPE = Type.getType(ScriptFunction.class);
+@@ -155,7 +152,7 @@
+ OBJECT_TYPE, STRING_TYPE, METHOD_TYPE_TYPE);
+ private static final String GET_HANDLE_FUNCTION_DESCRIPTOR = Type.getMethodDescriptor(METHOD_HANDLE_TYPE,
+ SCRIPT_FUNCTION_TYPE, METHOD_TYPE_TYPE);
+- private static final String GET_CLASS_INITIALIZER_DESCRIPTOR = Type.getMethodDescriptor(SCRIPT_OBJECT_TYPE);
++ private static final String GET_CLASS_INITIALIZER_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE);
+ private static final Type RUNTIME_EXCEPTION_TYPE = Type.getType(RuntimeException.class);
+ private static final Type THROWABLE_TYPE = Type.getType(Throwable.class);
+ private static final Type UNSUPPORTED_OPERATION_TYPE = Type.getType(UnsupportedOperationException.class);
+@@ -167,7 +164,7 @@
+ private static final String UNSUPPORTED_OPERATION_TYPE_NAME = UNSUPPORTED_OPERATION_TYPE.getInternalName();
+
+ private static final String METHOD_HANDLE_TYPE_DESCRIPTOR = METHOD_HANDLE_TYPE.getDescriptor();
+- private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(SCRIPT_OBJECT_TYPE);
++ private static final String GET_GLOBAL_METHOD_DESCRIPTOR = Type.getMethodDescriptor(OBJECT_TYPE);
+ private static final String GET_CLASS_METHOD_DESCRIPTOR = Type.getMethodDescriptor(Type.getType(Class.class));
+
+ // Package used when the adapter can't be defined in the adaptee's package (either because it's sealed, or because
+@@ -259,7 +256,7 @@
+ }
+
+ private void generateGlobalFields() {
+- cw.visitField(ACC_PRIVATE | ACC_FINAL | (classOverride ? ACC_STATIC : 0), GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR, null, null).visitEnd();
++ cw.visitField(ACC_PRIVATE | ACC_FINAL | (classOverride ? ACC_STATIC : 0), GLOBAL_FIELD_NAME, GLOBAL_TYPE_DESCRIPTOR, null, null).visitEnd();
+ usedFieldNames.add(GLOBAL_FIELD_NAME);
+ }
+
+@@ -363,7 +360,7 @@
+ }
+ // Assign "global = Context.getGlobal()"
+ invokeGetGlobalWithNullCheck(mv);
+- mv.putstatic(generatedClassName, GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
++ mv.putstatic(generatedClassName, GLOBAL_FIELD_NAME, GLOBAL_TYPE_DESCRIPTOR);
+
+ endInitMethod(mv);
+ }
+@@ -508,7 +505,7 @@
+ // Assign "this.global = Context.getGlobal()"
+ mv.visitVarInsn(ALOAD, 0);
+ invokeGetGlobalWithNullCheck(mv);
+- mv.putfield(generatedClassName, GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
++ mv.putfield(generatedClassName, GLOBAL_FIELD_NAME, GLOBAL_TYPE_DESCRIPTOR);
+
+ endInitMethod(mv);
+ }
+@@ -524,11 +521,11 @@
+ }
+
+ private static void invokeGetGlobal(final InstructionAdapter mv) {
+- mv.invokestatic(CONTEXT_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR);
++ mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "getGlobal", GET_GLOBAL_METHOD_DESCRIPTOR);
+ }
+
+ private static void invokeSetGlobal(final InstructionAdapter mv) {
+- mv.invokestatic(CONTEXT_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR);
++ mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "setGlobal", SET_GLOBAL_METHOD_DESCRIPTOR);
+ }
+
+ /**
+@@ -652,10 +649,10 @@
+ // Load the creatingGlobal object
+ if(classOverride) {
+ // If class handle is defined, load the static defining global
+- mv.getstatic(generatedClassName, GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
++ mv.getstatic(generatedClassName, GLOBAL_FIELD_NAME, GLOBAL_TYPE_DESCRIPTOR);
+ } else {
+ mv.visitVarInsn(ALOAD, 0);
+- mv.getfield(generatedClassName, GLOBAL_FIELD_NAME, SCRIPT_OBJECT_TYPE_DESCRIPTOR);
++ mv.getfield(generatedClassName, GLOBAL_FIELD_NAME, GLOBAL_TYPE_DESCRIPTOR);
+ }
+ // stack: [creatingGlobal, handle]
+ final Label setupGlobal = new Label();
+@@ -744,7 +741,7 @@
+ final Label methodEnd = new Label();
+ mv.visitLabel(methodEnd);
+
+- mv.visitLocalVariable("currentGlobal", SCRIPT_OBJECT_TYPE_DESCRIPTOR, null, setupGlobal, methodEnd, currentGlobalVar);
++ mv.visitLocalVariable("currentGlobal", GLOBAL_TYPE_DESCRIPTOR, null, setupGlobal, methodEnd, currentGlobalVar);
+ mv.visitLocalVariable("globalsDiffer", Type.INT_TYPE.getDescriptor(), null, setupGlobal, methodEnd, globalsDifferVar);
+
+ if(throwableDeclared) {
+--- nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java
++++ nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterClassLoader.java
+@@ -31,6 +31,8 @@
+ import java.security.ProtectionDomain;
+ import java.security.SecureClassLoader;
+ import jdk.internal.dynalink.beans.StaticClass;
++import jdk.nashorn.internal.runtime.Context;
++import jdk.nashorn.internal.runtime.ScriptFunction;
+
+ /**
+ * This class encapsulates the bytecode of the adapter class and can be used to load it into the JVM as an actual Class.
+@@ -85,13 +87,14 @@
+ @Override
+ public Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
+ try {
++ Context.checkPackageAccess(name);
+ return super.loadClass(name, resolve);
+ } catch (final SecurityException se) {
+ // we may be implementing an interface or extending a class that was
+ // loaded by a loader that prevents package.access. If so, it'd throw
+ // SecurityException for nashorn's classes!. For adapter's to work, we
+- // should be able to refer to nashorn classes.
+- if (name.startsWith("jdk.nashorn.internal.")) {
++ // should be able to refer to the few classes it needs in its implementation.
++ if(ScriptFunction.class.getName().equals(name) || JavaAdapterServices.class.getName().equals(name)) {
+ return myLoader.loadClass(name);
+ }
+ throw se;
+--- nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
++++ nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java
+@@ -248,7 +248,7 @@
+ }
+
+ private static class AdapterInfo {
+- private static final ClassAndLoader SCRIPT_OBJECT_LOADER = new ClassAndLoader(ScriptObject.class, true);
++ private static final ClassAndLoader SCRIPT_OBJECT_LOADER = new ClassAndLoader(ScriptFunction.class, true);
+
+ private final ClassLoader commonLoader;
+ // TODO: soft reference the JavaAdapterClassLoader objects. They can be recreated when needed.
+--- nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java
++++ nashorn/src/jdk/nashorn/internal/runtime/linker/JavaAdapterServices.java
+@@ -116,8 +116,8 @@
+ * static initializers.
+ * @return the thread-local JS object used to define methods for the class being initialized.
+ */
+- public static ScriptObject getClassOverrides() {
+- final ScriptObject overrides = classOverrides.get();
++ public static Object getClassOverrides() {
++ final Object overrides = classOverrides.get();
+ assert overrides != null;
+ return overrides;
+ }
+@@ -134,6 +134,22 @@
+ NO_PERMISSIONS_INVOKER.invokeExact(method, arg);
+ }
+
++ /**
++ * Set the current global scope
++ * @param global the global scope
++ */
++ public static void setGlobal(final Object global) {
++ Context.setGlobal((ScriptObject)global);
++ }
++
++ /**
++ * Get the current global scope
++ * @return the current global scope
++ */
++ public static Object getGlobal() {
++ return Context.getGlobal();
++ }
++
+ static void setClassOverrides(ScriptObject overrides) {
+ classOverrides.set(overrides);
+ }
+--- nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java
++++ nashorn/src/jdk/nashorn/internal/runtime/linker/ReflectionCheckLinker.java
+@@ -39,16 +39,38 @@
+ * Check java reflection permission for java reflective and java.lang.invoke access from scripts
+ */
+ final class ReflectionCheckLinker implements TypeBasedGuardingDynamicLinker{
++ private static final Class<?> STATEMENT_CLASS = getBeanClass("Statement");
++ private static final Class<?> XMLENCODER_CLASS = getBeanClass("XMLEncoder");
++ private static final Class<?> XMLDECODER_CLASS = getBeanClass("XMLDecoder");
++
++ private static Class<?> getBeanClass(final String name) {
++ try {
++ return Class.forName("java.beans." + name);
++ } catch (final ClassNotFoundException cnfe) {
++ // Possible to miss this class in other profiles.
++ return null;
++ }
++ }
++
+ @Override
+ public boolean canLinkType(final Class<?> type) {
+ return isReflectionClass(type);
+ }
+
+ private static boolean isReflectionClass(final Class<?> type) {
++ // Class or ClassLoader subclasses
+ if (type == Class.class || ClassLoader.class.isAssignableFrom(type)) {
+ return true;
+ }
+
++ // check for bean reflection
++ if ((STATEMENT_CLASS != null && STATEMENT_CLASS.isAssignableFrom(type)) ||
++ (XMLENCODER_CLASS != null && XMLENCODER_CLASS.isAssignableFrom(type)) ||
++ (XMLDECODER_CLASS != null && XMLDECODER_CLASS.isAssignableFrom(type))) {
++ return true;
++ }
++
++ // package name check
+ final String name = type.getName();
+ return name.startsWith("java.lang.reflect.") || name.startsWith("java.lang.invoke.");
+ }
diff --git a/java/openjdk8/files/patch-bsd b/java/openjdk8/files/patch-bsd
index 6ea1296e0ca6..c8f814f1b4ee 100644
--- a/java/openjdk8/files/patch-bsd
+++ b/java/openjdk8/files/patch-bsd
@@ -6080,6 +6080,17 @@
JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled
(JNIEnv *env, jobject dummy, jboolean enabled) {
+--- jdk/src/share/native/sun/management/GcInfoBuilder.c
++++ jdk/src/share/native/sun/management/GcInfoBuilder.c
+@@ -190,7 +190,7 @@
+
+ if (ext_att_count <= 0) {
+ JNU_ThrowIllegalArgumentException(env, "Invalid ext_att_count");
+- return;
++ return 0;
+ }
+
+ gc_stat.usage_before_gc = usageBeforeGC;
--- jdk/src/solaris/bin/ergo_i586.c
+++ jdk/src/solaris/bin/ergo_i586.c
@@ -106,7 +106,7 @@