mirror of
https://git.freebsd.org/ports.git
synced 2025-05-14 16:21:50 -04:00
13936 lines
552 KiB
Text
13936 lines
552 KiB
Text
--- .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.");
|
||
}
|