diff options
Diffstat (limited to 'java/openjdk8/files/patch-8u05-b13')
-rw-r--r-- | java/openjdk8/files/patch-8u05-b13 | 13936 |
1 files changed, 0 insertions, 13936 deletions
diff --git a/java/openjdk8/files/patch-8u05-b13 b/java/openjdk8/files/patch-8u05-b13 deleted file mode 100644 index 35ea3209ca3a..000000000000 --- a/java/openjdk8/files/patch-8u05-b13 +++ /dev/null @@ -1,13936 +0,0 @@ ---- .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 <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 <script>alert(\"Should not pop up\")</script>."; -+ private static final String[] ARGS_HTML_ENTITIES = new String[]{ -+ "-d", BUG_ID + "-4", "-windowtitle", TITLE_HTML_ENTITIES, "-sourcepath", SRC_DIR, "p1", "p2" -+ }; -+ private static final String[][] TEST_HTML_ENTITIES = { -+ {BUG_ID + "-4" + FS + "overview-summary.html", -+ "parent.document.title=\"Overview (Testing entities <script>alert(\\\"Should " + -+ "not pop up\\\")</script>.)\";" -+ } -+ }; -+ private static final String[][] NEG_TEST_HTML_ENTITIES = { -+ {BUG_ID + "-4" + FS + "overview-summary.html", -+ "parent.document.title=\"Overview (Testing entities alert(\\\"Should not pop up\\\").)\";" -+ } -+ }; -+ -+ //Window title with just empty HTML tags. -+ private static final String TITLE_EMPTY_TAGS = -+ "</title><script></script>"; -+ private static final String[] ARGS_EMPTY_TAGS = new String[]{ -+ "-d", BUG_ID + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2" -+ }; -+ private static final String[][] TEST_EMPTY_TAGS = { -+ {BUG_ID + "-5" + FS + "overview-summary.html", -+ "parent.document.title=\"Overview\";" -+ } -+ }; -+ private static final String[][] NEG_TEST_EMPTY_TAGS = { -+ {BUG_ID + "-5" + FS + "overview-summary.html", -+ "parent.document.title=\"Overview (</title><script></script>)\";" -+ } -+ }; -+ -+ //Window title with unicode characters. -+ private static final String TITLE_UNICODE_CHARS = -+ "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e."; -+ private static final String[] ARGS_UNICODE_CHARS = new String[]{ -+ "-d", BUG_ID + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" -+ }; -+ private static final String[][] TEST_UNICODE_CHARS = { -+ {BUG_ID + "-6" + FS + "overview-summary.html", -+ "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " + -+ "not pop up\\\").)\";" -+ } - }; -- private static final String[] 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."); - } |