ports/java/openjdk7/files/patch-7u55-b31
Greg Lewis af02cae5b9 . Update to 7u76
. Adopt a patchset strategy similar to the openjdk8 port, which keeps the
  patch files smaller and makes the BSD differences clearer.
2015-02-02 05:00:42 +00:00

17206 lines
670 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--- ./.hgtags Thu Dec 19 09:00:36 2013 -0800
+++ ./.hgtags Tue Mar 18 12:29:21 2014 -0700
@@ -378,6 +378,9 @@
f0cdb08a4624a623bdd178b04c4bf5a2fa4dc39a jdk7u45-b18
82f1f76c44124c31cb1151833fc15c13547ab280 jdk7u45-b30
f4373de4b75ba8d7f7a5d9c1f77e7884d9064b7e jdk7u45-b31
+b73c006b5d81528dfb4104a79b994b56675bf75d jdk7u45-b33
+05742477836cb30235328181c8e6cae5d4bb06fd jdk7u45-b34
+d0d5badd77abce0469830466ff7b910d3621d847 jdk7u45-b35
f2479abad143d2d9f33b6c872890ca0c5dd52530 jdk7u51-b00
c5822e1d1baa9625ee4e54b8e83a9bf529c883fc jdk7u51-b01
f750621fb31b8f6462b803b47bbf84f05cd5174a jdk7u51-b02
@@ -392,3 +395,22 @@
573c4cfca7dda548463bb84330bddfd07fe1183f jdk7u51-b11
df53ec7eb789e7dec375a685dce1fa5cf63618b4 jdk7u51-b12
6c778574d87336a2e55156544af92ce2de799696 jdk7u51-b13
+d2eeac0235eda77d0a6c72c7235a6e96bc9ad4fb jdk7u51-b30
+626e76f127a44ba0118a545d37410f80000db8fb jdk7u51-b31
+472d67871307433bf3e2687c48237c48ffbf068e jdk7u51-b33
+503f1d094a1bbbd94386f5c3342130dc5f4ba6ee jdk7u51-b34
+df53ec7eb789e7dec375a685dce1fa5cf63618b4 jdk7u55-b00
+15bc13cd7f5d0bb06ab59935e25944fa7cb15bc8 jdk7u55-b01
+b829c5947c6cd473f42cadfe2c61399fb67c2da6 jdk7u55-b02
+a72b902cdd39d9f2f2d353d5ad629e543cbc01ae jdk7u55-b03
+6a8ee38075621564dd276e8ed7be576d637acf79 jdk7u55-b04
+92ac508efb9e00d88b04a2bd79ab8a55f450a048 jdk7u55-b05
+6c7cd2146f69cf0823765b3cf84c338c1dc7157c jdk7u55-b06
+5cad0f56c685a0673944dbc5632ea9ae7b9340c7 jdk7u55-b07
+f617c33f98e1941875457c5c227198c52917942e jdk7u55-b08
+1f02b1889f7098c1e6fdd271ef74c62a2e346b28 jdk7u55-b09
+736c951b19b9562830f61d5ebbad78775f200e94 jdk7u55-b09
+2a55bbab15f6c866281003dcf48708a9d8c145e9 jdk7u55-b10
+f4ace62029de00d2497058c3c0e1d26e019cde30 jdk7u55-b11
+de268da51b54a4f36bcc1a9af60faea285e94330 jdk7u55-b12
+d972a2d9e4f3f864d26c33ccfdacd8269e0f29a8 jdk7u55-b13
--- ./corba/.hgtags Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/.hgtags Tue Mar 18 12:29:47 2014 -0700
@@ -381,6 +381,9 @@
80f65a8f58500ef5d93ddf4426d9c1909b79fadf jdk7u45-b18
a15e4a54504471f1e34a494ed66235870722a0f5 jdk7u45-b30
b7fb35bbe70d88eced3725b6e9070ad0b5b621ad jdk7u45-b31
+d641ac83157ec86219519c0cbaf3122bdc997136 jdk7u45-b33
+aa24e046a2da95637257c9effeaabe254db0aa0b jdk7u45-b34
+fab1423e6ab8ecf36da8b6bf2e454156ec701e8a jdk7u45-b35
b1f069eb48edfa6fb7428dc045a53e287215ef4a jdk7u51-b00
8d884cf2e8cce92d532950de2c7283d9804f9e58 jdk7u51-b01
327035fbb0433927c1b1af2bc0bcb84e7827f1b9 jdk7u51-b02
@@ -395,3 +398,22 @@
a26d0e8ab1027e70ae1ded8ede0086a0a4a10256 jdk7u51-b11
55a509ccc0e4ed49e311c7ecf2ed29a908bc1d6b jdk7u51-b12
e2f0036f712aa636cfd55334ac21ea7ca2587a7b jdk7u51-b13
+6563d12c48c92af39a27ca46b4515fad8e994667 jdk7u51-b30
+0ad990211737fe1b1e2737a3498ab266146d2c53 jdk7u51-b31
+ee7d9f5d18fb67564e88a10f1bd682660db60aa2 jdk7u51-b33
+65ef96a075a43e9201866d1c9b8ee3138ebcc424 jdk7u51-b34
+55a509ccc0e4ed49e311c7ecf2ed29a908bc1d6b jdk7u55-b00
+aabfdc799c0799837dcbbf9ea8d6df1511978b1f jdk7u55-b01
+db2e6d87bade9d2061646ff9a6b39b5159fba0ec jdk7u55-b02
+02ff18f156bd3382fe22e4758b138370f5238e97 jdk7u55-b03
+6a88a170331fb38af5046e54bf75f38176af5c41 jdk7u55-b04
+a8d27c3fc4e4e6cd99fa164f04c30a71f474a2d6 jdk7u55-b05
+af7f1808106bf4e9b4680d943677299829245d08 jdk7u55-b06
+44801796d42bebc90e8c4c7fb5bd79db04b10b75 jdk7u55-b07
+aa98fb8dc3608a30ac593635b21aca2105aaab20 jdk7u55-b08
+2a4842e7ca0b2228017542cea0fed3b8d4f4491a jdk7u55-b09
+5805c3291eb3a82cd75e95ac06eb13daa7f92866 jdk7u55-b09
+b9dae31c56a2bf69fc5932cc490cd80fccc1e0fd jdk7u55-b10
+cbd5b4b07e0c8a5f61eff396b7622e7b04d2a164 jdk7u55-b11
+3cce2a49d18d93dfca2634db32368486ebbb1590 jdk7u55-b12
+8efa6e66c13a5329c312d1a521ffab75d9a330e3 jdk7u55-b13
--- ./corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java Tue Mar 18 12:29:47 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -52,6 +52,7 @@
import java.io.DataOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.InvalidClassException;
+import java.io.Externalizable;
import java.io.Serializable;
import java.util.Arrays;
@@ -82,15 +83,15 @@
public static final long kDefaultUID = -1;
private static Object noArgsList[] = {};
- private static Class noTypesList[] = {};
+ private static Class<?> noTypesList[] = {};
/** true if represents enum type */
private boolean isEnum;
private static final Bridge bridge =
- (Bridge)AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
+ AccessController.doPrivileged(
+ new PrivilegedAction<Bridge>() {
+ public Bridge run() {
return Bridge.get() ;
}
}
@@ -100,7 +101,7 @@
* is returned if the specified class does not implement
* java.io.Serializable or java.io.Externalizable.
*/
- static final ObjectStreamClass lookup(Class cl)
+ static final ObjectStreamClass lookup(Class<?> cl)
{
ObjectStreamClass desc = lookupInternal(cl);
if (desc.isSerializable() || desc.isExternalizable())
@@ -112,7 +113,7 @@
* Find the class descriptor for the specified class.
* Package access only so it can be called from ObjectIn/OutStream.
*/
- static ObjectStreamClass lookupInternal(Class cl)
+ static ObjectStreamClass lookupInternal(Class<?> cl)
{
/* Synchronize on the hashtable so no two threads will do
* this at the same time.
@@ -123,14 +124,14 @@
desc = findDescriptorFor(cl);
if (desc == null) {
/* Check if it's serializable */
- boolean serializable = classSerializable.isAssignableFrom(cl);
+ boolean serializable = Serializable.class.isAssignableFrom(cl);
/* If the class is only Serializable,
* lookup the descriptor for the superclass.
*/
ObjectStreamClass superdesc = null;
if (serializable) {
- Class superclass = cl.getSuperclass();
+ Class<?> superclass = cl.getSuperclass();
if (superclass != null)
superdesc = lookup(superclass);
}
@@ -143,7 +144,7 @@
if (serializable) {
externalizable =
((superdesc != null) && superdesc.isExternalizable()) ||
- classExternalizable.isAssignableFrom(cl);
+ Externalizable.class.isAssignableFrom(cl);
if (externalizable) {
serializable = false;
}
@@ -187,7 +188,7 @@
* that have evolved from a common root class and agree to be serialized
* and deserialized using a common format.
*/
- public static final long getSerialVersionUID( java.lang.Class clazz) {
+ public static final long getSerialVersionUID( java.lang.Class<?> clazz) {
ObjectStreamClass theosc = ObjectStreamClass.lookup( clazz );
if( theosc != null )
{
@@ -221,7 +222,7 @@
/**
* Return the actual (computed) serialVersionUID for this class.
*/
- public static final long getActualSerialVersionUID( java.lang.Class clazz )
+ public static final long getActualSerialVersionUID( java.lang.Class<?> clazz )
{
ObjectStreamClass theosc = ObjectStreamClass.lookup( clazz );
if( theosc != null )
@@ -251,7 +252,7 @@
* Return the class in the local VM that this version is mapped to.
* Null is returned if there is no corresponding local class.
*/
- public final Class forClass() {
+ public final Class<?> forClass() {
return ofClass;
}
@@ -351,7 +352,7 @@
* Create a new ObjectStreamClass from a loaded class.
* Don't call this directly, call lookup instead.
*/
- private ObjectStreamClass(java.lang.Class cl, ObjectStreamClass superdesc,
+ private ObjectStreamClass(java.lang.Class<?> cl, ObjectStreamClass superdesc,
boolean serial, boolean extern)
{
ofClass = cl; /* created from this class */
@@ -390,7 +391,7 @@
PersistentFieldsValue() { }
- ObjectStreamField[] get(Class type) {
+ ObjectStreamField[] get(Class<?> type) {
Object value = map.get(type);
if (value == null) {
value = computeValue(type);
@@ -448,7 +449,7 @@
if (initialized)
return;
- final Class cl = ofClass;
+ final Class<?> cl = ofClass;
if (!serializable ||
externalizable ||
@@ -576,9 +577,9 @@
* will call it as necessary.
*/
writeObjectMethod = getPrivateMethod( cl, "writeObject",
- new Class[] { java.io.ObjectOutputStream.class }, Void.TYPE ) ;
+ new Class<?>[] { java.io.ObjectOutputStream.class }, Void.TYPE ) ;
readObjectMethod = getPrivateMethod( cl, "readObject",
- new Class[] { java.io.ObjectInputStream.class }, Void.TYPE ) ;
+ new Class<?>[] { java.io.ObjectInputStream.class }, Void.TYPE ) ;
}
return null;
}
@@ -604,9 +605,9 @@
* class, or null if none found. Access checks are disabled on the
* returned method (if any).
*/
- private static Method getPrivateMethod(Class cl, String name,
- Class[] argTypes,
- Class returnType)
+ private static Method getPrivateMethod(Class<?> cl, String name,
+ Class<?>[] argTypes,
+ Class<?> returnType)
{
try {
Method meth = cl.getDeclaredMethod(name, argTypes);
@@ -667,7 +668,7 @@
* Fill in the reflected Fields that will be used
* for reading.
*/
- final void setClass(Class cl) throws InvalidClassException {
+ final void setClass(Class<?> cl) throws InvalidClassException {
if (cl == null) {
localClassDesc = null;
@@ -934,9 +935,9 @@
* Access checks are disabled on the returned constructor (if any), since
* the defining class may still be non-public.
*/
- private static Constructor getExternalizableConstructor(Class cl) {
+ private static Constructor getExternalizableConstructor(Class<?> cl) {
try {
- Constructor cons = cl.getDeclaredConstructor(new Class[0]);
+ Constructor cons = cl.getDeclaredConstructor(new Class<?>[0]);
cons.setAccessible(true);
return ((cons.getModifiers() & Modifier.PUBLIC) != 0) ?
cons : null;
@@ -950,15 +951,15 @@
* superclass, or null if none found. Access checks are disabled on the
* returned constructor (if any).
*/
- private static Constructor getSerializableConstructor(Class cl) {
- Class initCl = cl;
+ private static Constructor getSerializableConstructor(Class<?> cl) {
+ Class<?> initCl = cl;
while (Serializable.class.isAssignableFrom(initCl)) {
if ((initCl = initCl.getSuperclass()) == null) {
return null;
}
}
try {
- Constructor cons = initCl.getDeclaredConstructor(new Class[0]);
+ Constructor cons = initCl.getDeclaredConstructor(new Class<?>[0]);
int mods = cons.getModifiers();
if ((mods & Modifier.PRIVATE) != 0 ||
((mods & (Modifier.PUBLIC | Modifier.PROTECTED)) == 0 &&
@@ -1063,7 +1064,7 @@
* items to the hash accumulating in the digest stream.
* Fold the hash into a long. Use the SHA secure hash function.
*/
- private static long _computeSerialVersionUID(Class cl) {
+ private static long _computeSerialVersionUID(Class<?> cl) {
if (DEBUG_SVUID)
msg( "Computing SerialVersionUID for " + cl ) ;
ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
@@ -1117,7 +1118,7 @@
* them from its computation.
*/
- Class interfaces[] = cl.getInterfaces();
+ Class<?> interfaces[] = cl.getInterfaces();
Arrays.sort(interfaces, compareClassByName);
for (int i = 0; i < interfaces.length; i++) {
@@ -1247,7 +1248,7 @@
return h;
}
- private static long computeStructuralUID(com.sun.corba.se.impl.io.ObjectStreamClass osc, Class cl) {
+ private static long computeStructuralUID(com.sun.corba.se.impl.io.ObjectStreamClass osc, Class<?> cl) {
ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
long h = 0;
@@ -1267,7 +1268,7 @@
DataOutputStream data = new DataOutputStream(mdo);
// Get SUID of parent
- Class parent = cl.getSuperclass();
+ Class<?> parent = cl.getSuperclass();
if ((parent != null))
// SerialBug 1; acc. to spec the one for
// java.lang.object
@@ -1323,10 +1324,10 @@
/**
* Compute the JVM signature for the class.
*/
- static String getSignature(Class clazz) {
+ static String getSignature(Class<?> clazz) {
String type = null;
if (clazz.isArray()) {
- Class cl = clazz;
+ Class<?> cl = clazz;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
@@ -1372,7 +1373,7 @@
sb.append("(");
- Class[] params = meth.getParameterTypes(); // avoid clone
+ Class<?>[] params = meth.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append(getSignature(params[j]));
}
@@ -1389,7 +1390,7 @@
sb.append("(");
- Class[] params = cons.getParameterTypes(); // avoid clone
+ Class<?>[] params = cons.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append(getSignature(params[j]));
}
@@ -1409,7 +1410,7 @@
* The entries are extended from java.lang.ref.SoftReference so the
* gc will be able to free them if needed.
*/
- private static ObjectStreamClass findDescriptorFor(Class cl) {
+ private static ObjectStreamClass findDescriptorFor(Class<?> cl) {
int hash = cl.hashCode();
int index = (hash & 0x7FFFFFFF) % descriptorFor.length;
@@ -1456,7 +1457,7 @@
descriptorFor[index] = e;
}
- private static Field[] getDeclaredFields(final Class clz) {
+ private static Field[] getDeclaredFields(final Class<?> clz) {
return (Field[]) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return clz.getDeclaredFields();
@@ -1490,7 +1491,7 @@
/*
* Class that is a descriptor for in this virtual machine.
*/
- private Class ofClass;
+ private Class<?> ofClass;
/*
* True if descriptor for a proxy class.
@@ -1562,30 +1563,17 @@
* Returns true if the given class defines a static initializer method,
* false otherwise.
*/
- private static boolean hasStaticInitializer(Class cl) {
+ private static boolean hasStaticInitializer(Class<?> cl) {
if (hasStaticInitializerMethod == null) {
- Class classWithThisMethod = null;
+ Class<?> classWithThisMethod = null;
try {
- try {
- // When using rip-int with Merlin or when this is a Merlin
- // workspace, the method we want is in sun.misc.ClassReflector
- // and absent from java.io.ObjectStreamClass.
- //
- // When compiling rip-int with JDK 1.3.x, we have to get it
- // from java.io.ObjectStreamClass.
- classWithThisMethod = Class.forName("sun.misc.ClassReflector");
- } catch (ClassNotFoundException cnfe) {
- // Do nothing. This is either not a Merlin workspace,
- // or rip-int is being compiled with something other than
- // Merlin, probably JDK 1.3. Fall back on java.io.ObjectStreaClass.
- }
if (classWithThisMethod == null)
classWithThisMethod = java.io.ObjectStreamClass.class;
hasStaticInitializerMethod =
classWithThisMethod.getDeclaredMethod("hasStaticInitializer",
- new Class[] { Class.class });
+ new Class<?>[] { Class.class });
} catch (NoSuchMethodException ex) {
}
@@ -1610,22 +1598,6 @@
}
- /* The Class Object for java.io.Serializable */
- private static Class classSerializable = null;
- private static Class classExternalizable = null;
-
- /*
- * Resolve java.io.Serializable at load time.
- */
- static {
- try {
- classSerializable = Class.forName("java.io.Serializable");
- classExternalizable = Class.forName("java.io.Externalizable");
- } catch (Throwable e) {
- System.err.println("Could not load java.io.Serializable or java.io.Externalizable.");
- }
- }
-
/** use serialVersionUID from JDK 1.1. for interoperability */
private static final long serialVersionUID = -6120832682080437368L;
@@ -1663,8 +1635,8 @@
private static class CompareClassByName implements Comparator {
public int compare(Object o1, Object o2) {
- Class c1 = (Class)o1;
- Class c2 = (Class)o2;
+ Class<?> c1 = (Class)o1;
+ Class<?> c2 = (Class)o2;
return (c1.getName()).compareTo(c2.getName());
}
}
@@ -1778,12 +1750,12 @@
*
* Copied from the Merlin java.io.ObjectStreamClass.
*/
- private static Method getInheritableMethod(Class cl, String name,
- Class[] argTypes,
- Class returnType)
+ private static Method getInheritableMethod(Class<?> cl, String name,
+ Class<?>[] argTypes,
+ Class<?> returnType)
{
Method meth = null;
- Class defCl = cl;
+ Class<?> defCl = cl;
while (defCl != null) {
try {
meth = defCl.getDeclaredMethod(name, argTypes);
@@ -1815,7 +1787,7 @@
*
* Copied from the Merlin java.io.ObjectStreamClass.
*/
- private static boolean packageEquals(Class cl1, Class cl2) {
+ private static boolean packageEquals(Class<?> cl1, Class<?> cl2) {
Package pkg1 = cl1.getPackage(), pkg2 = cl2.getPackage();
return ((pkg1 == pkg2) || ((pkg1 != null) && (pkg1.equals(pkg2))));
}
--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java Tue Mar 18 12:29:47 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -94,7 +94,7 @@
});
}
- public static long computeStructuralUID(boolean hasWriteObject, Class cl) {
+ public static long computeStructuralUID(boolean hasWriteObject, Class<?> cl) {
ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
long h = 0;
@@ -119,7 +119,7 @@
// Object method in there
// Get SUID of parent
- Class parent = cl.getSuperclass();
+ Class<?> parent = cl.getSuperclass();
if ((parent != null) && (parent != java.lang.Object.class)) {
boolean hasWriteObjectFlag = false;
Class [] args = {java.io.ObjectOutputStream.class};
@@ -503,19 +503,6 @@
Class classWithThisMethod = null;
try {
- try {
- // When using rip-int with Merlin or when this is a Merlin
- // workspace, the method we want is in sun.misc.ClassReflector
- // and absent from java.io.ObjectStreamClass.
- //
- // When compiling rip-int with JDK 1.3.x, we have to get it
- // from java.io.ObjectStreamClass.
- classWithThisMethod = Class.forName("sun.misc.ClassReflector");
- } catch (ClassNotFoundException cnfe) {
- // Do nothing. This is either not a Merlin workspace,
- // or rip-int is being compiled with something other than
- // Merlin, probably JDK 1.3. Fall back on java.io.ObjectStreaClass.
- }
if (classWithThisMethod == null)
classWithThisMethod = java.io.ObjectStreamClass.class;
--- ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java Tue Mar 18 12:29:47 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,6 +53,7 @@
import java.io.ByteArrayOutputStream;
import java.io.InvalidClassException;
import java.io.Serializable;
+import java.io.Externalizable;
import java.util.Arrays;
import java.util.Comparator;
@@ -88,7 +89,7 @@
public static final long kDefaultUID = -1;
private static Object noArgsList[] = {};
- private static Class noTypesList[] = {};
+ private static Class<?> noTypesList[] = {};
private static Hashtable translatedFields;
@@ -96,7 +97,7 @@
* is returned if the specified class does not implement
* java.io.Serializable or java.io.Externalizable.
*/
- static final ObjectStreamClass_1_3_1 lookup(Class cl)
+ static final ObjectStreamClass_1_3_1 lookup(Class<?> cl)
{
ObjectStreamClass_1_3_1 desc = lookupInternal(cl);
if (desc.isSerializable() || desc.isExternalizable())
@@ -108,7 +109,7 @@
* Find the class descriptor for the specified class.
* Package access only so it can be called from ObjectIn/OutStream.
*/
- static ObjectStreamClass_1_3_1 lookupInternal(Class cl)
+ static ObjectStreamClass_1_3_1 lookupInternal(Class<?> cl)
{
/* Synchronize on the hashtable so no two threads will do
* this at the same time.
@@ -122,13 +123,13 @@
}
/* Check if it's serializable */
- boolean serializable = classSerializable.isAssignableFrom(cl);
+ boolean serializable = Serializable.class.isAssignableFrom(cl);
/* If the class is only Serializable,
* lookup the descriptor for the superclass.
*/
ObjectStreamClass_1_3_1 superdesc = null;
if (serializable) {
- Class superclass = cl.getSuperclass();
+ Class<?> superclass = cl.getSuperclass();
if (superclass != null)
superdesc = lookup(superclass);
}
@@ -141,7 +142,7 @@
if (serializable) {
externalizable =
((superdesc != null) && superdesc.isExternalizable()) ||
- classExternalizable.isAssignableFrom(cl);
+ Externalizable.class.isAssignableFrom(cl);
if (externalizable) {
serializable = false;
}
@@ -170,7 +171,7 @@
* that have evolved from a common root class and agree to be serialized
* and deserialized using a common format.
*/
- public static final long getSerialVersionUID( java.lang.Class clazz) {
+ public static final long getSerialVersionUID( java.lang.Class<?> clazz) {
ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz );
if( theosc != null )
{
@@ -204,7 +205,7 @@
/**
* Return the actual (computed) serialVersionUID for this class.
*/
- public static final long getActualSerialVersionUID( java.lang.Class clazz )
+ public static final long getActualSerialVersionUID( java.lang.Class<?> clazz )
{
ObjectStreamClass_1_3_1 theosc = ObjectStreamClass_1_3_1.lookup( clazz );
if( theosc != null )
@@ -234,7 +235,7 @@
* Return the class in the local VM that this version is mapped to.
* Null is returned if there is no corresponding local class.
*/
- public final Class forClass() {
+ public final Class<?> forClass() {
return ofClass;
}
@@ -333,7 +334,7 @@
* Create a new ObjectStreamClass_1_3_1 from a loaded class.
* Don't call this directly, call lookup instead.
*/
- private ObjectStreamClass_1_3_1(java.lang.Class cl, ObjectStreamClass_1_3_1 superdesc,
+ private ObjectStreamClass_1_3_1(java.lang.Class<?> cl, ObjectStreamClass_1_3_1 superdesc,
boolean serial, boolean extern)
{
ofClass = cl; /* created from this class */
@@ -376,7 +377,7 @@
private void init() {
synchronized (lock) {
- final Class cl = ofClass;
+ final Class<?> cl = ofClass;
if (fields != null) // already initialized
return;
@@ -558,7 +559,7 @@
* will call it as necessary.
*/
try {
- Class[] args = {java.io.ObjectOutputStream.class};
+ Class<?>[] args = {java.io.ObjectOutputStream.class};
writeObjectMethod = cl.getDeclaredMethod("writeObject", args);
hasWriteObjectMethod = true;
int mods = writeObjectMethod.getModifiers();
@@ -578,7 +579,7 @@
* ObjectInputStream so it can all the method directly.
*/
try {
- Class[] args = {java.io.ObjectInputStream.class};
+ Class<?>[] args = {java.io.ObjectInputStream.class};
readObjectMethod = cl.getDeclaredMethod("readObject", args);
int mods = readObjectMethod.getModifiers();
@@ -629,11 +630,11 @@
if (translation != null)
return translation;
else {
- Class osfClass = com.sun.corba.se.impl.orbutil.ObjectStreamField.class;
+ Class<?> osfClass = com.sun.corba.se.impl.orbutil.ObjectStreamField.class;
translation = (Object[])java.lang.reflect.Array.newInstance(osfClass, objs.length);
Object arg[] = new Object[2];
- Class types[] = {String.class, Class.class};
+ Class<?> types[] = {String.class, Class.class};
Constructor constructor = osfClass.getDeclaredConstructor(types);
for (int i = fields.length -1; i >= 0; i--){
arg[0] = fields[i].getName();
@@ -804,7 +805,7 @@
}
}
- private static long computeStructuralUID(ObjectStreamClass_1_3_1 osc, Class cl) {
+ private static long computeStructuralUID(ObjectStreamClass_1_3_1 osc, Class<?> cl) {
ByteArrayOutputStream devnull = new ByteArrayOutputStream(512);
long h = 0;
@@ -824,7 +825,7 @@
DataOutputStream data = new DataOutputStream(mdo);
// Get SUID of parent
- Class parent = cl.getSuperclass();
+ Class<?> parent = cl.getSuperclass();
if ((parent != null))
// SerialBug 1; acc. to spec the one for
// java.lang.object
@@ -910,10 +911,10 @@
/**
* Compute the JVM signature for the class.
*/
- static String getSignature(Class clazz) {
+ static String getSignature(Class<?> clazz) {
String type = null;
if (clazz.isArray()) {
- Class cl = clazz;
+ Class<?> cl = clazz;
int dimensions = 0;
while (cl.isArray()) {
dimensions++;
@@ -959,7 +960,7 @@
sb.append("(");
- Class[] params = meth.getParameterTypes(); // avoid clone
+ Class<?>[] params = meth.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append(getSignature(params[j]));
}
@@ -976,7 +977,7 @@
sb.append("(");
- Class[] params = cons.getParameterTypes(); // avoid clone
+ Class<?>[] params = cons.getParameterTypes(); // avoid clone
for (int j = 0; j < params.length; j++) {
sb.append(getSignature(params[j]));
}
@@ -996,7 +997,7 @@
* The entries are extended from java.lang.ref.SoftReference so the
* gc will be able to free them if needed.
*/
- private static ObjectStreamClass_1_3_1 findDescriptorFor(Class cl) {
+ private static ObjectStreamClass_1_3_1 findDescriptorFor(Class<?> cl) {
int hash = cl.hashCode();
int index = (hash & 0x7FFFFFFF) % descriptorFor.length;
@@ -1077,7 +1078,7 @@
/*
* Class that is a descriptor for in this virtual machine.
*/
- private Class ofClass;
+ private Class<?> ofClass;
/*
* True if descriptor for a proxy class.
@@ -1130,22 +1131,6 @@
/* Get the private static final field for serial version UID */
// private static native long getSerialVersionUIDField(Class cl);
- /* The Class Object for java.io.Serializable */
- private static Class classSerializable = null;
- private static Class classExternalizable = null;
-
- /*
- * Resolve java.io.Serializable at load time.
- */
- static {
- try {
- classSerializable = Class.forName("java.io.Serializable");
- classExternalizable = Class.forName("java.io.Externalizable");
- } catch (Throwable e) {
- System.err.println("Could not load java.io.Serializable or java.io.Externalizable.");
- }
- }
-
/** use serialVersionUID from JDK 1.1. for interoperability */
private static final long serialVersionUID = -6120832682080437368L;
@@ -1183,8 +1168,8 @@
private static class CompareClassByName implements Comparator {
public int compare(Object o1, Object o2) {
- Class c1 = (Class)o1;
- Class c2 = (Class)o2;
+ Class<?> c1 = (Class)o1;
+ Class<?> c2 = (Class)o2;
return (c1.getName()).compareTo(c2.getName());
}
}
--- ./corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java Tue Mar 18 12:29:47 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -170,6 +170,12 @@
// representing LogDomain and ExceptionGroup.
private Map wrapperMap ;
+ static class Holder {
+ static final PresentationManager defaultPresentationManager =
+ setupPresentationManager();
+ }
+ private static final Object pmLock = new Object();
+
private static Map staticWrapperMap = new ConcurrentHashMap();
protected MonitoringManager monitoringManager;
@@ -235,13 +241,24 @@
*/
public static PresentationManager getPresentationManager()
{
- AppContext ac = AppContext.getAppContext();
- PresentationManager pm = (PresentationManager) ac.get(PresentationManager.class);
- if (pm == null) {
- pm = setupPresentationManager();
- ac.put(PresentationManager.class, pm);
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null && AppContext.getAppContexts().size() > 0) {
+ AppContext ac = AppContext.getAppContext();
+ if (ac != null) {
+ synchronized (pmLock) {
+ PresentationManager pm =
+ (PresentationManager) ac.get(PresentationManager.class);
+ if (pm == null) {
+ pm = setupPresentationManager();
+ ac.put(PresentationManager.class, pm);
+ }
+ return pm;
+ }
+ }
}
- return pm;
+
+ // No security manager or AppContext
+ return Holder.defaultPresentationManager;
}
/** Get the appropriate StubFactoryFactory. This
--- ./corba/src/share/classes/org/omg/CORBA/ORB.java Thu Dec 19 09:00:44 2013 -0800
+++ ./corba/src/share/classes/org/omg/CORBA/ORB.java Tue Mar 18 12:29:47 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,8 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
+import sun.reflect.misc.ReflectUtil;
+
/**
* A class providing APIs for the CORBA Object Request Broker
* features. The <code>ORB</code> class also provides
@@ -289,20 +291,38 @@
(className.equals("com.sun.corba.se.impl.orb.ORBSingleton"))) {
singleton = new com.sun.corba.se.impl.orb.ORBSingleton();
} else {
- singleton = create_impl(className);
+ singleton = create_impl_with_systemclassloader(className);
}
}
return singleton;
}
+ private static ORB create_impl_with_systemclassloader(String className) {
+
+ try {
+ ReflectUtil.checkPackageAccess(className);
+ ClassLoader cl = ClassLoader.getSystemClassLoader();
+ Class<org.omg.CORBA.ORB> orbBaseClass = org.omg.CORBA.ORB.class;
+ Class<?> singletonOrbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass);
+ return (ORB)singletonOrbClass.newInstance();
+ } catch (Throwable ex) {
+ SystemException systemException = new INITIALIZE(
+ "can't instantiate default ORB implementation " + className);
+ systemException.initCause(ex);
+ throw systemException;
+ }
+ }
+
private static ORB create_impl(String className) {
-
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null)
cl = ClassLoader.getSystemClassLoader();
try {
- return (ORB) Class.forName(className, true, cl).newInstance();
+ ReflectUtil.checkPackageAccess(className);
+ Class<org.omg.CORBA.ORB> orbBaseClass = org.omg.CORBA.ORB.class;
+ Class<?> orbClass = Class.forName(className, true, cl).asSubclass(orbBaseClass);
+ return (ORB)orbClass.newInstance();
} catch (Throwable ex) {
SystemException systemException = new INITIALIZE(
"can't instantiate default ORB implementation " + className);
@@ -346,7 +366,6 @@
} else {
orb = create_impl(className);
}
-
orb.set_parameters(args, props);
return orb;
}
@@ -377,7 +396,6 @@
} else {
orb = create_impl(className);
}
-
orb.set_parameters(app, props);
return orb;
}
@@ -573,7 +591,7 @@
try {
// First try to load the OperationDef class
String opDefClassName = "org.omg.CORBA.OperationDef";
- Class opDefClass = null;
+ Class<?> opDefClass = null;
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if ( cl == null )
@@ -583,7 +601,7 @@
// OK, we loaded OperationDef. Now try to get the
// create_operation_list(OperationDef oper) method.
- Class[] argc = { opDefClass };
+ Class<?>[] argc = { opDefClass };
java.lang.reflect.Method meth =
this.getClass().getMethod("create_operation_list", argc);
--- ./hotspot/.hgtags Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/.hgtags Tue Mar 18 12:31:20 2014 -0700
@@ -590,6 +590,9 @@
12374864c655a2cefb0d65caaacf215d5365ec5f jdk7u45-b18
3677c8cc3c89c0fa608f485b84396e4cf755634b jdk7u45-b30
520b7b3d9153c1407791325946b07c5c222cf0d6 jdk7u45-b31
+c373a733d5d5147f99eaa2b91d6b937c28214fc9 jdk7u45-b33
+0bcb43482f2ac5615437541ffb8dc0f79ece3148 jdk7u45-b34
+12ea8d416f105f5971c808c89dddc1006bfc4c53 jdk7u45-b35
429884602206fcf5314c8b953c06d54d337558ca jdk7u51-b00
68f03ff066f2341b89b52a6d6e21ae09de008351 jdk7u51-b01
67910a581eca113847c5320c49436a9816c5d5c6 jdk7u51-b02
@@ -604,3 +607,22 @@
1f11dff734af98f5bf11d4fceeda221ab1416971 jdk7u51-b11
dee2a38ef6b26534c44c550ef4da2c3146c612c2 jdk7u51-b12
6c6a2299029ad02fa2820b8ff8c61c2bbcae799c jdk7u51-b13
+a398ddc79d2310ad37b131cc3794b3cf574f088e jdk7u51-b30
+cf4110c35afb10456d8264c47b7cde1c20150cab jdk7u51-b31
+208419914859dd77abdb5ec755b32c237ee6e4eb jdk7u51-b33
+f8457a75bdb5052f1d8c547027a926f9b755b808 jdk7u51-b34
+dee2a38ef6b26534c44c550ef4da2c3146c612c2 jdk7u55-b00
+ac0063b4452bc724e8648e64f4b2d495054bb308 jdk7u55-b01
+408028d410e316a99495c42df0031018890c22fe jdk7u55-b02
+50fb91504dd8cdf410eb956075442daf3aacf1db jdk7u55-b03
+3be3b8a032a5508646c1c5620cee18d3e69fc708 jdk7u55-b04
+b86119fa2748bd91ae4984ff2264da92b6626f8c jdk7u55-b05
+260d919d52e500a0b20f911fade2a7710474067a jdk7u55-b06
+8cf6e0a3a0651c4132ae034c2b68ddf4eb5c4d88 jdk7u55-b07
+049fd2cef85bf2d557dd7dd8a90a6831a8168ce4 jdk7u55-b08
+9b238ab164e6d1cf9cfb560827d88ef8a7d8c898 jdk7u55-b09
+573d8d080af9eff48aa3b8f0696d8874ce36fbb1 jdk7u55-b09
+36f8bd4dd467ae4183340842fd7158ac3309b826 jdk7u55-b10
+49cada8e39b9215b9fd8b9183743f92625587cfc jdk7u55-b11
+aadc864abd1ced3049bf59ce32786a07997ba190 jdk7u55-b12
+b021fd817a0177b31d1e3d65127a27458e85801e jdk7u55-b13
--- ./hotspot/make/bsd/makefiles/arm.make Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/make/bsd/makefiles/arm.make Tue Mar 18 12:31:20 2014 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,8 @@
Obj_Files += bsd_arm.o
-LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
+ifneq ($(EXT_LIBS_PATH),)
+ LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
+endif
CFLAGS += -DVM_LITTLE_ENDIAN
--- ./hotspot/make/hotspot_version Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/make/hotspot_version Tue Mar 18 12:31:20 2014 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -31,10 +31,10 @@
#
# Don't put quotes (fail windows build).
-HOTSPOT_VM_COPYRIGHT=Copyright 2013
+HOTSPOT_VM_COPYRIGHT=Copyright 2014
HS_MAJOR_VER=24
-HS_MINOR_VER=51
+HS_MINOR_VER=55
HS_BUILD_NUMBER=03
JDK_MAJOR_VER=1
--- ./hotspot/make/linux/makefiles/arm.make Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/make/linux/makefiles/arm.make Tue Mar 18 12:31:20 2014 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,8 @@
Obj_Files += linux_arm.o
-LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
+ifneq ($(EXT_LIBS_PATH),)
+ LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
+endif
CFLAGS += -DVM_LITTLE_ENDIAN
--- ./hotspot/src/os/windows/vm/os_windows.cpp Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/src/os/windows/vm/os_windows.cpp Tue Mar 18 12:31:20 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1591,6 +1591,7 @@
void os::win32::print_windows_version(outputStream* st) {
OSVERSIONINFOEX osvi;
+ SYSTEM_INFO si;
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
@@ -1600,6 +1601,18 @@
}
int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
+
+ ZeroMemory(&si, sizeof(SYSTEM_INFO));
+ if (os_vers >= 5002) {
+ // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
+ // find out whether we are running on 64 bit processor or not.
+ if (os::Kernel32Dll::GetNativeSystemInfoAvailable()) {
+ os::Kernel32Dll::GetNativeSystemInfo(&si);
+ } else {
+ GetSystemInfo(&si);
+ }
+ }
+
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
switch (os_vers) {
case 3051: st->print(" Windows NT 3.51"); break;
@@ -1607,57 +1620,48 @@
case 5000: st->print(" Windows 2000"); break;
case 5001: st->print(" Windows XP"); break;
case 5002:
- case 6000:
- case 6001:
- case 6002: {
- // Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
- // find out whether we are running on 64 bit processor or not.
- SYSTEM_INFO si;
- ZeroMemory(&si, sizeof(SYSTEM_INFO));
- if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
- GetSystemInfo(&si);
+ if (osvi.wProductType == VER_NT_WORKSTATION &&
+ si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
+ st->print(" Windows XP x64 Edition");
} else {
- os::Kernel32Dll::GetNativeSystemInfo(&si);
- }
- if (os_vers == 5002) {
- if (osvi.wProductType == VER_NT_WORKSTATION &&
- si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- st->print(" Windows XP x64 Edition");
- else
- st->print(" Windows Server 2003 family");
- } else if (os_vers == 6000) {
- if (osvi.wProductType == VER_NT_WORKSTATION)
- st->print(" Windows Vista");
- else
- st->print(" Windows Server 2008");
- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- st->print(" , 64 bit");
- } else if (os_vers == 6001) {
- if (osvi.wProductType == VER_NT_WORKSTATION) {
- st->print(" Windows 7");
- } else {
- // Unrecognized windows, print out its major and minor versions
- st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
- }
- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- st->print(" , 64 bit");
- } else if (os_vers == 6002) {
- if (osvi.wProductType == VER_NT_WORKSTATION) {
- st->print(" Windows 8");
- } else {
- st->print(" Windows Server 2012");
- }
- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- st->print(" , 64 bit");
- } else { // future os
- // Unrecognized windows, print out its major and minor versions
- st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
- if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
- st->print(" , 64 bit");
+ st->print(" Windows Server 2003 family");
}
break;
- }
- default: // future windows, print out its major and minor versions
+
+ case 6000:
+ if (osvi.wProductType == VER_NT_WORKSTATION) {
+ st->print(" Windows Vista");
+ } else {
+ st->print(" Windows Server 2008");
+ }
+ break;
+
+ case 6001:
+ if (osvi.wProductType == VER_NT_WORKSTATION) {
+ st->print(" Windows 7");
+ } else {
+ st->print(" Windows Server 2008 R2");
+ }
+ break;
+
+ case 6002:
+ if (osvi.wProductType == VER_NT_WORKSTATION) {
+ st->print(" Windows 8");
+ } else {
+ st->print(" Windows Server 2012");
+ }
+ break;
+
+ case 6003:
+ if (osvi.wProductType == VER_NT_WORKSTATION) {
+ st->print(" Windows 8.1");
+ } else {
+ st->print(" Windows Server 2012 R2");
+ }
+ break;
+
+ default: // future os
+ // Unrecognized windows, print out its major and minor versions
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
}
} else {
@@ -1669,6 +1673,11 @@
st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
}
}
+
+ if (os_vers >= 6000 && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
+ st->print(" , 64 bit");
+ }
+
st->print(" Build %d", osvi.dwBuildNumber);
st->print(" %s", osvi.szCSDVersion); // service pack
st->cr();
--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Tue Mar 18 12:31:20 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -2661,6 +2661,11 @@
"Short length on BootstrapMethods in class file %s",
CHECK);
+ guarantee_property(attribute_byte_length > sizeof(u2),
+ "Invalid BootstrapMethods attribute length %u in class file %s",
+ attribute_byte_length,
+ CHECK);
+
// The attribute contains a counted array of counted tuples of shorts,
// represending bootstrap specifiers:
// length*{bootstrap_method_index, argument_count*{argument_index}}
--- ./hotspot/src/share/vm/oops/objArrayKlass.cpp Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/src/share/vm/oops/objArrayKlass.cpp Tue Mar 18 12:31:20 2014 -0700
@@ -149,7 +149,7 @@
if (element_is_null ||
Klass::cast((new_val->klass()))->is_subtype_of(bound)) {
bs->write_ref_field_pre(p, new_val);
- *p = *from;
+ *p = element;
} else {
// We must do a barrier to cover the partial copy.
const size_t pd = pointer_delta(p, dst, (size_t)heapOopSize);
--- ./hotspot/src/share/vm/opto/matcher.cpp Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/src/share/vm/opto/matcher.cpp Tue Mar 18 12:31:20 2014 -0700
@@ -464,17 +464,17 @@
C->FIRST_STACK_mask().Clear();
// Add in the incoming argument area
- OptoReg::Name init = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
- for (i = init; i < _in_arg_limit; i = OptoReg::add(i,1))
+ OptoReg::Name init_in = OptoReg::add(_old_SP, C->out_preserve_stack_slots());
+ for (i = init_in; i < _in_arg_limit; i = OptoReg::add(i,1)) {
C->FIRST_STACK_mask().Insert(i);
-
+ }
// Add in all bits past the outgoing argument area
guarantee(RegMask::can_represent_arg(OptoReg::add(_out_arg_limit,-1)),
"must be able to represent all call arguments in reg mask");
- init = _out_arg_limit;
- for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1))
+ OptoReg::Name init = _out_arg_limit;
+ for (i = init; RegMask::can_represent(i); i = OptoReg::add(i,1)) {
C->FIRST_STACK_mask().Insert(i);
-
+ }
// Finally, set the "infinite stack" bit.
C->FIRST_STACK_mask().set_AllStack();
@@ -506,16 +506,36 @@
idealreg2spillmask[Op_VecS]->OR(C->FIRST_STACK_mask());
}
if (Matcher::vector_size_supported(T_FLOAT,2)) {
+ // For VecD we need dual alignment and 8 bytes (2 slots) for spills.
+ // RA guarantees such alignment since it is needed for Double and Long values.
*idealreg2spillmask[Op_VecD] = *idealreg2regmask[Op_VecD];
idealreg2spillmask[Op_VecD]->OR(aligned_stack_mask);
}
if (Matcher::vector_size_supported(T_FLOAT,4)) {
+ // For VecX we need quadro alignment and 16 bytes (4 slots) for spills.
+ //
+ // RA can use input arguments stack slots for spills but until RA
+ // we don't know frame size and offset of input arg stack slots.
+ //
+ // Exclude last input arg stack slots to avoid spilling vectors there
+ // otherwise vector spills could stomp over stack slots in caller frame.
+ OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
+ for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecX); k++) {
+ aligned_stack_mask.Remove(in);
+ in = OptoReg::add(in, -1);
+ }
aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecX);
assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
*idealreg2spillmask[Op_VecX] = *idealreg2regmask[Op_VecX];
idealreg2spillmask[Op_VecX]->OR(aligned_stack_mask);
}
if (Matcher::vector_size_supported(T_FLOAT,8)) {
+ // For VecY we need octo alignment and 32 bytes (8 slots) for spills.
+ OptoReg::Name in = OptoReg::add(_in_arg_limit, -1);
+ for (int k = 1; (in >= init_in) && (k < RegMask::SlotsPerVecY); k++) {
+ aligned_stack_mask.Remove(in);
+ in = OptoReg::add(in, -1);
+ }
aligned_stack_mask.clear_to_sets(RegMask::SlotsPerVecY);
assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
*idealreg2spillmask[Op_VecY] = *idealreg2regmask[Op_VecY];
--- ./hotspot/src/share/vm/opto/output.cpp Thu Dec 19 09:00:51 2013 -0800
+++ ./hotspot/src/share/vm/opto/output.cpp Tue Mar 18 12:31:20 2014 -0700
@@ -345,6 +345,11 @@
uint* jmp_offset = NEW_RESOURCE_ARRAY(uint,nblocks);
uint* jmp_size = NEW_RESOURCE_ARRAY(uint,nblocks);
int* jmp_nidx = NEW_RESOURCE_ARRAY(int ,nblocks);
+
+ // Collect worst case block paddings
+ int* block_worst_case_pad = NEW_RESOURCE_ARRAY(int, nblocks);
+ memset(block_worst_case_pad, 0, nblocks * sizeof(int));
+
DEBUG_ONLY( uint *jmp_target = NEW_RESOURCE_ARRAY(uint,nblocks); )
DEBUG_ONLY( uint *jmp_rule = NEW_RESOURCE_ARRAY(uint,nblocks); )
@@ -461,6 +466,7 @@
last_avoid_back_to_back_adr += max_loop_pad;
}
blk_size += max_loop_pad;
+ block_worst_case_pad[i + 1] = max_loop_pad;
}
}
@@ -500,9 +506,16 @@
if (bnum > i) { // adjust following block's offset
offset -= adjust_block_start;
}
+
+ // This block can be a loop header, account for the padding
+ // in the previous block.
+ int block_padding = block_worst_case_pad[i];
+ assert(i == 0 || block_padding == 0 || br_offs >= block_padding, "Should have at least a padding on top");
// In the following code a nop could be inserted before
// the branch which will increase the backward distance.
- bool needs_padding = ((uint)br_offs == last_may_be_short_branch_adr);
+ bool needs_padding = ((uint)(br_offs - block_padding) == last_may_be_short_branch_adr);
+ assert(!needs_padding || jmp_offset[i] == 0, "padding only branches at the beginning of block");
+
if (needs_padding && offset <= 0)
offset -= nop_size;
--- ./jaxp/.hgtags Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/.hgtags Tue Mar 18 12:34:22 2014 -0700
@@ -381,6 +381,9 @@
4beb90ab48f7fd46c7a9afbe66f8cccb230699ba jdk7u45-b18
a456c78a50e201a65c9f63565c8291b84a4fbd32 jdk7u45-b30
3c34f244296e98d8ebb94973c752f3395612391a jdk7u45-b31
+056494e83d15cd1c546d32a3b35bdb6f670b3876 jdk7u45-b33
+b5a83862ed2ab9cc2de3719e38c72519481a4bbb jdk7u45-b34
+7fda9b300e07738116b2b95b568229bdb4b31059 jdk7u45-b35
0a8b95184728548be4b20876e05f76e0262e4195 jdk7u51-b00
2450ace952f45202e5a3fd4f6a8356a196fe029e jdk7u51-b01
68def851cc6b17944756f1986734b323d8569571 jdk7u51-b02
@@ -395,3 +398,22 @@
70b5691c44d2830efd4301856e6223fa43894462 jdk7u51-b11
807946db29f42477e8d8390be01c7e27280bc85c jdk7u51-b12
114654a331e2f97a048d7ed43d06d7512e20e2c1 jdk7u51-b13
+3161567adae93d12c64b79592bda3046f0c0a22d jdk7u51-b30
+e85ee81daec2ea2fa21bf804d03431b0664c6dff jdk7u51-b31
+1a6c3258ad218bf286c47d65e4cd80eb6763f8df jdk7u51-b33
+9cdc04d76eb19a871c739625acd801ed1b24bed9 jdk7u51-b34
+807946db29f42477e8d8390be01c7e27280bc85c jdk7u55-b00
+bb7779a8fc4d14719e907b8890a2665476cf45ae jdk7u55-b01
+8275dc4db7f852edb331ae48d663d08b9ab2b5c7 jdk7u55-b02
+381e73f93a83e8d3bfd7dbf79f4f363a8fd6442f jdk7u55-b03
+c72c57f71c2ba6362d9ccfbf4743947b9ecefcac jdk7u55-b04
+5592b0c44617022e3c136eedfa1e98d4f254c964 jdk7u55-b05
+c59d714090080ad2e06f0ca5e8d354403059d8ce jdk7u55-b06
+125ea54089add3a16898b801a9989bf6cca05da6 jdk7u55-b07
+39337c00cb3ce29b4d67f6d247c3fa80f16cb49f jdk7u55-b08
+537f4f609132f3d6a4ce506c98f1dbd57f1320f8 jdk7u55-b09
+997bdd44d5de4aee319ff0a0d2892a912d9de6f5 jdk7u55-b09
+606483a43e8b6317d84922b9ed2b2c30d9e77419 jdk7u55-b10
+f3f02e67d867ae25cd4f3b9bc39a4fd17f593126 jdk7u55-b11
+708a1872f5bb8ba58ecc9fcbf4e12e6fa4783998 jdk7u55-b12
+14719f73596f5c90e3f46c0f4312f32e5b105edd jdk7u55-b13
--- ./jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xalan/internal/utils/ObjectFactory.java Tue Mar 18 12:34:22 2014 -0700
@@ -54,8 +54,8 @@
//
// Constants
//
- private static final String XALAN_INTERNAL = "com.sun.org.apache.xalan.internal";
- private static final String XERCES_INTERNAL = "com.sun.org.apache.xerces.internal";
+ private static final String JAXP_INTERNAL = "com.sun.org.apache";
+ private static final String STAX_INTERNAL = "com.sun.xml.internal";
// name of default properties file to look for in JDK's jre/lib directory
private static final String DEFAULT_PROPERTIES_FILENAME =
@@ -497,12 +497,8 @@
public static Class findProviderClass(String className, boolean doFallback)
throws ClassNotFoundException, ConfigurationError
{
- if (System.getSecurityManager()!=null) {
- return Class.forName(className);
- } else {
- return findProviderClass (className,
+ return findProviderClass (className,
findClassLoader (), doFallback);
- }
}
/**
@@ -517,8 +513,8 @@
SecurityManager security = System.getSecurityManager();
try{
if (security != null){
- if (className.startsWith(XALAN_INTERNAL) ||
- className.startsWith(XERCES_INTERNAL)) {
+ if (className.startsWith(JAXP_INTERNAL) ||
+ className.startsWith(STAX_INTERNAL)) {
cl = null;
} else {
final int lastDot = className.lastIndexOf(".");
@@ -533,16 +529,7 @@
Class providerClass;
if (cl == null) {
- // XXX Use the bootstrap ClassLoader. There is no way to
- // load a class using the bootstrap ClassLoader that works
- // in both JDK 1.1 and Java 2. However, this should still
- // work b/c the following should be true:
- //
- // (cl == null) iff current ClassLoader == null
- //
- // Thus Class.forName(String) will use the current
- // ClassLoader which will be the bootstrap ClassLoader.
- providerClass = Class.forName(className);
+ providerClass = Class.forName(className, false, ObjectFactory.class.getClassLoader());
} else {
try {
providerClass = cl.loadClass(className);
--- ./jaxp/src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xalan/internal/utils/SecuritySupport.java Tue Mar 18 12:34:22 2014 -0700
@@ -57,7 +57,7 @@
return securitySupport;
}
- static ClassLoader getContextClassLoader() {
+ public static ClassLoader getContextClassLoader() {
return (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
ClassLoader cl = null;
--- ./jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xerces/internal/utils/ObjectFactory.java Tue Mar 18 12:34:22 2014 -0700
@@ -48,7 +48,8 @@
//
// Constants
//
- private static final String DEFAULT_INTERNAL_CLASSES = "com.sun.org.apache.";
+ private static final String JAXP_INTERNAL = "com.sun.org.apache";
+ private static final String STAX_INTERNAL = "com.sun.xml.internal";
// name of default properties file to look for in JDK's jre/lib directory
private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";
@@ -288,12 +289,8 @@
public static Class findProviderClass(String className, boolean doFallback)
throws ClassNotFoundException, ConfigurationError
{
- if (System.getSecurityManager()!=null) {
- return Class.forName(className);
- } else {
- return findProviderClass (className,
+ return findProviderClass (className,
findClassLoader (), doFallback);
- }
}
/**
* Find a Class using the specified ClassLoader
@@ -306,7 +303,8 @@
//restrict the access to package as speicified in java.security policy
SecurityManager security = System.getSecurityManager();
if (security != null) {
- if (className.startsWith(DEFAULT_INTERNAL_CLASSES)) {
+ if (className.startsWith(JAXP_INTERNAL) ||
+ className.startsWith(STAX_INTERNAL)) {
cl = null;
} else {
final int lastDot = className.lastIndexOf(".");
@@ -318,7 +316,7 @@
Class providerClass;
if (cl == null) {
//use the bootstrap ClassLoader.
- providerClass = Class.forName(className);
+ providerClass = Class.forName(className, false, ObjectFactory.class.getClassLoader());
} else {
try {
providerClass = cl.loadClass(className);
--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/CharInfo.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/CharInfo.java Tue Mar 18 12:34:22 2014 -0700
@@ -22,6 +22,11 @@
*/
package com.sun.org.apache.xml.internal.serializer;
+import com.sun.org.apache.xalan.internal.utils.SecuritySupport;
+import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
+import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
+import com.sun.org.apache.xml.internal.serializer.utils.Utils;
+import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -29,19 +34,11 @@
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
import javax.xml.transform.TransformerException;
-import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
-import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
-import com.sun.org.apache.xml.internal.serializer.utils.Utils;
-import com.sun.org.apache.xml.internal.serializer.utils.WrappedRuntimeException;
-import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
-
/**
* This class provides services that tell if a character should have
* special treatement, such as entity reference substitution or normalization
@@ -176,13 +173,19 @@
// file
// 3) try treating the resource a URI
- if (internal) {
- try {
+ try {
+ if (internal) {
// Load entity property files by using PropertyResourceBundle,
// cause of security issure for applets
entities = PropertyResourceBundle.getBundle(entitiesResource);
- } catch (Exception e) {}
- }
+ } else {
+ ClassLoader cl = SecuritySupport.getContextClassLoader();
+ if (cl != null) {
+ entities = PropertyResourceBundle.getBundle(entitiesResource,
+ Locale.getDefault(), cl);
+ }
+ }
+ } catch (Exception e) {}
if (entities != null) {
Enumeration keys = entities.getKeys();
@@ -198,6 +201,7 @@
set(S_CARRIAGERETURN);
} else {
InputStream is = null;
+ String err = null;
// Load user specified resource file by using URL loading, it
// requires a valid URI as parameter
@@ -205,18 +209,22 @@
if (internal) {
is = CharInfo.class.getResourceAsStream(entitiesResource);
} else {
- ClassLoader cl = ObjectFactory.findClassLoader();
- if (cl == null) {
- is = ClassLoader.getSystemResourceAsStream(entitiesResource);
- } else {
- is = cl.getResourceAsStream(entitiesResource);
+ ClassLoader cl = SecuritySupport.getContextClassLoader();
+ if (cl != null) {
+ try {
+ is = cl.getResourceAsStream(entitiesResource);
+ } catch (Exception e) {
+ err = e.getMessage();
+ }
}
if (is == null) {
try {
URL url = new URL(entitiesResource);
is = url.openStream();
- } catch (Exception e) {}
+ } catch (Exception e) {
+ err = e.getMessage();
+ }
}
}
@@ -224,7 +232,7 @@
throw new RuntimeException(
Utils.messages.createMessage(
MsgKey.ER_RESOURCE_COULD_NOT_FIND,
- new Object[] {entitiesResource, entitiesResource}));
+ new Object[] {entitiesResource, err}));
}
// Fix Bugzilla#4000: force reading in UTF-8
@@ -456,64 +464,56 @@
return isCleanTextASCII[value];
}
-// In the future one might want to use the array directly and avoid
-// the method call, but I think the JIT alreay inlines this well enough
-// so don't do it (for now) - bjm
-// public final boolean[] getASCIIClean()
-// {
-// return isCleanTextASCII;
-// }
+ /**
+ * Read an internal resource file that describes the mapping of
+ * characters to entity references; Construct a CharInfo object.
+ *
+ * @param entitiesFileName Name of entities resource file that should
+ * be loaded, which describes the mapping of characters to entity references.
+ * @param method the output method type, which should be one of "xml", "html", and "text".
+ * @return an instance of CharInfo
+ *
+ * @xsl.usage internal
+ */
+ static CharInfo getCharInfoInternal(String entitiesFileName, String method)
+ {
+ CharInfo charInfo = (CharInfo) m_getCharInfoCache.get(entitiesFileName);
+ if (charInfo != null) {
+ return charInfo;
+ }
- private static CharInfo getCharInfoBasedOnPrivilege(
- final String entitiesFileName, final String method,
- final boolean internal){
- return (CharInfo) AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- return new CharInfo(entitiesFileName,
- method, internal);}
- });
+ charInfo = new CharInfo(entitiesFileName, method, true);
+ m_getCharInfoCache.put(entitiesFileName, charInfo);
+ return charInfo;
}
/**
- * Factory that reads in a resource file that describes the mapping of
- * characters to entity references.
+ * Constructs a CharInfo object using the following process to try reading
+ * the entitiesFileName parameter:
*
- * Resource files must be encoded in UTF-8 and have a format like:
+ * 1) attempt to load it as a ResourceBundle
+ * 2) try using the class loader to find the specified file
+ * 3) try opening it as an URI
+ *
+ * In case of 2 and 3, the resource file must be encoded in UTF-8 and have the
+ * following format:
* <pre>
* # First char # is a comment
* Entity numericValue
* quot 34
* amp 38
* </pre>
- * (Note: Why don't we just switch to .properties files? Oct-01 -sc)
*
- * @param entitiesResource Name of entities resource file that should
- * be loaded, which describes that mapping of characters to entity references.
- * @param method the output method type, which should be one of "xml", "html", "text"...
- *
- * @xsl.usage internal
+ * @param entitiesFileName Name of entities resource file that should
+ * be loaded, which describes the mapping of characters to entity references.
+ * @param method the output method type, which should be one of "xml", "html", and "text".
+ * @return an instance of CharInfo
*/
static CharInfo getCharInfo(String entitiesFileName, String method)
{
- CharInfo charInfo = (CharInfo) m_getCharInfoCache.get(entitiesFileName);
- if (charInfo != null) {
- return charInfo;
- }
-
- // try to load it internally - cache
try {
- charInfo = getCharInfoBasedOnPrivilege(entitiesFileName,
- method, true);
- m_getCharInfoCache.put(entitiesFileName, charInfo);
- return charInfo;
- } catch (Exception e) {}
-
- // try to load it externally - do not cache
- try {
- return getCharInfoBasedOnPrivilege(entitiesFileName,
- method, false);
+ return new CharInfo(entitiesFileName, method, false);
} catch (Exception e) {}
String absoluteEntitiesFileName;
@@ -530,8 +530,7 @@
}
}
- return getCharInfoBasedOnPrivilege(entitiesFileName,
- method, false);
+ return new CharInfo(absoluteEntitiesFileName, method, false);
}
/** Table of user-specified char infos. */
--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToHTMLStream.java Tue Mar 18 12:34:22 2014 -0700
@@ -60,7 +60,7 @@
*/
private static final CharInfo m_htmlcharInfo =
// new CharInfo(CharInfo.HTML_ENTITIES_RESOURCE);
- CharInfo.getCharInfo(CharInfo.HTML_ENTITIES_RESOURCE, Method.HTML);
+ CharInfo.getCharInfoInternal(CharInfo.HTML_ENTITIES_RESOURCE, Method.HTML);
/** A digital search trie for fast, case insensitive lookup of ElemDesc objects. */
static final Trie m_elementFlags = new Trie();
--- ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToXMLStream.java Thu Dec 19 09:01:08 2013 -0800
+++ ./jaxp/src/com/sun/org/apache/xml/internal/serializer/ToXMLStream.java Tue Mar 18 12:34:22 2014 -0700
@@ -58,7 +58,7 @@
*/
private static CharInfo m_xmlcharInfo =
// new CharInfo(CharInfo.XML_ENTITIES_RESOURCE);
- CharInfo.getCharInfo(CharInfo.XML_ENTITIES_RESOURCE, Method.XML);
+ CharInfo.getCharInfoInternal(CharInfo.XML_ENTITIES_RESOURCE, Method.XML);
/**
* Default constructor.
--- ./jaxws/.hgtags Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/.hgtags Tue Mar 18 12:34:51 2014 -0700
@@ -381,6 +381,9 @@
65b0f3ccdc8bcff0d79e1b543a8cefb817529b3f jdk7u45-b18
c32c6a662d18d7195fc02125178c7543ce09bb00 jdk7u45-b30
6802a1c098c48b2c8336e06f1565254759025bab jdk7u45-b31
+e040abab3625fbced33b30cba7c0307236268211 jdk7u45-b33
+e7df5d6b23c64509672d262187f51cde14db4e66 jdk7u45-b34
+c654ba4b2392c2913f45b495a2ea0c53cc348d98 jdk7u45-b35
5524cced32d3959d95ed414add230273bc10c38d jdk7u51-b00
db9e3328f393313e52cbf3fee5236aa2429028d0 jdk7u51-b01
92a4787cb3617005a329fb49247c550e8d7eb47a jdk7u51-b02
@@ -395,3 +398,22 @@
708507f4795cad1f0cf7e19ff2dc16fe9d441754 jdk7u51-b11
7c7c2ea4b6808d0abf7fd48d11440d75b0c08d3a jdk7u51-b12
81a1b110f70c37d2c2f0de7c0ef3bd2d04aba475 jdk7u51-b13
+5dbeb9983f104be717da35c9b14923d71dd248d7 jdk7u51-b30
+eb79f394916efba85f4f6c7ef562966699f2c1e8 jdk7u51-b31
+b2e40219fdcb579d9e10bf01bbd1f05ddcc936fb jdk7u51-b33
+f782f513bb1c74640fe0f4711fec6a417845e9e9 jdk7u51-b34
+7c7c2ea4b6808d0abf7fd48d11440d75b0c08d3a jdk7u55-b00
+c5eb0c2a0f9715b510bc641506fb90df9bf05ab0 jdk7u55-b01
+a257072fc2aa482abd6ffa28e235dbe532af6d00 jdk7u55-b02
+2916fdfc475bf29bc702887bf5ba02df67c98916 jdk7u55-b03
+f4759b4547602b3bc865db8c5f356f46979c6389 jdk7u55-b04
+8a8dfdbc66149b89f804c5a50e4692c2520569ae jdk7u55-b05
+2696d6747826cea92a97b2d80be4a59ff99462bd jdk7u55-b06
+1ad971afe2b5db93420654fa65b23f827760fed7 jdk7u55-b07
+57ba92e96b7fb6f4543038c1daa390c45d8a9d84 jdk7u55-b08
+c9d8555964a581486f4c8e1bf5f5db678eb3b9f2 jdk7u55-b09
+0f469a7307b98e911aaaab8cad781eab3bd94ad6 jdk7u55-b09
+1080e907d64ab63c6138b1a61d9e5b826e83634a jdk7u55-b10
+0db5b891d1ba10211da0a8158551b35f00da7684 jdk7u55-b11
+3834eb921dfd8d29d917a0c57bb9fdd9aa58c209 jdk7u55-b12
+3b0da73591b1ea23c48aa7babc34ed776fc183f0 jdk7u55-b13
--- ./jaxws/src/share/jaf_classes/javax/activation/CommandMap.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaf_classes/javax/activation/CommandMap.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,9 @@
package javax.activation;
+import java.util.Map;
+import java.util.WeakHashMap;
+
/**
* The CommandMap class provides an interface to a registry of
@@ -38,6 +41,8 @@
*/
public abstract class CommandMap {
private static CommandMap defaultCommandMap = null;
+ private static Map<ClassLoader,CommandMap> map =
+ new WeakHashMap<ClassLoader,CommandMap>();
/**
* Get the default CommandMap.
@@ -56,11 +61,18 @@
*
* @return the CommandMap
*/
- public static CommandMap getDefaultCommandMap() {
- if (defaultCommandMap == null)
- defaultCommandMap = new MailcapCommandMap();
+ public static synchronized CommandMap getDefaultCommandMap() {
+ if (defaultCommandMap != null)
+ return defaultCommandMap;
- return defaultCommandMap;
+ // fetch per-thread-context-class-loader default
+ ClassLoader tccl = SecuritySupport.getContextClassLoader();
+ CommandMap def = map.get(tccl);
+ if (def == null) {
+ def = new MailcapCommandMap();
+ map.put(tccl, def);
+ }
+ return def;
}
/**
@@ -71,7 +83,7 @@
* @exception SecurityException if the caller doesn't have permission
* to change the default
*/
- public static void setDefaultCommandMap(CommandMap commandMap) {
+ public static synchronized void setDefaultCommandMap(CommandMap commandMap) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
@@ -79,13 +91,16 @@
security.checkSetFactory();
} catch (SecurityException ex) {
// otherwise, we also allow it if this code and the
- // factory come from the same class loader (e.g.,
+ // factory come from the same (non-system) class loader (e.g.,
// the JAF classes were loaded with the applet classes).
- if (CommandMap.class.getClassLoader() !=
+ if (CommandMap.class.getClassLoader() == null ||
+ CommandMap.class.getClassLoader() !=
commandMap.getClass().getClassLoader())
throw ex;
}
}
+ // remove any per-thread-context-class-loader CommandMap
+ map.remove(SecuritySupport.getContextClassLoader());
defaultCommandMap = commandMap;
}
--- ./jaxws/src/share/jaf_classes/javax/activation/DataHandler.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaf_classes/javax/activation/DataHandler.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -368,7 +368,12 @@
// if it's not set, set it...
if (transferFlavors == emptyFlavors)
transferFlavors = getDataContentHandler().getTransferDataFlavors();
- return transferFlavors;
+
+ if (transferFlavors == emptyFlavors)
+ return transferFlavors;
+ else
+ return transferFlavors.clone();
+
}
/**
--- ./jaxws/src/share/jaf_classes/javax/activation/FileTypeMap.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaf_classes/javax/activation/FileTypeMap.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,8 @@
package javax.activation;
import java.io.File;
+import java.util.Map;
+import java.util.WeakHashMap;
/**
* The FileTypeMap is an abstract class that provides a data typing
@@ -48,6 +50,8 @@
public abstract class FileTypeMap {
private static FileTypeMap defaultMap = null;
+ private static Map<ClassLoader,FileTypeMap> map =
+ new WeakHashMap<ClassLoader,FileTypeMap>();
/**
* The default constructor.
@@ -78,11 +82,11 @@
* Sets the default FileTypeMap for the system. This instance
* will be returned to callers of getDefaultFileTypeMap.
*
- * @param map The FileTypeMap.
+ * @param fileTypeMap The FileTypeMap.
* @exception SecurityException if the caller doesn't have permission
* to change the default
*/
- public static void setDefaultFileTypeMap(FileTypeMap map) {
+ public static synchronized void setDefaultFileTypeMap(FileTypeMap fileTypeMap) {
SecurityManager security = System.getSecurityManager();
if (security != null) {
try {
@@ -90,14 +94,17 @@
security.checkSetFactory();
} catch (SecurityException ex) {
// otherwise, we also allow it if this code and the
- // factory come from the same class loader (e.g.,
+ // factory come from the same (non-system) class loader (e.g.,
// the JAF classes were loaded with the applet classes).
- if (FileTypeMap.class.getClassLoader() !=
- map.getClass().getClassLoader())
+ if (FileTypeMap.class.getClassLoader() == null ||
+ FileTypeMap.class.getClassLoader() !=
+ fileTypeMap.getClass().getClassLoader())
throw ex;
}
}
- defaultMap = map;
+ // remove any per-thread-context-class-loader FileTypeMap
+ map.remove(SecuritySupport.getContextClassLoader());
+ defaultMap = fileTypeMap;
}
/**
@@ -109,10 +116,17 @@
* @return The default FileTypeMap
* @see javax.activation.FileTypeMap#setDefaultFileTypeMap
*/
- public static FileTypeMap getDefaultFileTypeMap() {
- // XXX - probably should be synchronized
- if (defaultMap == null)
- defaultMap = new MimetypesFileTypeMap();
- return defaultMap;
+ public static synchronized FileTypeMap getDefaultFileTypeMap() {
+ if (defaultMap != null)
+ return defaultMap;
+
+ // fetch per-thread-context-class-loader default
+ ClassLoader tccl = SecuritySupport.getContextClassLoader();
+ FileTypeMap def = map.get(tccl);
+ if (def == null) {
+ def = new MimetypesFileTypeMap();
+ map.put(tccl, def);
+ }
+ return def;
}
}
--- ./jaxws/src/share/jaf_classes/javax/activation/MailcapCommandMap.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaf_classes/javax/activation/MailcapCommandMap.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -120,11 +120,7 @@
public class MailcapCommandMap extends CommandMap {
/*
* We manage a collection of databases, searched in order.
- * The default database is shared between all instances
- * of this class.
- * XXX - Can we safely share more databases between instances?
*/
- private static MailcapFile defDB = null;
private MailcapFile[] DB;
private static final int PROG = 0; // programmatically added entries
@@ -164,14 +160,10 @@
loadAllResources(dbv, "META-INF/mailcap");
LogSupport.log("MailcapCommandMap: load DEF");
- synchronized (MailcapCommandMap.class) {
- // see if another instance has created this yet.
- if (defDB == null)
- defDB = loadResource("/META-INF/mailcap.default");
- }
+ mf = loadResource("/META-INF/mailcap.default");
- if (defDB != null)
- dbv.add(defDB);
+ if (mf != null)
+ dbv.add(mf);
DB = new MailcapFile[dbv.size()];
DB = (MailcapFile[])dbv.toArray(DB);
--- ./jaxws/src/share/jaf_classes/javax/activation/MimetypesFileTypeMap.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaf_classes/javax/activation/MimetypesFileTypeMap.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,11 +69,7 @@
public class MimetypesFileTypeMap extends FileTypeMap {
/*
* We manage a collection of databases, searched in order.
- * The default database is shared between all instances
- * of this class.
- * XXX - Can we safely share more databases between instances?
*/
- private static MimeTypeFile defDB = null;
private MimeTypeFile[] DB;
private static final int PROG = 0; // programmatically added entries
@@ -114,14 +110,10 @@
loadAllResources(dbv, "META-INF/mime.types");
LogSupport.log("MimetypesFileTypeMap: load DEF");
- synchronized (MimetypesFileTypeMap.class) {
- // see if another instance has created this yet.
- if (defDB == null)
- defDB = loadResource("/META-INF/mimetypes.default");
- }
+ mf = loadResource("/META-INF/mimetypes.default");
- if (defDB != null)
- dbv.addElement(defDB);
+ if (mf != null)
+ dbv.addElement(mf);
DB = new MimeTypeFile[dbv.size()];
dbv.copyInto(DB);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.internal.ws.wsdl.parser;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/Internalizer.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/Internalizer.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -65,8 +65,15 @@
* @author Vivek Pandey
*/
public class Internalizer {
- private static final XPathFactory xpf = XPathFactory.newInstance();
- private final XPath xpath = xpf.newXPath();
+
+ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
+ @Override
+ protected XPathFactory initialValue() throws Exception {
+ return XPathFactory.newInstance();
+ }
+ };
+
+ private final XPath xpath = xpf.get().newXPath();
private final WsimportOptions options;
private final DOMForest forest;
private final ErrorReceiver errorReceiver;
--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/ws/wsdl/parser/JAXWSBindingExtensionHandler.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -56,8 +56,14 @@
*/
public class JAXWSBindingExtensionHandler extends AbstractExtensionHandler {
- private static final XPathFactory xpf = XPathFactory.newInstance();
- private final XPath xpath = xpf.newXPath();
+ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
+ @Override
+ protected XPathFactory initialValue() throws Exception {
+ return XPathFactory.newInstance();
+ }
+ };
+
+ private final XPath xpath = xpf.get().newXPath();
public JAXWSBindingExtensionHandler(Map<String, AbstractExtensionHandler> extensionHandlerMap) {
super(extensionHandlerMap);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.internal.xjc.reader.internalizer;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/Internalizer.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/reader/internalizer/Internalizer.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -75,9 +75,14 @@
private static final String WSDL_NS = "http://schemas.xmlsoap.org/wsdl/";
- private static final XPathFactory xpf = XPathFactory.newInstance();
+ private static final ContextClassloaderLocal<XPathFactory> xpf = new ContextClassloaderLocal<XPathFactory>() {
+ @Override
+ protected XPathFactory initialValue() throws Exception {
+ return XPathFactory.newInstance();
+ }
+ };
- private final XPath xpath = xpf.newXPath();
+ private final XPath xpath = xpf.get().newXPath();
/**
* Internalize all &lt;jaxb:bindings> customizations in the given forest.
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,9 +27,14 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.Calendar;
+import java.util.Collections;
import java.util.GregorianCalendar;
+import java.util.Map;
import java.util.TimeZone;
+import java.util.WeakHashMap;
import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.DatatypeConverterInterface;
@@ -352,7 +357,7 @@
public static GregorianCalendar _parseDateTime(CharSequence s) {
String val = WhiteSpaceProcessor.trim(s).toString();
- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
+ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
}
public static String _printDateTime(Calendar val) {
@@ -718,14 +723,30 @@
}
return false;
}
- private static final DatatypeFactory datatypeFactory;
- static {
- try {
- datatypeFactory = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- throw new Error(e);
+ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
+
+ public static DatatypeFactory getDatatypeFactory() {
+ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ DatatypeFactory df = DF_CACHE.get(tccl);
+ if (df == null) {
+ synchronized (DatatypeConverterImpl.class) {
+ df = DF_CACHE.get(tccl);
+ if (df == null) { // to prevent multiple initialization
+ try {
+ df = DatatypeFactory.newInstance();
+ } catch (DatatypeConfigurationException e) {
+ throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
+ }
+ DF_CACHE.put(tccl, df);
+ }
+ }
}
+ return df;
}
private static final class CalendarFormatter {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.bind;
+
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+
+/**
+ * Message resources
+ */
+enum Messages {
+ FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
+ ;
+
+ private static final ResourceBundle rb = ResourceBundle.getBundle(Messages.class.getName());
+
+ @Override
+ public String toString() {
+ return format();
+ }
+
+ public String format( Object... args ) {
+ return MessageFormat.format( rb.getString(name()), args );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+FAILED_TO_INITIALE_DATATYPE_FACTORY = \
+ Failed to initialize JAXP 1.3 DatatypeFactory class.
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,7 +60,6 @@
PROPERTY_ORDER_CONTAINS_UNUSED_ENTRY, // 2 args
INVALID_XML_ENUM_VALUE, // 2 arg
- FAILED_TO_INITIALE_DATATYPE_FACTORY, // 0 args
NO_IMAGE_WRITER, // 1 arg
ILLEGAL_MIME_TYPE, // 2 args
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Messages.properties Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -86,9 +86,6 @@
INVALID_XML_ENUM_VALUE = \
"{0}" is not a valid value for {1}.
-FAILED_TO_INITIALE_DATATYPE_FACTORY = \
- Failed to initialize JAXP 1.3 DatatypeFactory class.
-
NO_IMAGE_WRITER = \
No javax.imageio.ImageWriter is available for the specified MIME type "{0}"
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,9 +60,7 @@
import javax.imageio.stream.ImageOutputStream;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.helpers.ValidationEventImpl;
-import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
-import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
@@ -565,7 +563,8 @@
public XMLGregorianCalendar parse(CharSequence lexical) throws SAXException {
try {
- return datatypeFactory.newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
+ return DatatypeConverterImpl.getDatatypeFactory()
+ .newXMLGregorianCalendar(lexical.toString().trim()); // (.trim() - issue 396)
} catch (Exception e) {
UnmarshallingContext.getInstance().handleError(e);
return null;
@@ -835,7 +834,7 @@
public Duration parse(CharSequence lexical) {
TODO.checkSpec("JSR222 Issue #42");
- return datatypeFactory.newDuration(lexical.toString());
+ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
}
});
primaryList.add(
@@ -876,21 +875,6 @@
}
}
-
- /**
- * Cached instance of {@link DatatypeFactory} to create
- * {@link XMLGregorianCalendar} and {@link Duration}.
- */
- private static final DatatypeFactory datatypeFactory = init();
-
- private static DatatypeFactory init() {
- try {
- return DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- throw new Error(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY.format(),e);
- }
- }
-
private static void checkXmlGregorianCalendarFieldRef(QName type,
XMLGregorianCalendar cal)throws javax.xml.bind.MarshalException{
StringBuilder buf = new StringBuilder();
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,6 @@
import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl;
import com.sun.xml.internal.bind.v2.runtime.XMLSerializer;
-import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
import org.xml.sax.SAXException;
@@ -153,7 +152,6 @@
}
}
-
/**
* Reference to FI's XMLStreamWriter class, if FI can be loaded.
*/
@@ -162,9 +160,8 @@
private static Class initFIStAXWriterClass() {
try {
- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
- Class llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter", true, loader);
- Class sds = loader.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
+ Class<?> llfisw = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.LowLevelFastInfosetStreamWriter");
+ Class<?> sds = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentSerializer");
// Check if StAXDocumentSerializer implements LowLevelFastInfosetStreamWriter
if (llfisw.isAssignableFrom(sds))
return sds;
@@ -179,8 +176,7 @@
try {
if (FI_STAX_WRITER_CLASS == null)
return null;
- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput", true, loader);
+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.FastInfosetStreamWriterOutput");
return c.getConstructor(FI_STAX_WRITER_CLASS, JAXBContextImpl.class);
} catch (Throwable e) {
return null;
@@ -195,8 +191,7 @@
private static Class initStAXExWriterClass() {
try {
- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
- return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx",true,loader);
+ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamWriterEx");
} catch (Throwable e) {
return null;
}
@@ -204,8 +199,7 @@
private static Constructor<? extends XmlOutput> initStAXExOutputClass() {
try {
- ClassLoader loader = ClassLoaderRetriever.getClassLoader();
- Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput",true, loader);
+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput");
return c.getConstructor(STAXEX_WRITER_CLASS);
} catch (Throwable e) {
return null;
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/unmarshaller/StAXStreamConnector.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,6 @@
import javax.xml.stream.XMLStreamReader;
import com.sun.xml.internal.bind.WhiteSpaceProcessor;
-import com.sun.xml.internal.bind.v2.util.ClassLoaderRetriever;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
@@ -337,9 +336,8 @@
private static Class initFIStAXReaderClass() {
try {
- ClassLoader cl = getClassLoader();
- Class fisr = cl.loadClass("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
- Class sdp = cl.loadClass("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
+ Class<?> fisr = Class.forName("com.sun.xml.internal.org.jvnet.fastinfoset.stax.FastInfosetStreamReader");
+ Class<?> sdp = Class.forName("com.sun.xml.internal.fastinfoset.stax.StAXDocumentParser");
// Check if StAXDocumentParser implements FastInfosetStreamReader
if (fisr.isAssignableFrom(sdp))
return sdp;
@@ -355,7 +353,7 @@
if (FI_STAX_READER_CLASS == null)
return null;
- Class c = getClassLoader().loadClass(
+ Class c = Class.forName(
"com.sun.xml.internal.bind.v2.runtime.unmarshaller.FastInfosetConnector");
return c.getConstructor(FI_STAX_READER_CLASS,XmlVisitor.class);
} catch (Throwable e) {
@@ -371,7 +369,7 @@
private static Class initStAXExReader() {
try {
- return getClassLoader().loadClass("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
+ return Class.forName("com.sun.xml.internal.org.jvnet.staxex.XMLStreamReaderEx");
} catch (Throwable e) {
return null;
}
@@ -379,15 +377,10 @@
private static Constructor<? extends StAXConnector> initStAXExConnector() {
try {
- Class c = getClassLoader().loadClass("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
+ Class c = Class.forName("com.sun.xml.internal.bind.v2.runtime.unmarshaller.StAXExConnector");
return c.getConstructor(STAX_EX_READER_CLASS,XmlVisitor.class);
} catch (Throwable e) {
return null;
}
}
-
- public static ClassLoader getClassLoader() {
- return ClassLoaderRetriever.getClassLoader();
- }
-
}
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/AttachmentPartImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -62,61 +62,6 @@
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
- static {
- try {
- CommandMap map = CommandMap.getDefaultCommandMap();
- if (map instanceof MailcapCommandMap) {
- MailcapCommandMap mailMap = (MailcapCommandMap) map;
- String hndlrStr = ";;x-java-content-handler=";
- mailMap.addMailcap(
- "text/xml"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
- mailMap.addMailcap(
- "application/xml"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
- mailMap.addMailcap(
- "application/fastinfoset"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
- /* Image DataContentHandler handles all image types
- mailMap.addMailcap(
- "image/jpeg"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.JpegDataContentHandler");
- mailMap.addMailcap(
- "image/gif"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.GifDataContentHandler"); */
- /*mailMap.addMailcap(
- "multipart/*"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");*/
- mailMap.addMailcap(
- "image/*"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
- mailMap.addMailcap(
- "text/plain"
- + hndlrStr
- + "com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
- } else {
- throw new SOAPExceptionImpl("Default CommandMap is not a MailcapCommandMap");
- }
- } catch (Throwable t) {
- log.log(
- Level.SEVERE,
- "SAAJ0508.soap.cannot.register.handlers",
- t);
- if (t instanceof RuntimeException) {
- throw (RuntimeException) t;
- } else {
- throw new RuntimeException(t.getLocalizedMessage());
- }
- }
- };
-
private final MimeHeaders headers;
private MimeBodyPart rawContent = null;
private DataHandler dataHandler = null;
@@ -126,6 +71,12 @@
public AttachmentPartImpl() {
headers = new MimeHeaders();
+
+ // initialization from here should cover most of cases;
+ // if not, it would be necessary to call
+ // AttachmentPartImpl.initializeJavaActivationHandlers()
+ // explicitly by programmer
+ initializeJavaActivationHandlers();
}
public AttachmentPartImpl(MIMEPart part) {
@@ -263,7 +214,7 @@
log.log(
Level.FINE,
"SAAJ0580.soap.set.Content-Type",
- new String[] { dataHandler.getContentType()});
+ new String[] { dataHandler.getContentType() });
setMimeHeader("Content-Type", dataHandler.getContentType());
}
@@ -405,7 +356,7 @@
throw new SOAPExceptionImpl(e.getLocalizedMessage());
} finally {
try {
- decoded.close();
+ decoded.close();
} catch (IOException ex) {
throw new SOAPException(ex);
}
@@ -608,4 +559,43 @@
return headers;
}
-}
+ public static void initializeJavaActivationHandlers() {
+ // DataHandler.writeTo() may search for DCH. So adding some default ones.
+ try {
+ CommandMap map = CommandMap.getDefaultCommandMap();
+ if (map instanceof MailcapCommandMap) {
+ MailcapCommandMap mailMap = (MailcapCommandMap) map;
+
+ // registering our DCH since javamail's DCH doesn't handle
+ if (!cmdMapInitialized(mailMap)) {
+ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
+ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler");
+ mailMap.addMailcap("application/fastinfoset;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.FastInfosetDataContentHandler");
+ mailMap.addMailcap("multipart/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.MultipartDataContentHandler");
+ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.ImageDataContentHandler");
+ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.messaging.saaj.soap.StringDataContentHandler");
+ }
+ }
+ } catch (Throwable t) {
+ // ignore the exception.
+ }
+ }
+
+ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
+
+ // checking fastinfoset handler, since this one is specific to SAAJ
+ CommandInfo[] commands = mailMap.getAllCommands("application/fastinfoset");
+ if (commands == null || commands.length == 0) {
+ return false;
+ }
+
+ String saajClassName = "com.sun.xml.internal.ws.binding.FastInfosetDataContentHandler";
+ for (CommandInfo command : commands) {
+ String commandClass = command.getCommandClass();
+ if (saajClassName.equals(commandClass)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.messaging.saaj.soap;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for StaticCache utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/EnvelopeFactory.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,14 @@
package com.sun.xml.internal.messaging.saaj.soap;
-import java.util.logging.Logger;
+import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
+import com.sun.xml.internal.messaging.saaj.util.JAXMStreamSource;
+import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
+import com.sun.xml.internal.messaging.saaj.util.ParserPool;
+import com.sun.xml.internal.messaging.saaj.util.RejectDoctypeSaxFilter;
+import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
import javax.xml.parsers.SAXParser;
import javax.xml.soap.SOAPException;
@@ -34,14 +41,7 @@
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-
-import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
-import com.sun.xml.internal.messaging.saaj.util.*;
-
-import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTransformer;
+import java.util.logging.Logger;
/**
* EnvelopeFactory creates SOAP Envelope objects using different
@@ -50,14 +50,19 @@
public class EnvelopeFactory {
protected static final Logger
- log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
- "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
+ log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
+ "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
- private static ParserPool parserPool = new ParserPool(5);
+ private static ContextClassloaderLocal<ParserPool> parserPool =
+ new ContextClassloaderLocal<ParserPool>() {
+ @Override
+ protected ParserPool initialValue() throws Exception {
+ return new ParserPool(5);
+ }
+ };
public static Envelope createEnvelope(Source src, SOAPPartImpl soapPart)
- throws SOAPException
- {
+ throws SOAPException {
// Insert SAX filter to disallow Document Type Declarations since
// they are not legal in SOAP
SAXParser saxParser = null;
@@ -73,15 +78,15 @@
}
}
try {
- saxParser = parserPool.get();
+ saxParser = parserPool.get().get();
} catch (Exception e) {
log.severe("SAAJ0601.util.newSAXParser.exception");
throw new SOAPExceptionImpl(
- "Couldn't get a SAX parser while constructing a envelope",
- e);
+ "Couldn't get a SAX parser while constructing a envelope",
+ e);
}
InputSource is = SAXSource.sourceToInputSource(src);
- if (is.getEncoding()== null && soapPart.getSourceCharsetEncoding() != null) {
+ if (is.getEncoding() == null && soapPart.getSourceCharsetEncoding() != null) {
is.setEncoding(soapPart.getSourceCharsetEncoding());
}
XMLReader rejectFilter;
@@ -90,15 +95,15 @@
} catch (Exception ex) {
log.severe("SAAJ0510.soap.cannot.create.envelope");
throw new SOAPExceptionImpl(
- "Unable to create envelope from given source: ",
- ex);
+ "Unable to create envelope from given source: ",
+ ex);
}
src = new SAXSource(rejectFilter, is);
}
try {
Transformer transformer =
- EfficientStreamingTransformer.newTransformer();
+ EfficientStreamingTransformer.newTransformer();
DOMResult result = new DOMResult(soapPart);
transformer.transform(src, result);
@@ -110,11 +115,11 @@
}
log.severe("SAAJ0511.soap.cannot.create.envelope");
throw new SOAPExceptionImpl(
- "Unable to create envelope from given source: ",
- ex);
+ "Unable to create envelope from given source: ",
+ ex);
} finally {
if (saxParser != null) {
- parserPool.returnParser(saxParser);
+ parserPool.get().returnParser(saxParser);
}
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.stream.buffer;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/stream/buffer/XMLStreamBuffer.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -370,7 +370,12 @@
writeTo(handler, errorHandler, isFragment());
}
- private static final TransformerFactory trnsformerFactory = TransformerFactory.newInstance();
+ private static final ContextClassloaderLocal<TransformerFactory> trnsformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
+ @Override
+ protected TransformerFactory initialValue() throws Exception {
+ return TransformerFactory.newInstance();
+ }
+ };
/**
* Writes out the contents of this buffer as DOM node and append that to the given node.
@@ -382,7 +387,7 @@
*/
public final Node writeTo(Node n) throws XMLStreamBufferException {
try {
- Transformer t = trnsformerFactory.newTransformer();
+ Transformer t = trnsformerFactory.get().newTransformer();
t.transform(new XMLStreamBufferSource(this), new DOMResult(n));
return n.getLastChild();
} catch (TransformerException e) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.ws.api.streaming;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamReaderFactory.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -61,29 +61,32 @@
/**
* Singleton instance.
*/
- private static volatile @NotNull XMLStreamReaderFactory theInstance;
+ private static volatile ContextClassloaderLocal<XMLStreamReaderFactory> streamReader =
+ new ContextClassloaderLocal<XMLStreamReaderFactory>() {
- static {
- XMLInputFactory xif = getXMLInputFactory();
- XMLStreamReaderFactory f=null;
+ @Override
+ protected XMLStreamReaderFactory initialValue() {
+ XMLInputFactory xif = getXMLInputFactory();
+ XMLStreamReaderFactory f=null;
- // this system property can be used to disable the pooling altogether,
- // in case someone hits an issue with pooling in the production system.
- if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
- f = Zephyr.newInstance(xif);
+ // this system property can be used to disable the pooling altogether,
+ // in case someone hits an issue with pooling in the production system.
+ if(!getProperty(XMLStreamReaderFactory.class.getName()+".noPool"))
+ f = Zephyr.newInstance(xif);
- if(f==null) {
- // is this Woodstox?
- if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
- f = new Woodstox(xif);
+ if(f==null) {
+ // is this Woodstox?
+ if(xif.getClass().getName().equals("com.ctc.wstx.stax.WstxInputFactory"))
+ f = new Woodstox(xif);
+ }
+
+ if(f==null)
+ f = new Default();
+
+ LOGGER.fine("XMLStreamReaderFactory instance is = "+f);
+ return f;
}
-
- if(f==null)
- f = new Default();
-
- theInstance = f;
- LOGGER.fine("XMLStreamReaderFactory instance is = "+theInstance);
- }
+ };
private static XMLInputFactory getXMLInputFactory() {
XMLInputFactory xif = null;
@@ -109,11 +112,11 @@
*/
public static void set(XMLStreamReaderFactory f) {
if(f==null) throw new IllegalArgumentException();
- theInstance = f;
+ streamReader.set(f);
}
public static XMLStreamReaderFactory get() {
- return theInstance;
+ return streamReader.get();
}
public static XMLStreamReader create(InputSource source, boolean rejectDTDs) {
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,39 +57,41 @@
/**
* Singleton instance.
*/
- private static volatile @NotNull XMLStreamWriterFactory theInstance;
+ private static volatile ContextClassloaderLocal<XMLStreamWriterFactory> writerFactory =
+ new ContextClassloaderLocal<XMLStreamWriterFactory>() {
+ @Override
+ protected XMLStreamWriterFactory initialValue() {
+ XMLOutputFactory xof = null;
+ if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
+ try {
+ xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
+ } catch (Exception e) {
+ // Ignore and fallback to default XMLOutputFactory
+ }
+ }
+ if (xof == null) {
+ xof = XMLOutputFactory.newInstance();
+ }
- static {
- XMLOutputFactory xof = null;
- if (Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".woodstox")) {
- try {
- xof = (XMLOutputFactory)Class.forName("com.ctc.wstx.stax.WstxOutputFactory").newInstance();
- } catch (Exception e) {
- // Ignore and fallback to default XMLOutputFactory
+ XMLStreamWriterFactory f=null;
+
+ // this system property can be used to disable the pooling altogether,
+ // in case someone hits an issue with pooling in the production system.
+ if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
+ f = Zephyr.newInstance(xof);
+ if(f==null) {
+ // is this Woodstox?
+ if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
+ f = new NoLock(xof);
}
+ if (f == null)
+ f = new Default(xof);
+
+ LOGGER.fine("XMLStreamWriterFactory instance is = "+ f);
+ return f;
}
- if (xof == null) {
- xof = XMLOutputFactory.newInstance();
- }
-
- XMLStreamWriterFactory f=null;
-
- // this system property can be used to disable the pooling altogether,
- // in case someone hits an issue with pooling in the production system.
- if(!Boolean.getBoolean(XMLStreamWriterFactory.class.getName()+".noPool"))
- f = Zephyr.newInstance(xof);
- if(f==null) {
- // is this Woodstox?
- if(xof.getClass().getName().equals("com.ctc.wstx.stax.WstxOutputFactory"))
- f = new NoLock(xof);
- }
- if (f == null)
- f = new Default(xof);
-
- theInstance = f;
- LOGGER.fine("XMLStreamWriterFactory instance is = "+theInstance);
- }
+ };
/**
* See {@link #create(OutputStream)} for the contract.
@@ -152,7 +154,7 @@
* Gets the singleton instance.
*/
public static @NotNull XMLStreamWriterFactory get() {
- return theInstance;
+ return writerFactory.get();
}
/**
@@ -164,7 +166,7 @@
*/
public static void set(@NotNull XMLStreamWriterFactory f) {
if(f==null) throw new IllegalArgumentException();
- theInstance = f;
+ writerFactory.set(f);
}
/**
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/binding/BindingImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,9 @@
import com.sun.xml.internal.ws.developer.MemberSubmissionAddressingFeature;
import com.sun.xml.internal.ws.developer.BindingTypeFeature;
+import javax.activation.CommandInfo;
+import javax.activation.CommandMap;
+import javax.activation.MailcapCommandMap;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.soap.AddressingFeature;
@@ -109,9 +112,15 @@
return addressingVersion;
}
- public final
@NotNull
- Codec createCodec() {
+ public final Codec createCodec() {
+
+ // initialization from here should cover most of cases;
+ // if not, it would be necessary to call
+ // BindingImpl.initializeJavaActivationHandlers()
+ // explicitly by programmer
+ initializeJavaActivationHandlers();
+
return bindingId.createEncoder(this);
}
@@ -169,4 +178,48 @@
public void addFeature(@NotNull WebServiceFeature newFeature) {
features.add(newFeature);
}
+
+ public static void initializeJavaActivationHandlers() {
+ // DataHandler.writeTo() may search for DCH. So adding some default ones.
+ try {
+ CommandMap map = CommandMap.getDefaultCommandMap();
+ if (map instanceof MailcapCommandMap) {
+ MailcapCommandMap mailMap = (MailcapCommandMap) map;
+
+ // registering our DCH since javamail's DCH doesn't handle
+ if (!cmdMapInitialized(mailMap)) {
+ mailMap.addMailcap("text/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
+ mailMap.addMailcap("application/xml;;x-java-content-handler=com.sun.xml.internal.ws.encoding.XmlDataContentHandler");
+ mailMap.addMailcap("image/*;;x-java-content-handler=com.sun.xml.internal.ws.encoding.ImageDataContentHandler");
+ mailMap.addMailcap("text/plain;;x-java-content-handler=com.sun.xml.internal.ws.encoding.StringDataContentHandler");
+ }
+ }
+ } catch (Throwable t) {
+ // ignore the exception.
+ }
+ }
+
+ private static boolean cmdMapInitialized(MailcapCommandMap mailMap) {
+ CommandInfo[] commands = mailMap.getAllCommands("text/xml");
+ if (commands == null || commands.length == 0) {
+ return false;
+ }
+
+ // SAAJ RI implements it's own DataHandlers which can be used for JAX-WS too;
+ // see com.sun.xml.internal.messaging.saaj.soap.AttachmentPartImpl#initializeJavaActivationHandlers
+ // so if found any of SAAJ or our own handler registered, we are ok; anyway using SAAJ directly here
+ // is not good idea since we don't want standalone JAX-WS to depend on specific SAAJ impl.
+ // This is also reason for duplication of Handler's code by JAX-WS
+ String saajClassName = "com.sun.xml.internal.messaging.saaj.soap.XmlDataContentHandler";
+ String jaxwsClassName = "com.sun.xml.internal.ws.encoding.XmlDataContentHandler";
+ for (CommandInfo command : commands) {
+ String commandClass = command.getCommandClass();
+ if (saajClassName.equals(commandClass) ||
+ jaxwsClassName.equals(commandClass)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.ws.developer;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/developer/MemberSubmissionEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -64,7 +64,12 @@
@XmlType(name = "EndpointReferenceType", namespace = MemberSubmissionEndpointReference.MSNS)
public final class MemberSubmissionEndpointReference extends EndpointReference implements MemberSubmissionAddressingConstants {
- private final static JAXBContext msjc = MemberSubmissionEndpointReference.getMSJaxbContext();
+ private final static ContextClassloaderLocal<JAXBContext> msjc = new ContextClassloaderLocal<JAXBContext>() {
+ @Override
+ protected JAXBContext initialValue() throws Exception {
+ return MemberSubmissionEndpointReference.getMSJaxbContext();
+ }
+ };
public MemberSubmissionEndpointReference() {
}
@@ -85,7 +90,7 @@
throw new WebServiceException("Source parameter can not be null on constructor");
try {
- Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.createUnmarshaller();
+ Unmarshaller unmarshaller = MemberSubmissionEndpointReference.msjc.get().createUnmarshaller();
MemberSubmissionEndpointReference epr = unmarshaller.unmarshal(source,MemberSubmissionEndpointReference.class).getValue();
this.addr = epr.addr;
@@ -104,7 +109,7 @@
public void writeTo(Result result) {
try {
- Marshaller marshaller = MemberSubmissionEndpointReference.msjc.createMarshaller();
+ Marshaller marshaller = MemberSubmissionEndpointReference.msjc.get().createMarshaller();
//marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.marshal(this, result);
} catch (JAXBException e) {
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/encoding/MimeCodec.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,9 +34,6 @@
import com.sun.xml.internal.ws.api.pipe.ContentType;
import com.sun.xml.internal.ws.developer.StreamingAttachmentFeature;
-import javax.activation.CommandMap;
-import javax.activation.MailcapCommandMap;
-import javax.activation.DataContentHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -62,33 +59,6 @@
*/
abstract class MimeCodec implements Codec {
- static {
- // DataHandler.writeTo() may search for DCH. So adding some default ones.
- try {
- CommandMap map = CommandMap.getDefaultCommandMap();
- if (map instanceof MailcapCommandMap) {
- MailcapCommandMap mailMap = (MailcapCommandMap) map;
- String hndlrStr = ";;x-java-content-handler=";
- // registering our DCH since javamail's DCH doesn't handle
- // Source
- mailMap.addMailcap(
- "text/xml" + hndlrStr + XmlDataContentHandler.class.getName());
- mailMap.addMailcap(
- "application/xml" + hndlrStr + XmlDataContentHandler.class.getName());
- if (map.createDataContentHandler("image/*") == null) {
- mailMap.addMailcap(
- "image/*" + hndlrStr + ImageDataContentHandler.class.getName());
- }
- if (map.createDataContentHandler("text/plain") == null) {
- mailMap.addMailcap(
- "text/plain" + hndlrStr + StringDataContentHandler.class.getName());
- }
- }
- } catch (Throwable t) {
- // ignore the exception.
- }
- }
-
public static final String MULTIPART_RELATED_MIME_TYPE = "multipart/related";
private String boundary;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.ws.policy.sourcemodel.attach;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/policy/sourcemodel/attach/ExternalAttachmentsUnmarshaller.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -83,7 +83,13 @@
private static final QName POLICY = new QName("http://www.w3.org/ns/ws-policy", "Policy");
private static final QName URI = new QName("http://www.w3.org/ns/ws-policy", "URI");
private static final QName POLICIES = new QName(PolicyConstants.SUN_MANAGEMENT_NAMESPACE, "Policies");
- private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory.newInstance();
+ private static final ContextClassloaderLocal<XMLInputFactory> XML_INPUT_FACTORY = new ContextClassloaderLocal<XMLInputFactory>() {
+ @Override
+ protected XMLInputFactory initialValue() throws Exception {
+ return XMLInputFactory.newInstance();
+ }
+ };
+
private static final PolicyModelUnmarshaller POLICY_UNMARSHALLER = PolicyModelUnmarshaller.getXmlUnmarshaller();
private final Map<URI, Policy> map = new HashMap<URI, Policy>();
@@ -93,7 +99,7 @@
public static Map<URI, Policy> unmarshal(final Reader source) throws PolicyException {
LOGGER.entering(source);
try {
- XMLEventReader reader = XML_INPUT_FACTORY.createXMLEventReader(source);
+ XMLEventReader reader = XML_INPUT_FACTORY.get().createXMLEventReader(source);
ExternalAttachmentsUnmarshaller instance = new ExternalAttachmentsUnmarshaller();
final Map<URI, Policy> map = instance.unmarshal(reader, null);
LOGGER.exiting(map);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.ws.spi;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for StaticCache utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -77,7 +77,12 @@
*/
public class ProviderImpl extends Provider {
- private final static JAXBContext eprjc = getEPRJaxbContext();
+ private final static ContextClassloaderLocal<JAXBContext> eprjc = new ContextClassloaderLocal<JAXBContext>() {
+ @Override
+ protected JAXBContext initialValue() throws Exception {
+ return getEPRJaxbContext();
+ }
+ };
/**
* Convenient singleton instance.
@@ -140,7 +145,7 @@
return AccessController.doPrivileged(new PrivilegedAction<EndpointReference>() {
public EndpointReference run() {
try {
- Unmarshaller unmarshaller = eprjc.createUnmarshaller();
+ Unmarshaller unmarshaller = eprjc.get().createUnmarshaller();
return (EndpointReference) unmarshaller.unmarshal(eprInfoset);
} catch (JAXBException e) {
throw new WebServiceException("Error creating Marshaller or marshalling.", e);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.ws.util.xml;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for StaticCache utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -199,20 +199,28 @@
}
}
- static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
+ static final ContextClassloaderLocal<TransformerFactory> transformerFactory = new ContextClassloaderLocal<TransformerFactory>() {
+ @Override
+ protected TransformerFactory initialValue() throws Exception {
+ return TransformerFactory.newInstance();
+ }
+ };
- static final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
-
- static {
- saxParserFactory.setNamespaceAware(true);
- }
+ static final ContextClassloaderLocal<SAXParserFactory> saxParserFactory = new ContextClassloaderLocal<SAXParserFactory>() {
+ @Override
+ protected SAXParserFactory initialValue() throws Exception {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setNamespaceAware(true);
+ return factory;
+ }
+ };
/**
* Creates a new identity transformer.
*/
public static Transformer newTransformer() {
try {
- return transformerFactory.newTransformer();
+ return transformerFactory.get().newTransformer();
} catch (TransformerConfigurationException tex) {
throw new IllegalStateException("Unable to create a JAXP transformer");
}
@@ -227,9 +235,9 @@
// work around a bug in JAXP in JDK6u4 and earlier where the namespace processing
// is not turned on by default
StreamSource ssrc = (StreamSource) src;
- TransformerHandler th = ((SAXTransformerFactory) transformerFactory).newTransformerHandler();
+ TransformerHandler th = ((SAXTransformerFactory) transformerFactory.get()).newTransformerHandler();
th.setResult(result);
- XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();
+ XMLReader reader = saxParserFactory.get().newSAXParser().getXMLReader();
reader.setContentHandler(th);
reader.setProperty(LEXICAL_HANDLER_PROPERTY, th);
reader.parse(toInputSource(ssrc));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.java Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.xml.internal.xsom.util;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.text.MessageFormat;
+import java.util.ResourceBundle;
+import java.util.WeakHashMap;
+
+/**
+ * Simple utility ensuring that the value is cached only in case it is non-internal implementation
+ */
+abstract class ContextClassloaderLocal<V> {
+
+ private static final String FAILED_TO_CREATE_NEW_INSTANCE = "FAILED_TO_CREATE_NEW_INSTANCE";
+
+ private WeakHashMap<ClassLoader, V> CACHE = new WeakHashMap<ClassLoader, V>();
+
+ public V get() throws Error {
+ ClassLoader tccl = getContextClassLoader();
+ V instance = CACHE.get(tccl);
+ if (instance == null) {
+ instance = createNewInstance();
+ CACHE.put(tccl, instance);
+ }
+ return instance;
+ }
+
+ public void set(V instance) {
+ CACHE.put(getContextClassLoader(), instance);
+ }
+
+ protected abstract V initialValue() throws Exception;
+
+ private V createNewInstance() {
+ try {
+ return initialValue();
+ } catch (Exception e) {
+ throw new Error(format(FAILED_TO_CREATE_NEW_INSTANCE, getClass().getName()), e);
+ }
+ }
+
+ private static String format(String property, Object... args) {
+ String text = ResourceBundle.getBundle(ContextClassloaderLocal.class.getName()).getString(property);
+ return MessageFormat.format(text, args);
+ }
+
+ private static ClassLoader getContextClassLoader() {
+ return (ClassLoader)
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ ClassLoader cl = null;
+ try {
+ cl = Thread.currentThread().getContextClassLoader();
+ } catch (SecurityException ex) {
+ }
+ return cl;
+ }
+ });
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/ContextClassloaderLocal.properties Tue Mar 18 12:34:51 2014 -0700
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+# Error messages for ContextClassloaderLocal utility class
+FAILED_TO_CREATE_NEW_INSTANCE=Failed to create new instance of {0}
+
--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/xsom/util/DomAnnotationParserFactory.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,7 +60,12 @@
return new AnnotationParserImpl();
}
- private static final SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
+ private static final ContextClassloaderLocal<SAXTransformerFactory> stf = new ContextClassloaderLocal<SAXTransformerFactory>() {
+ @Override
+ protected SAXTransformerFactory initialValue() throws Exception {
+ return (SAXTransformerFactory) SAXTransformerFactory.newInstance();
+ }
+ };
private static class AnnotationParserImpl extends AnnotationParser {
@@ -72,7 +77,7 @@
AnnotationParserImpl() {
try {
- transformer = stf.newTransformerHandler();
+ transformer = stf.get().newTransformerHandler();
} catch (TransformerConfigurationException e) {
throw new Error(e); // impossible
}
--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/DatatypeConverterImpl.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,9 +27,14 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.Calendar;
+import java.util.Collections;
import java.util.GregorianCalendar;
+import java.util.Map;
import java.util.TimeZone;
+import java.util.WeakHashMap;
import javax.xml.namespace.QName;
import javax.xml.namespace.NamespaceContext;
@@ -418,7 +423,7 @@
public static GregorianCalendar _parseDateTime(CharSequence s) {
String val = WhiteSpaceProcessor.trim(s).toString();
- return datatypeFactory.newXMLGregorianCalendar(val).toGregorianCalendar();
+ return getDatatypeFactory().newXMLGregorianCalendar(val).toGregorianCalendar();
}
public String printDateTime(Calendar val) {
@@ -492,7 +497,7 @@
}
public Calendar parseTime(String lexicalXSDTime) {
- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
+ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDTime).toGregorianCalendar();
}
public String printTime(Calendar val) {
@@ -500,7 +505,7 @@
}
public Calendar parseDate(String lexicalXSDDate) {
- return datatypeFactory.newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
+ return getDatatypeFactory().newXMLGregorianCalendar(lexicalXSDDate).toGregorianCalendar();
}
public String printDate(Calendar val) {
@@ -882,14 +887,30 @@
}
return false;
}
- private static final DatatypeFactory datatypeFactory;
- static {
- try {
- datatypeFactory = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- throw new Error(e);
+ private static final Map<ClassLoader, DatatypeFactory> DF_CACHE = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DatatypeFactory>());
+
+ public static DatatypeFactory getDatatypeFactory() {
+ ClassLoader tccl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+ });
+ DatatypeFactory df = DF_CACHE.get(tccl);
+ if (df == null) {
+ synchronized (DatatypeConverterImpl.class) {
+ df = DF_CACHE.get(tccl);
+ if (df == null) { // to prevent multiple initialization
+ try {
+ df = DatatypeFactory.newInstance();
+ } catch (DatatypeConfigurationException e) {
+ throw new Error(Messages.format(Messages.FAILED_TO_INITIALE_DATATYPE_FACTORY), e);
+ }
+ DF_CACHE.put(tccl, df);
+ }
+ }
}
+ return df;
}
private static final class CalendarFormatter {
--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,4 +88,6 @@
static final String ILLEGAL_CAST = // 2 args
"JAXBContext.IllegalCast";
+
+ static final String FAILED_TO_INITIALE_DATATYPE_FACTORY = "FAILED_TO_INITIALE_DATATYPE_FACTORY";
}
--- ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/javax/xml/bind/Messages.properties Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -49,3 +49,6 @@
JAXBContext.IllegalCast = \
ClassCastException: attempting to cast {0} to {1}. Please make sure that you are specifying the proper ClassLoader.
+
+FAILED_TO_INITIALE_DATATYPE_FACTORY = \
+ Failed to initialize JAXP 1.3 DatatypeFactory class.
--- ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Thu Dec 19 09:01:10 2013 -0800
+++ ./jaxws/src/share/jaxws_classes/javax/xml/ws/wsaddressing/W3CEndpointReference.java Tue Mar 18 12:34:51 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,7 +69,7 @@
@XmlType(name="EndpointReferenceType",namespace=W3CEndpointReference.NS)
public final class W3CEndpointReference extends EndpointReference {
- private final static JAXBContext w3cjc = getW3CJaxbContext();
+ private final JAXBContext w3cjc = getW3CJaxbContext();
protected W3CEndpointReference() {
}
--- ./jdk/.hgtags Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/.hgtags Tue Mar 18 12:35:25 2014 -0700
@@ -365,6 +365,9 @@
c5ca4daec23b5e7f99ac8d684f5016ff8bfebbb0 jdk7u45-b18
4797f984f6c93c433aa797e9b2d8f904cf083f96 jdk7u45-b30
8c343a783777b8728cb819938f387db0acf7f3ac jdk7u45-b31
+402d54c7d8ce95f3945cc3d698e528e4adec7b9b jdk7u45-b33
+34e8f9f26ae612ebac36357eecbe70ea20e0233c jdk7u45-b34
+3dbb06a924cdf73d39b8543824ec88ae501ba5c6 jdk7u45-b35
3c9a6d9eafd31be44b0ade0354e60f5078b417a4 jdk7u51-b00
d76613074ff357d0664b97b4aaf99fbb65dcec47 jdk7u51-b01
fb057871f094ebe4906ad6856326768b01a62c45 jdk7u51-b02
@@ -379,3 +382,22 @@
f0425ecbbb0ca9d8c87c250c19e8f9524b38833d jdk7u51-b11
f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u51-b12
d19a89fdfb9b959b8638441d9d396685d6c7ab7b jdk7u51-b13
+ef58b2b9a9a1e1a42b0139b57816a160c4681371 jdk7u51-b30
+5bca0d0969b13b1d9b8caba3cce8293a98d68318 jdk7u51-b31
+e9143dc3dc2a8f4b896e74f70d6c503d73c40533 jdk7u51-b33
+c1eaf405fb8d7beddd75c6f81671970f6baa70d8 jdk7u51-b34
+f5eee4f1d5b4a1e19febc9c26c863ae853ed6d2e jdk7u55-b00
+5010db5b9b5ab07a9409a5c557d3f43ab32dc428 jdk7u55-b01
+2ca3e1fa4455ad564228ad6e654498167af2f20d jdk7u55-b02
+c12b3c81366cb067ff4444952209d54bfa387353 jdk7u55-b03
+476d1bddaa32bf440953c3b1814ba38f16886c03 jdk7u55-b04
+7fa6d3ba2cc77cd1e6f24e33f0c39788cb2893b8 jdk7u55-b05
+795654fce29c38d4c8504f760d8d8a36248d38ed jdk7u55-b06
+4b2ed892b195e95f7541aaa3b129a2caa5faae1d jdk7u55-b07
+db1323224053a18ecc62bdc1d3902d93b33f0b70 jdk7u55-b08
+534eeff29ac9fcbbb99ef8908548dbb368d04baf jdk7u55-b09
+d39dd4135844ca5c707bc39ae1d7e020d49880ce jdk7u55-b09
+b231536550067c3b00c77d0e035afe8faaa15581 jdk7u55-b10
+2d80b7cd7aae76f0909a210414317dcf846ad651 jdk7u55-b11
+07be5d5508733ed37c11fcd21a13ae3c8288313b jdk7u55-b12
+92fd166252c2701092a510002f4cf9285a20473d jdk7u55-b13
--- ./jdk/make/common/Defs-embedded.gmk Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/common/Defs-embedded.gmk Tue Mar 18 12:35:25 2014 -0700
@@ -71,7 +71,9 @@
# and it must be linked after fdlibm - this places it at the end after libc
# -z muldefs avoids linker errors for duplicate symbols.
ifeq ($(CROSS_COMPILE_ARCH), arm)
- EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
+ ifneq ($(EXT_LIBS_PATH),)
+ EXTRA_LIBS += $(EXT_LIBS_PATH)/sflt_glibc_jdk.a -Xlinker -z -Xlinker muldefs
+ endif
endif
endif
--- ./jdk/make/java/java/Exportedfiles.gmk Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/java/java/Exportedfiles.gmk Tue Mar 18 12:35:25 2014 -0700
@@ -50,6 +50,7 @@
java/lang/SecurityManager.java \
java/lang/Shutdown.java \
java/lang/Package.java \
+ java/lang/UNIXProcess.java \
java/lang/ref/Finalizer.java \
java/lang/reflect/AccessibleObject.java \
java/lang/reflect/Field.java \
--- ./jdk/make/java/java/Makefile Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/java/java/Makefile Tue Mar 18 12:35:25 2014 -0700
@@ -84,6 +84,7 @@
java/util/prefs/FileSystemPreferencesFactory.java \
FILES_c += UNIXProcess_md.c \
+ childproc.c \
UnixFileSystem_md.c \
canonicalize_md.c \
TimeZone.c \
@@ -451,3 +452,36 @@
clean::
$(RM) $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java
+
+HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper
+BUILDHELPER =
+ifeq ($(PLATFORM), solaris)
+ BUILDHELPER = 1
+endif
+ifeq ($(PLATFORM), macosx)
+ HELPER_EXE = $(LIBDIR)/jspawnhelper
+ BUILDHELPER = 1
+endif
+
+ARCHFLAG =
+ifeq ($(ARCH_DATA_MODEL), 64)
+ARCHFLAG = -m64
+endif
+
+ifdef BUILDHELPER
+
+HELPER_EXE_FILES_c = jspawnhelper.c
+HELPER_EXE_FILES_o = $(OBJDIR)/jspawnhelper.o \
+ $(OBJDIR)/childproc.o
+
+$(HELPER_EXE): $(HELPER_EXE_FILES_o)
+ $(CC) $(ARCHFLAG) $(HELPER_EXE_FILES_o) \
+ -o $(TEMPDIR)/jspawnhelper
+ $(CP) $(TEMPDIR)/jspawnhelper $(HELPER_EXE)
+
+build: $(HELPER_EXE)
+
+clean clobber::
+ $(RM) $(HELPER_EXE_FILES_o) $(HELPER_EXE)
+
+endif #BUILDHELPER
--- ./jdk/make/java/java/mapfile-vers Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/java/java/mapfile-vers Tue Mar 18 12:35:25 2014 -0700
@@ -215,7 +215,7 @@
Java_java_lang_Throwable_fillInStackTrace;
Java_java_lang_Throwable_getStackTraceDepth;
Java_java_lang_Throwable_getStackTraceElement;
- Java_java_lang_UNIXProcess_initIDs;
+ Java_java_lang_UNIXProcess_init;
Java_java_lang_UNIXProcess_waitForProcessExit;
Java_java_lang_UNIXProcess_forkAndExec;
Java_java_lang_UNIXProcess_destroyProcess;
--- ./jdk/make/sun/javazic/tzdata/VERSION Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/sun/javazic/tzdata/VERSION Tue Mar 18 12:35:25 2014 -0700
@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-tzdata2013h
+tzdata2013i
--- ./jdk/make/sun/javazic/tzdata/africa Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/sun/javazic/tzdata/africa Tue Mar 18 12:35:25 2014 -0700
@@ -500,14 +500,13 @@
Rule Libya 1997 only - Oct 4 0:00 0 -
Rule Libya 2013 only - Mar lastFri 1:00 1:00 S
Rule Libya 2013 only - Oct lastFri 2:00 0 -
-
-# The 1996 and 1997 entries are from Shanks & Pottenger;
-# the IATA SSIM data contain some obvious errors.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Tripoli 0:52:44 - LMT 1920
1:00 Libya CE%sT 1959
2:00 - EET 1982
1:00 Libya CE%sT 1990 May 4
+# The 1996 and 1997 entries are from Shanks & Pottenger;
+# the IATA SSIM data contain some obvious errors.
2:00 - EET 1996 Sep 30
1:00 Libya CE%sT 1997 Oct 4
2:00 - EET 2012 Nov 10 2:00
--- ./jdk/make/sun/javazic/tzdata/asia Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/sun/javazic/tzdata/asia Tue Mar 18 12:35:25 2014 -0700
@@ -1403,12 +1403,22 @@
# switch back to standard time this winter, so the will stay on DST
# until about the same time next year (at least).
# http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?NewsID=88950
-#
-# From Paul Eggert (2013-09-21):
-# It's looking like this change will be permanent; see
-# Petra News Agency, Cancelling winter saved Jordan $7 million (2013-02-20)
-# <http://www.albawaba.com/business/jordan-winter-electricity--472005>.
-# So move Jordan to UTC+3 as of the abovementioned date.
+
+# From Steffen Thorsen (2013-12-11):
+# Jordan Times and other sources say that Jordan is going back to
+# UTC+2 on 2013-12-19 at midnight:
+# http://jordantimes.com/govt-decides-to-switch-back-to-wintertime
+# Official, in Arabic:
+# http://www.petra.gov.jo/public_news/Nws_NewsDetails.aspx?Menu_ID=&Site_Id=2&lang=1&NewsID=133230&CatID=14
+# ... Our background/permalink about it
+# http://www.timeanddate.com/news/time/jordan-reverses-dst-decision.html
+# ...
+# http://www.petra.gov.jo/Public_News/Nws_NewsDetails.aspx?lang=2&site_id=1&NewsID=133313&Type=P
+# ... says midnight for the coming one and 1:00 for the ones in the future
+# (and they will use DST again next year, using the normal schedule).
+
+# From Paul Eggert (2013-12-11):
+# As Steffen suggested, consider the past 21-month experiment to be DST.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Jordan 1973 only - Jun 6 0:00 1:00 S
@@ -1438,11 +1448,13 @@
Rule Jordan 2003 only - Oct 24 0:00s 0 -
Rule Jordan 2004 only - Oct 15 0:00s 0 -
Rule Jordan 2005 only - Sep lastFri 0:00s 0 -
-Rule Jordan 2006 2012 - Oct lastFri 0:00s 0 -
+Rule Jordan 2006 2011 - Oct lastFri 0:00s 0 -
+Rule Jordan 2013 only - Dec 20 0:00 0 -
+Rule Jordan 2014 max - Mar lastThu 24:00 1:00 S
+Rule Jordan 2014 max - Oct lastFri 0:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Amman 2:23:44 - LMT 1931
- 2:00 Jordan EE%sT 2012 Oct 26 0:00s
- 3:00 - AST
+ 2:00 Jordan EE%sT
# Kazakhstan
--- ./jdk/make/sun/javazic/tzdata/northamerica Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/make/sun/javazic/tzdata/northamerica Tue Mar 18 12:35:25 2014 -0700
@@ -2688,6 +2688,11 @@
# to DST--and one more hour on 1999-04-04--when the announcers will have
# returned to Baltimore, which switches on that date.)
+# From Steffen Thorsen (2013-11-11):
+# DST start in Cuba in 2004 ... does not follow the same rules as the
+# years before. The correct date should be Sunday 2004-03-28 00:00 ...
+# https://web.archive.org/web/20040402060750/http://www.granma.cu/espanol/2004/marzo/sab27/reloj.html
+
# From Evert van der Veer via Steffen Thorsen (2004-10-28):
# Cuba is not going back to standard time this year.
# From Paul Eggert (2006-03-22):
@@ -2877,7 +2882,8 @@
Rule Cuba 1997 only - Oct 12 0:00s 0 S
Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D
Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S
-Rule Cuba 2000 2004 - Apr Sun>=1 0:00s 1:00 D
+Rule Cuba 2000 2003 - Apr Sun>=1 0:00s 1:00 D
+Rule Cuba 2004 only - Mar lastSun 0:00s 1:00 D
Rule Cuba 2006 2010 - Oct lastSun 0:00s 0 S
Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D
Rule Cuba 2008 only - Mar Sun>=15 0:00s 1:00 D
--- ./jdk/src/macosx/classes/sun/font/CFontManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/font/CFontManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,8 @@
import java.awt.*;
import java.io.File;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
@@ -38,6 +40,7 @@
import sun.awt.FontConfiguration;
import sun.awt.HeadlessToolkit;
+import sun.misc.ThreadGroupUtils;
import sun.lwawt.macosx.*;
public class CFontManager extends SunFontManager {
@@ -215,24 +218,22 @@
});
}
};
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<Object>() {
- public Object run() {
+ AccessController.doPrivileged(
+ new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
/* The thread must be a member of a thread group
* which will not get GCed before VM exit.
* Make its parent the top-level thread group.
*/
- ThreadGroup tg =
- Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null;
- tg = tgn, tgn = tg.getParent());
- fileCloser = new Thread(tg, fileCloserRunnable);
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ fileCloser = new Thread(rootTG, fileCloserRunnable);
fileCloser.setContextClassLoader(null);
Runtime.getRuntime().addShutdownHook(fileCloser);
return null;
}
- });
+ }
+ );
}
}
}
--- ./jdk/src/macosx/classes/sun/font/CStrike.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/font/CStrike.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,7 @@
import sun.awt.SunHints;
-public class CStrike extends FontStrike {
+public final class CStrike extends FontStrike {
// Creates the native strike
private static native long createNativeStrikePtr(long nativeFontPtr,
@@ -68,10 +68,10 @@
Rectangle2D.Float result,
double x, double y);
- private CFont nativeFont;
+ private final CFont nativeFont;
private AffineTransform invDevTx;
- private GlyphInfoCache glyphInfoCache;
- private GlyphAdvanceCache glyphAdvanceCache;
+ private final GlyphInfoCache glyphInfoCache;
+ private final GlyphAdvanceCache glyphAdvanceCache;
private long nativeStrikePtr;
CStrike(final CFont font, final FontStrikeDesc inDesc) {
@@ -84,11 +84,11 @@
// Normally the device transform should be the identity transform
// for screen operations. The device transform only becomes
// interesting when we are outputting between different dpi surfaces,
- // like when we are printing to postscript.
+ // like when we are printing to postscript or use retina.
if (inDesc.devTx != null && !inDesc.devTx.isIdentity()) {
try {
invDevTx = inDesc.devTx.createInverse();
- } catch (NoninvertibleTransformException e) {
+ } catch (NoninvertibleTransformException ignored) {
// ignored, since device transforms should not be that
// complicated, and if they are - there is nothing we can do,
// so we won't worry about it.
@@ -134,15 +134,13 @@
nativeStrikePtr = 0;
}
- // the fractional metrics default on our platform is OFF
- private boolean useFractionalMetrics() {
- return desc.fmHint == SunHints.INTVAL_FRACTIONALMETRICS_ON;
- }
+ @Override
public int getNumGlyphs() {
return nativeFont.getNumGlyphs();
}
+ @Override
StrikeMetrics getFontMetrics() {
if (strikeMetrics == null) {
StrikeMetrics metrics = getFontMetrics(getNativeStrikePtr());
@@ -155,74 +153,24 @@
return strikeMetrics;
}
- float getGlyphAdvance(int glyphCode) {
- return getScaledAdvanceForAdvance(getCachedNativeGlyphAdvance(glyphCode));
+ @Override
+ float getGlyphAdvance(final int glyphCode) {
+ return getCachedNativeGlyphAdvance(glyphCode);
}
- float getCodePointAdvance(int cp) {
- float advance = getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
-
- double glyphScaleX = desc.glyphTx.getScaleX();
- double devScaleX = desc.devTx.getScaleX();
-
- if (devScaleX == 0) {
- glyphScaleX = Math.sqrt(desc.glyphTx.getDeterminant());
- devScaleX = Math.sqrt(desc.devTx.getDeterminant());
- }
-
- if (devScaleX == 0) {
- devScaleX = Double.NaN; // this an undefined graphics state
- }
- advance = (float) (advance * glyphScaleX / devScaleX);
- return useFractionalMetrics() ? advance : Math.round(advance);
+ @Override
+ float getCodePointAdvance(final int cp) {
+ return getGlyphAdvance(nativeFont.getMapper().charToGlyph(cp));
}
- // calculate an advance, and round if not using fractional metrics
- private float getScaledAdvanceForAdvance(float advance) {
- if (invDevTx != null) {
- advance *= invDevTx.getScaleX();
- }
- advance *= desc.glyphTx.getScaleX();
- return useFractionalMetrics() ? advance : Math.round(advance);
+ @Override
+ Point2D.Float getCharMetrics(final char ch) {
+ return getGlyphMetrics(nativeFont.getMapper().charToGlyph(ch));
}
- Point2D.Float getCharMetrics(char ch) {
- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(nativeFont.getMapper().charToGlyph(ch)));
- }
-
- Point2D.Float getGlyphMetrics(int glyphCode) {
- return getScaledPointForAdvance(getCachedNativeGlyphAdvance(glyphCode));
- }
-
- // calculate an advance point, and round if not using fractional metrics
- private Point2D.Float getScaledPointForAdvance(float advance) {
- Point2D.Float pt = new Point2D.Float(advance, 0);
-
- if (!desc.glyphTx.isIdentity()) {
- return scalePoint(pt);
- }
-
- if (!useFractionalMetrics()) {
- pt.x = Math.round(pt.x);
- }
- return pt;
- }
-
- private Point2D.Float scalePoint(Point2D.Float pt) {
- if (invDevTx != null) {
- // transform the point out of the device space first
- invDevTx.transform(pt, pt);
- }
- desc.glyphTx.transform(pt, pt);
- pt.x -= desc.glyphTx.getTranslateX();
- pt.y -= desc.glyphTx.getTranslateY();
-
- if (!useFractionalMetrics()) {
- pt.x = Math.round(pt.x);
- pt.y = Math.round(pt.y);
- }
-
- return pt;
+ @Override
+ Point2D.Float getGlyphMetrics(final int glyphCode) {
+ return new Point2D.Float(getGlyphAdvance(glyphCode), 0.0f);
}
Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) {
@@ -414,9 +362,7 @@
private SparseBitShiftingTwoLayerArray secondLayerCache;
private HashMap<Integer, Long> generalCache;
- public GlyphInfoCache(final Font2D nativeFont,
- final FontStrikeDesc desc)
- {
+ GlyphInfoCache(final Font2D nativeFont, final FontStrikeDesc desc) {
super(nativeFont, desc);
firstLayerCache = new long[FIRST_LAYER_SIZE];
}
@@ -527,7 +473,7 @@
final int shift;
final int secondLayerLength;
- public SparseBitShiftingTwoLayerArray(final int size, final int shift) {
+ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
this.shift = shift;
this.cache = new long[1 << shift][];
this.secondLayerLength = size >> shift;
@@ -559,6 +505,12 @@
private SparseBitShiftingTwoLayerArray secondLayerCache;
private HashMap<Integer, Float> generalCache;
+ // Empty non private constructor was added because access to this
+ // class shouldn't be emulated by a synthetic accessor method.
+ GlyphAdvanceCache() {
+ super();
+ }
+
public synchronized float get(final int index) {
if (index < 0) {
if (-index < SECOND_LAYER_SIZE) {
@@ -609,9 +561,7 @@
final int shift;
final int secondLayerLength;
- public SparseBitShiftingTwoLayerArray(final int size,
- final int shift)
- {
+ SparseBitShiftingTwoLayerArray(final int size, final int shift) {
this.shift = shift;
this.cache = new float[1 << shift][];
this.secondLayerLength = size >> shift;
--- ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import sun.awt.*;
import sun.lwawt.macosx.*;
+import sun.misc.ThreadGroupUtils;
import sun.print.*;
public abstract class LWToolkit extends SunToolkit implements Runnable {
@@ -66,22 +67,17 @@
protected final void init() {
AWTAutoShutdown.notifyToolkitThreadBusy();
- ThreadGroup mainTG = AccessController.doPrivileged(
- new PrivilegedAction<ThreadGroup>() {
- public ThreadGroup run() {
- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = currentTG.getParent();
- while (parentTG != null) {
- currentTG = parentTG;
- parentTG = currentTG.getParent();
+ ThreadGroup rootTG = AccessController.doPrivileged(
+ new PrivilegedAction<ThreadGroup>() {
+ @Override
+ public ThreadGroup run() {
+ return ThreadGroupUtils.getRootThreadGroup();
}
- return currentTG;
- }
- }
- );
+ });
Runtime.getRuntime().addShutdownHook(
- new Thread(mainTG, new Runnable() {
+ new Thread(rootTG, new Runnable() {
+ @Override
public void run() {
shutdown();
waitForRunState(STATE_CLEANUP);
@@ -89,7 +85,7 @@
})
);
- Thread toolkitThread = new Thread(mainTG, this, "AWT-LW");
+ Thread toolkitThread = new Thread(rootTG, this, "AWT-LW");
toolkitThread.setDaemon(true);
toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
toolkitThread.start();
--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Tue Mar 18 12:35:25 2014 -0700
@@ -53,7 +53,7 @@
}
protected void setContentsNative(Transferable contents) {
-
+ FlavorTable flavorMap = getDefaultFlavorTable();
// Don't use delayed Clipboard rendering for the Transferable's data.
// If we did that, we would call Transferable.getTransferData on
// the Toolkit thread, which is a security hole.
--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CInputMethod.java Tue Mar 18 12:35:25 2014 -0700
@@ -620,8 +620,7 @@
retString[0] = new String(selectedText);
}}
}, fAwtFocussedComponent);
- } catch (InterruptedException ie) { ie.printStackTrace(); }
- catch (InvocationTargetException ite) { ite.printStackTrace(); }
+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
synchronized(retString) { return retString[0]; }
}
@@ -669,8 +668,7 @@
}}
}, fAwtFocussedComponent);
- } catch (InterruptedException ie) { ie.printStackTrace(); }
- catch (InvocationTargetException ite) { ite.printStackTrace(); }
+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
synchronized(returnValue) { return returnValue; }
}
@@ -695,8 +693,7 @@
returnValue[0] = fIMContext.getInsertPositionOffset();
}}
}, fAwtFocussedComponent);
- } catch (InterruptedException ie) { ie.printStackTrace(); }
- catch (InvocationTargetException ite) { ite.printStackTrace(); }
+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
returnValue[1] = fCurrentTextLength;
synchronized(returnValue) { return returnValue; }
@@ -743,8 +740,7 @@
}
}}
}, fAwtFocussedComponent);
- } catch (InterruptedException ie) { ie.printStackTrace(); }
- catch (InvocationTargetException ite) { ite.printStackTrace(); }
+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
synchronized(rect) { return rect; }
}
@@ -764,8 +760,7 @@
insertPositionOffset[0] = fIMContext.getInsertPositionOffset();
}}
}, fAwtFocussedComponent);
- } catch (InterruptedException ie) { ie.printStackTrace(); }
- catch (InvocationTargetException ite) { ite.printStackTrace(); }
+ } catch (InvocationTargetException ite) { ite.printStackTrace(); }
// This bit of gymnastics ensures that the returned location is within the composed text.
// If it falls outside that region, the input method will commit the text, which is inconsistent with native
--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Mar 18 12:35:25 2014 -0700
@@ -918,7 +918,7 @@
//Posting an empty to flush the EventQueue without blocking the main thread
}
}, target);
- } catch (InterruptedException | InvocationTargetException e) {
+ } catch (InvocationTargetException e) {
e.printStackTrace();
}
}
--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java Tue Mar 18 12:35:25 2014 -0700
@@ -97,6 +97,6 @@
setVisible(true);
}
}, this);
- } catch (InterruptedException | InvocationTargetException ex) {}
+ } catch (InvocationTargetException ex) {}
}
}
--- ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Mar 18 12:35:25 2014 -0700
@@ -414,8 +414,15 @@
}
// Intended to be called from the LWCToolkit.m only.
- private static void installToolkitThreadNameInJava() {
+ private static void installToolkitThreadInJava() {
Thread.currentThread().setName(CThreading.APPKIT_THREAD_NAME);
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ Thread.currentThread().setContextClassLoader(null);
+ return null;
+ }
+ });
}
@Override
@@ -518,22 +525,21 @@
// Any selector invoked using ThreadUtilities performOnMainThread will be processed in doAWTRunLoop
// The InvocationEvent will call LWCToolkit.stopAWTRunLoop() when finished, which will stop our manual runloop
// Does not dispatch native events while in the loop
- public static void invokeAndWait(Runnable event, Component component) throws InterruptedException, InvocationTargetException {
+ public static void invokeAndWait(Runnable runnable, Component component) throws InvocationTargetException {
final long mediator = createAWTRunLoopMediator();
- InvocationEvent invocationEvent =
- new InvocationEvent(component != null ? component : Toolkit.getDefaultToolkit(), event) {
- @Override
- public void dispatch() {
- try {
- super.dispatch();
- } finally {
- if (mediator != 0) {
- stopAWTRunLoop(mediator);
+ InvocationEvent invocationEvent = AWTAccessor.getInvocationEventAccessor()
+ .createEvent(component != null ? component : Toolkit.getDefaultToolkit(),
+ runnable,
+ new Runnable() {
+ @Override
+ public void run() {
+ if (mediator != 0) {
+ stopAWTRunLoop(mediator);
+ }
}
- }
- }
- };
+ },
+ true);
if (component != null) {
AppContext appContext = SunToolkit.targetToAppContext(component);
--- ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/awt/LWCToolkit.m Tue Mar 18 12:35:25 2014 -0700
@@ -193,8 +193,8 @@
JNIEnv *env = [ThreadUtilities getJNIEnv];
static JNF_CLASS_CACHE(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
- static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadNameInJava, jc_LWCToolkit, "installToolkitThreadNameInJava", "()V");
- JNFCallStaticVoidMethod(env, jsm_installToolkitThreadNameInJava);
+ static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
+ JNFCallStaticVoidMethod(env, jsm_installToolkitThreadInJava);
});
gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
--- ./jdk/src/macosx/native/sun/awt/awt.m Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/awt/awt.m Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -432,6 +432,16 @@
forceEmbeddedMode = YES;
}
+ JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
+ jclass jc_ThreadGroupUtils = (*env)->FindClass(env, "sun/misc/ThreadGroupUtils");
+ jmethodID sjm_getRootThreadGroup = (*env)->GetStaticMethodID(env, jc_ThreadGroupUtils, "getRootThreadGroup", "()Ljava/lang/ThreadGroup;");
+ jobject rootThreadGroup = (*env)->CallStaticObjectMethod(env, jc_ThreadGroupUtils, sjm_getRootThreadGroup);
+ [ThreadUtilities setAppkitThreadGroup:(*env)->NewGlobalRef(env, rootThreadGroup)];
+
+ // The current thread was attached in getJNIEnvUncached.
+ // Detach it back. It will be reattached later if needed with a proper TG
+ [ThreadUtilities detachCurrentThread];
+
BOOL headless = isHeadless(env);
// We need to let Foundation know that this is a multithreaded application, if it isn't already.
--- ./jdk/src/macosx/native/sun/font/AWTStrike.h Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/font/AWTStrike.h Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,11 +31,12 @@
@interface AWTStrike : NSObject {
@public
AWTFont * fAWTFont;
- CGFloat fSize;
+ CGFloat fSize;
JRSFontRenderingStyle fStyle;
- jint fAAStyle;
+ jint fAAStyle;
CGAffineTransform fTx;
+ CGAffineTransform fDevTx;
CGAffineTransform fAltTx; // alternate strike tx used for Sun2D
CGAffineTransform fFontTx;
}
--- ./jdk/src/macosx/native/sun/font/AWTStrike.m Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/font/AWTStrike.m Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,6 +60,7 @@
invDevTx.b *= -1;
invDevTx.c *= -1;
fFontTx = CGAffineTransformConcat(CGAffineTransformConcat(tx, invDevTx), sInverseTX);
+ fDevTx = CGAffineTransformInvert(invDevTx);
// the "font size" is the square root of the determinant of the matrix
fSize = sqrt(abs(fFontTx.a * fFontTx.d - fFontTx.b * fFontTx.c));
@@ -143,7 +144,8 @@
{
CGSize advance;
JNF_COCOA_ENTER(env);
- AWTFont *awtFont = ((AWTStrike *)jlong_to_ptr(awtStrikePtr))->fAWTFont;
+ AWTStrike *awtStrike = (AWTStrike *)jlong_to_ptr(awtStrikePtr);
+ AWTFont *awtFont = awtStrike->fAWTFont;
// negative glyph codes are really unicodes, which were placed there by the mapper
// to indicate we should use CoreText to substitute the character
@@ -151,6 +153,10 @@
const CTFontRef fallback = CTS_CopyCTFallbackFontAndGlyphForJavaGlyphCode(awtFont, glyphCode, &glyph);
CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
CFRelease(fallback);
+ advance = CGSizeApplyAffineTransform(advance, awtStrike->fFontTx);
+ if (!JRSFontStyleUsesFractionalMetrics(awtStrike->fStyle)) {
+ advance.width = round(advance.width);
+ }
JNF_COCOA_EXIT(env);
return advance.width;
--- ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/font/CGGlyphImages.m Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -455,6 +455,7 @@
#define CGGI_GLYPH_BBOX_PADDING 2.0f
static inline GlyphInfo *
CGGI_CreateNewGlyphInfoFrom(CGSize advance, CGRect bbox,
+ const AWTStrike *strike,
const CGGI_RenderingMode *mode)
{
size_t pixelSize = mode->glyphDescriptor->pixelSize;
@@ -477,6 +478,12 @@
width = 1;
height = 1;
}
+ advance = CGSizeApplyAffineTransform(advance, strike->fFontTx);
+ if (!JRSFontStyleUsesFractionalMetrics(strike->fStyle)) {
+ advance.width = round(advance.width);
+ advance.height = round(advance.height);
+ }
+ advance = CGSizeApplyAffineTransform(advance, strike->fDevTx);
#ifdef USE_IMAGE_ALIGNED_MEMORY
// create separate memory
@@ -564,10 +571,10 @@
JRSFontGetBoundingBoxesForGlyphsAndStyle(fallback, &tx, style, &glyph, 1, &bbox);
CGSize advance;
- JRSFontGetAdvancesForGlyphsAndStyle(fallback, &tx, strike->fStyle, &glyph, 1, &advance);
+ CTFontGetAdvancesForGlyphs(fallback, kCTFontDefaultOrientation, &glyph, &advance, 1);
// create the Sun2D GlyphInfo we are going to strike into
- GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
+ GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
// fix the context size, just in case the substituted character is unexpectedly large
CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode);
@@ -715,7 +722,7 @@
JRSFontRenderingStyle bboxCGMode = JRSFontAlignStyleForFractionalMeasurement(strike->fStyle);
JRSFontGetBoundingBoxesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, bboxCGMode, glyphs, len, bboxes);
- JRSFontGetAdvancesForGlyphsAndStyle((CTFontRef)font->fFont, &tx, strike->fStyle, glyphs, len, advances);
+ CTFontGetAdvancesForGlyphs((CTFontRef)font->fFont, kCTFontDefaultOrientation, glyphs, advances, len);
size_t maxWidth = 1;
size_t maxHeight = 1;
@@ -732,7 +739,7 @@
CGSize advance = advances[i];
CGRect bbox = bboxes[i];
- GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, mode);
+ GlyphInfo *glyphInfo = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
if (maxWidth < glyphInfo->width) maxWidth = glyphInfo->width;
if (maxHeight < glyphInfo->height) maxHeight = glyphInfo->height;
--- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.h Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -127,6 +127,8 @@
+ (JNIEnv*)getJNIEnv;
+ (JNIEnv*)getJNIEnvUncached;
++ (void)detachCurrentThread;
++ (void)setAppkitThreadGroup:(jobject)group;
//Wrappers for the corresponding JNFRunLoop methods with a check for main thread
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block;
--- ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,23 +33,44 @@
// The following must be named "jvm", as there are extern references to it in AWT
JavaVM *jvm = NULL;
static JNIEnv *appKitEnv = NULL;
+static jobject appkitThreadGroup = NULL;
+
+inline void attachCurrentThread(void** env) {
+ if ([NSThread isMainThread]) {
+ JavaVMAttachArgs args;
+ args.version = JNI_VERSION_1_4;
+ args.name = "AppKit Thread";
+ args.group = appkitThreadGroup;
+ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, &args);
+ } else {
+ (*jvm)->AttachCurrentThreadAsDaemon(jvm, env, NULL);
+ }
+}
@implementation ThreadUtilities
+ (JNIEnv*)getJNIEnv {
AWT_ASSERT_APPKIT_THREAD;
if (appKitEnv == NULL) {
- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&appKitEnv, NULL);
+ attachCurrentThread((void **)&appKitEnv);
}
return appKitEnv;
}
+ (JNIEnv*)getJNIEnvUncached {
JNIEnv *env = NULL;
- (*jvm)->AttachCurrentThreadAsDaemon(jvm, (void **)&env, nil);
+ attachCurrentThread((void **)&env);
return env;
}
++ (void)detachCurrentThread {
+ (*jvm)->DetachCurrentThread(jvm);
+}
+
++ (void)setAppkitThreadGroup:(jobject)group {
+ appkitThreadGroup = group;
+}
+
+ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block {
if ([NSThread isMainThread] && wait == YES) {
block();
--- ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Tue Mar 18 12:35:25 2014 -0700
@@ -35,6 +35,8 @@
import javax.management.remote.SubjectDelegationPermission;
import com.sun.jmx.remote.util.CacheMap;
+import java.util.ArrayList;
+import java.util.Collection;
public class SubjectDelegator {
private static final int PRINCIPALS_CACHE_SIZE = 10;
@@ -53,11 +55,14 @@
boolean removeCallerContext)
throws SecurityException {
+ if (System.getSecurityManager() != null && authenticatedACC == null) {
+ throw new SecurityException("Illegal AccessControlContext: null");
+ }
if (principalsCache == null || accCache == null) {
principalsCache =
- new CacheMap<Subject, Principal[]>(PRINCIPALS_CACHE_SIZE);
+ new CacheMap<>(PRINCIPALS_CACHE_SIZE);
accCache =
- new CacheMap<Subject, AccessControlContext>(ACC_CACHE_SIZE);
+ new CacheMap<>(ACC_CACHE_SIZE);
}
// Retrieve the principals for the given
@@ -101,14 +106,15 @@
// principal in the delegated subject
//
final Principal[] dp = delegatedPrincipals;
+ final Collection<Permission> permissions = new ArrayList<>(dp.length);
+ for(Principal p : dp) {
+ final String pname = p.getClass().getName() + "." + p.getName();
+ permissions.add(new SubjectDelegationPermission(pname));
+ }
PrivilegedAction<Void> action =
new PrivilegedAction<Void>() {
public Void run() {
- for (int i = 0 ; i < dp.length ; i++) {
- final String pname =
- dp[i].getClass().getName() + "." + dp[i].getName();
- Permission sdp =
- new SubjectDelegationPermission(pname);
+ for (Permission sdp : permissions) {
AccessController.checkPermission(sdp);
}
return null;
--- ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/jndi/dns/DnsClient.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,13 +30,14 @@
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.Socket;
+import java.security.SecureRandom;
import javax.naming.*;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
-import java.util.Set;
-import java.util.HashSet;
+
+import sun.security.jca.JCAUtil;
// Some of this code began life as part of sun.javaos.net.DnsClient
// originally by sritchie@eng 1/96. It was first hacked up for JNDI
@@ -77,6 +78,8 @@
};
private static final int DEFAULT_PORT = 53;
+ private static final int TRANSACTION_ID_BOUND = 0x10000;
+ private static final SecureRandom random = JCAUtil.getSecureRandom();
private InetAddress[] servers;
private int[] serverPorts;
private int timeout; // initial timeout on UDP queries in ms
@@ -85,7 +88,7 @@
private DatagramSocket udpSocket;
// Requests sent
- private Set<Integer> reqs;
+ private Map<Integer, ResourceRecord> reqs;
// Responses received
private Map<Integer, byte[]> resps;
@@ -134,7 +137,8 @@
throw ne;
}
}
- reqs = Collections.synchronizedSet(new HashSet<Integer>());
+ reqs = Collections.synchronizedMap(
+ new HashMap<Integer, ResourceRecord>());
resps = Collections.synchronizedMap(new HashMap<Integer, byte[]>());
}
@@ -153,10 +157,6 @@
}
}
-
- private int ident = 0; // used to set the msg ID field
- private Object identLock = new Object();
-
/*
* If recursion is true, recursion is requested on the query.
* If auth is true, only authoritative responses are accepted; other
@@ -167,15 +167,22 @@
throws NamingException {
int xid;
- synchronized (identLock) {
- ident = 0xFFFF & (ident + 1);
- xid = ident;
- }
+ Packet pkt;
+ ResourceRecord collision;
- // enqueue the outstanding request
- reqs.add(xid);
+ do {
+ // Generate a random transaction ID
+ xid = random.nextInt(TRANSACTION_ID_BOUND);
+ pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
- Packet pkt = makeQueryPacket(fqdn, xid, qclass, qtype, recursion);
+ // enqueue the outstanding request
+ synchronized (reqs) {
+ if ((collision = reqs.put(xid, new ResourceRecord(pkt.getData(),
+ pkt.length(), Header.HEADER_SIZE, true, false))) != null) {
+ reqs.put(xid, collision); // revert
+ }
+ }
+ } while (collision != null);
Exception caughtException = null;
boolean[] doNotRetry = new boolean[servers.length];
@@ -305,11 +312,8 @@
ResourceRecords queryZone(DnsName zone, int qclass, boolean recursion)
throws NamingException {
- int xid;
- synchronized (identLock) {
- ident = 0xFFFF & (ident + 1);
- xid = ident;
- }
+ int xid = random.nextInt(TRANSACTION_ID_BOUND);
+
Packet pkt = makeQueryPacket(zone, xid, qclass,
ResourceRecord.QTYPE_AXFR, recursion);
Exception caughtException = null;
@@ -390,6 +394,7 @@
DatagramPacket opkt = new DatagramPacket(
pkt.getData(), pkt.length(), server, port);
DatagramPacket ipkt = new DatagramPacket(new byte[8000], 8000);
+ // Packets may only be sent to or received from this server address
udpSocket.connect(server, port);
int pktTimeout = (timeout * (1 << retry));
try {
@@ -524,7 +529,7 @@
"\tResponse Q:" + resps);
}
byte[] pkt;
- if ((pkt = (byte[]) resps.get(xid)) != null) {
+ if ((pkt = resps.get(xid)) != null) {
checkResponseCode(new Header(pkt, pkt.length));
synchronized (queuesLock) {
resps.remove(xid);
@@ -543,6 +548,9 @@
* Checks the header of an incoming DNS response.
* Returns true if it matches the given xid and throws a naming
* exception, if appropriate, based on the response code.
+ *
+ * Also checks that the domain name, type and class in the response
+ * match those in the original query.
*/
private boolean isMatchResponse(byte[] pkt, int xid)
throws NamingException {
@@ -552,7 +560,7 @@
throw new CommunicationException("DNS error: expecting response");
}
- if (!reqs.contains(xid)) { // already received, ignore the response
+ if (!reqs.containsKey(xid)) { // already received, ignore the response
return false;
}
@@ -561,14 +569,47 @@
if (debug) {
dprint("XID MATCH:" + xid);
}
+ checkResponseCode(hdr);
+ if (!hdr.query && hdr.numQuestions == 1) {
- checkResponseCode(hdr);
- // remove the response for the xid if received by some other thread.
- synchronized (queuesLock) {
- resps.remove(xid);
- reqs.remove(xid);
+ ResourceRecord rr = new ResourceRecord(pkt, pkt.length,
+ Header.HEADER_SIZE, true, false);
+
+ // Retrieve the original query
+ ResourceRecord query = reqs.get(xid);
+ int qtype = query.getType();
+ int qclass = query.getRrclass();
+ DnsName qname = query.getName();
+
+ // Check that the type/class/name in the query section of the
+ // response match those in the original query
+ if ((qtype == ResourceRecord.QTYPE_STAR ||
+ qtype == rr.getType()) &&
+ (qclass == ResourceRecord.QCLASS_STAR ||
+ qclass == rr.getRrclass()) &&
+ qname.equals(rr.getName())) {
+
+ if (debug) {
+ dprint("MATCH NAME:" + qname + " QTYPE:" + qtype +
+ " QCLASS:" + qclass);
+ }
+
+ // Remove the response for the xid if received by some other
+ // thread.
+ synchronized (queuesLock) {
+ resps.remove(xid);
+ reqs.remove(xid);
+ }
+ return true;
+
+ } else {
+ if (debug) {
+ dprint("NO-MATCH NAME:" + qname + " QTYPE:" + qtype +
+ " QCLASS:" + qclass);
+ }
+ }
}
- return true;
+ return false;
}
//
@@ -577,7 +618,7 @@
// enqueue only the first response, responses for retries are ignored.
//
synchronized (queuesLock) {
- if (reqs.contains(hdr.xid)) { // enqueue only the first response
+ if (reqs.containsKey(hdr.xid)) { // enqueue only the first response
resps.put(hdr.xid, pkt);
}
}
--- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapBindingEnumeration.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,10 @@
package com.sun.jndi.ldap;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.Vector;
import javax.naming.*;
import javax.naming.directory.*;
@@ -34,6 +38,8 @@
final class LdapBindingEnumeration extends LdapNamingEnumeration {
+ private final AccessControlContext acc = AccessController.getContext();
+
LdapBindingEnumeration(LdapCtx homeCtx, LdapResult answer, Name remain,
Continuation cont) throws NamingException
{
@@ -41,7 +47,7 @@
}
protected NameClassPair
- createItem(String dn, Attributes attrs, Vector respCtls)
+ createItem(String dn, final Attributes attrs, Vector respCtls)
throws NamingException {
Object obj = null;
@@ -49,7 +55,16 @@
if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
// serialized object or object reference
- obj = Obj.decodeObject(attrs);
+ try {
+ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ @Override
+ public Object run() throws NamingException {
+ return Obj.decodeObject(attrs);
+ }
+ }, acc);
+ } catch (PrivilegedActionException e) {
+ throw (NamingException)e.getException();
+ }
}
if (obj == null) {
// DirContext object
--- ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/jndi/ldap/LdapSearchEnumeration.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,10 @@
package com.sun.jndi.ldap;
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.Vector;
import javax.naming.*;
import javax.naming.directory.*;
@@ -39,6 +43,8 @@
private Name startName; // prefix of names of search results
private LdapCtx.SearchArgs searchArgs = null;
+ private final AccessControlContext acc = AccessController.getContext();
+
LdapSearchEnumeration(LdapCtx homeCtx, LdapResult search_results,
String starter, LdapCtx.SearchArgs args, Continuation cont)
throws NamingException {
@@ -53,7 +59,7 @@
}
protected NameClassPair
- createItem(String dn, Attributes attrs, Vector respCtls)
+ createItem(String dn, final Attributes attrs, Vector respCtls)
throws NamingException {
Object obj = null;
@@ -110,8 +116,16 @@
if (attrs.get(Obj.JAVA_ATTRIBUTES[Obj.CLASSNAME]) != null) {
// Entry contains Java-object attributes (ser/ref object)
// serialized object or object reference
- obj = Obj.decodeObject(attrs);
-
+ try {
+ obj = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ @Override
+ public Object run() throws NamingException {
+ return Obj.decodeObject(attrs);
+ }
+ }, acc);
+ } catch (PrivilegedActionException e) {
+ throw (NamingException)e.getException();
+ }
}
if (obj == null) {
obj = new LdapCtx(homeCtx, dn);
--- ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/media/sound/JDK13Services.java Tue Mar 18 12:35:25 2014 -0700
@@ -25,27 +25,33 @@
package com.sun.media.sound;
+import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Properties;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Transmitter;
+import javax.sound.midi.spi.MidiDeviceProvider;
+import javax.sound.midi.spi.MidiFileReader;
+import javax.sound.midi.spi.MidiFileWriter;
+import javax.sound.midi.spi.SoundbankReader;
import javax.sound.sampled.Clip;
import javax.sound.sampled.Port;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
+import javax.sound.sampled.spi.AudioFileReader;
+import javax.sound.sampled.spi.AudioFileWriter;
+import javax.sound.sampled.spi.FormatConversionProvider;
+import javax.sound.sampled.spi.MixerProvider;
/**
- * JDK13Services uses the Service class in JDK 1.3
- * to discover a list of service providers installed
- * in the system.
- *
+ * JDK13Services uses the Service class in JDK 1.3 to discover a list of service
+ * providers installed in the system.
+ * <p>
* This class is public because it is called from javax.sound.midi.MidiSystem
* and javax.sound.sampled.AudioSystem. The alternative would be to make
* JSSecurityManager public, which is considered worse.
@@ -54,80 +60,55 @@
*/
public final class JDK13Services {
- /** The default for the length of the period to hold the cache.
- This value is given in milliseconds. It is equivalent to
- 1 minute.
- */
- private static final long DEFAULT_CACHING_PERIOD = 60000;
-
- /** Filename of the properties file for default provider properties.
- This file is searched in the subdirectory "lib" of the JRE directory
- (this behaviour is hardcoded).
- */
+ /**
+ * Filename of the properties file for default provider properties. This
+ * file is searched in the subdirectory "lib" of the JRE directory (this
+ * behaviour is hardcoded).
+ */
private static final String PROPERTIES_FILENAME = "sound.properties";
- /** Cache for the providers.
- Class objects of the provider type (MixerProvider, MidiDeviceProvider
- ...) are used as keys. The values are instances of ProviderCache.
- */
- private static final Map providersCacheMap = new HashMap();
-
-
- /** The length of the period to hold the cache.
- This value is given in milliseconds.
- */
- private static long cachingPeriod = DEFAULT_CACHING_PERIOD;
-
- /** Properties loaded from the properties file for default provider
- properties.
- */
+ /**
+ * Properties loaded from the properties file for default provider
+ * properties.
+ */
private static Properties properties;
-
- /** Private, no-args constructor to ensure against instantiation.
+ /**
+ * Private, no-args constructor to ensure against instantiation.
*/
private JDK13Services() {
}
-
- /** Set the period provider lists are cached.
- This method is only intended for testing.
+ /**
+ * Obtains a List containing installed instances of the providers for the
+ * requested service. The returned List is immutable.
+ *
+ * @param serviceClass The type of providers requested. This should be one
+ * of AudioFileReader.class, AudioFileWriter.class,
+ * FormatConversionProvider.class, MixerProvider.class,
+ * MidiDeviceProvider.class, MidiFileReader.class,
+ * MidiFileWriter.class or SoundbankReader.class.
+ *
+ * @return A List of providers of the requested type. This List is
+ * immutable.
*/
- public static void setCachingPeriod(int seconds) {
- cachingPeriod = seconds * 1000L;
+ public static List<?> getProviders(final Class<?> serviceClass) {
+ final List<?> providers;
+ if (!MixerProvider.class.equals(serviceClass)
+ && !FormatConversionProvider.class.equals(serviceClass)
+ && !AudioFileReader.class.equals(serviceClass)
+ && !AudioFileWriter.class.equals(serviceClass)
+ && !MidiDeviceProvider.class.equals(serviceClass)
+ && !SoundbankReader.class.equals(serviceClass)
+ && !MidiFileWriter.class.equals(serviceClass)
+ && !MidiFileReader.class.equals(serviceClass)) {
+ providers = new ArrayList<>(0);
+ } else {
+ providers = JSSecurityManager.getProviders(serviceClass);
+ }
+ return Collections.unmodifiableList(providers);
}
-
- /** Obtains a List containing installed instances of the
- providers for the requested service.
- The List of providers is cached for the period of time given by
- {@link #cachingPeriod cachingPeriod}. During this period, the same
- List instance is returned for the same type of provider. After this
- period, a new instance is constructed and returned. The returned
- List is immutable.
- @param serviceClass The type of providers requested. This should be one
- of AudioFileReader.class, AudioFileWriter.class,
- FormatConversionProvider.class, MixerProvider.class,
- MidiDeviceProvider.class, MidiFileReader.class, MidiFileWriter.class or
- SoundbankReader.class.
- @return A List of providers of the requested type. This List is
- immutable.
- */
- public static synchronized List getProviders(Class serviceClass) {
- ProviderCache cache = (ProviderCache) providersCacheMap.get(serviceClass);
- if (cache == null) {
- cache = new ProviderCache();
- providersCacheMap.put(serviceClass, cache);
- }
- if (cache.providers == null ||
- System.currentTimeMillis() > cache.lastUpdate + cachingPeriod) {
- cache.providers = Collections.unmodifiableList(JSSecurityManager.getProviders(serviceClass));
- cache.lastUpdate = System.currentTimeMillis();
- }
- return cache.providers;
- }
-
-
/** Obtain the provider class name part of a default provider property.
@param typeClass The type of the default provider property. This
should be one of Receiver.class, Transmitter.class, Sequencer.class,
@@ -219,14 +200,4 @@
}
return properties;
}
-
- // INNER CLASSES
-
- private static class ProviderCache {
- // System time of the last update in milliseconds.
- public long lastUpdate;
-
- // The providers.
- public List providers;
- }
}
--- ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/media/sound/JSSecurityManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -187,7 +187,7 @@
return thread;
}
- static List getProviders(final Class providerClass) {
+ static synchronized List getProviders(final Class providerClass) {
List p = new ArrayList();
// Service.providers(Class) just creates "lazy" iterator instance,
// so it doesn't require do be called from privileged section
--- ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/naming/internal/ResourceManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -69,6 +69,14 @@
private static final String JRELIB_PROPERTY_FILE_NAME = "jndi.properties";
/*
+ * Internal environment property, that when set to "true", disables
+ * application resource files lookup to prevent recursion issues
+ * when validating signed JARs.
+ */
+ private static final String DISABLE_APP_RESOURCE_FILES =
+ "com.sun.naming.disable.app.resource.files";
+
+ /*
* The standard JNDI properties that specify colon-separated lists.
*/
private static final String[] listProperties = {
@@ -218,6 +226,13 @@
}
}
+ // Return without merging if application resource files lookup
+ // is disabled.
+ String disableAppRes = (String)env.get(DISABLE_APP_RESOURCE_FILES);
+ if (disableAppRes != null && disableAppRes.equalsIgnoreCase("true")) {
+ return env;
+ }
+
// Merge the above with the values read from all application
// resource files. Colon-separated lists are concatenated.
mergeTables(env, getApplicationResources());
--- ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/rowset/CachedRowSetImpl.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import javax.sql.rowset.serial.*;
import com.sun.rowset.internal.*;
import com.sun.rowset.providers.*;
+import sun.reflect.misc.ReflectUtil;
/**
* The standard implementation of the <code>CachedRowSet</code> interface.
@@ -2963,13 +2964,9 @@
// create new instance of the class
SQLData obj = null;
try {
- obj = (SQLData)c.newInstance();
- } catch (java.lang.InstantiationException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
- } catch (java.lang.IllegalAccessException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
+ obj = (SQLData) ReflectUtil.newInstance(c);
+ } catch(Exception ex) {
+ throw new SQLException("Unable to Instantiate: ", ex);
}
// get the attributes from the struct
Object attribs[] = s.getAttributes(map);
@@ -5714,13 +5711,9 @@
// create new instance of the class
SQLData obj = null;
try {
- obj = (SQLData)c.newInstance();
- } catch (java.lang.InstantiationException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
- } catch (java.lang.IllegalAccessException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
+ obj = (SQLData) ReflectUtil.newInstance(c);
+ } catch(Exception ex) {
+ throw new SQLException("Unable to Instantiate: ", ex);
}
// get the attributes from the struct
Object attribs[] = s.getAttributes(map);
--- ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,6 +39,7 @@
import javax.sql.rowset.serial.SerialClob;
import javax.sql.rowset.serial.SerialStruct;
import javax.sql.rowset.spi.*;
+import sun.reflect.misc.ReflectUtil;
/**
@@ -578,13 +579,9 @@
// create new instance of the class
SQLData obj = null;
try {
- obj = (SQLData)c.newInstance();
- } catch (java.lang.InstantiationException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
- } catch (java.lang.IllegalAccessException ex) {
- throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.unableins").toString(),
- ex.getMessage()));
+ obj = (SQLData)ReflectUtil.newInstance(c);
+ } catch (Exception ex) {
+ throw new SQLException("Unable to Instantiate: ", ex);
}
// get the attributes from the struct
Object attribs[] = s.getAttributes(map);
--- ./jdk/src/share/classes/java/awt/EventQueue.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/awt/EventQueue.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1043,11 +1043,11 @@
t.setContextClassLoader(classLoader);
t.setPriority(Thread.NORM_PRIORITY + 1);
t.setDaemon(false);
+ AWTAutoShutdown.getInstance().notifyThreadBusy(t);
return t;
}
}
);
- AWTAutoShutdown.getInstance().notifyThreadBusy(dispatchThread);
dispatchThread.start();
}
} finally {
@@ -1139,6 +1139,10 @@
if (entry.event instanceof SentEvent) {
((SentEvent)entry.event).dispose();
}
+ if (entry.event instanceof InvocationEvent) {
+ AWTAccessor.getInvocationEventAccessor()
+ .dispose((InvocationEvent)entry.event);
+ }
if (prev == null) {
queues[i].head = entry.next;
} else {
--- ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Tue Mar 18 12:35:25 2014 -0700
@@ -45,8 +45,8 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.WeakHashMap;
+import sun.awt.AppContext;
import sun.awt.datatransfer.DataTransferer;
/**
@@ -72,10 +72,7 @@
*/
private static String JavaMIME = "JAVA_DATAFLAVOR:";
- /**
- * System singleton which maps a thread's ClassLoader to a SystemFlavorMap.
- */
- private static final WeakHashMap flavorMaps = new WeakHashMap();
+ private static final Object FLAVOR_MAP_KEY = new Object();
/**
* Copied from java.util.Properties.
@@ -184,22 +181,12 @@
* Returns the default FlavorMap for this thread's ClassLoader.
*/
public static FlavorMap getDefaultFlavorMap() {
- ClassLoader contextClassLoader =
- Thread.currentThread().getContextClassLoader();
- if (contextClassLoader == null) {
- contextClassLoader = ClassLoader.getSystemClassLoader();
+ AppContext context = AppContext.getAppContext();
+ FlavorMap fm = (FlavorMap) context.get(FLAVOR_MAP_KEY);
+ if (fm == null) {
+ fm = new SystemFlavorMap();
+ context.put(FLAVOR_MAP_KEY, fm);
}
-
- FlavorMap fm;
-
- synchronized(flavorMaps) {
- fm = (FlavorMap)flavorMaps.get(contextClassLoader);
- if (fm == null) {
- fm = new SystemFlavorMap();
- flavorMaps.put(contextClassLoader, fm);
- }
- }
-
return fm;
}
@@ -240,26 +227,11 @@
}
});
- BufferedReader flavormapURL =
+ String url =
java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction<BufferedReader>() {
- public BufferedReader run() {
- String url = Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
-
- if (url == null) {
- return null;
- }
-
- try {
- return new BufferedReader
- (new InputStreamReader
- (new URL(url).openStream(), "ISO-8859-1"));
- } catch (MalformedURLException e) {
- System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
- } catch (IOException e) {
- System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
- }
- return null;
+ new java.security.PrivilegedAction<String>() {
+ public String run() {
+ return Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null);
}
});
@@ -271,6 +243,19 @@
}
}
+ BufferedReader flavormapURL = null;
+ if (url != null) {
+ try {
+ flavormapURL = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "ISO-8859-1"));
+ } catch (MalformedURLException e) {
+ System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
+ } catch (IOException e) {
+ System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url);
+ } catch (SecurityException e) {
+ // ignored
+ }
+ }
+
if (flavormapURL != null) {
try {
parseAndStoreReader(flavormapURL);
--- ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/awt/event/InvocationEvent.java Tue Mar 18 12:35:25 2014 -0700
@@ -25,6 +25,8 @@
package java.awt.event;
+import sun.awt.AWTAccessor;
+
import java.awt.ActiveEvent;
import java.awt.AWTEvent;
@@ -56,6 +58,20 @@
*/
public class InvocationEvent extends AWTEvent implements ActiveEvent {
+ static {
+ AWTAccessor.setInvocationEventAccessor(new AWTAccessor.InvocationEventAccessor() {
+ @Override
+ public void dispose(InvocationEvent invocationEvent) {
+ invocationEvent.finishedDispatching(false);
+ }
+ @Override
+ public InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
+ boolean catchThrowables) {
+ return new InvocationEvent(source, runnable, listener, catchThrowables);
+ }
+ });
+ }
+
/**
* Marks the first integer id for the range of invocation event ids.
*/
@@ -85,6 +101,14 @@
protected Object notifier;
/**
+ * The (potentially null) Runnable whose run() method will be called
+ * immediately after the event was dispatched or disposed.
+ *
+ * @see #isDispatched
+ */
+ private final Runnable listener;
+
+ /**
* Indicates whether the <code>run()</code> method of the <code>runnable</code>
* was executed or not.
*
@@ -147,7 +171,7 @@
* @see #InvocationEvent(Object, Runnable, Object, boolean)
*/
public InvocationEvent(Object source, Runnable runnable) {
- this(source, runnable, null, false);
+ this(source, INVOCATION_DEFAULT, runnable, null, null, false);
}
/**
@@ -185,7 +209,39 @@
*/
public InvocationEvent(Object source, Runnable runnable, Object notifier,
boolean catchThrowables) {
- this(source, INVOCATION_DEFAULT, runnable, notifier, catchThrowables);
+ this(source, INVOCATION_DEFAULT, runnable, notifier, null, catchThrowables);
+ }
+
+ /**
+ * Constructs an <code>InvocationEvent</code> with the specified
+ * source which will execute the runnable's <code>run</code>
+ * method when dispatched. If listener is non-<code>null</code>,
+ * <code>listener.run()</code> will be called immediately after
+ * <code>run</code> has returned, thrown an exception or the event
+ * was disposed.
+ * <p>This method throws an <code>IllegalArgumentException</code>
+ * if <code>source</code> is <code>null</code>.
+ *
+ * @param source The <code>Object</code> that originated
+ * the event
+ * @param runnable The <code>Runnable</code> whose
+ * <code>run</code> method will be
+ * executed
+ * @param listener The <code>Runnable</code>Runnable whose
+ * <code>run()</code> method will be called
+ * after the {@code InvocationEvent}
+ * was dispatched or disposed
+ * @param catchThrowables Specifies whether <code>dispatch</code>
+ * should catch Throwable when executing
+ * the <code>Runnable</code>'s <code>run</code>
+ * method, or should instead propagate those
+ * Throwables to the EventDispatchThread's
+ * dispatch loop
+ * @throws IllegalArgumentException if <code>source</code> is null
+ */
+ private InvocationEvent(Object source, Runnable runnable, Runnable listener,
+ boolean catchThrowables) {
+ this(source, INVOCATION_DEFAULT, runnable, null, listener, catchThrowables);
}
/**
@@ -221,13 +277,18 @@
*/
protected InvocationEvent(Object source, int id, Runnable runnable,
Object notifier, boolean catchThrowables) {
+ this(source, id, runnable, notifier, null, catchThrowables);
+ }
+
+ private InvocationEvent(Object source, int id, Runnable runnable,
+ Object notifier, Runnable listener, boolean catchThrowables) {
super(source, id);
this.runnable = runnable;
this.notifier = notifier;
+ this.listener = listener;
this.catchExceptions = catchThrowables;
this.when = System.currentTimeMillis();
}
-
/**
* Executes the Runnable's <code>run()</code> method and notifies the
* notifier (if any) when <code>run()</code> has returned or thrown an exception.
@@ -251,13 +312,7 @@
runnable.run();
}
} finally {
- dispatched = true;
-
- if (notifier != null) {
- synchronized (notifier) {
- notifier.notifyAll();
- }
- }
+ finishedDispatching(true);
}
}
@@ -331,6 +386,25 @@
}
/**
+ * Called when the event was dispatched or disposed
+ * @param dispatched true if the event was dispatched
+ * false if the event was disposed
+ */
+ private void finishedDispatching(boolean dispatched) {
+ this.dispatched = dispatched;
+
+ if (notifier != null) {
+ synchronized (notifier) {
+ notifier.notifyAll();
+ }
+ }
+
+ if (listener != null) {
+ listener.run();
+ }
+ }
+
+ /**
* Returns a parameter string identifying this event.
* This method is useful for event-logging and for debugging.
*
--- ./jdk/src/share/classes/java/lang/Thread.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/lang/Thread.java Tue Mar 18 12:35:25 2014 -0700
@@ -366,6 +366,8 @@
throw new NullPointerException("name cannot be null");
}
+ this.name = name.toCharArray();
+
Thread parent = currentThread();
SecurityManager security = System.getSecurityManager();
if (g == null) {
@@ -402,7 +404,6 @@
this.group = g;
this.daemon = parent.isDaemon();
this.priority = parent.getPriority();
- this.name = name.toCharArray();
if (security == null || isCCLOverridden(parent.getClass()))
this.contextClassLoader = parent.getContextClassLoader();
else
--- ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/lang/invoke/BoundMethodHandle.java Tue Mar 18 12:35:25 2014 -0700
@@ -140,7 +140,7 @@
* Return the {@link SpeciesData} instance representing this BMH species. All subclasses must provide a
* static field containing this value, and they must accordingly implement this method.
*/
- protected abstract SpeciesData speciesData();
+ /*non-public*/ abstract SpeciesData speciesData();
@Override
final Object internalProperties() {
@@ -156,7 +156,7 @@
return Arrays.asList(boundValues);
}
- public final Object arg(int i) {
+ /*non-public*/ final Object arg(int i) {
try {
switch (speciesData().fieldType(i)) {
case 'L': return argL(i);
@@ -170,22 +170,22 @@
}
throw new InternalError("unexpected type: " + speciesData().types+"."+i);
}
- public final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
- public final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
- public final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
- public final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
- public final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
+ /*non-public*/ final Object argL(int i) throws Throwable { return speciesData().getters[i].invokeBasic(this); }
+ /*non-public*/ final int argI(int i) throws Throwable { return (int) speciesData().getters[i].invokeBasic(this); }
+ /*non-public*/ final float argF(int i) throws Throwable { return (float) speciesData().getters[i].invokeBasic(this); }
+ /*non-public*/ final double argD(int i) throws Throwable { return (double) speciesData().getters[i].invokeBasic(this); }
+ /*non-public*/ final long argJ(int i) throws Throwable { return (long) speciesData().getters[i].invokeBasic(this); }
//
// cloning API
//
- public abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
- public abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
- public abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
- public abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
- public abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
- public abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable;
+ /*non-public*/ abstract BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable;
// The following is a grossly irregular hack:
@Override MethodHandle reinvokerTarget() {
@@ -203,39 +203,39 @@
private // make it private to force users to access the enclosing class first
static final class Species_L extends BoundMethodHandle {
final Object argL0;
- public Species_L(MethodType mt, LambdaForm lf, Object argL0) {
+ /*non-public*/ Species_L(MethodType mt, LambdaForm lf, Object argL0) {
super(mt, lf);
this.argL0 = argL0;
}
// The following is a grossly irregular hack:
@Override MethodHandle reinvokerTarget() { return (MethodHandle) argL0; }
@Override
- public SpeciesData speciesData() {
+ /*non-public*/ SpeciesData speciesData() {
return SPECIES_DATA;
}
- public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
+ /*non-public*/ static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("L", Species_L.class);
@Override
- public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
+ /*non-public*/ final BoundMethodHandle clone(MethodType mt, LambdaForm lf) throws Throwable {
return new Species_L(mt, lf, argL0);
}
@Override
- public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
+ /*non-public*/ final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) throws Throwable {
return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, narg);
}
@Override
- public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
+ /*non-public*/ final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) throws Throwable {
return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, narg);
}
@Override
- public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
+ /*non-public*/ final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) throws Throwable {
return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, narg);
}
@Override
- public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
+ /*non-public*/ final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) throws Throwable {
return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, narg);
}
@Override
- public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
+ /*non-public*/ final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) throws Throwable {
return (BoundMethodHandle) SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, narg);
}
}
@@ -338,10 +338,10 @@
final MethodHandle[] getters;
final SpeciesData[] extensions;
- public int fieldCount() {
+ /*non-public*/ int fieldCount() {
return types.length();
}
- public char fieldType(int i) {
+ /*non-public*/ char fieldType(int i) {
return types.charAt(i);
}
@@ -546,30 +546,30 @@
* final Object argL0;
* final Object argL1;
* final int argI2;
- * public Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
+ * Species_LLI(MethodType mt, LambdaForm lf, Object argL0, Object argL1, int argI2) {
* super(mt, lf);
* this.argL0 = argL0;
* this.argL1 = argL1;
* this.argI2 = argI2;
* }
- * public final SpeciesData speciesData() { return SPECIES_DATA; }
- * public static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
- * public final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
+ * final SpeciesData speciesData() { return SPECIES_DATA; }
+ * static final SpeciesData SPECIES_DATA = SpeciesData.getForClass("LLI", Species_LLI.class);
+ * final BoundMethodHandle clone(MethodType mt, LambdaForm lf) {
* return SPECIES_DATA.constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2);
* }
- * public final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
+ * final BoundMethodHandle cloneExtendL(MethodType mt, LambdaForm lf, Object narg) {
* return SPECIES_DATA.extendWithIndex(INDEX_L).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
* }
- * public final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
+ * final BoundMethodHandle cloneExtendI(MethodType mt, LambdaForm lf, int narg) {
* return SPECIES_DATA.extendWithIndex(INDEX_I).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
* }
- * public final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
+ * final BoundMethodHandle cloneExtendJ(MethodType mt, LambdaForm lf, long narg) {
* return SPECIES_DATA.extendWithIndex(INDEX_J).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
* }
- * public final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
+ * final BoundMethodHandle cloneExtendF(MethodType mt, LambdaForm lf, float narg) {
* return SPECIES_DATA.extendWithIndex(INDEX_F).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
* }
- * public final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
+ * final BoundMethodHandle cloneExtendD(MethodType mt, LambdaForm lf, double narg) {
* return SPECIES_DATA.extendWithIndex(INDEX_D).constructor[0].invokeBasic(mt, lf, argL0, argL1, argI2, narg);
* }
* }
@@ -583,11 +583,12 @@
final String className = SPECIES_PREFIX_PATH + types;
final String sourceFile = SPECIES_PREFIX_NAME + types;
- cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
+ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
+ cw.visit(V1_6, NOT_ACC_PUBLIC + ACC_FINAL + ACC_SUPER, className, null, BMH, null);
cw.visitSource(sourceFile, null);
// emit static types and SPECIES_DATA fields
- cw.visitField(ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
+ cw.visitField(NOT_ACC_PUBLIC + ACC_STATIC, "SPECIES_DATA", SPECIES_DATA_SIG, null, null).visitEnd();
// emit bound argument fields
for (int i = 0; i < types.length(); ++i) {
@@ -600,7 +601,7 @@
MethodVisitor mv;
// emit constructor
- mv = cw.visitMethod(ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC, "<init>", makeSignature(types, true), null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
@@ -624,7 +625,7 @@
mv.visitEnd();
// emit implementation of reinvokerTarget()
- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "reinvokerTarget", "()" + MH_SIG, null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, className, "argL0", JLO_SIG);
@@ -634,7 +635,7 @@
mv.visitEnd();
// emit implementation of speciesData()
- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "speciesData", MYSPECIES_DATA_SIG, null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, className, "SPECIES_DATA", SPECIES_DATA_SIG);
mv.visitInsn(ARETURN);
@@ -642,7 +643,7 @@
mv.visitEnd();
// emit clone()
- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "clone", makeSignature("", false), null, E_THROWABLE);
mv.visitCode();
// return speciesData().constructor[0].invokeBasic(mt, lf, argL0, ...)
// obtain constructor
@@ -665,7 +666,7 @@
// for each type, emit cloneExtendT()
for (Class<?> c : TYPES) {
char t = Wrapper.basicTypeChar(c);
- mv = cw.visitMethod(ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC + ACC_FINAL, "cloneExtend" + t, makeSignature(String.valueOf(t), false), null, E_THROWABLE);
mv.visitCode();
// return SPECIES_DATA.extendWithIndex(extensionIndex(t)).constructor[0].invokeBasic(mt, lf, argL0, ..., narg)
// obtain constructor
@@ -692,7 +693,7 @@
}
// emit class initializer
- mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
+ mv = cw.visitMethod(NOT_ACC_PUBLIC | ACC_STATIC, "<clinit>", VOID_SIG, null, null);
mv.visitCode();
mv.visitLdcInsn(types);
mv.visitLdcInsn(Type.getObjectType(className));
--- ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Tue Mar 18 12:35:25 2014 -0700
@@ -289,8 +289,9 @@
* Set up class file generation.
*/
private void classFilePrologue() {
+ final int NOT_ACC_PUBLIC = 0; // not ACC_PUBLIC
cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES);
- cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
+ cw.visit(Opcodes.V1_6, NOT_ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, className, null, superName, null);
cw.visitSource(sourceFile, null);
String invokerDesc = invokerType.toMethodDescriptorString();
--- ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Tue Mar 18 12:35:25 2014 -0700
@@ -1616,6 +1616,7 @@
*/
public static
MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) {
+ reorder = reorder.clone();
checkReorder(reorder, newType, target.type());
return target.permuteArguments(newType, reorder);
}
@@ -1810,6 +1811,7 @@
throw newIllegalArgumentException("no argument type to remove");
ArrayList<Class<?>> ptypes = new ArrayList<>(oldType.parameterList());
ptypes.addAll(pos, valueTypes);
+ if (ptypes.size() != inargs) throw newIllegalArgumentException("valueTypes");
MethodType newType = MethodType.methodType(oldType.returnType(), ptypes);
return target.dropArguments(newType, pos, dropped);
}
--- ./jdk/src/share/classes/java/util/ServiceLoader.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/util/ServiceLoader.java Tue Mar 18 12:35:25 2014 -0700
@@ -375,7 +375,7 @@
return p;
} catch (Throwable x) {
fail(service,
- "Provider " + cn + " could not be instantiated: " + x,
+ "Provider " + cn + " could not be instantiated",
x);
}
throw new Error(); // This cannot happen
--- ./jdk/src/share/classes/java/util/jar/JarVerifier.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/util/jar/JarVerifier.java Tue Mar 18 12:35:25 2014 -0700
@@ -677,6 +677,8 @@
} else {
matchUnsigned = true;
}
+ } else {
+ matchUnsigned = true;
}
}
@@ -779,23 +781,7 @@
// true if file is part of the signature mechanism itself
static boolean isSigningRelated(String name) {
- name = name.toUpperCase(Locale.ENGLISH);
- if (!name.startsWith("META-INF/")) {
- return false;
- }
- name = name.substring(9);
- if (name.indexOf('/') != -1) {
- return false;
- }
- if (name.endsWith(".DSA")
- || name.endsWith(".RSA")
- || name.endsWith(".SF")
- || name.endsWith(".EC")
- || name.startsWith("SIG-")
- || name.equals("MANIFEST.MF")) {
- return true;
- }
- return false;
+ return SignatureFileVerifier.isSigningRelated(name);
}
private Enumeration<String> unsignedEntryNames(JarFile jar) {
--- ./jdk/src/share/classes/java/util/logging/LogManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/util/logging/LogManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -363,6 +363,9 @@
changes.removePropertyChangeListener(l);
}
+ // LoggerContext maps from AppContext
+ private static WeakHashMap<Object, LoggerContext> contextsMap = null;
+
// Returns the LoggerContext for the user code (i.e. application or AppContext).
// Loggers are isolated from each AppContext.
private LoggerContext getUserContext() {
@@ -371,33 +374,28 @@
SecurityManager sm = System.getSecurityManager();
JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess();
if (sm != null && javaAwtAccess != null) {
+ // for each applet, it has its own LoggerContext isolated from others
synchronized (javaAwtAccess) {
- // AppContext.getAppContext() returns the system AppContext if called
- // from a system thread but Logger.getLogger might be called from
- // an applet code. Instead, find the AppContext of the applet code
- // from the execution stack.
- Object ecx = javaAwtAccess.getExecutionContext();
- if (ecx == null) {
- // fall back to thread group seach of AppContext
- ecx = javaAwtAccess.getContext();
- }
+ // find the AppContext of the applet code
+ // will be null if we are in the main app context.
+ final Object ecx = javaAwtAccess.getAppletContext();
if (ecx != null) {
- context = (LoggerContext)javaAwtAccess.get(ecx, LoggerContext.class);
+ if (contextsMap == null) {
+ contextsMap = new WeakHashMap<>();
+ }
+ context = contextsMap.get(ecx);
if (context == null) {
- if (javaAwtAccess.isMainAppContext()) {
- context = userContext;
- } else {
- // Create a new LoggerContext for the applet.
- // The new logger context has its requiresDefaultLoggers
- // flag set to true - so that these loggers will be
- // lazily added when the context is firt accessed.
- context = new LoggerContext(true);
- }
- javaAwtAccess.put(ecx, LoggerContext.class, context);
+ // Create a new LoggerContext for the applet.
+ // The new logger context has its requiresDefaultLoggers
+ // flag set to true - so that these loggers will be
+ // lazily added when the context is firt accessed.
+ context = new LoggerContext(true);
+ contextsMap.put(ecx, context);
}
}
}
}
+ // for standalone app, return userContext
return context != null ? context : userContext;
}
@@ -424,7 +422,7 @@
Logger result = getLogger(name);
if (result == null) {
// only allocate the new logger once
- Logger newLogger = new Logger(name, resourceBundleName, caller);
+ Logger newLogger = new Logger(name, resourceBundleName, caller, false);
do {
if (addLogger(newLogger)) {
// We successfully added the new Logger that we
@@ -471,12 +469,12 @@
} while (logger == null);
// LogManager will set the sysLogger's handlers via LogManager.addLogger method.
- if (logger != sysLogger && sysLogger.getHandlers().length == 0) {
+ if (logger != sysLogger && sysLogger.accessCheckedHandlers().length == 0) {
// if logger already exists but handlers not set
final Logger l = logger;
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
- for (Handler hdl : l.getHandlers()) {
+ for (Handler hdl : l.accessCheckedHandlers()) {
sysLogger.addHandler(hdl);
}
return null;
@@ -760,7 +758,7 @@
Logger result = findLogger(name);
if (result == null) {
// only allocate the new system logger once
- Logger newLogger = new Logger(name, resourceBundleName);
+ Logger newLogger = new Logger(name, resourceBundleName, null, true);
do {
if (addLocalLogger(newLogger)) {
// We successfully added the new Logger that we
@@ -1425,31 +1423,35 @@
// We use a subclass of Logger for the root logger, so
// that we only instantiate the global handlers when they
// are first needed.
- private class RootLogger extends Logger {
+ private final class RootLogger extends Logger {
private RootLogger() {
- super("", null);
+ super("", null, null, true);
setLevel(defaultLevel);
}
+ @Override
public void log(LogRecord record) {
// Make sure that the global handlers have been instantiated.
initializeGlobalHandlers();
super.log(record);
}
+ @Override
public void addHandler(Handler h) {
initializeGlobalHandlers();
super.addHandler(h);
}
+ @Override
public void removeHandler(Handler h) {
initializeGlobalHandlers();
super.removeHandler(h);
}
- public Handler[] getHandlers() {
+ @Override
+ Handler[] accessCheckedHandlers() {
initializeGlobalHandlers();
- return super.getHandlers();
+ return super.accessCheckedHandlers();
}
}
--- ./jdk/src/share/classes/java/util/logging/Logger.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/java/util/logging/Logger.java Tue Mar 18 12:35:25 2014 -0700
@@ -178,7 +178,7 @@
private String name;
private final CopyOnWriteArrayList<Handler> handlers =
new CopyOnWriteArrayList<>();
- private String resourceBundleName;
+ private volatile String resourceBundleName;
private volatile boolean useParentHandlers = true;
private volatile Filter filter;
private boolean anonymous;
@@ -189,7 +189,7 @@
// The fields relating to parent-child relationships and levels
// are managed under a separate lock, the treeLock.
- private static Object treeLock = new Object();
+ private static final Object treeLock = new Object();
// We keep weak references from parents to children, but strong
// references from children to parents.
private volatile Logger parent; // our nearest parent.
@@ -197,6 +197,7 @@
private volatile Level levelObject;
private volatile int levelValue; // current effective level value
private WeakReference<ClassLoader> callersClassLoaderRef;
+ private final boolean isSystemLogger;
/**
* GLOBAL_LOGGER_NAME is a name for the global logger.
@@ -257,11 +258,12 @@
* no corresponding resource can be found.
*/
protected Logger(String name, String resourceBundleName) {
- this(name, resourceBundleName, null);
+ this(name, resourceBundleName, null, false);
}
- Logger(String name, String resourceBundleName, Class<?> caller) {
+ Logger(String name, String resourceBundleName, Class<?> caller, boolean isSystemLogger) {
this.manager = LogManager.getLogManager();
+ this.isSystemLogger = isSystemLogger;
setupResourceInfo(resourceBundleName, caller);
this.name = name;
levelValue = Level.INFO.intValue();
@@ -288,6 +290,7 @@
private Logger(String name) {
// The manager field is not initialized here.
this.name = name;
+ this.isSystemLogger = true;
levelValue = Level.INFO.intValue();
}
@@ -528,7 +531,7 @@
// cleanup some Loggers that have been GC'ed
manager.drainLoggerRefQueueBounded();
Logger result = new Logger(null, resourceBundleName,
- Reflection.getCallerClass());
+ Reflection.getCallerClass(), false);
result.anonymous = true;
Logger root = manager.getLogger("");
result.doSetParent(root);
@@ -606,15 +609,22 @@
Logger logger = this;
while (logger != null) {
- for (Handler handler : logger.getHandlers()) {
+ final Handler[] loggerHandlers = isSystemLogger
+ ? logger.accessCheckedHandlers()
+ : logger.getHandlers();
+ for (Handler handler : loggerHandlers) {
handler.publish(record);
}
- if (!logger.getUseParentHandlers()) {
+ final boolean useParentHdls = isSystemLogger
+ ? logger.useParentHandlers
+ : logger.getUseParentHandlers();
+
+ if (!useParentHdls) {
break;
}
- logger = logger.getParent();
+ logger = isSystemLogger ? logger.parent : logger.getParent();
}
}
@@ -1337,6 +1347,12 @@
* @return an array of all registered Handlers
*/
public Handler[] getHandlers() {
+ return accessCheckedHandlers();
+ }
+
+ // This method should ideally be marked final - but unfortunately
+ // it needs to be overridden by LogManager.RootLogger
+ Handler[] accessCheckedHandlers() {
return handlers.toArray(emptyHandlers);
}
@@ -1669,11 +1685,13 @@
private String getEffectiveResourceBundleName() {
Logger target = this;
while (target != null) {
- String rbn = target.getResourceBundleName();
+ final String rbn = isSystemLogger
+ ? target.resourceBundleName
+ : target.getResourceBundleName();
if (rbn != null) {
return rbn;
}
- target = target.getParent();
+ target = isSystemLogger ? target.parent : target.getParent();
}
return null;
}
--- ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/javax/script/ScriptEngineManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -85,15 +85,18 @@
nameAssociations = new HashMap<String, ScriptEngineFactory>();
extensionAssociations = new HashMap<String, ScriptEngineFactory>();
mimeTypeAssociations = new HashMap<String, ScriptEngineFactory>();
- AccessController.doPrivileged(new PrivilegedAction<Object>() {
- public Object run() {
- initEngines(loader);
- return null;
- }
- });
+ List<ScriptEngineFactory> facList = AccessController.doPrivileged(
+ new PrivilegedAction<List<ScriptEngineFactory>>() {
+ public List<ScriptEngineFactory> run() {
+ return initEngines(loader);
+ }
+ });
+ for (ScriptEngineFactory fac : facList) {
+ engineSpis.add(fac);
+ }
}
- private void initEngines(final ClassLoader loader) {
+ private List<ScriptEngineFactory> initEngines(final ClassLoader loader) {
Iterator itr = null;
try {
if (loader != null) {
@@ -110,14 +113,15 @@
// do not throw any exception here. user may want to
// manage his/her own factories using this manager
// by explicit registratation (by registerXXX) methods.
- return;
+ return null;
}
+ final List<ScriptEngineFactory> facList = new ArrayList<>();
try {
while (itr.hasNext()) {
try {
ScriptEngineFactory fact = (ScriptEngineFactory) itr.next();
- engineSpis.add(fact);
+ facList.add(fact);
} catch (ServiceConfigurationError err) {
System.err.println("ScriptEngineManager providers.next(): "
+ err.getMessage());
@@ -137,8 +141,8 @@
// do not throw any exception here. user may want to
// manage his/her own factories using this manager
// by explicit registratation (by registerXXX) methods.
- return;
}
+ return facList;
}
/**
--- ./jdk/src/share/classes/javax/security/auth/Subject.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/javax/security/auth/Subject.java Tue Mar 18 12:35:25 2014 -0700
@@ -941,14 +941,30 @@
/**
* Reads this object from a stream (i.e., deserializes it)
*/
+ @SuppressWarnings("unchecked")
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
- s.defaultReadObject();
+ ObjectInputStream.GetField gf = s.readFields();
+
+ readOnly = gf.get("readOnly", false);
+
+ Set<Principal> inputPrincs = (Set<Principal>)gf.get("principals", null);
// Rewrap the principals into a SecureSet
- principals = Collections.synchronizedSet(new SecureSet<Principal>
- (this, PRINCIPAL_SET, principals));
+ if (inputPrincs == null) {
+ throw new NullPointerException
+ (ResourcesMgr.getString("invalid.null.input.s."));
+ }
+ try {
+ principals = Collections.synchronizedSet(new SecureSet<Principal>
+ (this, PRINCIPAL_SET, inputPrincs));
+ } catch (NullPointerException npe) {
+ // Sometimes people deserialize the principals set only.
+ // Subject is not accessible, so just don't fail.
+ principals = Collections.synchronizedSet
+ (new SecureSet<Principal>(this, PRINCIPAL_SET));
+ }
// The Credential <code>Set</code> is not serialized, but we do not
// want the default deserialization routine to set it to null.
--- ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/javax/sql/rowset/RowSetProvider.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@
import java.sql.SQLException;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
+import sun.reflect.misc.ReflectUtil;
/**
* A factory API that enables applications to obtain a
@@ -127,15 +128,11 @@
factoryClassName = getSystemProperty(ROWSET_FACTORY_NAME);
if (factoryClassName != null) {
trace("Found system property, value=" + factoryClassName);
- factory = (RowSetFactory) getFactoryClass(factoryClassName, null, true).newInstance();
+ factory = (RowSetFactory) ReflectUtil.newInstance(getFactoryClass(factoryClassName, null, true));
}
- } catch (ClassNotFoundException e) {
- throw new SQLException(
- "RowSetFactory: " + factoryClassName + " not found", e);
- } catch (Exception e) {
- throw new SQLException(
- "RowSetFactory: " + factoryClassName + " could not be instantiated: " + e,
- e);
+ } catch (Exception e) {
+ throw new SQLException( "RowSetFactory: " + factoryClassName +
+ " could not be instantiated: ", e);
}
// Check to see if we found the RowSetFactory via a System property
@@ -180,6 +177,16 @@
throws SQLException {
trace("***In newInstance()");
+
+ if(factoryClassName == null) {
+ throw new SQLException("Error: factoryClassName cannot be null");
+ }
+ try {
+ ReflectUtil.checkPackageAccess(factoryClassName);
+ } catch (java.security.AccessControlException e) {
+ throw new SQLException("Access Exception",e);
+ }
+
try {
Class providerClass = getFactoryClass(factoryClassName, cl, false);
RowSetFactory instance = (RowSetFactory) providerClass.newInstance();
@@ -292,6 +299,7 @@
});
} catch (SecurityException se) {
if (debug) {
+ trace("error getting " + propName + ": "+ se);
se.printStackTrace();
}
}
--- ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/javax/sql/rowset/serial/SQLInputImpl.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,6 +30,7 @@
import java.io.*;
import java.math.*;
import java.util.Map;
+import sun.reflect.misc.ReflectUtil;
/**
* An input stream used for custom mapping user-defined types (UDTs).
@@ -606,13 +607,9 @@
// create new instance of the class
SQLData obj = null;
try {
- obj = (SQLData)c.newInstance();
- } catch (java.lang.InstantiationException ex) {
- throw new SQLException("Unable to instantiate: " +
- ex.getMessage());
- } catch (java.lang.IllegalAccessException ex) {
- throw new SQLException("Unable to instantiate: " +
- ex.getMessage());
+ obj = (SQLData)ReflectUtil.newInstance(c);
+ } catch (Exception ex) {
+ throw new SQLException("Unable to Instantiate: ", ex);
}
// get the attributes from the struct
Object attribs[] = s.getAttributes(map);
--- ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/javax/sql/rowset/spi/SyncFactory.java Tue Mar 18 12:35:25 2014 -0700
@@ -37,8 +37,11 @@
import java.io.FileNotFoundException;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import javax.naming.*;
+import sun.reflect.misc.ReflectUtil;
/**
* The Service Provider Interface (SPI) mechanism that generates <code>SyncProvider</code>
@@ -343,7 +346,7 @@
// Local implementation class names and keys from Properties
// file, translate names into Class objects using Class.forName
// and store mappings
- Properties properties = new Properties();
+ final Properties properties = new Properties();
if (implementations == null) {
implementations = new Hashtable();
@@ -372,6 +375,7 @@
}
});
} catch (Exception ex) {
+ System.out.println("errorget rowset.properties: " + ex);
strRowsetProperties = null;
}
if (strRowsetProperties != null) {
@@ -391,16 +395,33 @@
strFileSep + "rowset" + strFileSep +
"rowset.properties";
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ final ClassLoader cl = Thread.currentThread().getContextClassLoader();
- try (InputStream stream =
- (cl == null) ? ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
- : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
- if (stream == null) {
- throw new SyncFactoryException(
- "Resource " + ROWSET_PROPERTIES + " not found");
+ try {
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
+ @Override
+ public Void run() throws SyncFactoryException, IOException, FileNotFoundException {
+ try (InputStream stream = (cl == null) ?
+ ClassLoader.getSystemResourceAsStream(ROWSET_PROPERTIES)
+ : cl.getResourceAsStream(ROWSET_PROPERTIES)) {
+ if (stream == null) {
+ throw new SyncFactoryException("Resource " + ROWSET_PROPERTIES + " not found");
+ }
+ properties.load(stream);
+ }
+ return null;
+ }
+
+ });
+ } catch (PrivilegedActionException ex) {
+ Throwable e = ex.getException();
+ if (e instanceof SyncFactoryException) {
+ throw (SyncFactoryException) e;
+ } else {
+ SyncFactoryException sfe = new SyncFactoryException();
+ sfe.initCause(ex.getException());
+ throw sfe;
}
- properties.load(stream);
}
parseProperties(properties);
@@ -560,6 +581,13 @@
return new com.sun.rowset.providers.RIOptimisticProvider();
}
+ try {
+ ReflectUtil.checkPackageAccess(providerID);
+ } catch (java.security.AccessControlException e) {
+ SyncFactoryException sfe = new SyncFactoryException();
+ sfe.initCause(e);
+ throw sfe;
+ }
// Attempt to invoke classname from registered SyncProvider list
Class c = null;
try {
@@ -568,7 +596,7 @@
/**
* The SyncProvider implementation of the user will be in
* the classpath. We need to find the ClassLoader which loads
- * this SyncFactory and try to laod the SyncProvider class from
+ * this SyncFactory and try to load the SyncProvider class from
* there.
**/
c = Class.forName(providerID, true, cl);
--- ./jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/AWTAccessor.java Tue Mar 18 12:35:25 2014 -0700
@@ -29,6 +29,7 @@
import java.awt.KeyboardFocusManager;
import java.awt.DefaultKeyboardFocusManager;
import java.awt.event.InputEvent;
+import java.awt.event.InvocationEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.Point2D;
@@ -690,6 +691,25 @@
}
/*
+ * An accessor object for the InvocationEvent class
+ */
+ public interface InvocationEventAccessor {
+ /**
+ * Disposes the InvocationEvent
+ */
+ void dispose(InvocationEvent event);
+
+ /**
+ * Creates an InvocationEvent with a completion listener -
+ * a Runnable whose run() method will be called immediately after
+ * the event is dispatched or disposed
+ */
+ InvocationEvent createEvent(Object source, Runnable runnable, Runnable listener,
+ boolean catchThrowables);
+ }
+
+
+ /*
* Accessor instances are initialized in the static initializers of
* corresponding AWT classes by using setters defined below.
*/
@@ -716,6 +736,7 @@
private static TrayIconAccessor trayIconAccessor;
private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
private static SequencedEventAccessor sequencedEventAccessor;
+ private static InvocationEventAccessor invocationEventAccessor;
/*
* Set an accessor object for the java.awt.Component class.
@@ -1110,4 +1131,18 @@
// (so not a single instance of the event has been created).
return sequencedEventAccessor;
}
+
+ /*
+ * Get the accessor object for the java.awt.event.InvocationEvent class.
+ */
+ public static void setInvocationEventAccessor(InvocationEventAccessor invocationEventAccessor) {
+ AWTAccessor.invocationEventAccessor = invocationEventAccessor;
+ }
+
+ /*
+ * Set the accessor object for the java.awt.event.InvocationEvent class.
+ */
+ public static InvocationEventAccessor getInvocationEventAccessor() {
+ return invocationEventAccessor;
+ }
}
--- ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/AWTAutoShutdown.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,13 @@
package sun.awt;
import java.awt.AWTEvent;
-import java.util.Collections;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Map;
+
+import sun.misc.ThreadGroupUtils;
import sun.util.logging.PlatformLogger;
/**
@@ -212,7 +215,13 @@
synchronized (activationLock) {
synchronized (mainLock) {
if (!isReadyToShutdown() && blockerThread == null) {
- activateBlockerThread();
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ activateBlockerThread();
+ return null;
+ }
+ });
} else {
mainLock.notifyAll();
timeoutPassed = false;
@@ -326,9 +335,12 @@
/**
* Creates and starts a new blocker thread. Doesn't return until
* the new blocker thread starts.
+ *
+ * Must be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
*/
private void activateBlockerThread() {
- Thread thread = new Thread(this, "AWT-Shutdown");
+ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), this, "AWT-Shutdown");
+ thread.setContextClassLoader(null);
thread.setDaemon(false);
blockerThread = thread;
thread.start();
--- ./jdk/src/share/classes/sun/awt/AppContext.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/AppContext.java Tue Mar 18 12:35:25 2014 -0700
@@ -837,21 +837,68 @@
public boolean isMainAppContext() {
return (numAppContexts.get() == 1 && mainAppContext != null);
}
- public Object getContext() {
- return getAppContext();
+
+ private boolean hasRootThreadGroup(final AppContext ecx) {
+ return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return ecx.threadGroup.getParent() == null;
+ }
+ });
}
- public Object getExecutionContext() {
- return getExecutionAppContext();
+
+ /**
+ * Returns the AppContext used for applet logging isolation, or null if
+ * the default global context can be used.
+ * If there's no applet, or if the caller is a stand alone application,
+ * or running in the main app context, returns null.
+ * Otherwise, returns the AppContext of the calling applet.
+ * @return null if the global default context can be used,
+ * an AppContext otherwise.
+ **/
+ public Object getAppletContext() {
+ // There's no AppContext: return null.
+ // No need to call getAppContext() if numAppContext == 0:
+ // it means that no AppContext has been created yet, and
+ // we don't want to trigger the creation of a main app
+ // context since we don't need it.
+ if (numAppContexts.get() == 0) return null;
+
+ // Get the context from the security manager
+ AppContext ecx = getExecutionAppContext();
+
+ // Not sure we really need to re-check numAppContexts here.
+ // If all applets have gone away then we could have a
+ // numAppContexts coming back to 0. So we recheck
+ // it here because we don't want to trigger the
+ // creation of a main AppContext in that case.
+ // This is probably not 100% MT-safe but should reduce
+ // the window of opportunity in which that issue could
+ // happen.
+ if (numAppContexts.get() > 0) {
+ // Defaults to thread group caching.
+ // This is probably not required as we only really need
+ // isolation in a deployed applet environment, in which
+ // case ecx will not be null when we reach here
+ // However it helps emulate the deployed environment,
+ // in tests for instance.
+ ecx = ecx != null ? ecx : getAppContext();
+ }
+
+ // getAppletContext() may be called when initializing the main
+ // app context - in which case mainAppContext will still be
+ // null. To work around this issue we simply use
+ // AppContext.threadGroup.getParent() == null instead, since
+ // mainAppContext is the only AppContext which should have
+ // the root TG as its thread group.
+ // See: JDK-8023258
+ final boolean isMainAppContext = ecx == null
+ || mainAppContext == ecx
+ || mainAppContext == null && hasRootThreadGroup(ecx);
+
+ return isMainAppContext ? null : ecx;
}
- public Object get(Object context, Object key) {
- return ((AppContext)context).get(key);
- }
- public void put(Object context, Object key, Object value) {
- ((AppContext)context).put(key, value);
- }
- public void remove(Object context, Object key) {
- ((AppContext)context).remove(key);
- }
+
});
}
}
--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import java.awt.SystemTray;
import java.awt.event.InputEvent;
import java.net.URL;
+import java.security.PrivilegedAction;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
--- ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/datatransfer/ClipboardTransferable.java Tue Mar 18 12:35:25 2014 -0700
@@ -87,7 +87,7 @@
HashMap cached_data = new HashMap(formats.length, 1.0f);
Map flavorsForFormats = DataTransferer.getInstance().
- getFlavorsForFormats(formats, SunClipboard.flavorMap);
+ getFlavorsForFormats(formats, SunClipboard.getDefaultFlavorTable());
for (Iterator iter = flavorsForFormats.keySet().iterator();
iter.hasNext(); )
{
--- ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/awt/datatransfer/SunClipboard.java Tue Mar 18 12:35:25 2014 -0700
@@ -64,9 +64,6 @@
public abstract class SunClipboard extends Clipboard
implements PropertyChangeListener {
- public static final FlavorTable flavorMap =
- (FlavorTable)SystemFlavorMap.getDefaultFlavorMap();
-
private AppContext contentsContext = null;
private final Object CLIPBOARD_FLAVOR_LISTENER_KEY;
@@ -172,7 +169,7 @@
long[] formats = getClipboardFormatsOpenClose();
return DataTransferer.getInstance().
- getFlavorsForFormatsAsArray(formats, flavorMap);
+ getFlavorsForFormatsAsArray(formats, getDefaultFlavorTable());
}
/**
@@ -218,7 +215,7 @@
long[] formats = getClipboardFormats();
Long lFormat = (Long)DataTransferer.getInstance().
- getFlavorsForFormats(formats, flavorMap).get(flavor);
+ getFlavorsForFormats(formats, getDefaultFlavorTable()).get(flavor);
if (lFormat == null) {
throw new UnsupportedFlavorException(flavor);
@@ -349,7 +346,7 @@
private static Set formatArrayAsDataFlavorSet(long[] formats) {
return (formats == null) ? null :
DataTransferer.getInstance().
- getFlavorsForFormatsAsSet(formats, flavorMap);
+ getFlavorsForFormatsAsSet(formats, getDefaultFlavorTable());
}
@@ -469,4 +466,7 @@
}
}
+ public static FlavorTable getDefaultFlavorTable() {
+ return (FlavorTable) SystemFlavorMap.getDefaultFlavorMap();
+ }
}
--- ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/font/CreatedFontTracker.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,12 +27,15 @@
import java.io.File;
import java.io.OutputStream;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import sun.awt.AppContext;
+import sun.misc.ThreadGroupUtils;
public class CreatedFontTracker {
@@ -112,28 +115,25 @@
static void init() {
if (t == null) {
// Add a shutdown hook to remove the temp file.
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public Object run() {
- /* The thread must be a member of a thread group
- * which will not get GCed before VM exit.
- * Make its parent the top-level thread group.
- */
- ThreadGroup tg =
- Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null;
- tg = tgn, tgn = tg.getParent());
- t = new Thread(tg, new Runnable() {
- public void run() {
- runHooks();
- }
- });
- t.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(t);
- return null;
- }
- });
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ t = new Thread(rootTG, new Runnable() {
+ @Override
+ public void run() {
+ runHooks();
+ }
+ });
+ t.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(t);
+ return null;
+ }
+ });
}
}
--- ./jdk/src/share/classes/sun/font/SunFontManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/font/SunFontManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -52,6 +52,7 @@
import sun.awt.AppContext;
import sun.awt.FontConfiguration;
import sun.awt.SunToolkit;
+import sun.misc.ThreadGroupUtils;
import sun.java2d.FontSupport;
import sun.util.logging.PlatformLogger;
@@ -2521,24 +2522,20 @@
});
}
};
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public Object run() {
- /* The thread must be a member of a thread group
- * which will not get GCed before VM exit.
- * Make its parent the top-level thread group.
- */
- ThreadGroup tg =
- Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null;
- tg = tgn, tgn = tg.getParent());
- fileCloser = new Thread(tg, fileCloserRunnable);
- fileCloser.setContextClassLoader(null);
- Runtime.getRuntime().addShutdownHook(fileCloser);
- return null;
- }
- });
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ /* The thread must be a member of a thread group
+ * which will not get GCed before VM exit.
+ * Make its parent the top-level thread group.
+ */
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ fileCloser = new Thread(rootTG, fileCloserRunnable);
+ fileCloser.setContextClassLoader(null);
+ Runtime.getRuntime().addShutdownHook(fileCloser);
+ return null;
+ }
+ });
}
}
}
--- ./jdk/src/share/classes/sun/java2d/Disposer.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/java2d/Disposer.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,10 +25,14 @@
package sun.java2d;
+import sun.misc.ThreadGroupUtils;
+
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.PhantomReference;
import java.lang.ref.WeakReference;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Hashtable;
@@ -71,26 +75,22 @@
}
}
disposerInstance = new Disposer();
- java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public Object run() {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
/* The thread must be a member of a thread group
* which will not get GCed before VM exit.
* Make its parent the top-level thread group.
*/
- ThreadGroup tg = Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null;
- tg = tgn, tgn = tg.getParent());
- Thread t =
- new Thread(tg, disposerInstance, "Java2D Disposer");
- t.setContextClassLoader(null);
- t.setDaemon(true);
- t.setPriority(Thread.MAX_PRIORITY);
- t.start();
- return null;
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ Thread t = new Thread(rootTG, disposerInstance, "Java2D Disposer");
+ t.setContextClassLoader(null);
+ t.setDaemon(true);
+ t.setPriority(Thread.MAX_PRIORITY);
+ t.start();
+ return null;
+ }
}
- }
);
}
--- ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/java2d/opengl/OGLRenderQueue.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
package sun.java2d.opengl;
+import sun.misc.ThreadGroupUtils;
import sun.java2d.pipe.RenderBuffer;
import sun.java2d.pipe.RenderQueue;
import static sun.java2d.pipe.BufferedOpCodes.*;
@@ -48,12 +49,9 @@
* which will not get GCed before VM exit.
*/
flusher = AccessController.doPrivileged(new PrivilegedAction<QueueFlusher>() {
+ @Override
public QueueFlusher run() {
- ThreadGroup rootThreadGroup = Thread.currentThread().getThreadGroup();
- while (rootThreadGroup.getParent() != null) {
- rootThreadGroup = rootThreadGroup.getParent();
- }
- return new QueueFlusher(rootThreadGroup);
+ return new QueueFlusher(ThreadGroupUtils.getRootThreadGroup());
}
});
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/src/share/classes/sun/misc/InnocuousThread.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNUNSAFE General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUNSAFET
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICUNSAFELAR PUNSAFERPOSE. See the GNUNSAFE General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNUNSAFE General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 UNSAFESA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 UNSAFESA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.misc;
+
+import java.security.AccessControlContext;
+import java.security.ProtectionDomain;
+
+/**
+ * A thread that has no permissions, is not a member of any user-defined
+ * ThreadGroup and supports the ability to erase ThreadLocals.
+ *
+ * @implNote Based on the implementation of InnocuousForkJoinWorkerThread.
+ */
+public final class InnocuousThread extends Thread {
+ private static final Unsafe UNSAFE;
+ private static final ThreadGroup THREADGROUP;
+ private static final AccessControlContext ACC;
+ private static final long THREADLOCALS;
+ private static final long INHERITABLETHREADLOCALS;
+ private static final long INHERITEDACCESSCONTROLCONTEXT;
+
+ public InnocuousThread(Runnable target) {
+ super(THREADGROUP, target, "anInnocuousThread");
+ UNSAFE.putOrderedObject(this, INHERITEDACCESSCONTROLCONTEXT, ACC);
+ eraseThreadLocals();
+ }
+
+ @Override
+ public ClassLoader getContextClassLoader() {
+ // always report system class loader
+ return ClassLoader.getSystemClassLoader();
+ }
+
+ @Override
+ public void setUncaughtExceptionHandler(UncaughtExceptionHandler x) {
+ // silently fail
+ }
+
+ @Override
+ public void setContextClassLoader(ClassLoader cl) {
+ throw new SecurityException("setContextClassLoader");
+ }
+
+ // ensure run method is run only once
+ private volatile boolean hasRun;
+
+ @Override
+ public void run() {
+ if (Thread.currentThread() == this && !hasRun) {
+ hasRun = true;
+ super.run();
+ }
+ }
+
+ /**
+ * Drops all thread locals (and inherited thread locals).
+ */
+ public void eraseThreadLocals() {
+ UNSAFE.putObject(this, THREADLOCALS, null);
+ UNSAFE.putObject(this, INHERITABLETHREADLOCALS, null);
+ }
+
+ // Use Unsafe to access Thread group and ThreadGroup parent fields
+ static {
+ try {
+ ACC = new AccessControlContext(new ProtectionDomain[] {
+ new ProtectionDomain(null, null)
+ });
+
+ // Find and use topmost ThreadGroup as parent of new group
+ UNSAFE = Unsafe.getUnsafe();
+ Class<?> tk = Thread.class;
+ Class<?> gk = ThreadGroup.class;
+
+ THREADLOCALS = UNSAFE.objectFieldOffset
+ (tk.getDeclaredField("threadLocals"));
+ INHERITABLETHREADLOCALS = UNSAFE.objectFieldOffset
+ (tk.getDeclaredField("inheritableThreadLocals"));
+ INHERITEDACCESSCONTROLCONTEXT = UNSAFE.objectFieldOffset
+ (tk.getDeclaredField("inheritedAccessControlContext"));
+
+ long tg = UNSAFE.objectFieldOffset(tk.getDeclaredField("group"));
+ long gp = UNSAFE.objectFieldOffset(gk.getDeclaredField("parent"));
+ ThreadGroup group = (ThreadGroup)
+ UNSAFE.getObject(Thread.currentThread(), tg);
+
+ while (group != null) {
+ ThreadGroup parent = (ThreadGroup)UNSAFE.getObject(group, gp);
+ if (parent == null)
+ break;
+ group = parent;
+ }
+ THREADGROUP = new ThreadGroup(group, "InnocuousThreadGroup");
+ } catch (Exception e) {
+ throw new Error(e);
+ }
+ }
+}
--- ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/misc/JavaAWTAccess.java Tue Mar 18 12:35:25 2014 -0700
@@ -26,14 +26,16 @@
package sun.misc;
public interface JavaAWTAccess {
- public Object getContext();
- public Object getExecutionContext();
- public Object get(Object context, Object key);
- public void put(Object context, Object key, Object value);
- public void remove(Object context, Object key);
+ // Returns the AppContext used for applet logging isolation, or null if
+ // no isolation is required.
+ // If there's no applet, or if the caller is a stand alone application,
+ // or running in the main app context, returns null.
+ // Otherwise, returns the AppContext of the calling applet.
+ public Object getAppletContext();
- // convenience methods whose context is the object returned by getContext()
+ // convenience methods to cache objects in the current thread group's
+ // AppContext
public Object get(Object key);
public void put(Object key, Object value);
public void remove(Object key);
--- ./jdk/src/share/classes/sun/misc/Service.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/misc/Service.java Tue Mar 18 12:35:25 2014 -0700
@@ -299,7 +299,7 @@
return service.cast(c.newInstance());
} catch (Throwable x) {
fail(service,
- "Provider " + cn + " could not be instantiated: " + x,
+ "Provider " + cn + " could not be instantiated",
x);
}
return null; /* This cannot happen */
--- ./jdk/src/share/classes/sun/misc/SharedSecrets.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/misc/SharedSecrets.java Tue Mar 18 12:35:25 2014 -0700
@@ -197,9 +197,6 @@
public static JavaAWTAccess getJavaAWTAccess() {
// this may return null in which case calling code needs to
// provision for.
- if (javaAWTAccess == null || javaAWTAccess.getContext() == null) {
- return null;
- }
return javaAWTAccess;
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/src/share/classes/sun/misc/ThreadGroupUtils.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.misc;
+
+/**
+ * A utility class needed to access the root {@code ThreadGroup}
+ *
+ * The class should not depend on any others, because it' called from JNI_OnLoad of the AWT
+ * native library. Triggering class loading could could lead to a deadlock.
+ */
+public final class ThreadGroupUtils {
+
+ private ThreadGroupUtils() {
+ // Avoid instantiation
+ }
+
+ /**
+ * Returns a root thread group.
+ * Should be called with {@link sun.security.util.SecurityConstants#MODIFY_THREADGROUP_PERMISSION}
+ *
+ * @return a root {@code ThreadGroup}
+ */
+ public static ThreadGroup getRootThreadGroup() {
+ ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
+ ThreadGroup parentTG = currentTG.getParent();
+ while (parentTG != null) {
+ currentTG = parentTG;
+ parentTG = currentTG.getParent();
+ }
+ return currentTG;
+ }
+}
--- ./jdk/src/share/classes/sun/nio/ch/Invoker.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/nio/ch/Invoker.java Tue Mar 18 12:35:25 2014 -0700
@@ -130,6 +130,18 @@
// clear interrupt
Thread.interrupted();
+
+ // clear thread locals when in default thread pool
+ if (System.getSecurityManager() != null) {
+ Thread me = Thread.currentThread();
+ if (me instanceof sun.misc.InnocuousThread) {
+ GroupAndInvokeCount thisGroupAndInvokeCount = myGroupAndInvokeCount.get();
+ ((sun.misc.InnocuousThread)me).eraseThreadLocals();
+ if (thisGroupAndInvokeCount != null) {
+ myGroupAndInvokeCount.set(thisGroupAndInvokeCount);
+ }
+ }
+ }
}
/**
--- ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/nio/ch/ThreadPool.java Tue Mar 18 12:35:25 2014 -0700
@@ -27,6 +27,7 @@
import java.util.concurrent.*;
import java.security.AccessController;
+import java.security.PrivilegedAction;
import sun.security.action.GetPropertyAction;
import sun.security.action.GetIntegerAction;
@@ -39,14 +40,6 @@
"java.nio.channels.DefaultThreadPool.threadFactory";
private static final String DEFAULT_THREAD_POOL_INITIAL_SIZE =
"java.nio.channels.DefaultThreadPool.initialSize";
- private static final ThreadFactory defaultThreadFactory = new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setDaemon(true);
- return t;
- }
- };
private final ExecutorService executor;
@@ -79,7 +72,29 @@
}
static ThreadFactory defaultThreadFactory() {
- return defaultThreadFactory;
+ if (System.getSecurityManager() == null) {
+ return new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setDaemon(true);
+ return t;
+ }
+ };
+ } else {
+ return new ThreadFactory() {
+ @Override
+ public Thread newThread(final Runnable r) {
+ return (Thread) AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ Thread t = new sun.misc.InnocuousThread(r);
+ t.setDaemon(true);
+ return t;
+ }
+ });
+ }
+ };
+ }
}
private static class DefaultThreadPoolHolder {
@@ -100,7 +115,7 @@
// default to thread factory that creates daemon threads
ThreadFactory threadFactory = getDefaultThreadPoolThreadFactory();
if (threadFactory == null)
- threadFactory = defaultThreadFactory;
+ threadFactory = defaultThreadFactory();
// create thread pool
ExecutorService executor =
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
--- ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/provider/SeedGenerator.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -173,8 +173,8 @@
md.update(p.getProperty(s).getBytes());
}
- md.update
- (InetAddress.getLocalHost().toString().getBytes());
+ // Include network adapter names (and a Mac address)
+ addNetworkAdapterInfo(md);
// The temporary dir
File f = new File(p.getProperty("java.io.tmpdir"));
@@ -212,6 +212,31 @@
return md.digest();
}
+ /*
+ * Include network adapter names and, if available, a Mac address
+ *
+ * See also java.util.concurrent.ThreadLocalRandom.initialSeed()
+ */
+ private static void addNetworkAdapterInfo(MessageDigest md) {
+
+ try {
+ Enumeration<NetworkInterface> ifcs =
+ NetworkInterface.getNetworkInterfaces();
+ while (ifcs.hasMoreElements()) {
+ NetworkInterface ifc = ifcs.nextElement();
+ md.update(ifc.toString().getBytes());
+ if (!ifc.isVirtual()) { // skip fake addresses
+ byte[] bs = ifc.getHardwareAddress();
+ if (bs != null) {
+ md.update(bs);
+ break;
+ }
+ }
+ }
+ } catch (Exception ignore) {
+ }
+ }
+
/**
* Helper function to convert a long into a byte array (least significant
* byte first).
--- ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/provider/certpath/AlgorithmChecker.java Tue Mar 18 12:35:25 2014 -0700
@@ -75,7 +75,7 @@
private PublicKey prevPubKey;
private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
- EnumSet.of(CryptoPrimitive.SIGNATURE);
+ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
private final static DisabledAlgorithmConstraints
certPathDefaultConstraints = new DisabledAlgorithmConstraints(
--- ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Mar 18 12:35:25 2014 -0700
@@ -50,6 +50,7 @@
import sun.security.util.Cache;
import sun.security.util.Debug;
import sun.security.x509.X500Name;
+import sun.security.action.GetBooleanAction;
import sun.security.action.GetPropertyAction;
/**
@@ -135,6 +136,14 @@
private final static String PROP_LIFETIME =
"sun.security.certpath.ldap.cache.lifetime";
+ /*
+ * Internal system property, that when set to "true", disables the
+ * JNDI application resource files lookup to prevent recursion issues
+ * when validating signed JARs with LDAP URLs in certificates.
+ */
+ private final static String PROP_DISABLE_APP_RESOURCE_FILES =
+ "sun.security.certpath.ldap.disable.app.resource.files";
+
static {
String s = AccessController.doPrivileged(
new GetPropertyAction(PROP_LIFETIME));
@@ -236,6 +245,17 @@
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
+
+ // If property is set to true, disable application resource file lookup.
+ boolean disableAppResourceFiles = AccessController.doPrivileged(
+ new GetBooleanAction(PROP_DISABLE_APP_RESOURCE_FILES));
+ if (disableAppResourceFiles) {
+ if (debug != null) {
+ debug.println("LDAPCertStore disabling app resource files");
+ }
+ env.put("com.sun.naming.disable.app.resource.files", "true");
+ }
+
try {
ctx = new InitialDirContext(env);
/*
--- ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/rsa/RSAPadding.java Tue Mar 18 12:35:25 2014 -0700
@@ -25,11 +25,9 @@
package sun.security.rsa;
-import java.math.BigInteger;
import java.util.*;
import java.security.*;
-import java.security.interfaces.*;
import java.security.spec.*;
import javax.crypto.BadPaddingException;
@@ -41,21 +39,41 @@
/**
* RSA padding and unpadding.
*
- * Format of PKCS#1 v1.5 padding is:
+ * The various PKCS#1 versions can be found in the EMC/RSA Labs
+ * web site, which is currently:
+ *
+ * http://www.emc.com/emc-plus/rsa-labs/index.htm
+ *
+ * or in the IETF RFCs derived from the above PKCS#1 standards.
+ *
+ * RFC 2313: v1.5
+ * RFC 2437: v2.0
+ * RFC 3447: v2.1
+ *
+ * The format of PKCS#1 v1.5 padding is:
+ *
* 0x00 | BT | PS...PS | 0x00 | data...data
+ *
* where BT is the blocktype (1 or 2). The length of the entire string
* must be the same as the size of the modulus (i.e. 128 byte for a 1024 bit
* key). Per spec, the padding string must be at least 8 bytes long. That
* leaves up to (length of key in bytes) - 11 bytes for the data.
*
- * OAEP padding is a bit more complicated and has a number of options.
- * We support:
+ * OAEP padding was introduced in PKCS#1 v2.0 and is a bit more complicated
+ * and has a number of options. We support:
+ *
* . arbitrary hash functions ('Hash' in the specification), MessageDigest
* implementation must be available
* . MGF1 as the mask generation function
* . the empty string as the default value for label L and whatever
* specified in javax.crypto.spec.OAEPParameterSpec
*
+ * The algorithms (representations) are forwards-compatible: that is,
+ * the algorithm described in previous releases are in later releases.
+ * However, additional comments/checks/clarifications were added to the
+ * later versions based on real-world experience (e.g. stricter v1.5
+ * format checking.)
+ *
* Note: RSA keys should be at least 512 bits long
*
* @since 1.5
@@ -156,7 +174,8 @@
throw new InvalidAlgorithmParameterException
("Unsupported MGF algo: " + mgfName);
}
- mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters()).getDigestAlgorithm();
+ mgfMdName = ((MGF1ParameterSpec)spec.getMGFParameters())
+ .getDigestAlgorithm();
PSource pSrc = spec.getPSource();
String pSrcAlgo = pSrc.getAlgorithm();
if (!pSrcAlgo.equalsIgnoreCase("PSpecified")) {
@@ -198,7 +217,7 @@
*/
private static byte[] getInitialHash(MessageDigest md,
byte[] digestInput) {
- byte[] result = null;
+ byte[] result;
if ((digestInput == null) || (digestInput.length == 0)) {
String digestName = md.getAlgorithm();
result = emptyHashes.get(digestName);
@@ -213,8 +232,8 @@
}
/**
- * Return the maximum size of the plaintext data that can be processed using
- * this object.
+ * Return the maximum size of the plaintext data that can be processed
+ * using this object.
*/
public int getMaxDataSize() {
return maxDataSize;
@@ -262,7 +281,7 @@
*/
public byte[] unpad(byte[] padded) throws BadPaddingException {
if (padded.length != paddedSize) {
- throw new BadPaddingException("Padded length must be " + paddedSize);
+ throw new BadPaddingException("Decryption error");
}
switch (type) {
case PAD_NONE:
@@ -282,7 +301,8 @@
*/
private byte[] padV15(byte[] data) throws BadPaddingException {
byte[] padded = new byte[paddedSize];
- System.arraycopy(data, 0, padded, paddedSize - data.length, data.length);
+ System.arraycopy(data, 0, padded, paddedSize - data.length,
+ data.length);
int psSize = paddedSize - 3 - data.length;
int k = 0;
padded[k++] = 0;
@@ -317,55 +337,53 @@
}
/**
- * PKCS#1 v1.5 unpadding (blocktype 1 and 2).
+ * PKCS#1 v1.5 unpadding (blocktype 1 (signature) and 2 (encryption)).
*
* Note that we want to make it a constant-time operation
*/
private byte[] unpadV15(byte[] padded) throws BadPaddingException {
int k = 0;
- BadPaddingException bpe = null;
+ boolean bp = false;
if (padded[k++] != 0) {
- bpe = new BadPaddingException("Data must start with zero");
+ bp = true;
}
- if (padded[k++] != type && bpe == null) {
- bpe = new BadPaddingException("Blocktype mismatch: " + padded[1]);
+ if (padded[k++] != type) {
+ bp = true;
}
int p = 0;
while (k < padded.length) {
int b = padded[k++] & 0xff;
- if (b == 0 && p == 0) {
+ if ((b == 0) && (p == 0)) {
p = k;
}
- if (k == padded.length && p == 0 && bpe == null) {
- bpe = new BadPaddingException("Padding string not terminated");
+ if ((k == padded.length) && (p == 0)) {
+ bp = true;
}
if ((type == PAD_BLOCKTYPE_1) && (b != 0xff) &&
- p == 0 && bpe == null) {
- bpe = new BadPaddingException("Padding byte not 0xff: " + b);
+ (p == 0)) {
+ bp = true;
}
}
int n = padded.length - p;
- if (n > maxDataSize && bpe == null) {
- bpe = new BadPaddingException("Padding string too short");
+ if (n > maxDataSize) {
+ bp = true;
}
// copy useless padding array for a constant-time method
- //
- // Is it necessary?
byte[] padding = new byte[p];
System.arraycopy(padded, 0, padding, 0, p);
byte[] data = new byte[n];
System.arraycopy(padded, p, data, 0, n);
- if (bpe == null) {
- bpe = new BadPaddingException("Unused exception");
+ BadPaddingException bpe = new BadPaddingException("Decryption error");
+
+ if (bp) {
+ throw bpe;
} else {
- throw bpe;
+ return data;
}
-
- return data;
}
/**
@@ -424,10 +442,11 @@
*/
private byte[] unpadOAEP(byte[] padded) throws BadPaddingException {
byte[] EM = padded;
+ boolean bp = false;
int hLen = lHash.length;
if (EM[0] != 0) {
- throw new BadPaddingException("Data must start with zero");
+ bp = true;
}
int seedStart = 1;
@@ -442,29 +461,48 @@
// verify lHash == lHash'
for (int i = 0; i < hLen; i++) {
if (lHash[i] != EM[dbStart + i]) {
- throw new BadPaddingException("lHash mismatch");
+ bp = true;
}
}
- // skip over padding (0x00 bytes)
- int i = dbStart + hLen;
- while (EM[i] == 0) {
- i++;
- if (i >= EM.length) {
- throw new BadPaddingException("Padding string not terminated");
+ int padStart = dbStart + hLen;
+ int onePos = -1;
+
+ for (int i = padStart; i < EM.length; i++) {
+ int value = EM[i];
+ if (onePos == -1) {
+ if (value == 0x00) {
+ // continue;
+ } else if (value == 0x01) {
+ onePos = i;
+ } else { // Anything other than {0,1} is bad.
+ bp = true;
+ }
}
}
- if (EM[i++] != 1) {
- throw new BadPaddingException
- ("Padding string not terminated by 0x01 byte");
+ // We either ran off the rails or found something other than 0/1.
+ if (onePos == -1) {
+ bp = true;
+ onePos = EM.length - 1; // Don't inadvertently return any data.
}
- int mLen = EM.length - i;
- byte[] m = new byte[mLen];
- System.arraycopy(EM, i, m, 0, mLen);
+ int mStart = onePos + 1;
- return m;
+ // copy useless padding array for a constant-time method
+ byte [] tmp = new byte[mStart - padStart];
+ System.arraycopy(EM, padStart, tmp, 0, tmp.length);
+
+ byte [] m = new byte[EM.length - mStart];
+ System.arraycopy(EM, mStart, m, 0, m.length);
+
+ BadPaddingException bpe = new BadPaddingException("Decryption error");
+
+ if (bp) {
+ throw bpe;
+ } else {
+ return m;
+ }
}
/**
@@ -478,7 +516,7 @@
private void mgf1(byte[] seed, int seedOfs, int seedLen,
byte[] out, int outOfs, int maskLen) throws BadPaddingException {
byte[] C = new byte[4]; // 32 bit counter
- byte[] digest = new byte[20]; // 20 bytes is length of SHA-1 digest
+ byte[] digest = new byte[mgfMd.getDigestLength()];
while (maskLen > 0) {
mgfMd.update(seed, seedOfs, seedLen);
mgfMd.update(C);
@@ -499,5 +537,4 @@
}
}
}
-
}
--- ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Tue Mar 18 12:35:25 2014 -0700
@@ -68,7 +68,7 @@
// performance optimization
private final static Set<CryptoPrimitive> SIGNATURE_PRIMITIVE_SET =
- EnumSet.of(CryptoPrimitive.SIGNATURE);
+ Collections.unmodifiableSet(EnumSet.of(CryptoPrimitive.SIGNATURE));
// supported pairs of signature and hash algorithm
private final static Map<Integer, SignatureAndHashAlgorithm> supportedMap;
--- ./jdk/src/share/classes/sun/security/tools/JarSigner.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/tools/JarSigner.java Tue Mar 18 12:35:25 2014 -0700
@@ -88,9 +88,6 @@
private static final String META_INF = "META-INF/";
- // prefix for new signature-related files in META-INF directory
- private static final String SIG_PREFIX = META_INF + "SIG-";
-
private static final Class[] PARAM_STRING = { String.class };
private static final String NONE = "NONE";
@@ -1516,22 +1513,7 @@
* . META-INF/*.EC
*/
private boolean signatureRelated(String name) {
- String ucName = name.toUpperCase(Locale.ENGLISH);
- if (ucName.equals(JarFile.MANIFEST_NAME) ||
- ucName.equals(META_INF) ||
- (ucName.startsWith(SIG_PREFIX) &&
- ucName.indexOf("/") == ucName.lastIndexOf("/"))) {
- return true;
- }
-
- if (ucName.startsWith(META_INF) &&
- SignatureFileVerifier.isBlockOrSF(ucName)) {
- // .SF/.DSA/.RSA/.EC files in META-INF subdirs
- // are not considered signature-related
- return (ucName.indexOf("/") == ucName.lastIndexOf("/"));
- }
-
- return false;
+ return SignatureFileVerifier.isSigningRelated(name);
}
Map<CodeSigner,String> cacheForSignerInfo = new IdentityHashMap<>();
--- ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java Tue Mar 18 12:35:25 2014 -0700
@@ -153,6 +153,52 @@
return false;
}
+ /**
+ * Yet another utility method used by JarVerifier and JarSigner
+ * to determine what files are signature related, which includes
+ * the MANIFEST, SF files, known signature block files, and other
+ * unknown signature related files (those starting with SIG- with
+ * an optional [A-Z0-9]{1,3} extension right inside META-INF).
+ *
+ * @param s file name
+ * @return true if the input file name is signature related
+ */
+ public static boolean isSigningRelated(String name) {
+ name = name.toUpperCase(Locale.ENGLISH);
+ if (!name.startsWith("META-INF/")) {
+ return false;
+ }
+ name = name.substring(9);
+ if (name.indexOf('/') != -1) {
+ return false;
+ }
+ if (isBlockOrSF(name) || name.equals("MANIFEST.MF")) {
+ return true;
+ } else if (name.startsWith("SIG-")) {
+ // check filename extension
+ // see http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jar.html#Digital_Signatures
+ // for what filename extensions are legal
+ int extIndex = name.lastIndexOf('.');
+ if (extIndex != -1) {
+ String ext = name.substring(extIndex + 1);
+ // validate length first
+ if (ext.length() > 3 || ext.length() < 1) {
+ return false;
+ }
+ // then check chars, must be in [a-zA-Z0-9] per the jar spec
+ for (int index = 0; index < ext.length(); index++) {
+ char cc = ext.charAt(index);
+ // chars are promoted to uppercase so skip lowercase checks
+ if ((cc < 'A' || cc > 'Z') && (cc < '0' || cc > '9')) {
+ return false;
+ }
+ }
+ }
+ return true; // no extension is OK
+ }
+ return false;
+ }
+
/** get digest from cache */
private MessageDigest getDigest(String algorithm)
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata Time", "ALMT",
"Alma-Ata Summer Time", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Anadyr Time", "ANAT",
"Anadyr Summer Time", "ANAST"}},
{"Asia/Aqtau", new String[] {"Aqtau Time", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma Ata Zeit", "ALMT",
"Alma-Ata Sommerzeit", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Anadyr Zeit", "ANAT",
"Anadyr Sommerzeit", "ANAST"}},
{"Asia/Aqtau", new String[] {"Aqtau Zeit", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Hora de Alma-Ata", "ALMT",
"Hora de verano de Alma-Ata", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Hora de Anadyr", "ANAT",
"Hora de verano de Anadyr", "ANAST"}},
{"Asia/Aqtau", new String[] {"Hora de Aqtau", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Heure d'Alma-Ata", "ALMT",
"Heure d'\u00e9t\u00e9 d'Alma-Ata", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Heure d'Anadyr", "ANAT",
"Heure d'\u00e9t\u00e9 d'Anadyr", "ANAST"}},
{"Asia/Aqtau", new String[] {"Heure d'Aqtau", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Ora di Alma-Ata", "ALMT",
"Ora estiva di Alma-Ata", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Ora di Anadyr", "ANAT",
"Ora estiva di Anadyr", "ANAST"}},
{"Asia/Aqtau", new String[] {"Ora di Aqtau", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"\u30a2\u30eb\u30de\u30a2\u30bf\u6642\u9593", "ALMT",
"\u30a2\u30eb\u30de\u30a2\u30bf\u590f\u6642\u9593", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u6642\u9593", "ANAT",
"\u30a2\u30ca\u30c9\u30a5\u30a4\u30ea\u590f\u6642\u9593", "ANAST"}},
{"Asia/Aqtau", new String[] {"\u30a2\u30af\u30bf\u30a6\u6642\u9593", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"\uc54c\ub9c8\uc544\ud0c0 \uc2dc\uac04", "ALMT",
"\uc54c\ub9c8\uc544\ud0c0 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"\uc544\ub098\ub514\ub974 \uc2dc\uac04", "ANAT",
"\uc544\ub098\ub514\ub974 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ANAST"}},
{"Asia/Aqtau", new String[] {"\uc545\ud0c0\uc6b0 \uc2dc\uac04", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_pt_BR.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Fuso hor\u00e1rio de Alma-Ata", "ALMT",
"Fuso hor\u00e1rio de ver\u00e3o de Alma-Ata", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Fuso hor\u00e1rio de Anadyr", "ANAT",
"Fuso hor\u00e1rio de ver\u00e3o de Anadyr", "ANAST"}},
{"Asia/Aqtau", new String[] {"Fuso hor\u00e1rio de Aqtau", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata, normaltid", "ALMT",
"Alma-Ata, sommartid", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"Anadyr, normaltid", "ANAT",
"Anadyr, sommartid", "ANAST"}},
{"Asia/Aqtau", new String[] {"Aqtau, normaltid", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata \u65f6\u95f4", "ALMT",
"Alma-Ata \u590f\u4ee4\u65f6", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u65f6\u95f4", "ANAT",
"\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u65f6", "ANAST"}},
{"Asia/Aqtau", new String[] {"Aqtau \u65f6\u95f4", "AQTT",
--- ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,7 +483,7 @@
{"Asia/Aden", ARAST},
{"Asia/Almaty", new String[] {"Alma-Ata \u6642\u9593", "ALMT",
"Alma-Ata \u590f\u4ee4\u6642\u9593", "ALMST"}},
- {"Asia/Amman", ARAST},
+ {"Asia/Amman", EET},
{"Asia/Anadyr", new String[] {"\u963f\u90a3\u5e95\u6cb3\u6642\u9593", "ANAT",
"\u963f\u90a3\u5e95\u6cb3\u590f\u4ee4\u6642\u9593", "ANAST"}},
{"Asia/Aqtau", new String[] {"Aqtau \u6642\u9593", "AQTT",
--- ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -4780,39 +4780,7 @@
} else if (log_file[0] != '\0' && (errstrm = fopen(log_file,"a+")) != NULL) {
return;
} else {
- char log_file_name[PATH_MAX+100];
- char tmpdir[PATH_MAX];
-#ifdef WIN32
- int n = GetTempPath(PATH_MAX,tmpdir); //API returns with trailing '\'
- if (n < 1 || n > PATH_MAX) {
- sprintf(tmpdir,"C:\\");
- }
- sprintf(log_file_name, "%sunpack.log", tmpdir);
-#else
- sprintf(tmpdir,"/tmp");
- sprintf(log_file_name, "/tmp/unpack.log");
-#endif
- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
- log_file = errstrm_name = saveStr(log_file_name);
- return ;
- }
-
- char *tname = tempnam(tmpdir,"#upkg");
- if (tname == NULL) return;
- sprintf(log_file_name, "%s", tname);
- ::free(tname);
- if ((errstrm = fopen(log_file_name, "a+")) != NULL) {
- log_file = errstrm_name = saveStr(log_file_name);
- return ;
- }
-#ifndef WIN32
- sprintf(log_file_name, "/dev/null");
- // On windows most likely it will fail.
- if ( (errstrm = fopen(log_file_name, "a+")) != NULL) {
- log_file = errstrm_name = saveStr(log_file_name);
- return ;
- }
-#endif
+ fprintf(stderr, "Can not open log file %s\n", log_file);
// Last resort
// (Do not use stdout, since it might be jarout->jarfp.)
errstrm = stderr;
--- ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/giflib/dgif_lib.c Tue Mar 18 12:35:25 2014 -0700
@@ -435,9 +435,7 @@
Private->PixelCount = (long)GifFile->Image.Width *
(long)GifFile->Image.Height;
- DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
-
- return GIF_OK;
+ return DGifSetupDecompress(GifFile); /* Reset decompress algorithm parameters. */
}
/******************************************************************************
--- ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/image/gif/gifdecoder.c Tue Mar 18 12:35:25 2014 -0700
@@ -249,6 +249,7 @@
/* fill the block */
len = (*env)->CallIntMethod(env, this, readID,
blockh, remain, blockLength + 1);
+ if (len > blockLength + 1) len = blockLength + 1;
if ((*env)->ExceptionOccurred(env)) {
return 0;
}
--- ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Tue Mar 18 12:35:25 2014 -0700
@@ -939,6 +939,9 @@
JPEGImageReader_readInputDataID,
sb->hstreamBuffer, 0,
sb->bufferLength);
+ if ((ret > 0) && ((unsigned int)ret > sb->bufferLength)) {
+ ret = sb->bufferLength;
+ }
if ((*env)->ExceptionOccurred(env)
|| !GET_ARRAYS(env, data, &(src->next_input_byte))) {
cinfo->err->error_exit((j_common_ptr) cinfo);
@@ -1035,6 +1038,7 @@
JPEGImageReader_readInputDataID,
sb->hstreamBuffer,
offset, buflen);
+ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
if ((*env)->ExceptionOccurred(env)
|| !GET_ARRAYS(env, data, &(src->next_input_byte))) {
cinfo->err->error_exit((j_common_ptr) cinfo);
--- ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/image/jpeg/jdmarker.c Tue Mar 18 12:35:25 2014 -0700
@@ -349,6 +349,12 @@
TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
compptr->dc_tbl_no, compptr->ac_tbl_no);
+
+ /* This CSi (cc) should differ from the previous CSi */
+ for (ci = 0; ci < i; ci++) {
+ if (cinfo->cur_comp_info[ci] == compptr)
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+ }
}
/* Collect the additional scan parameters Ss, Se, Ah/Al. */
--- ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/image/jpeg/jpegdecoder.c Tue Mar 18 12:35:25 2014 -0700
@@ -289,6 +289,7 @@
buflen = (*env)->GetArrayLength(env, src->hInputBuffer);
ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
src->hInputBuffer, 0, buflen);
+ if (ret > buflen) ret = buflen;
if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
}
@@ -349,6 +350,7 @@
}
ret = (*env)->CallIntMethod(env, src->hInputStream, InputStream_readID,
src->hInputBuffer, offset, buflen);
+ if ((ret > 0) && ((unsigned int)ret > buflen)) ret = buflen;
if ((*env)->ExceptionOccurred(env) || !GET_ARRAYS(env, src)) {
cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
}
@@ -424,6 +426,7 @@
ret = (*env)->CallIntMethod(env, src->hInputStream,
InputStream_readID,
src->hInputBuffer, 0, buflen);
+ if (ret > buflen) ret = buflen;
if ((*env)->ExceptionOccurred(env)) {
cinfo->err->error_exit((struct jpeg_common_struct *) cinfo);
}
--- ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/libpng/pngrtran.c Tue Mar 18 12:35:25 2014 -0700
@@ -1862,6 +1862,9 @@
info_ptr->bit_depth = 8;
info_ptr->num_trans = 0;
+
+ if (png_ptr->palette == NULL)
+ png_error (png_ptr, "Palette is NULL in indexed image");
}
else
{
--- ./jdk/src/share/native/sun/awt/libpng/pngset.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/libpng/pngset.c Tue Mar 18 12:35:25 2014 -0700
@@ -512,6 +512,17 @@
}
}
+ if ((num_palette > 0 && palette == NULL) ||
+ (num_palette == 0
+# ifdef PNG_MNG_FEATURES_SUPPORTED
+ && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0
+# endif
+ ))
+ {
+ png_error(png_ptr, "Invalid palette");
+ return;
+ }
+
/* It may not actually be necessary to set png_ptr->palette here;
* we do it for backward compatibility with the way the png_handle_tRNS
* function used to do the allocation.
--- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue Mar 18 12:35:25 2014 -0700
@@ -228,6 +228,49 @@
}
}
+/*
+ * We have to make sure that awt_setPixels can be safely applied to the given pair of
+ * raster and mlib image.
+ *
+ * In particular, make sure that
+ * - dimension is the same
+ * - number of channels in mlib image corresponds to the number of bands in the raster
+ * - sample size in image and raster are the same.
+ *
+ * Returns:
+ * -1 to indicate failure,
+ * 1 to indicate success
+ */
+static int setPixelsFormMlibImage(JNIEnv *env, RasterS_t *rasterP, mlib_image* img) {
+ if (rasterP->width != img->width || rasterP->height != img->height) {
+ /* dimension does not match */
+ return -1;
+ }
+
+ if (rasterP->numBands != img->channels) {
+ /* number of bands does not match */
+ return -1;
+ }
+
+ switch (rasterP->dataType) {
+ case BYTE_DATA_TYPE:
+ if (img->type != MLIB_BYTE) {
+ return -1;
+ }
+ break;
+ case SHORT_DATA_TYPE:
+ if (img->type != MLIB_SHORT && img->type != MLIB_USHORT) {
+ return -1;
+ }
+ break;
+ default:
+ /* awt_setPixels does not support such rasters */
+ return -1;
+ }
+
+ return awt_setPixels(env, rasterP, mlib_ImageGetData(img));
+}
+
/***************************************************************************
* External Functions *
***************************************************************************/
@@ -700,7 +743,9 @@
/* Means that we couldn't write directly into the destination buffer */
if (ddata == NULL) {
- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
+ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
+ }
}
/* Release the pinned memory */
@@ -1106,7 +1151,7 @@
if (ddata == NULL) {
/* Need to store it back into the array */
if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
}
}
@@ -1432,6 +1477,14 @@
retStatus = 0;
}
+ /* Release the LUT */
+ for (i=0; i < lut_nbands; i++) {
+ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
+ (jbyte *) jtable[i].table, JNI_ABORT);
+ }
+ free ((void *) jtable);
+ free ((void *) tbl);
+
/*
* Means that we couldn't write directly into
* the destination buffer
@@ -1445,13 +1498,6 @@
}
}
- /* Release the LUT */
- for (i=0; i < lut_nbands; i++) {
- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
- (jbyte *) jtable[i].table, JNI_ABORT);
- }
- free ((void *) jtable);
- free ((void *) tbl);
/* Release the pinned memory */
freeArray(env, srcImageP, src, sdata, dstImageP, dst, ddata);
@@ -1669,18 +1715,20 @@
retStatus = 0;
}
+ /* Release the LUT */
+ for (i=0; i < lut_nbands; i++) {
+ (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
+ (jbyte *) jtable[i].table, JNI_ABORT);
+ }
+
/*
* Means that we couldn't write directly into
* the destination buffer
*/
if (ddata == NULL) {
- retStatus = awt_setPixels(env, dstRasterP, mlib_ImageGetData(dst));
- }
-
- /* Release the LUT */
- for (i=0; i < lut_nbands; i++) {
- (*env)->ReleasePrimitiveArrayCritical(env, jtable[i].jArray,
- (jbyte *) jtable[i].table, JNI_ABORT);
+ if (storeRasterArray(env, srcRasterP, dstRasterP, dst) < 0) {
+ retStatus = setPixelsFormMlibImage(env, dstRasterP, dst);
+ }
}
/* Release the pinned memory */
@@ -2640,7 +2688,7 @@
}
}
else if (mlibImP->type == MLIB_SHORT) {
- return awt_setPixels(env, rasterP, mlibImP->data);
+ return setPixelsFormMlibImage(env, rasterP, mlibImP);
}
}
else {
--- ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/ContextualGlyphSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -154,6 +154,7 @@
TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) {
LEReferenceToArrayOf<LookupValue> valueArray(lookupTable8, success, &lookupTable8->valueArray[0], glyphCount);
+ if (LE_FAILURE(success)) { return newGlyph; }
newGlyph = SWAPW(valueArray(glyphCode - firstGlyph, success));
}
}
--- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -110,6 +110,8 @@
LEErrorCode &success,
le_bool backtrack)
{
+ if (LE_FAILURE(success)) { return FALSE; }
+
le_int32 direction = 1;
le_int32 match = 0;
@@ -255,6 +257,7 @@
le_uint16 matchCount = SWAPW(subRuleTable->glyphCount) - 1;
le_uint16 substCount = SWAPW(subRuleTable->substCount);
LEReferenceToArrayOf<TTGlyphID> inputGlyphArray(base, success, subRuleTable->inputGlyphArray, matchCount+2);
+ if (LE_FAILURE(success)) { return 0; }
if (matchGlyphIDs(inputGlyphArray, matchCount, glyphIterator)) {
LEReferenceToArrayOf<SubstitutionLookupRecord>
substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subRuleTable->inputGlyphArray[matchCount], substCount);
@@ -315,6 +318,7 @@
LEReferenceToArrayOf<le_uint16> classArray(base, success, subClassRuleTable->classArray, matchCount+1);
+ if (LE_FAILURE(success)) { return 0; }
if (matchGlyphClasses(classArray, matchCount, glyphIterator, classDefinitionTable, success)) {
LEReferenceToArrayOf<SubstitutionLookupRecord>
substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) &subClassRuleTable->classArray[matchCount], substCount);
@@ -573,7 +577,7 @@
if (matchGlyphClasses(inputClassArray, inputGlyphCount, glyphIterator, inputClassDefinitionTable, success)) {
LEReferenceToArrayOf<SubstitutionLookupRecord>
substLookupRecordArray(base, success, (const SubstitutionLookupRecord *) lookaheadClassArray.getAlias(lookaheadGlyphCount + 1, success), substCount);
-
+ if (LE_FAILURE(success)) { return 0; }
applySubstitutionLookups(lookupProcessor, substLookupRecordArray, substCount, glyphIterator, fontInstance, position, success);
return inputGlyphCount + 1;
@@ -601,6 +605,7 @@
le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount);
le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]);
LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset
+ if (LE_FAILURE(success)) { return 0; }
const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]);
if( LE_FAILURE(success) ) { return 0; }
--- ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/LigatureSubstProc2.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -95,7 +95,7 @@
if (actionOffset != 0) {
LEReferenceTo<LigatureActionEntry> ap(stHeader, success, ligActionOffset); // byte offset
- ap.addObject(ligActionIndex - 1, success); // index offset ( one before the actual start, because we will pre-increment)
+ ap.addObject(ligActionIndex, success);
LEReferenceToArrayOf<TTGlyphID> ligatureTable(stHeader, success, ligatureOffset, LE_UNBOUNDED_ARRAY);
LigatureActionEntry action;
le_int32 offset, i = 0;
@@ -111,7 +111,6 @@
do {
le_uint32 componentGlyph = componentStack[m--]; // pop off
- ap.addObject(success);
action = SWAPL(*ap.getAlias());
if (m < 0) {
@@ -145,7 +144,8 @@
LE_DEBUG_BAD_FONT("m<0")
}
#endif
- } while (!(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
+ ap.addObject(success);
+ } while (LE_SUCCESS(success) && !(action & lafLast) && (m>=0) ); // stop if last bit is set, or if run out of items
while (mm >= 0) {
if (++m >= nComponents) {
--- ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/LookupProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -282,6 +282,7 @@
for (le_uint16 feature = 0; feature < featureCount; feature += 1) {
LEReferenceToArrayOf<le_uint16> featureIndexArray(langSysTable, success, langSysTable->featureIndexArray, featureCount);
+ if (LE_FAILURE(success)) { continue; }
le_uint16 featureIndex = SWAPW(featureIndexArray.getObject(feature,success));
// don't add the required feature to the list more than once...
--- ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/MarkToBasePosnSubtables.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -67,6 +67,7 @@
LEPoint markAnchor;
LEReferenceTo<MarkArray> markArray(base, success, (const MarkArray *) ((char *) this + SWAPW(markArrayOffset)));
+ if(LE_FAILURE(success)) return 0;
le_int32 markClass = markArray->getMarkClass(markArray, markGlyph, markCoverage, fontInstance, markAnchor, success);
le_uint16 mcCount = SWAPW(classCount);
--- ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/OpenTypeUtilities.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -79,8 +79,8 @@
Offset OpenTypeUtilities::getTagOffset(LETag tag, const LEReferenceToArrayOf<TagAndOffsetRecord> &records, LEErrorCode &success)
{
+ if(LE_FAILURE(success)) return 0;
const TagAndOffsetRecord *r0 = (const TagAndOffsetRecord*)records.getAlias();
- if(LE_FAILURE(success)) return 0;
le_uint32 recordCount = records.getCount();
le_uint8 bit = highBit(recordCount);
--- ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/SegmentArrayProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -73,6 +73,7 @@
if (offset != 0) {
LEReferenceToArrayOf<TTGlyphID> glyphArray(subtableHeader, success, offset, LE_UNBOUNDED_ARRAY);
+ if (LE_FAILURE(success)) { continue; }
TTGlyphID newGlyph = SWAPW(glyphArray(LE_GET_GLYPH(thisGlyph) - firstGlyph, success));
glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
}
--- ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/font/layout/StateTableProcessor.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -97,6 +97,7 @@
LEReferenceToArrayOf<EntryTableIndex> stateArray(stHeader, success, currentState, LE_UNBOUNDED_ARRAY);
EntryTableIndex entryTableIndex = stateArray.getObject((le_uint8)classCode, success);
+ if (LE_FAILURE(success)) { break; }
LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex);
LE_STATE_PATIENCE_INCR(currGlyph);
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscam02.c Tue Mar 18 12:35:25 2014 -0700
@@ -81,7 +81,7 @@
cmsUInt32Number surround;
cmsFloat64Number n, Nbb, Ncb, z, FL, D;
- cmsContext ContextID;
+ cmsContext ContextID;
} cmsCIECAM02;
@@ -467,6 +467,7 @@
CAM02COLOR clr;
cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+ memset(&clr, 0, sizeof(clr));
_cmsAssert(lpMod != NULL);
_cmsAssert(pIn != NULL);
_cmsAssert(pOut != NULL);
@@ -491,6 +492,7 @@
CAM02COLOR clr;
cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+ memset(&clr, 0, sizeof(clr));
_cmsAssert(lpMod != NULL);
_cmsAssert(pIn != NULL);
_cmsAssert(pOut != NULL);
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscgats.c Tue Mar 18 12:35:25 2014 -0700
@@ -59,8 +59,8 @@
// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
-#define MAXID 128 // Max lenght of identifier
-#define MAXSTR 1024 // Max lenght of string
+#define MAXID 128 // Max length of identifier
+#define MAXSTR 1024 // Max length of string
#define MAXTABLES 255 // Max Number of tables in a single stream
#define MAXINCLUDE 20 // Max number of nested includes
@@ -383,28 +383,28 @@
//Forward declaration of some internal functions
static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);
-// Checks if c is a separator
+// Checks whatever c is a separator
static
cmsBool isseparator(int c)
{
- return (c == ' ') || (c == '\t') || (c == '\r');
+ return (c == ' ') || (c == '\t') ;
}
-// Checks whatever if c is a valid identifier char
+// Checks whatever c is a valid identifier char
static
cmsBool ismiddle(int c)
{
return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
}
-// Checks whatsever if c is a valid identifier middle char.
+// Checks whatsever c is a valid identifier middle char.
static
cmsBool isidchar(int c)
{
return isalnum(c) || ismiddle(c);
}
-// Checks whatsever if c is a valid identifier first char.
+// Checks whatsever c is a valid identifier first char.
static
cmsBool isfirstidchar(int c)
{
@@ -436,7 +436,6 @@
}
-
// Makes a file path based on a given reference path
// NOTE: this function doesn't check if the path exists or even if it's legal
static
@@ -634,6 +633,9 @@
cmsFloat64Number dnum = 0.0;
int sign = 1;
+ // keep safe
+ if (Buffer == NULL) return 0.0;
+
if (*Buffer == '-' || *Buffer == '+') {
sign = (*Buffer == '-') ? -1 : 1;
@@ -867,6 +869,14 @@
// Next line
+ case '\r':
+ NextCh(it8);
+ if (it8 ->ch == '\n')
+ NextCh(it8);
+ it8->sy = SEOLN;
+ it8->lineno++;
+ break;
+
case '\n':
NextCh(it8);
it8->sy = SEOLN;
@@ -876,7 +886,7 @@
// Comment
case '#':
NextCh(it8);
- while (it8->ch && it8->ch != '\n')
+ while (it8->ch && it8->ch != '\n' && it8->ch != '\r')
NextCh(it8);
it8->sy = SCOMMENT;
@@ -994,6 +1004,9 @@
{
switch (it8->sy) {
+ case SEOLN: // Empty value
+ Buffer[0]=0;
+ break;
case SIDENT: strncpy(Buffer, it8->id, max);
Buffer[max-1]=0;
break;
@@ -1143,9 +1156,9 @@
if (*Key != '#') { // Comments are ignored
if (cmsstrcasecmp(Key, p->Keyword) == 0)
- break;
+ break;
}
- }
+ }
if (p == NULL)
return FALSE;
@@ -1155,11 +1168,13 @@
for (; p != NULL; p = p->NextSubkey) {
+ if (p ->Subkey == NULL) continue;
+
if (LastPtr) *LastPtr = p;
if (cmsstrcasecmp(Subkey, p->Subkey) == 0)
- return TRUE;
- }
+ return TRUE;
+ }
return FALSE;
}
@@ -1282,7 +1297,7 @@
it8 ->nTable = nTable;
- return nTable;
+ return (cmsInt32Number) nTable;
}
@@ -1387,7 +1402,7 @@
cmsIT8* it8 = (cmsIT8*) hIT8;
char Buffer[1024];
- sprintf(Buffer, "%d", Val);
+ sprintf(Buffer, "%u", Val);
return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;
}
@@ -1424,6 +1439,8 @@
{
const char *v = cmsIT8GetProperty(hIT8, cProp);
+ if (v == NULL) return 0.0;
+
return ParseFloatNumber(v);
}
@@ -1456,7 +1473,7 @@
t -> nSamples = 10;
}
- t -> DataFormat = (char**) AllocChunk (it8, (t->nSamples + 1) * sizeof(char *));
+ t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));
if (t->DataFormat == NULL) {
SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
@@ -1512,7 +1529,7 @@
t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
- t-> Data = (char**)AllocChunk (it8, (t->nSamples + 1) * (t->nPatches + 1) *sizeof (char*));
+ t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));
if (t->Data == NULL) {
SynError(it8, "AllocateDataSet: Unable to allocate data array");
@@ -1571,7 +1588,7 @@
if (str == NULL)
str = " ";
- // Lenghth to write
+ // Length to write
len = (cmsUInt32Number) strlen(str);
f ->Used += len;
@@ -2095,7 +2112,7 @@
NextCh(it8);
// If a newline is found, then this is a type string
- if (it8 ->ch == '\n') {
+ if (it8 ->ch == '\n' || it8->ch == '\r') {
cmsIT8SetSheetType(it8, it8 ->id);
InSymbol(it8);
@@ -2210,7 +2227,7 @@
char Buffer[256];
char *Type = p ->Value;
- int nTable = k;
+ int nTable = (int) k;
snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
@@ -2564,6 +2581,8 @@
Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+ if (Buffer == NULL) return 0.0;
+
return ParseFloatNumber(Buffer);
}
@@ -2776,7 +2795,7 @@
if (Formatter == NULL)
strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
else
- strcpy(it8->DoubleFormatter, Formatter);
+ strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));
it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;
}
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmscnvrt.c Tue Mar 18 12:35:25 2014 -0700
@@ -270,7 +270,7 @@
// m2 holds CHAD from output white to D50 times abs. col. scaling
// Observer is not adapted, undo the chromatic adaptation
- _cmsMAT3per(m, &m3, ChromaticAdaptationMatrixOut);
+ _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);
m3 = *ChromaticAdaptationMatrixIn;
if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;
@@ -411,57 +411,61 @@
// Handle PCS mismatches. A specialized stage is added to the LUT in such case
switch (InPCS) {
- case cmsSigXYZData: // Input profile operates in XYZ
+ case cmsSigXYZData: // Input profile operates in XYZ
- switch (OutPCS) {
+ switch (OutPCS) {
- case cmsSigXYZData: // XYZ -> XYZ
- if (!IsEmptyLayer(m, off))
- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
- break;
+ case cmsSigXYZData: // XYZ -> XYZ
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ break;
- case cmsSigLabData: // XYZ -> Lab
- if (!IsEmptyLayer(m, off))
- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
- break;
+ case cmsSigLabData: // XYZ -> Lab
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+ return FALSE;
+ break;
- default:
- return FALSE; // Colorspace mismatch
- }
- break;
+ default:
+ return FALSE; // Colorspace mismatch
+ }
+ break;
+ case cmsSigLabData: // Input profile operates in Lab
- case cmsSigLabData: // Input profile operates in Lab
+ switch (OutPCS) {
- switch (OutPCS) {
+ case cmsSigXYZData: // Lab -> XYZ
- case cmsSigXYZData: // Lab -> XYZ
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))
+ return FALSE;
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ break;
- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
- if (!IsEmptyLayer(m, off))
- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
- break;
+ case cmsSigLabData: // Lab -> Lab
- case cmsSigLabData: // Lab -> Lab
-
- if (!IsEmptyLayer(m, off)) {
- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID));
- cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl));
- cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID));
- }
- break;
-
- default:
- return FALSE; // Mismatch
+ if (!IsEmptyLayer(m, off)) {
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||
+ !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+ return FALSE;
}
break;
+ default:
+ return FALSE; // Mismatch
+ }
+ break;
- // On colorspaces other than PCS, check for same space
- default:
- if (InPCS != OutPCS) return FALSE;
- break;
+ // On colorspaces other than PCS, check for same space
+ default:
+ if (InPCS != OutPCS) return FALSE;
+ break;
}
return TRUE;
@@ -497,7 +501,8 @@
cmsFloat64Number AdaptationStates[],
cmsUInt32Number dwFlags)
{
- cmsPipeline* Lut, *Result;
+ cmsPipeline* Lut = NULL;
+ cmsPipeline* Result;
cmsHPROFILE hProfile;
cmsMAT3 m;
cmsVEC3 off;
@@ -593,8 +598,11 @@
}
// Concatenate to the output LUT
- cmsPipelineCat(Result, Lut);
+ if (!cmsPipelineCat(Result, Lut))
+ goto Error;
+
cmsPipelineFree(Lut);
+ Lut = NULL;
// Update current space
CurrentColorSpace = ColorSpaceOut;
@@ -604,6 +612,7 @@
Error:
+ if (Lut != NULL) cmsPipelineFree(Lut);
if (Result != NULL) cmsPipelineFree(Result);
return NULL;
@@ -742,7 +751,8 @@
if (CLUT == NULL) goto Error;
// This is the one and only MPE in this LUT
- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+ goto Error;
// Sample it. We cannot afford pre/post linearization this time.
if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))
@@ -959,7 +969,8 @@
CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
if (CLUT == NULL) goto Cleanup;
- cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT);
+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+ goto Cleanup;
cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);
@@ -1057,7 +1068,7 @@
}
// The plug-in registration. User can add new intents or override default routines
-cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;
cmsIntentsList* fl;
@@ -1072,7 +1083,7 @@
fl = SearchIntent(Plugin ->Intent);
if (fl == NULL) {
- fl = (cmsIntentsList*) _cmsPluginMalloc(sizeof(cmsIntentsList));
+ fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));
if (fl == NULL) return FALSE;
}
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmserr.c Tue Mar 18 12:35:25 2014 -0700
@@ -302,8 +302,6 @@
return NULL;
}
-
-
chunk ->BlockSize = Initial;
chunk ->Used = 0;
chunk ->next = NULL;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgamma.c Tue Mar 18 12:35:25 2014 -0700
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
-// Copyright (c) 1998-2012 Marti Maria Saguer
+// Copyright (c) 1998-2013 Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
@@ -99,7 +99,7 @@
static _cmsParametricCurvesCollection* ParametricCurves = &DefaultCurves;
// As a way to install new parametric curves
-cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;
_cmsParametricCurvesCollection* fl;
@@ -110,7 +110,7 @@
return TRUE;
}
- fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(sizeof(_cmsParametricCurvesCollection));
+ fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(id, sizeof(_cmsParametricCurvesCollection));
if (fl == NULL) return FALSE;
// Copy the parameters
@@ -258,7 +258,8 @@
}
p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);
- return p;
+ if (p->InterpParams != NULL)
+ return p;
Error:
if (p -> Segments) _cmsFree(ContextID, p ->Segments);
@@ -423,7 +424,7 @@
if (e > 0)
Val = pow(e, Params[0]) + Params[5];
else
- Val = 0;
+ Val = Params[5];
}
else
Val = R*Params[3] + Params[6];
@@ -458,7 +459,7 @@
e = Params[1]*R + Params[2];
if (e < 0)
- Val = 0;
+ Val = Params[3];
else
Val = pow(e, Params[0]) + Params[3];
break;
@@ -478,7 +479,7 @@
e = Params[2] * pow(R, Params[0]) + Params[3];
if (e <= 0)
- Val = 0;
+ Val = Params[4];
else
Val = Params[1]*log10(e) + Params[4];
break;
@@ -544,7 +545,7 @@
// Type == 0 means segment is sampled
if (g ->Segments[i].Type == 0) {
- cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0);
+ cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
cmsFloat32Number Out;
// Setup the table (TODO: clean that)
@@ -629,20 +630,21 @@
// Use a segmented curve to store the floating point table
cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])
{
- cmsCurveSegment Seg[2];
+ cmsCurveSegment Seg[3];
- // Initialize segmented curve part up to 0
- Seg[0].x0 = -1;
+ // A segmented tone curve should have function segments in the first and last positions
+ // Initialize segmented curve part up to 0 to constant value = samples[0]
+ Seg[0].x0 = MINUS_INF;
Seg[0].x1 = 0;
Seg[0].Type = 6;
Seg[0].Params[0] = 1;
Seg[0].Params[1] = 0;
Seg[0].Params[2] = 0;
- Seg[0].Params[3] = 0;
+ Seg[0].Params[3] = values[0];
Seg[0].Params[4] = 0;
- // From zero to any
+ // From zero to 1
Seg[1].x0 = 0;
Seg[1].x1 = 1.0;
Seg[1].Type = 0;
@@ -650,7 +652,19 @@
Seg[1].nGridPoints = nEntries;
Seg[1].SampledPoints = (cmsFloat32Number*) values;
- return cmsBuildSegmentedToneCurve(ContextID, 2, Seg);
+ // Final segment is constant = lastsample
+ Seg[2].x0 = 1.0;
+ Seg[2].x1 = PLUS_INF;
+ Seg[2].Type = 6;
+
+ Seg[2].Params[0] = 1;
+ Seg[2].Params[1] = 0;
+ Seg[2].Params[2] = 0;
+ Seg[2].Params[3] = values[nEntries-1];
+ Seg[2].Params[4] = 0;
+
+
+ return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);
}
// Parametric curves
@@ -993,7 +1007,7 @@
if (Tab == NULL) return FALSE;
- if (cmsIsToneCurveLinear(Tab)) return FALSE; // Nothing to do
+ if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do
nItems = Tab -> nEntries;
@@ -1020,11 +1034,20 @@
if (z[i] == 0.) Zeros++;
if (z[i] >= 65535.) Poles++;
- if (z[i] < z[i-1]) return FALSE; // Non-Monotonic
+ if (z[i] < z[i-1]) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic.");
+ return FALSE;
+ }
}
- if (Zeros > (nItems / 3)) return FALSE; // Degenerated, mostly zeros
- if (Poles > (nItems / 3)) return FALSE; // Degenerated, mostly poles
+ if (Zeros > (nItems / 3)) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros.");
+ return FALSE;
+ }
+ if (Poles > (nItems / 3)) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles.");
+ return FALSE;
+ }
// Seems ok
for (i=0; i < nItems; i++) {
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsgmt.c Tue Mar 18 12:35:25 2014 -0700
@@ -249,13 +249,10 @@
cmsFloat64Number dE1, dE2, ErrorRatio;
// Assume in-gamut by default.
- dE1 = 0.;
- dE2 = 0;
ErrorRatio = 1.0;
// Convert input to Lab
- if (t -> hInput != NULL)
- cmsDoTransform(t -> hInput, In, &LabIn1, 1);
+ cmsDoTransform(t -> hInput, In, &LabIn1, 1);
// converts from PCS to colorant. This always
// does return in-gamut values,
@@ -267,7 +264,7 @@
memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
// Try again, but this time taking Check as input
- cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
+ cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
// Take difference of direct value
@@ -374,7 +371,7 @@
ProfileList[nGamutPCSposition] = hLab;
BPCList[nGamutPCSposition] = 0;
AdaptationList[nGamutPCSposition] = 1.0;
- Intents[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
+ IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
ColorSpace = cmsGetColorSpace(hGamut);
@@ -385,45 +382,48 @@
// 16 bits to Lab double
Chain.hInput = cmsCreateExtendedTransform(ContextID,
- nGamutPCSposition + 1,
- ProfileList,
- BPCList,
- Intents,
- AdaptationList,
- NULL, 0,
- dwFormat, TYPE_Lab_DBL,
- cmsFLAGS_NOCACHE);
+ nGamutPCSposition + 1,
+ ProfileList,
+ BPCList,
+ IntentList,
+ AdaptationList,
+ NULL, 0,
+ dwFormat, TYPE_Lab_DBL,
+ cmsFLAGS_NOCACHE);
// Does create the forward step. Lab double to device
dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
Chain.hForward = cmsCreateTransformTHR(ContextID,
- hLab, TYPE_Lab_DBL,
- hGamut, dwFormat,
- INTENT_RELATIVE_COLORIMETRIC,
- cmsFLAGS_NOCACHE);
+ hLab, TYPE_Lab_DBL,
+ hGamut, dwFormat,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
// Does create the backwards step
Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
- hLab, TYPE_Lab_DBL,
- INTENT_RELATIVE_COLORIMETRIC,
- cmsFLAGS_NOCACHE);
+ hLab, TYPE_Lab_DBL,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
// All ok?
- if (Chain.hForward && Chain.hReverse) {
+ if (Chain.hInput && Chain.hForward && Chain.hReverse) {
// Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
// dE when doing a transform back and forth on the colorimetric intent.
Gamut = cmsPipelineAlloc(ContextID, 3, 1);
-
if (Gamut != NULL) {
- CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
- cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT);
-
- cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
+ if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
+ cmsPipelineFree(Gamut);
+ Gamut = NULL;
+ }
+ else {
+ cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
+ }
}
}
else
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsintrp.c Tue Mar 18 12:35:25 2014 -0700
@@ -83,7 +83,6 @@
// Set the interpolation method
-
cmsBool _cmsSetInterpolationRoutine(cmsInterpParams* p)
{
// Invoke factory, possibly in the Plug-in
@@ -215,6 +214,11 @@
Output[0] = LinearInterp(rest, y0, y1);
}
+// To prevent out of bounds indexing
+cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v)
+{
+ return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);
+}
// Floating-point version of 1D interpolation
static
@@ -227,13 +231,15 @@
int cell0, cell1;
const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+ val2 = fclamp(Value[0]);
+
// if last value...
- if (Value[0] == 1.0) {
+ if (val2 == 1.0) {
Output[0] = LutTable[p -> Domain[0]];
return;
}
- val2 = p -> Domain[0] * Value[0];
+ val2 *= p -> Domain[0];
cell0 = (int) floor(val2);
cell1 = (int) ceil(val2);
@@ -292,13 +298,15 @@
cmsUInt32Number OutChan;
const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+ val2 = fclamp(Value[0]);
+
// if last value...
- if (Value[0] == 1.0) {
+ if (val2 == 1.0) {
Output[0] = LutTable[p -> Domain[0]];
return;
}
- val2 = p -> Domain[0] * Value[0];
+ val2 *= p -> Domain[0];
cell0 = (int) floor(val2);
cell1 = (int) ceil(val2);
@@ -339,8 +347,8 @@
dxy;
TotalOut = p -> nOutputs;
- px = Input[0] * p->Domain[0];
- py = Input[1] * p->Domain[1];
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
@@ -454,20 +462,9 @@
TotalOut = p -> nOutputs;
// We need some clipping here
- px = Input[0];
- py = Input[1];
- pz = Input[2];
-
- if (px < 0) px = 0;
- if (px > 1) px = 1;
- if (py < 0) py = 0;
- if (py > 1) py = 1;
- if (pz < 0) pz = 0;
- if (pz > 1) pz = 1;
-
- px *= p->Domain[0];
- py *= p->Domain[1];
- pz *= p->Domain[2];
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
+ pz = fclamp(Input[2]) * p->Domain[2];
x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
@@ -609,20 +606,9 @@
TotalOut = p -> nOutputs;
// We need some clipping here
- px = Input[0];
- py = Input[1];
- pz = Input[2];
-
- if (px < 0) px = 0;
- if (px > 1) px = 1;
- if (py < 0) py = 0;
- if (py > 1) py = 1;
- if (pz < 0) pz = 0;
- if (pz > 1) pz = 1;
-
- px *= p->Domain[0];
- py *= p->Domain[1];
- pz *= p->Domain[2];
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
+ pz = fclamp(Input[2]) * p->Domain[2];
x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);
y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);
@@ -844,7 +830,7 @@
register cmsUInt16Number Output[],
register const cmsInterpParams* p16)
{
- const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+ const cmsUInt16Number* LutTable;
cmsS15Fixed16Number fk;
cmsS15Fixed16Number k0, rk;
int K0, K1;
@@ -1039,8 +1025,7 @@
cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
cmsInterpParams p1;
-
- pk = Input[0] * p->Domain[0];
+ pk = fclamp(Input[0]) * p->Domain[0];
k0 = _cmsQuickFloor(pk);
rest = pk - (cmsFloat32Number) k0;
@@ -1127,7 +1112,7 @@
cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
cmsInterpParams p1;
- pk = Input[0] * p->Domain[0];
+ pk = fclamp(Input[0]) * p->Domain[0];
k0 = _cmsQuickFloor(pk);
rest = pk - (cmsFloat32Number) k0;
@@ -1214,7 +1199,7 @@
cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
cmsInterpParams p1;
- pk = Input[0] * p->Domain[0];
+ pk = fclamp(Input[0]) * p->Domain[0];
k0 = _cmsQuickFloor(pk);
rest = pk - (cmsFloat32Number) k0;
@@ -1299,7 +1284,7 @@
cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
cmsInterpParams p1;
- pk = Input[0] * p->Domain[0];
+ pk = fclamp(Input[0]) * p->Domain[0];
k0 = _cmsQuickFloor(pk);
rest = pk - (cmsFloat32Number) k0;
@@ -1384,7 +1369,7 @@
cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
cmsInterpParams p1;
- pk = Input[0] * p->Domain[0];
+ pk = fclamp(Input[0]) * p->Domain[0];
k0 = _cmsQuickFloor(pk);
rest = pk - (cmsFloat32Number) k0;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio0.c Tue Mar 18 12:35:25 2014 -0700
@@ -154,7 +154,6 @@
return iohandler;
Error:
- if (fm) _cmsFree(ContextID, fm);
if (iohandler) _cmsFree(ContextID, iohandler);
return NULL;
@@ -223,12 +222,17 @@
// Writes data to memory, also keeps used space for further reference.
static
-cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
+cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
{
FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
if (ResData == NULL) return FALSE; // Housekeeping
+ // Check for available space. Clip.
+ if (iohandler ->UsedSpace + size > ResData->Size) {
+ size = ResData ->Size - iohandler ->UsedSpace;
+ }
+
if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing
memmove(ResData ->Block + ResData ->Pointer, Ptr, size);
@@ -389,13 +393,15 @@
return TRUE;
}
-// Create a iohandler for disk based files. if FileName is NULL, then 'stream' member is also set
-// to NULL and no real writting is performed. This only happens in writting access mode
+// Create a iohandler for disk based files.
cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)
{
cmsIOHANDLER* iohandler = NULL;
FILE* fm = NULL;
+ _cmsAssert(FileName != NULL);
+ _cmsAssert(AccessMode != NULL);
+
iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
if (iohandler == NULL) return NULL;
@@ -432,11 +438,8 @@
iohandler ->UsedSpace = 0;
// Keep track of the original file
- if (FileName != NULL) {
-
- strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
- iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
- }
+ strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
+ iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
iohandler ->Read = FileRead;
iohandler ->Seek = FileSeek;
@@ -616,6 +619,31 @@
return _cmsSearchTag(Icc, sig, FALSE) >= 0;
}
+/*
+ * Enforces that the profile version is per. spec.
+ * Operates on the big endian bytes from the profile.
+ * Called before converting to platform endianness.
+ * Byte 0 is BCD major version, so max 9.
+ * Byte 1 is 2 BCD digits, one per nibble.
+ * Reserved bytes 2 & 3 must be 0.
+ */
+static cmsUInt32Number _validatedVersion(cmsUInt32Number DWord)
+{
+ cmsUInt8Number* pByte = (cmsUInt8Number*)&DWord;
+ cmsUInt8Number temp1;
+ cmsUInt8Number temp2;
+
+ if (*pByte > 0x09) *pByte = (cmsUInt8Number)9;
+ temp1 = *(pByte+1) & 0xf0;
+ temp2 = *(pByte+1) & 0x0f;
+ if (temp1 > 0x90) temp1 = 0x90;
+ if (temp2 > 9) temp2 = 0x09;
+ *(pByte+1) = (cmsUInt8Number)(temp1 | temp2);
+ *(pByte+2) = (cmsUInt8Number)0;
+ *(pByte+3) = (cmsUInt8Number)0;
+
+ return DWord;
+}
// Read profile header and validate it
cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
@@ -643,12 +671,15 @@
Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
+
Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);
Icc -> flags = _cmsAdjustEndianess32(Header.flags);
Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer);
Icc -> model = _cmsAdjustEndianess32(Header.model);
+ Icc -> creator = _cmsAdjustEndianess32(Header.creator);
+
_cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
- Icc -> Version = _cmsAdjustEndianess32(Header.version);
+ Icc -> Version = _cmsAdjustEndianess32(_validatedVersion(Header.version));
// Get size as reported in header
HeaderSize = _cmsAdjustEndianess32(Header.size);
@@ -815,28 +846,33 @@
cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- return (cmsUInt32Number) Icc ->manufacturer;
+ return Icc ->manufacturer;
}
void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- Icc -> manufacturer = (cmsUInt32Number) manufacturer;
+ Icc -> manufacturer = manufacturer;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc ->creator;
}
cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- return (cmsUInt32Number) Icc ->model;
+ return Icc ->model;
}
void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
- Icc -> model = (cmsUInt32Number) model;
+ Icc -> model = model;
}
-
void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
@@ -1073,11 +1109,16 @@
return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
}
-
static
cmsBool SanityCheck(_cmsICCPROFILE* profile)
{
- cmsIOHANDLER* io = profile->IOhandler;
+ cmsIOHANDLER* io;
+
+ if (!profile) {
+ return FALSE;
+ }
+
+ io = profile->IOhandler;
if (!io) {
return FALSE;
}
@@ -1106,13 +1147,13 @@
cmsIOHANDLER* io = Icc ->IOhandler;
cmsTagDescriptor* TagDescriptor;
cmsTagTypeSignature TypeBase;
+ cmsTagTypeSignature Type;
cmsTagTypeHandler* TypeHandler;
-
- if (!SanityCheck(FileOrig)) return FALSE;
+ cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc);
+ cmsTagTypeHandler LocalTypeHandler;
for (i=0; i < Icc -> TagCount; i++) {
-
if (Icc ->TagNames[i] == 0) continue;
// Linked tags are not written
@@ -1126,7 +1167,7 @@
// Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
// In this case a blind copy of the block data is performed
- if (FileOrig != NULL && Icc -> TagOffsets[i]) {
+ if (SanityCheck(FileOrig) && Icc -> TagOffsets[i]) {
cmsUInt32Number TagSize = FileOrig -> TagSizes[i];
cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
@@ -1164,7 +1205,16 @@
TagDescriptor = _cmsGetTagDescriptor(Icc -> TagNames[i]);
if (TagDescriptor == NULL) continue; // Unsupported, ignore it
- TypeHandler = Icc ->TagTypeHandlers[i];
+ if (TagDescriptor ->DecideType != NULL) {
+
+ Type = TagDescriptor ->DecideType(Version, Data);
+ }
+ else {
+
+ Type = TagDescriptor ->SupportedTypes[0];
+ }
+
+ TypeHandler = _cmsGetTagTypeHandler(Type);
if (TypeHandler == NULL) {
cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]);
@@ -1175,9 +1225,10 @@
if (!_cmsWriteTypeBase(io, TypeBase))
return FALSE;
- TypeHandler ->ContextID = Icc ->ContextID;
- TypeHandler ->ICCVersion = Icc ->Version;
- if (!TypeHandler ->WritePtr(TypeHandler, io, Data, TagDescriptor ->ElemCount)) {
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {
char String[5];
@@ -1314,8 +1365,8 @@
// Should we just calculate the needed space?
if (MemPtr == NULL) {
- *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
- return (*BytesNeeded == 0 ? FALSE : TRUE);
+ *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
+ return (*BytesNeeded == 0 ? FALSE : TRUE);
}
// That is a real write operation
@@ -1353,10 +1404,11 @@
cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
if (TypeHandler != NULL) {
+ cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameters
- TypeHandler ->ICCVersion = Icc ->Version;
- TypeHandler ->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameters
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
}
else
_cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
@@ -1400,6 +1452,7 @@
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
cmsIOHANDLER* io = Icc ->IOhandler;
cmsTagTypeHandler* TypeHandler;
+ cmsTagTypeHandler LocalTypeHandler;
cmsTagDescriptor* TagDescriptor;
cmsTagTypeSignature BaseType;
cmsUInt32Number Offset, TagSize;
@@ -1423,7 +1476,7 @@
// Seek to its location
if (!io -> Seek(io, Offset))
- return NULL;
+ return NULL;
// Search for support on this tag
TagDescriptor = _cmsGetTagDescriptor(sig);
@@ -1440,14 +1493,15 @@
// Get type handler
TypeHandler = _cmsGetTagTypeHandler(BaseType);
if (TypeHandler == NULL) return NULL;
+ LocalTypeHandler = *TypeHandler;
// Read the tag
Icc -> TagTypeHandlers[n] = TypeHandler;
- TypeHandler ->ContextID = Icc ->ContextID;
- TypeHandler ->ICCVersion = Icc ->Version;
- Icc -> TagPtrs[n] = TypeHandler ->ReadPtr(TypeHandler, io, &ElemCount, TagSize);
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
// The tag type is supported, but something wrong happend and we cannot read the tag.
// let know the user about this (although it is just a warning)
@@ -1468,7 +1522,7 @@
_cmsTagSignature2String(String, sig);
cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d",
- String, TagDescriptor ->ElemCount, ElemCount);
+ String, TagDescriptor ->ElemCount, ElemCount);
}
@@ -1500,6 +1554,7 @@
{
_cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
cmsTagTypeHandler* TypeHandler = NULL;
+ cmsTagTypeHandler LocalTypeHandler;
cmsTagDescriptor* TagDescriptor = NULL;
cmsTagTypeSignature Type;
int i;
@@ -1530,9 +1585,10 @@
if (TypeHandler != NULL) {
- TypeHandler ->ContextID = Icc ->ContextID; // As an additional parameter
- TypeHandler ->ICCVersion = Icc ->Version;
- TypeHandler->FreePtr(TypeHandler, Icc -> TagPtrs[i]);
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
}
}
}
@@ -1571,7 +1627,7 @@
// Let the tag descriptor to decide the type base on depending on
// the data. This is useful for example on parametric curves, where
// curves specified by a table cannot be saved as parametric and needs
- // to be revented to single v2-curves, even on v4 profiles.
+ // to be casted to single v2-curves, even on v4 profiles.
Type = TagDescriptor ->DecideType(Version, data);
}
@@ -1609,9 +1665,10 @@
Icc ->TagSizes[i] = 0;
Icc ->TagOffsets[i] = 0;
- TypeHandler ->ContextID = Icc ->ContextID;
- TypeHandler ->ICCVersion = Icc ->Version;
- Icc ->TagPtrs[i] = TypeHandler ->DupPtr(TypeHandler, data, TagDescriptor ->ElemCount);
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);
if (Icc ->TagPtrs[i] == NULL) {
@@ -1638,6 +1695,7 @@
int i;
cmsIOHANDLER* MemIO;
cmsTagTypeHandler* TypeHandler = NULL;
+ cmsTagTypeHandler LocalTypeHandler;
cmsTagDescriptor* TagDescriptor = NULL;
cmsUInt32Number rc;
cmsUInt32Number Offset, TagSize;
@@ -1653,15 +1711,16 @@
Offset = Icc ->TagOffsets[i];
TagSize = Icc ->TagSizes[i];
-
// read the data directly, don't keep copy
if (data != NULL) {
if (BufferSize < TagSize)
- TagSize = BufferSize;
+ TagSize = BufferSize;
if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) return 0;
if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) return 0;
+
+ return TagSize;
}
return Icc ->TagSizes[i];
@@ -1675,9 +1734,11 @@
TagSize = Icc ->TagSizes[i];
if (BufferSize < TagSize)
- TagSize = BufferSize;
+ TagSize = BufferSize;
memmove(data, Icc ->TagPtrs[i], TagSize);
+
+ return TagSize;
}
return Icc ->TagSizes[i];
@@ -1693,7 +1754,7 @@
if (data == NULL) {
MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));
} else{
- MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
+ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
}
if (MemIO == NULL) return 0;
@@ -1701,20 +1762,22 @@
TypeHandler = Icc ->TagTypeHandlers[i];
TagDescriptor = _cmsGetTagDescriptor(sig);
if (TagDescriptor == NULL) {
- cmsCloseIOhandler(MemIO);
- return 0;
+ cmsCloseIOhandler(MemIO);
+ return 0;
}
+ // FIXME: No handling for TypeHandler == NULL here?
// Serialize
- TypeHandler ->ContextID = Icc ->ContextID;
- TypeHandler ->ICCVersion = Icc ->Version;
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {
cmsCloseIOhandler(MemIO);
return 0;
}
- if (!TypeHandler ->WritePtr(TypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
cmsCloseIOhandler(MemIO);
return 0;
}
@@ -1752,7 +1815,7 @@
// Using this function you can collapse several tag entries to the same block in the profile
cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
{
- _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
int i;
if (!_cmsNewTag(Icc, sig, &i)) return FALSE;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsio1.c Tue Mar 18 12:35:25 2014 -0700
@@ -129,7 +129,6 @@
Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);
if (Tag != NULL) {
-
*Dest = *Tag;
return TRUE;
}
@@ -193,7 +192,8 @@
if (GrayTRC == NULL) return NULL;
Lut = cmsPipelineAlloc(ContextID, 1, 3);
- if (Lut == NULL) return NULL;
+ if (Lut == NULL)
+ goto Error;
if (cmsGetPCS(hProfile) == cmsSigLabData) {
@@ -204,28 +204,35 @@
EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
- if (EmptyTab == NULL) {
-
- cmsPipelineFree(Lut);
- return NULL;
- }
+ if (EmptyTab == NULL)
+ goto Error;
LabCurves[0] = GrayTRC;
LabCurves[1] = EmptyTab;
LabCurves[2] = EmptyTab;
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL));
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {
+ cmsFreeToneCurve(EmptyTab);
+ goto Error;
+ }
cmsFreeToneCurve(EmptyTab);
}
else {
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC));
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL));
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL)))
+ goto Error;
}
return Lut;
+
+Error:
+ cmsFreeToneCurve(GrayTRC);
+ cmsPipelineFree(Lut);
+ return NULL;
}
// RGB Matrix shaper
@@ -259,49 +266,31 @@
Lut = cmsPipelineAlloc(ContextID, 3, 3);
if (Lut != NULL) {
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes));
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))
+ goto Error;
// Note that it is certainly possible a single profile would have a LUT based
// tag for output working in lab and a matrix-shaper for the fallback cases.
// This is not allowed by the spec, but this code is tolerant to those cases
if (cmsGetPCS(hProfile) == cmsSigLabData) {
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))
+ goto Error;
}
}
return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
-/*static
-cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
-{
- cmsContext ContextID = cmsGetProfileContextID(hProfile);
- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
- cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
-
- if (Lut == NULL) return NULL;
-
- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
- // and since the formatter has already accomodated to 0..1.0, we should undo this change
- if ( spc == cmsSigLabData)
- {
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
- }
- else
- if (spc == cmsSigXYZData)
- {
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
- }
-
- return Lut;
-}
-*/
static
cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
{
@@ -316,23 +305,31 @@
// these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
if ( spc == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
}
else if (spc == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
}
if ( PCS == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
}
else if( PCS == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
}
return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
@@ -359,8 +356,11 @@
return NULL;
}
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE));
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {
+ cmsPipelineFree(Lut);
+ return NULL;
+ }
return Lut;
}
@@ -395,12 +395,18 @@
return Lut;
// If the input is Lab, add also a conversion at the begin
- if (cmsGetColorSpace(hProfile) == cmsSigLabData)
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData &&
+ !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
// Add a matrix for conversion V2 to V4 Lab PCS
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
+
return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// Lut was not found, try to create a matrix-shaper
@@ -445,21 +451,27 @@
if (cmsGetPCS(hProfile) == cmsSigLabData) {
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL)))
+ goto Error;
}
else {
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL)))
+ goto Error;
}
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
+ goto Error;
+
cmsFreeToneCurve(RevGrayTRC);
+ return Lut;
- return Lut;
+Error:
+ cmsFreeToneCurve(RevGrayTRC);
+ cmsPipelineFree(Lut);
+ return NULL;
}
-
-
static
cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
{
@@ -506,15 +518,21 @@
// This is not allowed by the spec, but this code is tolerant to those cases
if (cmsGetPCS(hProfile) == cmsSigLabData) {
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))
+ goto Error;
}
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL));
- cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))
+ goto Error;
}
cmsFreeToneCurveTriple(InvShapes);
return Lut;
+Error:
+ cmsFreeToneCurveTriple(InvShapes);
+ cmsPipelineFree(Lut);
+ return NULL;
}
@@ -540,30 +558,6 @@
// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
-/*static
-cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
-{
- cmsContext ContextID = cmsGetProfileContextID(hProfile);
- cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
- cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
-
- if (Lut == NULL) return NULL;
-
- // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
- // and since the formatter has already accomodated to 0..1.0, we should undo this change
- if ( PCS == cmsSigLabData)
- {
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
- }
- else
- if (PCS == cmsSigXYZData)
- {
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
- }
-
- return Lut;
-}*/
-
static
cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
{
@@ -578,25 +572,33 @@
// and since the formatter has already accomodated to 0..1.0, we should undo this change
if ( PCS == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
}
else
if (PCS == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
}
// the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
if ( dataSpace == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
}
- else if ( dataSpace == cmsSigXYZData)
+ else if (dataSpace == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
}
return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// Create an output MPE LUT from agiven profile. Version mismatches are handled here
@@ -636,30 +638,35 @@
// Now it is time for a controversial stuff. I found that for 3D LUTS using
// Lab used as indexer space, trilinear interpolation should be used
if (cmsGetPCS(hProfile) == cmsSigLabData)
- ChangeInterpolationToTrilinear(Lut);
+ ChangeInterpolationToTrilinear(Lut);
// We need to adjust data only for Lab and Lut16 type
if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
return Lut;
// Add a matrix for conversion V4 to V2 Lab PCS
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
// If the output is Lab, add also a conversion at the end
if (cmsGetColorSpace(hProfile) == cmsSigLabData)
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// Lut not found, try to create a matrix-shaper
// Check if this is a grayscale profile.
- if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+ if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
- // if so, build appropiate conversion tables.
- // The tables are the PCS iluminant, scaled across GrayTRC
- return BuildGrayOutputPipeline(hProfile);
+ // if so, build appropiate conversion tables.
+ // The tables are the PCS iluminant, scaled across GrayTRC
+ return BuildGrayOutputPipeline(hProfile);
}
// Not gray, create a normal matrix-shaper, which only operates in XYZ space
@@ -681,25 +688,32 @@
if (spc == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
}
else
if (spc == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
}
if (PCS == cmsSigLabData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
}
else
if (PCS == cmsSigXYZData)
{
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
}
- return Lut;
+ return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
@@ -721,15 +735,21 @@
if (nc == NULL) return NULL;
Lut = cmsPipelineAlloc(ContextID, 0, 0);
- if (Lut == NULL) {
- cmsFreeNamedColorList(nc);
- return NULL;
- }
+ if (Lut == NULL)
+ goto Error;
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
+ goto Error;
+
if (cmsGetColorSpace(hProfile) == cmsSigLabData)
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
+
return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ cmsFreeNamedColorList(nc);
+ return NULL;
}
if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
@@ -760,10 +780,10 @@
Lut = cmsPipelineDup(Lut);
if (Lut == NULL) return NULL;
- // Now it is time for a controversial stuff. I found that for 3D LUTS using
- // Lab used as indexer space, trilinear interpolation should be used
+ // Now it is time for a controversial stuff. I found that for 3D LUTS using
+ // Lab used as indexer space, trilinear interpolation should be used
if (cmsGetColorSpace(hProfile) == cmsSigLabData)
- ChangeInterpolationToTrilinear(Lut);
+ ChangeInterpolationToTrilinear(Lut);
// After reading it, we have info about the original type
OriginalType = _cmsGetTagTrueType(hProfile, tag16);
@@ -774,16 +794,20 @@
// Here it is possible to get Lab on both sides
if (cmsGetPCS(hProfile) == cmsSigLabData) {
- cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID));
+ if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error2;
}
if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
- cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID));
+ if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error2;
}
return Lut;
-
+Error2:
+ cmsPipelineFree(Lut);
+ return NULL;
}
// ---------------------------------------------------------------------------------------------------------------
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmslut.c Tue Mar 18 12:35:25 2014 -0700
@@ -264,10 +264,10 @@
if (NewElem ->TheCurves != NULL) {
for (i=0; i < NewElem ->nCurves; i++) {
if (NewElem ->TheCurves[i])
- cmsFreeToneCurve(Data ->TheCurves[i]);
+ cmsFreeToneCurve(NewElem ->TheCurves[i]);
}
}
- _cmsFree(mpe ->ContextID, Data ->TheCurves);
+ _cmsFree(mpe ->ContextID, NewElem ->TheCurves);
_cmsFree(mpe ->ContextID, NewElem);
return NULL;
}
@@ -392,6 +392,8 @@
void MatrixElemTypeFree(cmsStage* mpe)
{
_cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+ if (Data == NULL)
+ return;
if (Data ->Double)
_cmsFree(mpe ->ContextID, Data ->Double);
@@ -526,10 +528,15 @@
if (Data ->Tab.T) {
- if (Data ->HasFloatValues)
+ if (Data ->HasFloatValues) {
NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));
- else
+ if (NewElem ->Tab.TFloat == NULL)
+ goto Error;
+ } else {
NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));
+ if (NewElem ->Tab.TFloat == NULL)
+ goto Error;
+ }
}
NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID,
@@ -538,8 +545,14 @@
Data ->Params ->nOutputs,
NewElem ->Tab.T,
Data ->Params ->dwFlags);
-
- return (void*) NewElem;
+ if (NewElem->Params != NULL)
+ return (void*) NewElem;
+ Error:
+ if (NewElem->Tab.T)
+ // This works for both types
+ _cmsFree(mpe ->ContextID, NewElem -> Tab.T);
+ _cmsFree(mpe ->ContextID, NewElem);
+ return NULL;
}
@@ -636,7 +649,6 @@
for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
Dimensions[i] = nGridPoints;
-
return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);
}
@@ -706,15 +718,12 @@
}
}
-
NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);
if (NewElem ->Params == NULL) {
cmsStageFree(NewMPE);
return NULL;
}
-
-
return NewMPE;
}
@@ -772,7 +781,7 @@
int i, t, nTotalPoints, index, rest;
int nInputs, nOutputs;
cmsUInt32Number* nSamples;
- cmsUInt16Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
+ cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
_cmsStageCLutData* clut;
if (mpe == NULL) return FALSE;
@@ -785,7 +794,9 @@
nInputs = clut->Params ->nInputs;
nOutputs = clut->Params ->nOutputs;
- if (nInputs >= cmsMAXCHANNELS) return FALSE;
+ if (nInputs <= 0) return FALSE;
+ if (nOutputs <= 0) return FALSE;
+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
nTotalPoints = CubeSize(nSamples, nInputs);
@@ -832,14 +843,16 @@
int i, t, nTotalPoints, index, rest;
int nInputs, nOutputs;
cmsUInt32Number* nSamples;
- cmsFloat32Number In[cmsMAXCHANNELS], Out[MAX_STAGE_CHANNELS];
+ cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
_cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
nSamples = clut->Params ->nSamples;
nInputs = clut->Params ->nInputs;
nOutputs = clut->Params ->nOutputs;
- if (nInputs >= cmsMAXCHANNELS) return FALSE;
+ if (nInputs <= 0) return FALSE;
+ if (nOutputs <= 0) return FALSE;
+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
nTotalPoints = CubeSize(nSamples, nInputs);
@@ -1021,7 +1034,7 @@
mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
cmsFreeToneCurveTriple(LabTable);
- if (mpe == NULL) return mpe;
+ if (mpe == NULL) return NULL;
mpe ->Implements = cmsSigLabV2toV4;
return mpe;
}
@@ -1247,12 +1260,22 @@
NULL);
if (NewMPE == NULL) return NULL;
- NewMPE ->Implements = mpe ->Implements;
+ NewMPE ->Implements = mpe ->Implements;
- if (mpe ->DupElemPtr)
- NewMPE ->Data = mpe ->DupElemPtr(mpe);
- else
+ if (mpe ->DupElemPtr) {
+
+ NewMPE ->Data = mpe ->DupElemPtr(mpe);
+
+ if (NewMPE->Data == NULL) {
+
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ } else {
+
NewMPE ->Data = NULL;
+ }
return NewMPE;
}
@@ -1465,12 +1488,12 @@
}
-void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
+int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
{
cmsStage* Anterior = NULL, *pt;
- _cmsAssert(lut != NULL);
- _cmsAssert(mpe != NULL);
+ if (lut == NULL || mpe == NULL)
+ return FALSE;
switch (loc) {
@@ -1494,9 +1517,11 @@
}
break;
default:;
+ return FALSE;
}
BlessLUT(lut);
+ return TRUE;
}
// Unlink an element and return the pointer to it
@@ -1558,7 +1583,7 @@
// Concatenate two LUT into a new single one
cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
{
- cmsStage* mpe, *NewMPE;
+ cmsStage* mpe;
// If both LUTS does not have elements, we need to inherit
// the number of channels
@@ -1573,17 +1598,12 @@
mpe = mpe ->Next) {
// We have to dup each element
- NewMPE = cmsStageDup(mpe);
-
- if (NewMPE == NULL) {
- return FALSE;
- }
-
- cmsPipelineInsertStage(l1, cmsAT_END, NewMPE);
+ if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))
+ return FALSE;
}
- BlessLUT(l1);
- return TRUE;
+ BlessLUT(l1);
+ return TRUE;
}
@@ -1713,16 +1733,11 @@
cmsFloat32Number fx[4], x[4], xd[4], fxd[4];
cmsVEC3 tmp, tmp2;
cmsMAT3 Jacobian;
- cmsFloat64Number LastResult[4];
-
// Only 3->3 and 4->3 are supported
if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;
if (lut ->OutputChannels != 3) return FALSE;
- // Mark result of -1
- LastResult[0] = LastResult[1] = LastResult[2] = -1.0f;
-
// Take the hint as starting point if specified
if (Hint == NULL) {
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsmd5.c Tue Mar 18 12:35:25 2014 -0700
@@ -338,7 +338,7 @@
Error:
// Free resources as something went wrong
- if (MD5 != NULL) _cmsFree(ContextID, MD5);
+ // "MD5" cannot be other than NULL here, so no need to free it
if (Mem != NULL) _cmsFree(ContextID, Mem);
memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
return FALSE;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsnamed.c Tue Mar 18 12:35:25 2014 -0700
@@ -359,9 +359,9 @@
if (Best == -1)
Best = 0;
- v = mlu ->Entries + Best;
+ v = mlu ->Entries + Best;
- if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+ if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country;
if (len != NULL) *len = v ->Len;
@@ -475,6 +475,35 @@
}
+
+// Get the number of translations in the MLU object
+cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)
+{
+ if (mlu == NULL) return 0;
+ return mlu->UsedEntries;
+}
+
+// Get the language and country codes for a specific MLU index
+cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+ cmsUInt32Number idx,
+ char LanguageCode[3],
+ char CountryCode[3])
+{
+ _cmsMLUentry *entry;
+
+ if (mlu == NULL) return FALSE;
+
+ if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;
+
+ entry = &mlu->Entries[idx];
+
+ *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);
+ *(cmsUInt16Number *)CountryCode = _cmsAdjustEndianess16(entry->Country);
+
+ return TRUE;
+}
+
+
// Named color lists --------------------------------------------------------------------------------------------
// Grow the list to keep at least NumElements
@@ -517,9 +546,9 @@
while (v -> Allocated < n)
GrowNamedColorList(v);
- strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix) - 1);
- strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix) - 1);
- v->Prefix[sizeof(v ->Prefix) - 1] = v->Suffix[sizeof(v ->Suffix) - 1] = 0;
+ strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
+ strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
+ v->Prefix[32] = v->Suffix[32] = 0;
v -> ColorantCount = ColorantCount;
@@ -529,8 +558,9 @@
// Free a list
void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
{
+ if (v == NULL) return;
if (v ->List) _cmsFree(v ->ContextID, v ->List);
- if (v) _cmsFree(v ->ContextID, v);
+ _cmsFree(v ->ContextID, v);
}
cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
@@ -576,11 +606,8 @@
if (Name != NULL) {
- strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name,
- sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1);
-
- NamedColorList ->List[NamedColorList ->nColors].
- Name[sizeof(NamedColorList ->List[NamedColorList ->nColors].Name) - 1] = 0;
+ strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);
+ NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;
}
else
@@ -891,7 +918,6 @@
{
_cmsDICT* old_dict = (_cmsDICT*) hDict;
cmsHANDLE hNew;
- _cmsDICT* new_dict;
cmsDICTentry *entry;
_cmsAssert(old_dict != NULL);
@@ -899,8 +925,6 @@
hNew = cmsDictAlloc(old_dict ->ContextID);
if (hNew == NULL) return NULL;
- new_dict = (_cmsDICT*) hNew;
-
// Walk the list freeing all nodes
entry = old_dict ->head;
while (entry != NULL) {
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsopt.c Tue Mar 18 12:35:25 2014 -0700
@@ -27,6 +27,7 @@
// However, the following notice accompanied the original version of this
// file:
//
+
//---------------------------------------------------------------------------------
//
// Little Color Management System
@@ -81,10 +82,6 @@
int nInputs;
int nOutputs;
- // Since there is no limitation of the output number of channels, this buffer holding the connexion CLUT-shaper
- // has to be dynamically allocated. This is not the case of first step shaper-CLUT, which is limited to max inputs
- cmsUInt16Number* StageDEF;
-
_cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance
cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
@@ -202,8 +199,6 @@
{
cmsBool AnyOpt = FALSE, Opt;
- AnyOpt = FALSE;
-
do {
Opt = FALSE;
@@ -253,6 +248,7 @@
{
Prelin16Data* p16 = (Prelin16Data*) D;
cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS];
+ cmsUInt16Number StageDEF[cmsMAXCHANNELS];
int i;
for (i=0; i < p16 ->nInputs; i++) {
@@ -260,11 +256,11 @@
p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);
}
- p16 ->EvalCLUT(StageABC, p16 ->StageDEF, p16 ->CLUTparams);
+ p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);
for (i=0; i < p16 ->nOutputs; i++) {
- p16 ->EvalCurveOut16[i](&p16->StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
+ p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
}
}
@@ -274,7 +270,6 @@
{
Prelin16Data* p16 = (Prelin16Data*) ptr;
- _cmsFree(ContextID, p16 ->StageDEF);
_cmsFree(ContextID, p16 ->EvalCurveOut16);
_cmsFree(ContextID, p16 ->ParamsCurveOut16);
@@ -289,7 +284,6 @@
if (Duped == NULL) return NULL;
- Duped ->StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
Duped ->EvalCurveOut16 = _cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
Duped ->ParamsCurveOut16 = _cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
@@ -328,7 +322,6 @@
p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16;
- p16 -> StageDEF = _cmsCalloc(ContextID, p16 ->nOutputs, sizeof(cmsUInt16Number));
p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));
p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));
@@ -413,7 +406,7 @@
int i, index;
if (CLUT -> Type != cmsSigCLutElemType) {
- cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut MPE");
+ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage");
return FALSE;
}
@@ -548,6 +541,10 @@
for (i=0; i < nOuts; i++) {
cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);
+ if (InversePostLin == NULL) {
+ WhiteOut[i] = 0;
+ continue;
+ }
WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);
cmsFreeToneCurve(InversePostLin);
}
@@ -575,8 +572,8 @@
static
cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
{
- cmsPipeline* Src;
- cmsPipeline* Dest;
+ cmsPipeline* Src = NULL;
+ cmsPipeline* Dest = NULL;
cmsStage* mpe;
cmsStage* CLUT;
cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
@@ -589,7 +586,6 @@
cmsToneCurve** DataSetOut;
Prelin16Data* p16;
-
// This is a loosy optimization! does not apply in floating-point cases
if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
@@ -603,10 +599,10 @@
Src = *Lut;
- // Named color pipelines cannot be optimized either
- for (mpe = cmsPipelineGetPtrToFirstStage(Src);
- mpe != NULL;
- mpe = cmsStageNext(mpe)) {
+ // Named color pipelines cannot be optimized either
+ for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+ mpe != NULL;
+ mpe = cmsStageNext(mpe)) {
if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
}
@@ -628,7 +624,8 @@
// All seems ok, proceed.
NewPreLin = cmsStageDup(PreLin);
- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin);
+ if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))
+ goto Error;
// Remove prelinearization. Since we have duplicated the curve
// in destination LUT, the sampling shoud be applied after this stage.
@@ -642,7 +639,9 @@
if (CLUT == NULL) return FALSE;
// Add the CLUT to the destination LUT
- cmsPipelineInsertStage(Dest, cmsAT_END, CLUT);
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
+ goto Error;
+ }
// Postlinearization tables are kept unless indicated by flags
if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {
@@ -658,7 +657,8 @@
// All seems ok, proceed.
NewPostLin = cmsStageDup(PostLin);
- cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin);
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
+ goto Error;
// In destination LUT, the sampling shoud be applied after this stage.
cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
@@ -669,10 +669,18 @@
// Now its time to do the sampling. We have to ignore pre/post linearization
// The source LUT whithout pre/post curves is passed as parameter.
if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
-
+Error:
// Ops, something went wrong, Restore stages
- if (KeepPreLin != NULL) cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin);
- if (KeepPostLin != NULL) cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin);
+ if (KeepPreLin != NULL) {
+ if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {
+ _cmsAssert(0); // This never happens
+ }
+ }
+ if (KeepPostLin != NULL) {
+ if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) {
+ _cmsAssert(0); // This never happens
+ }
+ }
cmsPipelineFree(Dest);
return FALSE;
}
@@ -699,12 +707,11 @@
else {
p16 = PrelinOpt16alloc(Dest ->ContextID,
- DataCLUT ->Params,
- Dest ->InputChannels,
- DataSetIn,
- Dest ->OutputChannels,
- DataSetOut);
-
+ DataCLUT ->Params,
+ Dest ->InputChannels,
+ DataSetIn,
+ Dest ->OutputChannels,
+ DataSetOut);
_cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
}
@@ -1058,7 +1065,8 @@
LutPlusCurves = cmsPipelineDup(OriginalLut);
if (LutPlusCurves == NULL) goto Error;
- cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse));
+ if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))
+ goto Error;
// Create the result LUT
OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);
@@ -1067,13 +1075,15 @@
OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);
// Create and insert the curves at the beginning
- cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe);
+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))
+ goto Error;
// Allocate the CLUT for result
OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);
// Add the CLUT to the destination LUT
- cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe);
+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))
+ goto Error;
// Resample the LUT
if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;
@@ -1201,13 +1211,14 @@
for (i=0; i < nCurves; i++) {
c16->Curves[i] = _cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
+
if (c16->Curves[i] == NULL) {
+
for (j=0; j < i; j++) {
_cmsFree(ContextID, c16->Curves[j]);
}
_cmsFree(ContextID, c16->Curves);
_cmsFree(ContextID, c16);
-
return NULL;
}
@@ -1336,7 +1347,8 @@
// Maybe the curves are linear at the end
if (!AllCurvesAreLinear(ObtainedCurves)) {
- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves);
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))
+ goto Error;
// If the curves are to be applied in 8 bits, we can save memory
if (_cmsFormatterIs8bit(*InputFormat)) {
@@ -1344,6 +1356,7 @@
_cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;
Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);
+ if (c16 == NULL) goto Error;
*dwFlags |= cmsFLAGS_NOCACHE;
_cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
@@ -1353,6 +1366,7 @@
_cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
+ if (c16 == NULL) goto Error;
*dwFlags |= cmsFLAGS_NOCACHE;
_cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
}
@@ -1362,7 +1376,8 @@
// LUT optimizes to nothing. Set the identity LUT
cmsStageFree(ObtainedCurves);
- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels));
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))
+ goto Error;
*dwFlags |= cmsFLAGS_NOCACHE;
_cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);
@@ -1592,10 +1607,14 @@
if (!Dest) return FALSE;
// Assamble the new LUT
- cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1));
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
+ goto Error;
+
if (!IdentityMat)
- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset));
- cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2));
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
+ goto Error;
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
+ goto Error;
// If identity on matrix, we can further optimize the curves, so call the join curves routine
if (IdentityMat) {
@@ -1617,6 +1636,10 @@
cmsPipelineFree(Src);
*Lut = Dest;
return TRUE;
+Error:
+ // Leave Src unchanged
+ cmsPipelineFree(Dest);
+ return FALSE;
}
@@ -1646,7 +1669,7 @@
static _cmsOptimizationCollection* OptimizationCollection = DefaultOptimization;
// Register new ways to optimize
-cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterOptimizationPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;
_cmsOptimizationCollection* fl;
@@ -1660,7 +1683,7 @@
// Optimizer callback is required
if (Plugin ->OptimizePtr == NULL) return FALSE;
- fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(sizeof(_cmsOptimizationCollection));
+ fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(id, sizeof(_cmsOptimizationCollection));
if (fl == NULL) return FALSE;
// Copy the parameters
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspack.c Tue Mar 18 12:35:25 2014 -0700
@@ -317,6 +317,23 @@
}
static
+cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+ accum++; // A
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info,
register cmsUInt16Number wIn[],
register cmsUInt8Number* accum,
@@ -2901,6 +2918,9 @@
{ CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap},
{ CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst},
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+ ANYSPACE, Unroll3BytesSkip1SwapSwapFirst},
+
{ CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes},
{ CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse},
{ CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst},
@@ -3166,7 +3186,7 @@
// Formatters management
-cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterFormattersPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
cmsFormattersFactoryList* fl ;
@@ -3178,7 +3198,7 @@
return TRUE;
}
- fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(sizeof(cmsFormattersFactoryList));
+ fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(id, sizeof(cmsFormattersFactoryList));
if (fl == NULL) return FALSE;
fl ->Factory = Plugin ->FormattersFactory;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmspcs.c Tue Mar 18 12:35:25 2014 -0700
@@ -898,9 +898,11 @@
{
switch (ColorSpace) {
+ case cmsSigMCH1Data:
case cmsSig1colorData:
case cmsSigGrayData: return 1;
+ case cmsSigMCH2Data:
case cmsSig2colorData: return 2;
case cmsSigXYZData:
@@ -912,10 +914,12 @@
case cmsSigHsvData:
case cmsSigHlsData:
case cmsSigCmyData:
+ case cmsSigMCH3Data:
case cmsSig3colorData: return 3;
case cmsSigLuvKData:
case cmsSigCmykData:
+ case cmsSigMCH4Data:
case cmsSig4colorData: return 4;
case cmsSigMCH5Data:
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsplugin.c Tue Mar 18 12:35:25 2014 -0700
@@ -125,10 +125,14 @@
pOut[0] = pIn[7];
#else
-
_cmsAssert(Result != NULL);
+# ifdef CMS_DONT_USE_INT64
+ (*Result)[0] = QWord[0];
+ (*Result)[1] = QWord[1];
+# else
*Result = *QWord;
+# endif
#endif
}
@@ -543,10 +547,10 @@
static _cmsSubAllocator* PluginPool = NULL;
// Specialized malloc for plug-ins, that is freed upon exit.
-void* _cmsPluginMalloc(cmsUInt32Number size)
+void* _cmsPluginMalloc(cmsContext id, cmsUInt32Number size)
{
if (PluginPool == NULL)
- PluginPool = _cmsCreateSubAlloc(0, 4*1024);
+ PluginPool = _cmsCreateSubAlloc(id, 4*1024);
return _cmsSubAlloc(PluginPool, size);
}
@@ -555,6 +559,11 @@
// Main plug-in dispatcher
cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
{
+ return cmsPluginTHR(NULL, Plug_in);
+}
+
+cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
+{
cmsPluginBase* Plugin;
for (Plugin = (cmsPluginBase*) Plug_in;
@@ -583,35 +592,35 @@
break;
case cmsPluginTagTypeSig:
- if (!_cmsRegisterTagTypePlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;
break;
case cmsPluginTagSig:
- if (!_cmsRegisterTagPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginFormattersSig:
- if (!_cmsRegisterFormattersPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginRenderingIntentSig:
- if (!_cmsRegisterRenderingIntentPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginParametricCurveSig:
- if (!_cmsRegisterParametricCurvesPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginMultiProcessElementSig:
- if (!_cmsRegisterMultiProcessElementPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginOptimizationSig:
- if (!_cmsRegisterOptimizationPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;
break;
case cmsPluginTransformSig:
- if (!_cmsRegisterTransformPlugin(Plugin)) return FALSE;
+ if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;
break;
default:
@@ -630,14 +639,14 @@
{
_cmsRegisterMemHandlerPlugin(NULL);
_cmsRegisterInterpPlugin(NULL);
- _cmsRegisterTagTypePlugin(NULL);
- _cmsRegisterTagPlugin(NULL);
- _cmsRegisterFormattersPlugin(NULL);
- _cmsRegisterRenderingIntentPlugin(NULL);
- _cmsRegisterParametricCurvesPlugin(NULL);
- _cmsRegisterMultiProcessElementPlugin(NULL);
- _cmsRegisterOptimizationPlugin(NULL);
- _cmsRegisterTransformPlugin(NULL);
+ _cmsRegisterTagTypePlugin(NULL, NULL);
+ _cmsRegisterTagPlugin(NULL, NULL);
+ _cmsRegisterFormattersPlugin(NULL, NULL);
+ _cmsRegisterRenderingIntentPlugin(NULL, NULL);
+ _cmsRegisterParametricCurvesPlugin(NULL, NULL);
+ _cmsRegisterMultiProcessElementPlugin(NULL, NULL);
+ _cmsRegisterOptimizationPlugin(NULL, NULL);
+ _cmsRegisterTransformPlugin(NULL, NULL);
if (PluginPool != NULL)
_cmsSubAllocDestroy(PluginPool);
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsps2.c Tue Mar 18 12:35:25 2014 -0700
@@ -806,7 +806,6 @@
mpe = Pipeline ->Elements;
-
switch (cmsStageInputChannels(mpe)) {
case 3:
@@ -838,8 +837,6 @@
mpe = mpe ->Next;
}
-
-
if (cmsStageType(mpe) == cmsSigCLutElemType) {
_cmsIOPrintf(m, "/Table ");
@@ -854,7 +851,6 @@
_cmsIOPrintf(m, " >>\n");
_cmsIOPrintf(m, "]\n");
-
return 1;
}
@@ -950,6 +946,7 @@
rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
cmsPipelineFree(DeviceLink);
+ if (rc == 0) return 0;
}
break;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmssamp.c Tue Mar 18 12:35:25 2014 -0700
@@ -56,6 +56,8 @@
#include "lcms2_internal.h"
+#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))
+#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))
// This file contains routines for resampling and LUT optimization, black point detection
// and black preservation.
@@ -67,13 +69,13 @@
static
cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)
{
- cmsHPROFILE hLab = cmsCreateLab4Profile(NULL);
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
cmsHTRANSFORM xform;
cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };
cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };
cmsHPROFILE hProfiles[4];
cmsUInt32Number Intents[4];
- cmsContext ContextID = cmsGetProfileContextID(hProfile);
hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;
Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;
@@ -141,8 +143,8 @@
cmsCloseProfile(hLab);
if (xform == NULL) {
+
// Something went wrong. Get rid of open resources and return zero as black
-
BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
return FALSE;
}
@@ -173,7 +175,6 @@
// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
static
cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)
-
{
cmsHTRANSFORM hRoundTrip;
cmsCIELab LabIn, LabOut;
@@ -218,17 +219,27 @@
// involves to turn BP to neutral and to use only L component.
cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
{
+ cmsProfileClassSignature devClass;
- // Zero for black point
- if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {
+ // Make sure the device class is adequate
+ devClass = cmsGetDeviceClass(hProfile);
+ if (devClass == cmsSigLinkClass ||
+ devClass == cmsSigAbstractClass ||
+ devClass == cmsSigNamedColorClass) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
- return FALSE;
+ // Make sure intent is adequate
+ if (Intent != INTENT_PERCEPTUAL &&
+ Intent != INTENT_RELATIVE_COLORIMETRIC &&
+ Intent != INTENT_SATURATION) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
}
// v4 + perceptual & saturation intents does have its own black point, and it is
// well specified enough to use it. Black point tag is deprecated in V4.
-
if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
(Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
@@ -303,7 +314,7 @@
{
double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;
double sum_y = 0, sum_yx = 0, sum_yx2 = 0;
- double disc;
+ double d, a, b, c;
int i;
cmsMAT3 m;
cmsVEC3 v, res;
@@ -333,14 +344,32 @@
if (!_cmsMAT3solve(&res, &m, &v)) return 0;
- // y = t x2 + u x + c
- // x = ( - u + Sqrt( u^2 - 4 t c ) ) / ( 2 t )
- disc = res.n[1]*res.n[1] - 4.0 * res.n[0] * res.n[2];
- if (disc < 0) return -1;
- return ( -1.0 * res.n[1] + sqrt( disc )) / (2.0 * res.n[0]);
+ a = res.n[2];
+ b = res.n[1];
+ c = res.n[0];
+
+ if (fabs(a) < 1.0E-10) {
+
+ return cmsmin(0, cmsmax(50, -c/b ));
+ }
+ else {
+
+ d = b*b - 4.0 * a * c;
+ if (d <= 0) {
+ return 0;
+ }
+ else {
+
+ double rt = (-b + sqrt(d)) / (2.0 * a);
+
+ return cmsmax(0, cmsmin(50, rt));
+ }
+ }
+
}
+/*
static
cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
{
@@ -361,6 +390,7 @@
return TRUE;
}
+*/
// Calculates the black point of a destination profile.
// This algorithm comes from the Adobe paper disclosing its black point compensation method.
@@ -369,21 +399,30 @@
cmsColorSpaceSignature ColorSpace;
cmsHTRANSFORM hRoundTrip = NULL;
cmsCIELab InitialLab, destLab, Lab;
+ cmsFloat64Number inRamp[256], outRamp[256];
+ cmsFloat64Number MinL, MaxL;
+ cmsBool NearlyStraightMidrange = TRUE;
+ cmsFloat64Number yRamp[256];
+ cmsFloat64Number x[256], y[256];
+ cmsFloat64Number lo, hi;
+ int n, l;
+ cmsProfileClassSignature devClass;
- cmsFloat64Number MinL, MaxL;
- cmsBool NearlyStraightMidRange = FALSE;
- cmsFloat64Number L;
- cmsFloat64Number x[101], y[101];
- cmsFloat64Number lo, hi, NonMonoMin;
- int n, l, i, NonMonoIndx;
-
+ // Make sure the device class is adequate
+ devClass = cmsGetDeviceClass(hProfile);
+ if (devClass == cmsSigLinkClass ||
+ devClass == cmsSigAbstractClass ||
+ devClass == cmsSigNamedColorClass) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
// Make sure intent is adequate
if (Intent != INTENT_PERCEPTUAL &&
Intent != INTENT_RELATIVE_COLORIMETRIC &&
Intent != INTENT_SATURATION) {
- BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
- return FALSE;
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
}
@@ -415,10 +454,8 @@
return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
}
- // It is one of the valid cases!, presto chargo hocus pocus, go for the Adobe magic
+ // It is one of the valid cases!, use Adobe algorithm
- // Step 1
- // ======
// Set a first guess, that should work on good profiles.
if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
@@ -449,71 +486,68 @@
hRoundTrip = CreateRoundtripXForm(hProfile, Intent);
if (hRoundTrip == NULL) return FALSE;
- // Calculate Min L*
- Lab = InitialLab;
- Lab.L = 0;
- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
- MinL = destLab.L;
+ // Compute ramps
- // Calculate Max L*
- Lab = InitialLab;
- Lab.L = 100;
- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
- MaxL = destLab.L;
+ for (l=0; l < 256; l++) {
- // Step 3
- // ======
+ Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
+ Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
+ Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
- // check if quadratic estimation needs to be done.
+ cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+
+ inRamp[l] = Lab.L;
+ outRamp[l] = destLab.L;
+ }
+
+ // Make monotonic
+ for (l = 254; l > 0; --l) {
+ outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);
+ }
+
+ // Check
+ if (! (outRamp[0] < outRamp[255])) {
+
+ cmsDeleteTransform(hRoundTrip);
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+
+ // Test for mid range straight (only on relative colorimetric)
+
+ NearlyStraightMidrange = TRUE;
+ MinL = outRamp[0]; MaxL = outRamp[255];
if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
- // Conceptually, this code tests how close the source l and converted L are to one another in the mid-range
- // of the values. If the converted ramp of L values is close enough to a straight line y=x, then InitialLab
- // is good enough to be the DestinationBlackPoint,
- NearlyStraightMidRange = TRUE;
+ for (l=0; l < 256; l++) {
- for (l=0; l <= 100; l++) {
+ if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||
+ (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
+ NearlyStraightMidrange = FALSE;
+ }
- Lab.L = l;
- Lab.a = InitialLab.a;
- Lab.b = InitialLab.b;
+ // If the mid range is straight (as determined above) then the
+ // DestinationBlackPoint shall be the same as initialLab.
+ // Otherwise, the DestinationBlackPoint shall be determined
+ // using curve fitting.
- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+ if (NearlyStraightMidrange) {
- L = destLab.L;
-
- // Check the mid range in 20% after MinL
- if (L > (MinL + 0.2 * (MaxL - MinL))) {
-
- // Is close enough?
- if (fabs(L - l) > 4.0) {
-
- // Too far away, profile is buggy!
- NearlyStraightMidRange = FALSE;
- break;
- }
- }
+ cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+ cmsDeleteTransform(hRoundTrip);
+ return TRUE;
}
}
- else {
- // Check is always performed for perceptual and saturation intents
- NearlyStraightMidRange = FALSE;
- }
- // If no furter checking is needed, we are done
- if (NearlyStraightMidRange) {
-
- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
- cmsDeleteTransform(hRoundTrip);
- return TRUE;
- }
-
- // The round-trip curve normally looks like a nearly constant section at the black point,
+ // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
// with a corner and a nearly straight line to the white point.
- // STEP 4
- // =======
+ for (l=0; l < 256; l++) {
+
+ yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
+ }
// find the black point using the least squares error quadratic curve fitting
@@ -528,62 +562,32 @@
hi = 0.25;
}
- // Capture points for the fitting.
+ // Capture shadow points for the fitting.
n = 0;
- for (l=0; l <= 100; l++) {
+ for (l=0; l < 256; l++) {
- cmsFloat64Number ff;
-
- Lab.L = (cmsFloat64Number) l;
- Lab.a = InitialLab.a;
- Lab.b = InitialLab.b;
-
- cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
-
- ff = (destLab.L - MinL)/(MaxL - MinL);
+ cmsFloat64Number ff = yRamp[l];
if (ff >= lo && ff < hi) {
-
- x[n] = Lab.L;
- y[n] = ff;
+ x[n] = inRamp[l];
+ y[n] = yRamp[l];
n++;
}
-
- }
-
- // This part is not on the Adobe paper, but I found is necessary for getting any result.
-
- if (IsMonotonic(n, y)) {
-
- // Monotonic means lower point is stil valid
- cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
- cmsDeleteTransform(hRoundTrip);
- return TRUE;
- }
-
- // No suitable points, regret and use safer algorithm
- if (n == 0) {
- cmsDeleteTransform(hRoundTrip);
- return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
- }
-
-
- NonMonoMin = 100;
- NonMonoIndx = 0;
- for (i=0; i < n; i++) {
-
- if (y[i] < NonMonoMin) {
- NonMonoIndx = i;
- NonMonoMin = y[i];
- }
}
- Lab.L = x[NonMonoIndx];
+
+ // No suitable points
+ if (n < 3 ) {
+ cmsDeleteTransform(hRoundTrip);
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
// fit and get the vertex of quadratic curve
Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);
- if (Lab.L < 0.0 || Lab.L > 50.0) { // clip to zero L* if the vertex is negative
+ if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative
Lab.L = 0;
}
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmstypes.c Tue Mar 18 12:35:25 2014 -0700
@@ -91,7 +91,7 @@
// Register a new type handler. This routine is shared between normal types and MPE
static
-cmsBool RegisterTypesPlugin(cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
+cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsTagTypeLinkedList* LinkedList, cmsUInt32Number DefaultListCount)
{
cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;
_cmsTagTypeLinkedList *pt, *Anterior = NULL;
@@ -118,7 +118,7 @@
}
// Registering happens in plug-in memory pool
- pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagTypeLinkedList));
+ pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));
if (pt == NULL) return FALSE;
pt ->Handler = Plugin ->Handler;
@@ -208,10 +208,10 @@
cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
// Let's take the offsets to each element
- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
if (ElementOffsets == NULL) goto Error;
- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
if (ElementSizes == NULL) goto Error;
for (i=0; i < Count; i++) {
@@ -257,10 +257,10 @@
cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
// Create table
- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
if (ElementOffsets == NULL) goto Error;
- ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number *));
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
if (ElementSizes == NULL) goto Error;
// Keep starting position of curve offsets
@@ -456,6 +456,7 @@
void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
{
return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));
+
cmsUNUSED_PARAMETER(n);
}
@@ -1106,8 +1107,6 @@
{
cmsUInt32Number Count;
cmsToneCurve* NewGamma;
- cmsUInt16Number Linear[2] = { 0, 0xffff };
-
*nItems = 0;
if (!_cmsReadUInt32Number(io, &Count)) return NULL;
@@ -1115,11 +1114,14 @@
switch (Count) {
case 0: // Linear.
-
- NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, 2, Linear);
- if (!NewGamma) return NULL;
- *nItems = 1;
- return NewGamma;
+ {
+ cmsFloat64Number SingleGamma = 1.0;
+
+ NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
+ if (!NewGamma) return NULL;
+ *nItems = 1;
+ return NewGamma;
+ }
case 1: // Specified as the exponent of gamma function
{
@@ -1210,6 +1212,7 @@
if (ICCVersion < 4.0) return cmsSigCurveType;
if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric
if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves
+ if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves
return cmsSigParametricCurveType;
}
@@ -1386,6 +1389,9 @@
{
cmsICCMeasurementConditions mc;
+
+ memset(&mc, 0, sizeof(mc));
+
if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;
if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL;
if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;
@@ -1640,7 +1646,6 @@
static
cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)
{
- cmsStage* mpe;
cmsUInt8Number* Temp = NULL;
int i, j;
cmsToneCurve* Tables[cmsMAXCHANNELS];
@@ -1669,11 +1674,8 @@
_cmsFree(ContextID, Temp);
Temp = NULL;
-
- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
- if (mpe == NULL) goto Error;
-
- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+ goto Error;
for (i=0; i < nChannels; i++)
cmsFreeToneCurve(Tables[i]);
@@ -1701,21 +1703,30 @@
if (Tables) {
- if (Tables ->TheCurves[i]->nEntries != 256) {
- cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
- return FALSE;
+ // Usual case of identity curves
+ if ((Tables ->TheCurves[i]->nEntries == 2) &&
+ (Tables->TheCurves[i]->Table16[0] == 0) &&
+ (Tables->TheCurves[i]->Table16[1] == 65535)) {
+
+ for (j=0; j < 256; j++) {
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
+ }
}
-
- }
-
- for (j=0; j < 256; j++) {
-
- if (Tables != NULL)
- val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
else
- val = (cmsUInt8Number) j;
-
- if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+ if (Tables ->TheCurves[i]->nEntries != 256) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
+ return FALSE;
+ }
+ else
+ for (j=0; j < 256; j++) {
+
+ if (Tables != NULL)
+ val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
+ else
+ val = (cmsUInt8Number) j;
+
+ if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+ }
}
}
return TRUE;
@@ -1724,7 +1735,7 @@
// Check overflow
static
-size_t uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
+cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
{
cmsUInt32Number rv = 1, rc;
@@ -1736,13 +1747,13 @@
rv *= a;
// Check for overflow
- if (rv > UINT_MAX / a) return (size_t) -1;
+ if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;
}
rc = rv * n;
- if (rv != rc / n) return (size_t) -1;
+ if (rv != rc / n) return (cmsUInt32Number) -1;
return rc;
}
@@ -1757,7 +1768,6 @@
cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
cmsUInt8Number* Temp = NULL;
cmsPipeline* NewLUT = NULL;
- cmsStage *mpemat, *mpeclut;
cmsUInt32Number nTabSize, i;
cmsFloat64Number Matrix[3*3];
@@ -1796,9 +1806,8 @@
// Only operates if not identity...
if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
- if (mpemat == NULL) goto Error;
- cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, mpemat);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+ goto Error;
}
// Get input tables
@@ -1806,13 +1815,10 @@
// Get 3D CLUT. Check the overflow....
nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
- if (nTabSize == (size_t) -1) goto Error;
+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
if (nTabSize > 0) {
cmsUInt16Number *PtrW, *T;
- cmsUInt32Number Tsize;
-
- Tsize = (cmsUInt32Number) nTabSize * sizeof(cmsUInt16Number);
PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
if (T == NULL) goto Error;
@@ -1829,10 +1835,8 @@
_cmsFree(self ->ContextID, Temp);
Temp = NULL;
-
- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
- if (mpeclut == NULL) goto Error;
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))
+ goto Error;
_cmsFree(self ->ContextID, T);
}
@@ -1934,7 +1938,7 @@
if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;
nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);
- if (nTabSize == (size_t) -1) return FALSE;
+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
if (nTabSize > 0) {
// The 3D CLUT.
@@ -1983,7 +1987,6 @@
static
cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)
{
- cmsStage* mpe;
int i;
cmsToneCurve* Tables[cmsMAXCHANNELS];
@@ -2007,10 +2010,8 @@
// Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)
- mpe = cmsStageAllocToneCurves(ContextID, nChannels, Tables);
- if (mpe == NULL) goto Error;
-
- cmsPipelineInsertStage(lut, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+ goto Error;
for (i=0; i < nChannels; i++)
cmsFreeToneCurve(Tables[i]);
@@ -2031,7 +2032,9 @@
int j;
cmsUInt32Number i;
cmsUInt16Number val;
- int nEntries = 256;
+ int nEntries;
+
+ _cmsAssert(Tables != NULL);
nEntries = Tables->TheCurves[0]->nEntries;
@@ -2039,11 +2042,7 @@
for (j=0; j < nEntries; j++) {
- if (Tables != NULL)
- val = Tables->TheCurves[i]->Table16[j];
- else
- val = _cmsQuantizeVal(j, nEntries);
-
+ val = Tables->TheCurves[i]->Table16[j];
if (!_cmsWriteUInt16Number(io, val)) return FALSE;
}
}
@@ -2057,7 +2056,6 @@
{
cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
cmsPipeline* NewLUT = NULL;
- cmsStage *mpemat, *mpeclut;
cmsUInt32Number nTabSize;
cmsFloat64Number Matrix[3*3];
cmsUInt16Number InputEntries, OutputEntries;
@@ -2094,9 +2092,8 @@
// Only operates on 3 channels
if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
- mpemat = cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL);
- if (mpemat == NULL) goto Error;
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpemat);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+ goto Error;
}
if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;
@@ -2110,7 +2107,7 @@
// Get 3D CLUT
nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
- if (nTabSize == (size_t) -1) goto Error;
+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
if (nTabSize > 0) {
cmsUInt16Number *T;
@@ -2123,13 +2120,10 @@
goto Error;
}
- mpeclut = cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T);
- if (mpeclut == NULL) {
- _cmsFree(self ->ContextID, T);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {
+ _cmsFree(self ->ContextID, T);
goto Error;
}
-
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpeclut);
_cmsFree(self ->ContextID, T);
}
@@ -2159,7 +2153,7 @@
_cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
_cmsStageMatrixData* MatMPE = NULL;
_cmsStageCLutData* clut = NULL;
- int InputChannels, OutputChannels, clutPoints;
+ int i, InputChannels, OutputChannels, clutPoints;
// Disassemble the LUT into components.
mpe = NewLUT -> Elements;
@@ -2234,13 +2228,13 @@
if (PreMPE != NULL) {
if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;
} else {
- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
}
if (PostMPE != NULL) {
if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;
} else {
- if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
}
@@ -2249,9 +2243,16 @@
if (PreMPE != NULL) {
if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;
}
+ else {
+ for (i=0; i < InputChannels; i++) {
+
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+ }
+ }
nTabSize = uipow(OutputChannels, clutPoints, InputChannels);
- if (nTabSize == (size_t) -1) return FALSE;
+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
if (nTabSize > 0) {
// The 3D CLUT.
if (clut != NULL) {
@@ -2263,7 +2264,13 @@
if (PostMPE != NULL) {
if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;
}
-
+ else {
+ for (i=0; i < OutputChannels; i++) {
+
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+ }
+ }
return TRUE;
@@ -2479,7 +2486,6 @@
cmsUInt32Number offsetM; // Offset to first "M" curve
cmsUInt32Number offsetC; // Offset to CLUT
cmsUInt32Number offsetA; // Offset to first "A" curve
- cmsStage* mpe;
cmsPipeline* NewLUT = NULL;
@@ -2501,37 +2507,35 @@
if (NewLUT == NULL) return NULL;
if (offsetA!= 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))
+ goto Error;
}
if (offsetC != 0) {
- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+ goto Error;
}
if (offsetM != 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))
+ goto Error;
}
if (offsetMat != 0) {
- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+ goto Error;
}
if (offsetB != 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))
+ goto Error;
}
*nItems = 1;
return NewLUT;
+Error:
+ cmsPipelineFree(NewLUT);
+ return NULL;
cmsUNUSED_PARAMETER(SizeOfTag);
}
@@ -2798,7 +2802,6 @@
cmsUInt32Number offsetM; // Offset to first "M" curve
cmsUInt32Number offsetC; // Offset to CLUT
cmsUInt32Number offsetA; // Offset to first "A" curve
- cmsStage* mpe;
cmsPipeline* NewLUT = NULL;
@@ -2821,37 +2824,35 @@
if (NewLUT == NULL) return NULL;
if (offsetB != 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))
+ goto Error;
}
if (offsetMat != 0) {
- mpe = ReadMatrix(self, io, BaseOffset + offsetMat);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+ goto Error;
}
if (offsetM != 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))
+ goto Error;
}
if (offsetC != 0) {
- mpe = ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+ goto Error;
}
if (offsetA!= 0) {
- mpe = ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan);
- if (mpe == NULL) { cmsPipelineFree(NewLUT); return NULL; }
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))
+ goto Error;
}
*nItems = 1;
return NewLUT;
+Error:
+ cmsPipelineFree(NewLUT);
+ return NULL;
cmsUNUSED_PARAMETER(SizeOfTag);
}
@@ -3287,7 +3288,7 @@
SizeOfTag -= sizeof(cmsUInt32Number);
if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;
- if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+ if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;
SizeOfTag -= sizeof(cmsUInt64Number);
if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;
@@ -4292,6 +4293,9 @@
if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+ if (InputChans == 0) goto Error;
+ if (OutputChans == 0) goto Error;
+
if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
goto Error;
@@ -4381,7 +4385,6 @@
{
cmsStageSignature ElementSig;
cmsTagTypeHandler* TypeHandler;
- cmsStage *mpe = NULL;
cmsUInt32Number nItems;
cmsPipeline *NewLUT = (cmsPipeline *) Cargo;
@@ -4409,11 +4412,8 @@
if (TypeHandler ->ReadPtr != NULL) {
// This is a real element which should be read and processed
- mpe = (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag);
- if (mpe == NULL) return FALSE;
-
- // All seems ok, insert element
- cmsPipelineInsertStage(NewLUT, cmsAT_END, mpe);
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))
+ return FALSE;
}
return TRUE;
@@ -4479,10 +4479,10 @@
outputChan = cmsPipelineOutputChannels(Lut);
ElemCount = cmsPipelineStageCount(Lut);
- ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
if (ElementOffsets == NULL) goto Error;
- ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number *));
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
if (ElementSizes == NULL) goto Error;
// Write the head
@@ -4825,10 +4825,10 @@
static
cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count)
{
- e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
+ e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
if (e->Offsets == NULL) return FALSE;
- e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number *));
+ e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
if (e->Sizes == NULL) {
_cmsFree(ContextID, e -> Offsets);
@@ -4844,7 +4844,7 @@
void FreeElem(_cmsDICelem* e)
{
if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets);
- if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e ->Sizes);
+ if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes);
e->Offsets = e ->Sizes = NULL;
}
@@ -5084,7 +5084,7 @@
if (!_cmsReadUInt32Number(io, &Count)) return NULL;
SizeOfTag -= sizeof(cmsUInt32Number);
- // Get rec lenghth
+ // Get rec length
if (!_cmsReadUInt32Number(io, &Length)) return NULL;
SizeOfTag -= sizeof(cmsUInt32Number);
@@ -5118,14 +5118,22 @@
if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;
}
+ if (NameWCS == NULL || ValueWCS == NULL) {
+
+ cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value");
+ rc = FALSE;
+ }
+ else {
+
rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);
+ }
if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);
if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);
if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);
if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);
- if (!rc) return FALSE;
+ if (!rc) goto Error;
}
FreeArray(&a);
@@ -5277,14 +5285,14 @@
#define DEFAULT_TAG_TYPE_COUNT (sizeof(SupportedTagTypes) / sizeof(_cmsTagTypeLinkedList))
// Both kind of plug-ins share same structure
-cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)
{
- return RegisterTypesPlugin(Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
+ return RegisterTypesPlugin(id, Data, SupportedTagTypes, DEFAULT_TAG_TYPE_COUNT);
}
-cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)
{
- return RegisterTypesPlugin(Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
+ return RegisterTypesPlugin(id, Data, SupportedMPEtypes, DEFAULT_MPE_TYPE_COUNT);
}
@@ -5391,7 +5399,9 @@
{ cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]},
{ cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]},
{ cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]},
- { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL}, NULL}
+ { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]},
+ { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}
+
};
@@ -5406,7 +5416,7 @@
#define DEFAULT_TAG_COUNT (sizeof(SupportedTags) / sizeof(_cmsTagLinkedList))
-cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginTag* Plugin = (cmsPluginTag*) Data;
_cmsTagLinkedList *pt, *Anterior;
@@ -5430,7 +5440,7 @@
pt = pt ->Next;
}
- pt = (_cmsTagLinkedList*) _cmsPluginMalloc(sizeof(_cmsTagLinkedList));
+ pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));
if (pt == NULL) return FALSE;
pt ->Signature = Plugin ->Signature;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsvirt.c Tue Mar 18 12:35:25 2014 -0700
@@ -208,9 +208,26 @@
if (TransferFunction) {
+ // Tries to minimize space. Thanks to Richard Hughes for this nice idea
if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error;
- if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
- if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
+
+ if (TransferFunction[1] == TransferFunction[0]) {
+
+ if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;
+
+ } else {
+
+ if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
+ }
+
+ if (TransferFunction[2] == TransferFunction[0]) {
+
+ if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;
+
+ } else {
+
+ if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
+ }
}
if (Primaries) {
@@ -303,7 +320,6 @@
{
cmsHPROFILE hICC;
cmsPipeline* Pipeline;
- cmsStage* Lin;
int nChannels;
hICC = cmsCreateProfilePlaceholder(ContextID);
@@ -327,10 +343,8 @@
// Copy tables to Pipeline
- Lin = cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions);
- if (Lin == NULL) goto Error;
-
- cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, Lin);
+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))
+ goto Error;
// Create tags
if (!SetTextTags(hICC, L"Linearization built-in")) goto Error;
@@ -344,6 +358,7 @@
return hICC;
Error:
+ cmsPipelineFree(Pipeline);
if (hICC)
cmsCloseProfile(hICC);
@@ -451,9 +466,10 @@
if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels));
- cmsPipelineInsertStage(LUT, cmsAT_END, CLUT);
- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||
+ !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||
+ !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))
+ goto Error;
// Create tags
if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error;
@@ -504,7 +520,8 @@
LUT = cmsPipelineAlloc(ContextID, 3, 3);
if (LUT == NULL) goto Error;
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))
+ goto Error;
if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
cmsPipelineFree(LUT);
@@ -550,7 +567,8 @@
LUT = cmsPipelineAlloc(ContextID, 3, 3);
if (LUT == NULL) goto Error;
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+ goto Error;
if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
cmsPipelineFree(LUT);
@@ -595,7 +613,8 @@
LUT = cmsPipelineAlloc(ContextID, 3, 3);
if (LUT == NULL) goto Error;
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+ goto Error;
if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
cmsPipelineFree(LUT);
@@ -734,81 +753,83 @@
// contrast, Saturation and white point displacement
cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
- int nLUTPoints,
- cmsFloat64Number Bright,
- cmsFloat64Number Contrast,
- cmsFloat64Number Hue,
- cmsFloat64Number Saturation,
- int TempSrc,
- int TempDest)
+ int nLUTPoints,
+ cmsFloat64Number Bright,
+ cmsFloat64Number Contrast,
+ cmsFloat64Number Hue,
+ cmsFloat64Number Saturation,
+ int TempSrc,
+ int TempDest)
{
- cmsHPROFILE hICC;
- cmsPipeline* Pipeline;
- BCHSWADJUSTS bchsw;
- cmsCIExyY WhitePnt;
- cmsStage* CLUT;
- cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
- int i;
+ cmsHPROFILE hICC;
+ cmsPipeline* Pipeline;
+ BCHSWADJUSTS bchsw;
+ cmsCIExyY WhitePnt;
+ cmsStage* CLUT;
+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+ int i;
+ bchsw.Brightness = Bright;
+ bchsw.Contrast = Contrast;
+ bchsw.Hue = Hue;
+ bchsw.Saturation = Saturation;
- bchsw.Brightness = Bright;
- bchsw.Contrast = Contrast;
- bchsw.Hue = Hue;
- bchsw.Saturation = Saturation;
+ cmsWhitePointFromTemp(&WhitePnt, TempSrc );
+ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
- cmsWhitePointFromTemp(&WhitePnt, TempSrc );
- cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+ cmsWhitePointFromTemp(&WhitePnt, TempDest);
+ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
- cmsWhitePointFromTemp(&WhitePnt, TempDest);
- cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC) // can't allocate
+ return NULL;
- hICC = cmsCreateProfilePlaceholder(ContextID);
- if (!hICC) // can't allocate
- return NULL;
+ cmsSetDeviceClass(hICC, cmsSigAbstractClass);
+ cmsSetColorSpace(hICC, cmsSigLabData);
+ cmsSetPCS(hICC, cmsSigLabData);
- cmsSetDeviceClass(hICC, cmsSigAbstractClass);
- cmsSetColorSpace(hICC, cmsSigLabData);
- cmsSetPCS(hICC, cmsSigLabData);
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
- cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+ // Creates a Pipeline with 3D grid only
+ Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
+ if (Pipeline == NULL) {
+ cmsCloseProfile(hICC);
+ return NULL;
+ }
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
+ CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
+ if (CLUT == NULL) return NULL;
- // Creates a Pipeline with 3D grid only
- Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
- if (Pipeline == NULL) {
- cmsCloseProfile(hICC);
- return NULL;
- }
- for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
- CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
- if (CLUT == NULL) return NULL;
+ if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
+ // Shouldn't reach here
+ goto Error;
+ }
- if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
+ goto Error;
+ }
- // Shouldn't reach here
- cmsPipelineFree(Pipeline);
- cmsCloseProfile(hICC);
- return NULL;
- }
+ // Create tags
+ if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
- cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT);
+ cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
- // Create tags
+ cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
- if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
+ // Pipeline is already on virtual profile
+ cmsPipelineFree(Pipeline);
- cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
+ // Ok, done
+ return hICC;
- cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
-
- // Pipeline is already on virtual profile
- cmsPipelineFree(Pipeline);
-
- // Ok, done
- return hICC;
+Error:
+ cmsPipelineFree(Pipeline);
+ cmsCloseProfile(hICC);
+ return NULL;
}
@@ -856,7 +877,8 @@
PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);
cmsFreeToneCurve(EmptyTab);
- cmsPipelineInsertStage(LUT, cmsAT_END, PostLin);
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))
+ goto Error;
if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;
if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
@@ -999,6 +1021,7 @@
{ FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
{ FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+ { FALSE, 0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType}},
{ TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }},
{ TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
{ TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
@@ -1059,6 +1082,7 @@
cmsContext ContextID = cmsGetTransformContextID(hTransform);
const cmsAllowedLUT* AllowedLUT;
cmsTagSignature DestinationTag;
+ cmsProfileClassSignature deviceClass;
_cmsAssert(hTransform != NULL);
@@ -1080,13 +1104,15 @@
// Time to fix the Lab2/Lab4 issue.
if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))
+ goto Error;
}
// On the output side too
if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {
- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
}
@@ -1108,8 +1134,9 @@
FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);
FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);
+ deviceClass = cmsGetDeviceClass(hProfile);
- if (cmsGetDeviceClass(hProfile) == cmsSigOutputClass)
+ if (deviceClass == cmsSigOutputClass)
DestinationTag = cmsSigBToA0Tag;
else
DestinationTag = cmsSigAToB0Tag;
@@ -1136,10 +1163,12 @@
// Put identity curves if needed
if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
- cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
+ goto Error;
if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
- cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut));
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
+ goto Error;
AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
}
@@ -1168,10 +1197,22 @@
if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;
}
- if (xform ->Sequence != NULL) {
+ if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {
if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;
}
+ // Set the white point
+ if (deviceClass == cmsSigInputClass) {
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;
+ }
+ else {
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;
+ }
+
+
+ // Per 7.2.15 in spec 4.3
+ cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);
+
cmsPipelineFree(LUT);
return hProfile;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmswtpnt.c Tue Mar 18 12:35:25 2014 -0700
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
-// Copyright (c) 1998-2010 Marti Maria Saguer
+// Copyright (c) 1998-2012 Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
@@ -76,48 +76,48 @@
// Obtains WhitePoint from Temperature
cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)
{
- cmsFloat64Number x, y;
- cmsFloat64Number T, T2, T3;
- // cmsFloat64Number M1, M2;
+ cmsFloat64Number x, y;
+ cmsFloat64Number T, T2, T3;
+ // cmsFloat64Number M1, M2;
- _cmsAssert(WhitePoint != NULL);
+ _cmsAssert(WhitePoint != NULL);
- T = TempK;
- T2 = T*T; // Square
- T3 = T2*T; // Cube
+ T = TempK;
+ T2 = T*T; // Square
+ T3 = T2*T; // Cube
- // For correlated color temperature (T) between 4000K and 7000K:
+ // For correlated color temperature (T) between 4000K and 7000K:
- if (T >= 4000. && T <= 7000.)
- {
- x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
- }
- else
- // or for correlated color temperature (T) between 7000K and 25000K:
+ if (T >= 4000. && T <= 7000.)
+ {
+ x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
+ }
+ else
+ // or for correlated color temperature (T) between 7000K and 25000K:
- if (T > 7000.0 && T <= 25000.0)
- {
- x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
- }
- else {
- cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
- return FALSE;
- }
+ if (T > 7000.0 && T <= 25000.0)
+ {
+ x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
+ }
+ else {
+ cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
+ return FALSE;
+ }
- // Obtain y(x)
+ // Obtain y(x)
- y = -3.000*(x*x) + 2.870*x - 0.275;
+ y = -3.000*(x*x) + 2.870*x - 0.275;
- // wave factors (not used, but here for futures extensions)
+ // wave factors (not used, but here for futures extensions)
- // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
- // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
+ // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
+ // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
- WhitePoint -> x = x;
- WhitePoint -> y = y;
- WhitePoint -> Y = 1.0;
+ WhitePoint -> x = x;
+ WhitePoint -> y = y;
+ WhitePoint -> Y = 1.0;
- return TRUE;
+ return TRUE;
}
@@ -266,7 +266,7 @@
{{ 0.8951, 0.2664, -0.1614 }},
{{ -0.7502, 1.7135, 0.0367 }},
{{ 0.0389, -0.0685, 1.0296 }}
- }};
+ }};
if (ConeMatrix == NULL)
ConeMatrix = &LamRigg;
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/cmsxform.c Tue Mar 18 12:35:25 2014 -0700
@@ -396,7 +396,7 @@
static _cmsTransformCollection* TransformCollection = NULL;
// Register new ways to transform
-cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Data)
+cmsBool _cmsRegisterTransformPlugin(cmsContext id, cmsPluginBase* Data)
{
cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;
_cmsTransformCollection* fl;
@@ -412,7 +412,7 @@
if (Plugin ->Factory == NULL) return FALSE;
- fl = (_cmsTransformCollection*) _cmsPluginMalloc(sizeof(_cmsTransformCollection));
+ fl = (_cmsTransformCollection*) _cmsPluginMalloc(id, sizeof(_cmsTransformCollection));
if (fl == NULL) return FALSE;
// Copy the parameters
@@ -651,6 +651,22 @@
// ----------------------------------------------------------------------------------------------------------------
+static
+void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)
+{
+ if (src == NULL) {
+ wtPt ->X = cmsD50X;
+ wtPt ->Y = cmsD50Y;
+ wtPt ->Z = cmsD50Z;
+ }
+ else {
+ wtPt ->X = src->X;
+ wtPt ->Y = src->Y;
+ wtPt ->Z = src->Z;
+ }
+
+}
+
// New to lcms 2.0 -- have all parameters available.
cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
@@ -664,7 +680,6 @@
cmsUInt32Number dwFlags)
{
_cmsTRANSFORM* xform;
- cmsBool FloatTransform;
cmsColorSpaceSignature EntryColorSpace;
cmsColorSpaceSignature ExitColorSpace;
cmsPipeline* Lut;
@@ -681,9 +696,7 @@
if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;
}
- // On floating point transforms, inhibit optimizations
- FloatTransform = (_cmsFormatterIsFloat(InputFormat) && _cmsFormatterIsFloat(OutputFormat));
-
+ // On floating point transforms, inhibit cache
if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))
dwFlags |= cmsFLAGS_NOCACHE;
@@ -730,6 +743,10 @@
xform ->ExitColorSpace = ExitColorSpace;
xform ->RenderingIntent = Intents[nProfiles-1];
+ // Take white points
+ SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));
+ SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));
+
// Create a gamut check LUT if requested
if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2.h Tue Mar 18 12:35:25 2014 -0700
@@ -30,7 +30,7 @@
//---------------------------------------------------------------------------------
//
// Little Color Management System
-// Copyright (c) 1998-2011 Marti Maria Saguer
+// Copyright (c) 1998-2013 Marti Maria Saguer
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the "Software"),
@@ -52,7 +52,7 @@
//
//---------------------------------------------------------------------------------
//
-// Version 2.4
+// Version 2.5
//
#ifndef _lcms2_H
@@ -101,7 +101,7 @@
#endif
// Version/release
-#define LCMS_VERSION 2040
+#define LCMS_VERSION 2050
// I will give the chance of redefining basic types for compilers that are not fully C99 compliant
#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
@@ -367,6 +367,7 @@
cmsSigPreview1Tag = 0x70726531, // 'pre1'
cmsSigPreview2Tag = 0x70726532, // 'pre2'
cmsSigProfileDescriptionTag = 0x64657363, // 'desc'
+ cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm'
cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq'
cmsSigProfileSequenceIdTag = 0x70736964, // 'psid'
cmsSigPs2CRD0Tag = 0x70736430, // 'psd0'
@@ -1014,6 +1015,7 @@
// Plug-In registering ---------------------------------------------------------------------------------------------------
CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin);
+CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
CMSAPI void CMSEXPORT cmsUnregisterPlugins(void);
// Error logging ----------------------------------------------------------------------------------------------------------
@@ -1190,7 +1192,7 @@
// Where to place/locate the stages in the pipeline chain
typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
-CMSAPI void CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
+CMSAPI int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
@@ -1274,6 +1276,13 @@
const char LanguageCode[3], const char CountryCode[3],
char ObtainedLanguage[3], char ObtainedCountry[3]);
+CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
+
+CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+ cmsUInt32Number idx,
+ char LanguageCode[3],
+ char CountryCode[3]);
+
// Undercolorremoval & black generation -------------------------------------------------------------------------------------
typedef struct {
@@ -1424,6 +1433,7 @@
CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
--- ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/java2d/cmm/lcms/lcms2_internal.h Tue Mar 18 12:35:25 2014 -0700
@@ -27,7 +27,7 @@
// However, the following notice accompanied the original version of this
// file:
//
-//---------------------------------------------------------------------------------
+
//
// Little Color Management System
// Copyright (c) 1998-2011 Marti Maria Saguer
@@ -196,7 +196,7 @@
// Plug-In registering ---------------------------------------------------------------
// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
-void* _cmsPluginMalloc(cmsUInt32Number size);
+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);
// Memory management
cmsBool _cmsRegisterMemHandlerPlugin(cmsPluginBase* Plugin);
@@ -205,28 +205,28 @@
cmsBool _cmsRegisterInterpPlugin(cmsPluginBase* Plugin);
// Parametric curves
-cmsBool _cmsRegisterParametricCurvesPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Formatters management
-cmsBool _cmsRegisterFormattersPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Tag type management
-cmsBool _cmsRegisterTagTypePlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Tag management
-cmsBool _cmsRegisterTagPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Intent management
-cmsBool _cmsRegisterRenderingIntentPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Multi Process elements
-cmsBool _cmsRegisterMultiProcessElementPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Optimization
-cmsBool _cmsRegisterOptimizationPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// Transform
-cmsBool _cmsRegisterTransformPlugin(cmsPluginBase* Plugin);
+cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
// ---------------------------------------------------------------------------------------------------------
@@ -263,7 +263,7 @@
cmsUInt16Number Country;
cmsUInt32Number StrW; // Offset to current unicode string
- cmsUInt32Number Len; // Lenght in bytes
+ cmsUInt32Number Len; // Length in bytes
} _cmsMLUentry;
@@ -330,9 +330,11 @@
cmsColorSpaceSignature ColorSpace;
cmsColorSpaceSignature PCS;
cmsUInt32Number RenderingIntent;
+
cmsUInt32Number flags;
cmsUInt32Number manufacturer, model;
cmsUInt64Number attributes;
+ cmsUInt32Number creator;
cmsProfileID ProfileID;
@@ -585,6 +587,10 @@
cmsColorSpaceSignature EntryColorSpace;
cmsColorSpaceSignature ExitColorSpace;
+ // White points (informative only)
+ cmsCIEXYZ EntryWhitePoint;
+ cmsCIEXYZ ExitWhitePoint;
+
// Profiles used to create the transform
cmsSEQ* Sequence;
--- ./jdk/src/share/native/sun/management/Flag.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/management/Flag.c Tue Mar 18 12:35:25 2014 -0700
@@ -95,12 +95,12 @@
return 0;
}
- if (count == 0) {
+ if (count <= 0) {
JNU_ThrowIllegalArgumentException(env, 0);
return 0;
}
- gsize = count * sizeof(jmmVMGlobal);
+ gsize = (size_t)count * sizeof(jmmVMGlobal);
globals = (jmmVMGlobal*) malloc(gsize);
if (globals == NULL) {
JNU_ThrowOutOfMemoryError(env, 0);
--- ./jdk/src/share/native/sun/management/GcInfoBuilder.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/share/native/sun/management/GcInfoBuilder.c Tue Mar 18 12:35:25 2014 -0700
@@ -59,12 +59,12 @@
return;
}
- if (num_attributes == 0) {
+ if (num_attributes <= 0) {
JNU_ThrowIllegalArgumentException(env, "Invalid num_attributes");
return;
}
- ext_att_info = (jmmExtAttributeInfo*) malloc(num_attributes *
+ ext_att_info = (jmmExtAttributeInfo*) malloc((size_t)num_attributes *
sizeof(jmmExtAttributeInfo));
if (ext_att_info == NULL) {
JNU_ThrowOutOfMemoryError(env, 0);
@@ -78,7 +78,7 @@
return;
}
- nativeTypes = (jchar*) malloc(num_attributes * sizeof(jchar));
+ nativeTypes = (jchar*) malloc((size_t)num_attributes * sizeof(jchar));
if (nativeTypes == NULL) {
free(ext_att_info);
JNU_ThrowOutOfMemoryError(env, 0);
@@ -188,11 +188,16 @@
return 0;
}
+ if (ext_att_count <= 0) {
+ JNU_ThrowIllegalArgumentException(env, "Invalid ext_att_count");
+ return;
+ }
+
gc_stat.usage_before_gc = usageBeforeGC;
gc_stat.usage_after_gc = usageAfterGC;
gc_stat.gc_ext_attribute_values_size = ext_att_count;
if (ext_att_count > 0) {
- gc_stat.gc_ext_attribute_values = (jvalue*) malloc(ext_att_count *
+ gc_stat.gc_ext_attribute_values = (jvalue*) malloc((size_t)ext_att_count *
sizeof(jvalue));
if (gc_stat.gc_ext_attribute_values == NULL) {
JNU_ThrowOutOfMemoryError(env, 0);
@@ -212,7 +217,7 @@
}
// convert the ext_att_types to native types
- nativeTypes = (jchar*) malloc(ext_att_count * sizeof(jchar));
+ nativeTypes = (jchar*) malloc((size_t)ext_att_count * sizeof(jchar));
if (nativeTypes == NULL) {
if (gc_stat.gc_ext_attribute_values != NULL) {
free(gc_stat.gc_ext_attribute_values);
--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Mar 18 12:35:25 2014 -0700
@@ -63,11 +63,59 @@
private /* final */ InputStream stdout;
private /* final */ InputStream stderr;
+ private static enum LaunchMechanism {
+ FORK(1),
+ POSIX_SPAWN(2);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* On BSD, the default is to spawn */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+
+ helperpath = toCString(javahome + "/lib/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "posix_spawn");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - posix_spawn(2)
*
* @param fds an array of three file descriptors.
* Indexes 0, 1, and 2 correspond to standard input,
@@ -80,7 +128,8 @@
* output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -132,7 +181,9 @@
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
@@ -236,11 +287,10 @@
try { stderr.close(); } catch (IOException ignored) {}
}
- /* This routine initializes JNI field offsets for the class */
- private static native void initIDs();
+ private static native void init();
static {
- initIDs();
+ init();
}
/**
--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Mar 18 12:35:25 2014 -0700
@@ -63,11 +63,61 @@
private /* final */ InputStream stdout;
private /* final */ InputStream stderr;
+ private static enum LaunchMechanism {
+ FORK(1),
+ VFORK(3);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* default is VFORK on Linux */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+ String osArch = System.getProperty("os.arch");
+
+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "vfork");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - clone(2) and exec(2)
+ * - vfork(2) and exec(2)
*
* @param fds an array of three file descriptors.
* Indexes 0, 1, and 2 correspond to standard input,
@@ -80,7 +130,8 @@
* output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -132,7 +183,9 @@
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
@@ -236,11 +289,10 @@
try { stderr.close(); } catch (IOException ignored) {}
}
- /* This routine initializes JNI field offsets for the class */
- private static native void initIDs();
+ private static native void init();
static {
- initIDs();
+ init();
}
/**
--- ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Mar 18 12:35:25 2014 -0700
@@ -26,6 +26,8 @@
package java.lang;
import java.io.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
/* java.lang.Process subclass in the UNIX environment.
*
@@ -45,11 +47,65 @@
private DeferredCloseInputStream stdout_inner_stream;
private InputStream stderr_stream;
+ private static enum LaunchMechanism {
+ FORK(1),
+ POSIX_SPAWN(2);
+
+ private int value;
+ LaunchMechanism(int x) {value = x;}
+ };
+
+ /* On Solaris, the default is to spawn */
+ private static final LaunchMechanism launchMechanism;
+ private static byte[] helperpath;
+
+ private static byte[] toCString(String s) {
+ if (s == null)
+ return null;
+ byte[] bytes = s.getBytes();
+ byte[] result = new byte[bytes.length + 1];
+ System.arraycopy(bytes, 0,
+ result, 0,
+ bytes.length);
+ result[result.length-1] = (byte)0;
+ return result;
+ }
+
+ static {
+ launchMechanism = AccessController.doPrivileged(
+ new PrivilegedAction<LaunchMechanism>()
+ {
+ public LaunchMechanism run() {
+ String javahome = System.getProperty("java.home");
+ String osArch = System.getProperty("os.arch");
+ if (osArch.equals("x86")) {
+ osArch = "i386";
+ } else if (osArch.equals("x86_64")) {
+ osArch = "amd64";
+ }
+
+ helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper");
+ String s = System.getProperty(
+ "jdk.lang.Process.launchMechanism", "fork");
+
+ try {
+ return LaunchMechanism.valueOf(s.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ throw new Error(s + " is not a supported " +
+ "process launch mechanism on this platform.");
+ }
+ }
+ });
+ }
+
/* this is for the reaping thread */
private native int waitForProcessExit(int pid);
/**
- * Create a process using fork(2) and exec(2).
+ * Create a process. Depending on the mode flag, this is done by
+ * one of the following mechanisms.
+ * - fork(2) and exec(2)
+ * - posix_spawn(2)
*
* @param std_fds array of file descriptors. Indexes 0, 1, and
* 2 correspond to standard input, standard output and
@@ -61,7 +117,8 @@
* if and only if it is <em>not</em> -1 on output.
* @return the pid of the subprocess
*/
- private native int forkAndExec(byte[] prog,
+ private native int forkAndExec(int mode, byte[] helperpath,
+ byte[] prog,
byte[] argBlock, int argc,
byte[] envBlock, int envc,
byte[] dir,
@@ -76,7 +133,9 @@
final int[] std_fds,
final boolean redirectErrorStream)
throws IOException {
- pid = forkAndExec(prog,
+ pid = forkAndExec(launchMechanism.value,
+ helperpath,
+ prog,
argBlock, argc,
envBlock, envc,
dir,
@@ -294,10 +353,9 @@
}
- /* This routine initializes JNI field offsets for the class */
- private static native void initIDs();
+ private static native void init();
static {
- initIDs();
+ init();
}
}
--- ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/sun/awt/X11/XClipboard.java Tue Mar 18 12:35:25 2014 -0700
@@ -84,7 +84,7 @@
protected synchronized void setContentsNative(Transferable contents) {
SortedMap formatMap = DataTransferer.getInstance().getFormatsForTransferable
- (contents, DataTransferer.adaptFlavorMap(flavorMap));
+ (contents, DataTransferer.adaptFlavorMap(getDefaultFlavorTable()));
long[] formats = DataTransferer.keysToLongArray(formatMap);
if (!selection.setOwner(contents, formatMap, formats,
@@ -123,7 +123,7 @@
private void checkChangeHere(Transferable contents) {
if (areFlavorListenersRegistered()) {
checkChange(DataTransferer.getInstance().
- getFormatsForTransferableAsArray(contents, flavorMap));
+ getFormatsForTransferableAsArray(contents, getDefaultFlavorTable()));
}
}
--- ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -49,6 +49,7 @@
import sun.awt.*;
import sun.font.FontConfigManager;
import sun.misc.PerformanceLogger;
+import sun.misc.ThreadGroupUtils;
import sun.print.PrintJob2D;
import sun.security.action.GetPropertyAction;
import sun.security.action.GetBooleanAction;
@@ -311,13 +312,7 @@
}
PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
public Void run() {
- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = mainTG.getParent();
- while (parentTG != null) {
- mainTG = parentTG;
- parentTG = mainTG.getParent();
- }
- Thread shutdownThread = new Thread(mainTG, "XToolkt-Shutdown-Thread") {
+ Thread shutdownThread = new Thread(ThreadGroupUtils.getRootThreadGroup(), "XToolkt-Shutdown-Thread") {
public void run() {
XSystemTrayPeer peer = XSystemTrayPeer.getPeerInstance();
if (peer != null) {
@@ -379,22 +374,16 @@
init();
XWM.init();
SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME);
-
- PrivilegedAction<Thread> action = new PrivilegedAction() {
+ toolkitThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
+ @Override
public Thread run() {
- ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = currentTG.getParent();
- while (parentTG != null) {
- currentTG = parentTG;
- parentTG = currentTG.getParent();
- }
- Thread thread = new Thread(currentTG, XToolkit.this, "AWT-XAWT");
+ Thread thread = new Thread(ThreadGroupUtils.getRootThreadGroup(), XToolkit.this, "AWT-XAWT");
+ thread.setContextClassLoader(null);
thread.setPriority(Thread.NORM_PRIORITY + 1);
thread.setDaemon(true);
return thread;
}
- };
- toolkitThread = AccessController.doPrivileged(action);
+ });
toolkitThread.start();
}
}
--- ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/classes/sun/awt/X11GraphicsDevice.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
import sun.java2d.opengl.GLXGraphicsConfig;
import sun.java2d.xr.XRGraphicsConfig;
import sun.java2d.loops.SurfaceType;
+import sun.misc.ThreadGroupUtils;
/**
* This is an implementation of a GraphicsDevice object for a single
@@ -424,23 +425,20 @@
// hook will have no effect)
shutdownHookRegistered = true;
PrivilegedAction<Void> a = new PrivilegedAction<Void>() {
+ @Override
public Void run() {
- ThreadGroup mainTG = Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = mainTG.getParent();
- while (parentTG != null) {
- mainTG = parentTG;
- parentTG = mainTG.getParent();
- }
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
Runnable r = new Runnable() {
- public void run() {
- Window old = getFullScreenWindow();
- if (old != null) {
- exitFullScreenExclusive(old);
- setDisplayMode(origDisplayMode);
- }
+ @Override
+ public void run() {
+ Window old = getFullScreenWindow();
+ if (old != null) {
+ exitFullScreenExclusive(old);
+ setDisplayMode(origDisplayMode);
}
- };
- Thread t = new Thread(mainTG, r,"Display-Change-Shutdown-Thread-"+screen);
+ }
+ };
+ Thread t = new Thread(rootTG, r, "Display-Change-Shutdown-Thread-" + screen);
t.setContextClassLoader(null);
Runtime.getRuntime().addShutdownHook(t);
return null;
--- ./jdk/src/solaris/demo/jni/Poller/Poller.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/demo/jni/Poller/Poller.c Tue Mar 18 12:35:25 2014 -0700
@@ -318,7 +318,7 @@
ioevent_t *ioeh;
- if (handle < 0 || handle > MAX_HANDLES)
+ if (handle < 0 || handle >= MAX_HANDLES)
{
STATE_EXCEPTION("DestroyPoller - handle out of range");
return;
@@ -366,7 +366,7 @@
int retval;
ioevent_t *ioeh;
- if (handle < 0 || handle > MAX_HANDLES)
+ if (handle < 0 || handle >= MAX_HANDLES)
return STATE_EXCEPTION("AddFd - handle out of range");
ioeh = &IOE_handles[handle];
@@ -459,7 +459,7 @@
return fd;
}
- /*
+/*
* Class: Poller
* Method: nativeRemoveFd
* Signature: (II)I
@@ -469,7 +469,7 @@
{
ioevent_t *ioeh;
- if (handle < 0 || handle > MAX_HANDLES)
+ if (handle < 0 || handle >= MAX_HANDLES)
return STATE_EXCEPTION("RemoveFd - handle out of range");
ioeh = &IOE_handles[handle];
@@ -576,7 +576,7 @@
int i;
ioevent_t *ioeh;
- if (handle < 0 || handle > MAX_HANDLES)
+ if (handle < 0 || handle >= MAX_HANDLES)
return STATE_EXCEPTION("IsMember - handle out of range");
ioeh = &IOE_handles[handle];
@@ -629,7 +629,7 @@
ioevent_t *ioeh;
jboolean isCopy1,isCopy2;
- if (handle < 0 || handle > MAX_HANDLES)
+ if (handle < 0 || handle >= MAX_HANDLES)
return STATE_EXCEPTION("nativeWait - handle out of range");
ioeh = &IOE_handles[handle];
--- ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/native/com/sun/media/sound/PLATFORM_API_SolarisOS_Utils.c Tue Mar 18 12:35:25 2014 -0700
@@ -76,7 +76,7 @@
adPath[*count].st_ino = statBuf.st_ino;
adPath[*count].st_dev = statBuf.st_dev;
strncpy(adPath[*count].path, path, MAX_NAME_LENGTH);
- adPath[*count].path[MAX_NAME_LENGTH] = 0;
+ adPath[*count].path[MAX_NAME_LENGTH - 1] = 0;
(*count)++;
TRACE1("Added audio device %s\n", path);
}
--- ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c Tue Mar 18 12:35:25 2014 -0700
@@ -31,21 +31,24 @@
#ifdef __APPLE__
#include <crt_externs.h>
#define environ (*_NSGetEnviron())
+#else
+/* This is one of the rare times it's more portable to declare an
+ * external symbol explicitly, rather than via a system header.
+ * The declaration is standardized as part of UNIX98, but there is
+ * no standard (not even de-facto) header file where the
+ * declaration is to be found. See:
+ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
+ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
+ *
+ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
+ * environ, are defined in at least one of the headers" (!)
+ */
+extern char **environ;
#endif
JNIEXPORT jobjectArray JNICALL
Java_java_lang_ProcessEnvironment_environ(JNIEnv *env, jclass ign)
{
- /* This is one of the rare times it's more portable to declare an
- * external symbol explicitly, rather than via a system header.
- * The declaration is standardized as part of UNIX98, but there is
- * no standard (not even de-facto) header file where the
- * declaration is to be found. See:
- * http://www.opengroup.org/onlinepubs/007908799/xbd/envvar.html */
-#ifndef __APPLE__
- extern char ** environ; /* environ[i] looks like: VAR=VALUE\0 */
-#endif
-
jsize count = 0;
jsize i, j;
jobjectArray result;
--- ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/native/java/lang/UNIXProcess_md.c Tue Mar 18 12:35:25 2014 -0700
@@ -47,19 +47,15 @@
#endif
#include <signal.h>
#include <string.h>
-#include <errno.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <limits.h>
-#ifdef __APPLE__
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+#include <spawn.h>
#endif
+#include "childproc.h"
+
/*
- * There are 3 possible strategies we might use to "fork":
+ * There are 4 possible strategies we might use to "fork":
*
* - fork(2). Very portable and reliable but subject to
* failure due to overcommit (see the documentation on
@@ -94,81 +90,21 @@
* http://sources.redhat.com/bugzilla/show_bug.cgi?id=10311
* but the glibc maintainers closed it as WONTFIX.
*
+ * - posix_spawn(). While posix_spawn() is a fairly elaborate and
+ * complicated system call, it can't quite do everything that the old
+ * fork()/exec() combination can do, so the only feasible way to do
+ * this, is to use posix_spawn to launch a new helper executable
+ * "jprochelper", which in turn execs the target (after cleaning
+ * up file-descriptors etc.) The end result is the same as before,
+ * a child process linked to the parent in the same way, but it
+ * avoids the problem of duplicating the parent (VM) process
+ * address space temporarily, before launching the target command.
+ *
* Based on the above analysis, we are currently using vfork() on
- * Linux and fork() on other Unix systems, but the code to use clone()
- * remains.
+ * Linux, posix_spawn() on Mac and fork() on Solaris, but the code to
+ * use clone() and fork() remains.
*/
-#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
-
-#ifndef START_CHILD_USE_CLONE
- #ifdef __linux__
- #define START_CHILD_USE_CLONE 1
- #else
- #define START_CHILD_USE_CLONE 0
- #endif
-#endif
-
-/* By default, use vfork() on Linux. */
-#ifndef START_CHILD_USE_VFORK
- #ifdef __linux__
- #define START_CHILD_USE_VFORK 1
- #else
- #define START_CHILD_USE_VFORK 0
- #endif
-#endif
-
-#if START_CHILD_USE_CLONE
-#include <sched.h>
-#define START_CHILD_SYSTEM_CALL "clone"
-#elif START_CHILD_USE_VFORK
-#define START_CHILD_SYSTEM_CALL "vfork"
-#else
-#define START_CHILD_SYSTEM_CALL "fork"
-#endif
-
-#ifndef STDIN_FILENO
-#define STDIN_FILENO 0
-#endif
-
-#ifndef STDOUT_FILENO
-#define STDOUT_FILENO 1
-#endif
-
-#ifndef STDERR_FILENO
-#define STDERR_FILENO 2
-#endif
-
-#ifndef SA_NOCLDSTOP
-#define SA_NOCLDSTOP 0
-#endif
-
-#ifndef SA_RESTART
-#define SA_RESTART 0
-#endif
-
-#define FAIL_FILENO (STDERR_FILENO + 1)
-
-/* TODO: Refactor. */
-#define RESTARTABLE(_cmd, _result) do { \
- do { \
- _result = _cmd; \
- } while((_result == -1) && (errno == EINTR)); \
-} while(0)
-
-/* This is one of the rare times it's more portable to declare an
- * external symbol explicitly, rather than via a system header.
- * The declaration is standardized as part of UNIX98, but there is
- * no standard (not even de-facto) header file where the
- * declaration is to be found. See:
- * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
- * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
- *
- * "All identifiers in this volume of IEEE Std 1003.1-2001, except
- * environ, are defined in at least one of the headers" (!)
- */
-extern char **environ;
-
static void
setSIGCHLDHandler(JNIEnv *env)
@@ -245,53 +181,35 @@
}
static const char * const *
-splitPath(JNIEnv *env, const char *path)
+effectivePathv(JNIEnv *env)
{
- const char *p, *q;
- char **pathv;
+ char *p;
int i;
+ const char *path = effectivePath();
int count = countOccurrences(path, ':') + 1;
+ size_t pathvsize = sizeof(const char *) * (count+1);
+ size_t pathsize = strlen(path) + 1;
+ const char **pathv = (const char **) xmalloc(env, pathvsize + pathsize);
- pathv = NEW(char*, count+1);
+ if (pathv == NULL)
+ return NULL;
+ p = (char *) pathv + pathvsize;
+ memcpy(p, path, pathsize);
+ /* split PATH by replacing ':' with NULs; empty components => "." */
+ for (i = 0; i < count; i++) {
+ char *q = p + strcspn(p, ":");
+ pathv[i] = (p == q) ? "." : p;
+ *q = '\0';
+ p = q + 1;
+ }
pathv[count] = NULL;
- for (p = path, i = 0; i < count; i++, p = q + 1) {
- for (q = p; (*q != ':') && (*q != '\0'); q++)
- ;
- if (q == p) /* empty PATH component => "." */
- pathv[i] = "./";
- else {
- int addSlash = ((*(q - 1)) != '/');
- pathv[i] = NEW(char, q - p + addSlash + 1);
- memcpy(pathv[i], p, q - p);
- if (addSlash)
- pathv[i][q - p] = '/';
- pathv[i][q - p + addSlash] = '\0';
- }
- }
- return (const char * const *) pathv;
+ return pathv;
}
-/**
- * Cached value of JVM's effective PATH.
- * (We don't support putenv("PATH=...") in native code)
- */
-static const char *parentPath;
-
-/**
- * Split, canonicalized version of parentPath
- */
-static const char * const *parentPathv;
-
-static jfieldID field_exitcode;
-
JNIEXPORT void JNICALL
-Java_java_lang_UNIXProcess_initIDs(JNIEnv *env, jclass clazz)
+Java_java_lang_UNIXProcess_init(JNIEnv *env, jclass clazz)
{
- field_exitcode = (*env)->GetFieldID(env, clazz, "exitcode", "I");
-
- parentPath = effectivePath();
- parentPathv = splitPath(env, parentPath);
-
+ parentPathv = effectivePathv(env);
setSIGCHLDHandler(env);
}
@@ -358,96 +276,6 @@
}
}
-static ssize_t
-restartableWrite(int fd, const void *buf, size_t count)
-{
- ssize_t result;
- RESTARTABLE(write(fd, buf, count), result);
- return result;
-}
-
-static int
-restartableDup2(int fd_from, int fd_to)
-{
- int err;
- RESTARTABLE(dup2(fd_from, fd_to), err);
- return err;
-}
-
-static int
-restartableClose(int fd)
-{
- int err;
- RESTARTABLE(close(fd), err);
- return err;
-}
-
-static int
-closeSafely(int fd)
-{
- return (fd == -1) ? 0 : restartableClose(fd);
-}
-
-static int
-isAsciiDigit(char c)
-{
- return c >= '0' && c <= '9';
-}
-
-#ifdef _ALLBSD_SOURCE
-#define FD_DIR "/dev/fd"
-#define dirent64 dirent
-#define readdir64 readdir
-#else
-#define FD_DIR "/proc/self/fd"
-#endif
-
-static int
-closeDescriptors(void)
-{
- DIR *dp;
- struct dirent64 *dirp;
- int from_fd = FAIL_FILENO + 1;
-
- /* We're trying to close all file descriptors, but opendir() might
- * itself be implemented using a file descriptor, and we certainly
- * don't want to close that while it's in use. We assume that if
- * opendir() is implemented using a file descriptor, then it uses
- * the lowest numbered file descriptor, just like open(). So we
- * close a couple explicitly. */
-
- restartableClose(from_fd); /* for possible use by opendir() */
- restartableClose(from_fd + 1); /* another one for good luck */
-
- if ((dp = opendir(FD_DIR)) == NULL)
- return 0;
-
- /* We use readdir64 instead of readdir to work around Solaris bug
- * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
- */
- while ((dirp = readdir64(dp)) != NULL) {
- int fd;
- if (isAsciiDigit(dirp->d_name[0]) &&
- (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
- restartableClose(fd);
- }
-
- closedir(dp);
-
- return 1;
-}
-
-static int
-moveDescriptor(int fd_from, int fd_to)
-{
- if (fd_from != fd_to) {
- if ((restartableDup2(fd_from, fd_to) == -1) ||
- (restartableClose(fd_from) == -1))
- return -1;
- }
- return 0;
-}
-
static const char *
getBytes(JNIEnv *env, jbyteArray arr)
{
@@ -463,19 +291,6 @@
}
static void
-initVectorFromBlock(const char**vector, const char* block, int count)
-{
- int i;
- const char *p;
- for (i = 0, p = block; i < count; i++) {
- /* Invariant: p always points to the start of a C string. */
- vector[i] = p;
- while (*(p++));
- }
- vector[count] = NULL;
-}
-
-static void
throwIOException(JNIEnv *env, int errnum, const char *defaultDetail)
{
static const char * const format = "error=%d, %s";
@@ -490,6 +305,9 @@
}
/* ASCII Decimal representation uses 2.4 times as many bits as binary. */
errmsg = NEW(char, strlen(format) + strlen(detail) + 3 * sizeof(errnum));
+ if (errmsg == NULL)
+ return;
+
sprintf(errmsg, format, errnum, detail);
s = JNU_NewStringPlatform(env, errmsg);
if (s != NULL) {
@@ -515,180 +333,6 @@
}
#endif /* DEBUG_PROCESS */
-/**
- * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
- * If we could do it over again, we would probably not support such an ancient
- * misfeature, but compatibility wins over sanity. The original support for
- * this was imported accidentally from execvp().
- */
-static void
-execve_as_traditional_shell_script(const char *file,
- const char *argv[],
- const char *const envp[])
-{
- /* Use the extra word of space provided for us in argv by caller. */
- const char *argv0 = argv[0];
- const char *const *end = argv;
- while (*end != NULL)
- ++end;
- memmove(argv+2, argv+1, (end-argv) * sizeof (*end));
- argv[0] = "/bin/sh";
- argv[1] = file;
- execve(argv[0], (char **) argv, (char **) envp);
- /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
- memmove(argv+1, argv+2, (end-argv) * sizeof (*end));
- argv[0] = argv0;
-}
-
-/**
- * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
- * be a shell script and the system default shell is invoked to run it.
- */
-static void
-execve_with_shell_fallback(const char *file,
- const char *argv[],
- const char *const envp[])
-{
-#if START_CHILD_USE_CLONE || START_CHILD_USE_VFORK
- /* shared address space; be very careful. */
- execve(file, (char **) argv, (char **) envp);
- if (errno == ENOEXEC)
- execve_as_traditional_shell_script(file, argv, envp);
-#else
- /* unshared address space; we can mutate environ. */
- environ = (char **) envp;
- execvp(file, (char **) argv);
-#endif
-}
-
-/**
- * 'execvpe' should have been included in the Unix standards,
- * and is a GNU extension in glibc 2.10.
- *
- * JDK_execvpe is identical to execvp, except that the child environment is
- * specified via the 3rd argument instead of being inherited from environ.
- */
-static void
-JDK_execvpe(const char *file,
- const char *argv[],
- const char *const envp[])
-{
- if (envp == NULL || (char **) envp == environ) {
- execvp(file, (char **) argv);
- return;
- }
-
- if (*file == '\0') {
- errno = ENOENT;
- return;
- }
-
- if (strchr(file, '/') != NULL) {
- execve_with_shell_fallback(file, argv, envp);
- } else {
- /* We must search PATH (parent's, not child's) */
- char expanded_file[PATH_MAX];
- int filelen = strlen(file);
- int sticky_errno = 0;
- const char * const * dirs;
- for (dirs = parentPathv; *dirs; dirs++) {
- const char * dir = *dirs;
- int dirlen = strlen(dir);
- if (filelen + dirlen + 1 >= PATH_MAX) {
- errno = ENAMETOOLONG;
- continue;
- }
- memcpy(expanded_file, dir, dirlen);
- memcpy(expanded_file + dirlen, file, filelen);
- expanded_file[dirlen + filelen] = '\0';
- execve_with_shell_fallback(expanded_file, argv, envp);
- /* There are 3 responses to various classes of errno:
- * return immediately, continue (especially for ENOENT),
- * or continue with "sticky" errno.
- *
- * From exec(3):
- *
- * If permission is denied for a file (the attempted
- * execve returned EACCES), these functions will continue
- * searching the rest of the search path. If no other
- * file is found, however, they will return with the
- * global variable errno set to EACCES.
- */
- switch (errno) {
- case EACCES:
- sticky_errno = errno;
- /* FALLTHRU */
- case ENOENT:
- case ENOTDIR:
-#ifdef ELOOP
- case ELOOP:
-#endif
-#ifdef ESTALE
- case ESTALE:
-#endif
-#ifdef ENODEV
- case ENODEV:
-#endif
-#ifdef ETIMEDOUT
- case ETIMEDOUT:
-#endif
- break; /* Try other directories in PATH */
- default:
- return;
- }
- }
- if (sticky_errno != 0)
- errno = sticky_errno;
- }
-}
-
-/*
- * Reads nbyte bytes from file descriptor fd into buf,
- * The read operation is retried in case of EINTR or partial reads.
- *
- * Returns number of bytes read (normally nbyte, but may be less in
- * case of EOF). In case of read errors, returns -1 and sets errno.
- */
-static ssize_t
-readFully(int fd, void *buf, size_t nbyte)
-{
- ssize_t remaining = nbyte;
- for (;;) {
- ssize_t n = read(fd, buf, remaining);
- if (n == 0) {
- return nbyte - remaining;
- } else if (n > 0) {
- remaining -= n;
- if (remaining <= 0)
- return nbyte;
- /* We were interrupted in the middle of reading the bytes.
- * Unlikely, but possible. */
- buf = (void *) (((char *)buf) + n);
- } else if (errno == EINTR) {
- /* Strange signals like SIGJVM1 are possible at any time.
- * See http://www.dreamsongs.com/WorseIsBetter.html */
- } else {
- return -1;
- }
- }
-}
-
-typedef struct _ChildStuff
-{
- int in[2];
- int out[2];
- int err[2];
- int fail[2];
- int fds[3];
- const char **argv;
- const char **envv;
- const char *pdir;
- jboolean redirectErrorStream;
-#if START_CHILD_USE_CLONE
- void *clone_stack;
-#endif
-} ChildStuff;
-
static void
copyPipe(int from[2], int to[2])
{
@@ -696,97 +340,67 @@
to[1] = from[1];
}
-/**
- * Child process after a successful fork() or clone().
- * This function must not return, and must be prepared for either all
- * of its address space to be shared with its parent, or to be a copy.
- * It must not modify global variables such as "environ".
+/* arg is an array of pointers to 0 terminated strings. array is terminated
+ * by a null element.
+ *
+ * *nelems and *nbytes receive the number of elements of array (incl 0)
+ * and total number of bytes (incl. 0)
+ * Note. An empty array will have one null element
+ * But if arg is null, then *nelems set to 0, and *nbytes to 0
*/
-static int
-childProcess(void *arg)
+static void arraysize(const char * const *arg, int *nelems, int *nbytes)
{
- const ChildStuff* p = (const ChildStuff*) arg;
+ int i, bytes, count;
+ const char * const *a = arg;
+ char *p;
+ int *q;
+ if (arg == 0) {
+ *nelems = 0;
+ *nbytes = 0;
+ return;
+ }
+ /* count the array elements and number of bytes */
+ for (count=0, bytes=0; *a != 0; count++, a++) {
+ bytes += strlen(*a)+1;
+ }
+ *nbytes = bytes;
+ *nelems = count+1;
+}
- /* Close the parent sides of the pipes.
- Closing pipe fds here is redundant, since closeDescriptors()
- would do it anyways, but a little paranoia is a good thing. */
- if ((closeSafely(p->in[1]) == -1) ||
- (closeSafely(p->out[0]) == -1) ||
- (closeSafely(p->err[0]) == -1) ||
- (closeSafely(p->fail[0]) == -1))
- goto WhyCantJohnnyExec;
+/* copy the strings from arg[] into buf, starting at given offset
+ * return new offset to next free byte
+ */
+static int copystrings(char *buf, int offset, const char * const *arg) {
+ char *p;
+ const char * const *a;
+ int count=0;
- /* Give the child sides of the pipes the right fileno's. */
- /* Note: it is possible for in[0] == 0 */
- if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
- STDIN_FILENO) == -1) ||
- (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
- STDOUT_FILENO) == -1))
- goto WhyCantJohnnyExec;
-
- if (p->redirectErrorStream) {
- if ((closeSafely(p->err[1]) == -1) ||
- (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
- goto WhyCantJohnnyExec;
- } else {
- if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
- STDERR_FILENO) == -1)
- goto WhyCantJohnnyExec;
+ if (arg == 0) {
+ return offset;
}
-
- if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
- goto WhyCantJohnnyExec;
-
- /* close everything */
- if (closeDescriptors() == 0) { /* failed, close the old way */
- int max_fd = (int)sysconf(_SC_OPEN_MAX);
- int fd;
- for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
- if (restartableClose(fd) == -1 && errno != EBADF)
- goto WhyCantJohnnyExec;
+ for (p=buf+offset, a=arg; *a != 0; a++) {
+ int len = strlen(*a) +1;
+ memcpy(p, *a, len);
+ p += len;
+ count += len;
}
-
- /* change to the new working directory */
- if (p->pdir != NULL && chdir(p->pdir) < 0)
- goto WhyCantJohnnyExec;
-
- if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
- goto WhyCantJohnnyExec;
-
- JDK_execvpe(p->argv[0], p->argv, p->envv);
-
- WhyCantJohnnyExec:
- /* We used to go to an awful lot of trouble to predict whether the
- * child would fail, but there is no reliable way to predict the
- * success of an operation without *trying* it, and there's no way
- * to try a chdir or exec in the parent. Instead, all we need is a
- * way to communicate any failure back to the parent. Easy; we just
- * send the errno back to the parent over a pipe in case of failure.
- * The tricky thing is, how do we communicate the *success* of exec?
- * We use FD_CLOEXEC together with the fact that a read() on a pipe
- * yields EOF when the write ends (we have two of them!) are closed.
- */
- {
- int errnum = errno;
- restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
- }
- restartableClose(FAIL_FILENO);
- _exit(-1);
- return 0; /* Suppress warning "no return value from function" */
+ return offset+count;
}
/**
- * Start a child process running function childProcess.
- * This function only returns in the parent.
* We are unusually paranoid; use of clone/vfork is
* especially likely to tickle gcc/glibc bugs.
*/
#ifdef __attribute_noinline__ /* See: sys/cdefs.h */
__attribute_noinline__
#endif
+
+#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */
+
+#ifdef START_CHILD_USE_CLONE
static pid_t
-startChild(ChildStuff *c) {
-#if START_CHILD_USE_CLONE
+cloneChild(ChildStuff *c) {
+#ifdef __linux__
#define START_CHILD_CLONE_STACK_SIZE (64 * 1024)
/*
* See clone(2).
@@ -800,33 +414,161 @@
c->clone_stack + START_CHILD_CLONE_STACK_SIZE,
CLONE_VFORK | CLONE_VM | SIGCHLD, c);
#else
- #if START_CHILD_USE_VFORK
+/* not available on Solaris / Mac */
+ assert(0);
+ return -1;
+#endif
+}
+#endif
+
+static pid_t
+vforkChild(ChildStuff *c) {
+ volatile pid_t resultPid;
+
/*
* We separate the call to vfork into a separate function to make
* very sure to keep stack of child from corrupting stack of parent,
* as suggested by the scary gcc warning:
* warning: variable 'foo' might be clobbered by 'longjmp' or 'vfork'
*/
- volatile pid_t resultPid = vfork();
- #else
+ resultPid = vfork();
+
+ if (resultPid == 0) {
+ childProcess(c);
+ }
+ assert(resultPid != 0); /* childProcess never returns */
+ return resultPid;
+}
+
+static pid_t
+forkChild(ChildStuff *c) {
+ pid_t resultPid;
+
/*
* From Solaris fork(2): In Solaris 10, a call to fork() is
* identical to a call to fork1(); only the calling thread is
* replicated in the child process. This is the POSIX-specified
* behavior for fork().
*/
- pid_t resultPid = fork();
- #endif
- if (resultPid == 0)
+ resultPid = fork();
+
+ if (resultPid == 0) {
childProcess(c);
+ }
assert(resultPid != 0); /* childProcess never returns */
return resultPid;
-#endif /* ! START_CHILD_USE_CLONE */
+}
+
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+static pid_t
+spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
+ pid_t resultPid;
+ jboolean isCopy;
+ int i, offset, rval, bufsize, magic;
+ char *buf, buf1[16];
+ char *hlpargs[2];
+ SpawnInfo sp;
+
+ /* need to tell helper which fd is for receiving the childstuff
+ * and which fd to send response back on
+ */
+ snprintf(buf1, sizeof(buf1), "%d:%d", c->childenv[0], c->fail[1]);
+ /* put the fd string as argument to the helper cmd */
+ hlpargs[0] = buf1;
+ hlpargs[1] = 0;
+
+ /* Following items are sent down the pipe to the helper
+ * after it is spawned.
+ * All strings are null terminated. All arrays of strings
+ * have an empty string for termination.
+ * - the ChildStuff struct
+ * - the SpawnInfo struct
+ * - the argv strings array
+ * - the envv strings array
+ * - the home directory string
+ * - the parentPath string
+ * - the parentPathv array
+ */
+ /* First calculate the sizes */
+ arraysize(c->argv, &sp.nargv, &sp.argvBytes);
+ bufsize = sp.argvBytes;
+ arraysize(c->envv, &sp.nenvv, &sp.envvBytes);
+ bufsize += sp.envvBytes;
+ sp.dirlen = c->pdir == 0 ? 0 : strlen(c->pdir)+1;
+ bufsize += sp.dirlen;
+ arraysize(parentPathv, &sp.nparentPathv, &sp.parentPathvBytes);
+ bufsize += sp.parentPathvBytes;
+ /* We need to clear FD_CLOEXEC if set in the fds[].
+ * Files are created FD_CLOEXEC in Java.
+ * Otherwise, they will be closed when the target gets exec'd */
+ for (i=0; i<3; i++) {
+ if (c->fds[i] != -1) {
+ int flags = fcntl(c->fds[i], F_GETFD);
+ if (flags & FD_CLOEXEC) {
+ fcntl(c->fds[i], F_SETFD, flags & (~1));
+ }
+ }
+ }
+
+ rval = posix_spawn(&resultPid, helperpath, 0, 0, (char * const *) hlpargs, environ);
+
+ if (rval != 0) {
+ return -1;
+ }
+
+ /* now the lengths are known, copy the data */
+ buf = NEW(char, bufsize);
+ if (buf == 0) {
+ return -1;
+ }
+ offset = copystrings(buf, 0, &c->argv[0]);
+ offset = copystrings(buf, offset, &c->envv[0]);
+ memcpy(buf+offset, c->pdir, sp.dirlen);
+ offset += sp.dirlen;
+ offset = copystrings(buf, offset, parentPathv);
+ assert(offset == bufsize);
+
+ magic = magicNumber();
+
+ /* write the two structs and the data buffer */
+ write(c->childenv[1], (char *)&magic, sizeof(magic)); // magic number first
+ write(c->childenv[1], (char *)c, sizeof(*c));
+ write(c->childenv[1], (char *)&sp, sizeof(sp));
+ write(c->childenv[1], buf, bufsize);
+ free(buf);
+
+ /* In this mode an external main() in invoked which calls back into
+ * childProcess() in this file, rather than directly
+ * via the statement below */
+ return resultPid;
+}
+#endif
+
+/*
+ * Start a child process running function childProcess.
+ * This function only returns in the parent.
+ */
+static pid_t
+startChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) {
+ switch (c->mode) {
+ case MODE_VFORK:
+ return vforkChild(c);
+ case MODE_FORK:
+ return forkChild(c);
+#if defined(__solaris__) || defined(_ALLBSD_SOURCE)
+ case MODE_POSIX_SPAWN:
+ return spawnChild(env, process, c, helperpath);
+#endif
+ default:
+ return -1;
+ }
}
JNIEXPORT jint JNICALL
Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env,
jobject process,
+ jint mode,
+ jbyteArray helperpath,
jbyteArray prog,
jbyteArray argBlock, jint argc,
jbyteArray envBlock, jint envc,
@@ -836,32 +578,35 @@
{
int errnum;
int resultPid = -1;
- int in[2], out[2], err[2], fail[2];
+ int in[2], out[2], err[2], fail[2], childenv[2];
jint *fds = NULL;
+ const char *phelperpath = NULL;
const char *pprog = NULL;
const char *pargBlock = NULL;
const char *penvBlock = NULL;
ChildStuff *c;
in[0] = in[1] = out[0] = out[1] = err[0] = err[1] = fail[0] = fail[1] = -1;
+ childenv[0] = childenv[1] = -1;
if ((c = NEW(ChildStuff, 1)) == NULL) return -1;
c->argv = NULL;
c->envv = NULL;
c->pdir = NULL;
-#if START_CHILD_USE_CLONE
c->clone_stack = NULL;
-#endif
/* Convert prog + argBlock into a char ** argv.
* Add one word room for expansion of argv for use by
* execve_as_traditional_shell_script.
+ * This word is also used when using spawn mode
*/
assert(prog != NULL && argBlock != NULL);
+ if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch;
if ((pprog = getBytes(env, prog)) == NULL) goto Catch;
if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch;
if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch;
c->argv[0] = pprog;
+ c->argc = argc + 2;
initVectorFromBlock(c->argv+1, pargBlock, argc);
if (envBlock != NULL) {
@@ -882,6 +627,7 @@
if ((fds[0] == -1 && pipe(in) < 0) ||
(fds[1] == -1 && pipe(out) < 0) ||
(fds[2] == -1 && pipe(err) < 0) ||
+ (pipe(childenv) < 0) ||
(pipe(fail) < 0)) {
throwIOException(env, errno, "Bad file descriptor");
goto Catch;
@@ -894,18 +640,29 @@
copyPipe(out, c->out);
copyPipe(err, c->err);
copyPipe(fail, c->fail);
+ copyPipe(childenv, c->childenv);
c->redirectErrorStream = redirectErrorStream;
+ c->mode = mode;
- resultPid = startChild(c);
+ resultPid = startChild(env, process, c, phelperpath);
assert(resultPid != 0);
if (resultPid < 0) {
- throwIOException(env, errno, START_CHILD_SYSTEM_CALL " failed");
+ switch (c->mode) {
+ case MODE_VFORK:
+ throwIOException(env, errno, "vfork failed");
+ break;
+ case MODE_FORK:
+ throwIOException(env, errno, "fork failed");
+ break;
+ case MODE_POSIX_SPAWN:
+ throwIOException(env, errno, "spawn failed");
+ break;
+ }
goto Catch;
}
-
- restartableClose(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec */
+ close(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec (childproc.c) */
switch (readFully(fail[0], &errnum, sizeof(errnum))) {
case 0: break; /* Exec succeeded */
@@ -923,18 +680,18 @@
fds[2] = (err[0] != -1) ? err[0] : -1;
Finally:
-#if START_CHILD_USE_CLONE
free(c->clone_stack);
-#endif
/* Always clean up the child's side of the pipes */
closeSafely(in [0]);
closeSafely(out[1]);
closeSafely(err[1]);
- /* Always clean up fail descriptors */
+ /* Always clean up fail and childEnv descriptors */
closeSafely(fail[0]);
closeSafely(fail[1]);
+ closeSafely(childenv[0]);
+ closeSafely(childenv[1]);
releaseBytes(env, prog, pprog);
releaseBytes(env, argBlock, pargBlock);
@@ -952,9 +709,9 @@
Catch:
/* Clean up the parent's side of the pipes in case of failure only */
- closeSafely(in [1]);
- closeSafely(out[0]);
- closeSafely(err[0]);
+ closeSafely(in [1]); in[1] = -1;
+ closeSafely(out[0]); out[0] = -1;
+ closeSafely(err[0]); err[0] = -1;
goto Finally;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/src/solaris/native/java/lang/childproc.c Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <limits.h>
+
+#include "childproc.h"
+
+
+ssize_t
+restartableWrite(int fd, const void *buf, size_t count)
+{
+ ssize_t result;
+ RESTARTABLE(write(fd, buf, count), result);
+ return result;
+}
+
+int
+restartableDup2(int fd_from, int fd_to)
+{
+ int err;
+ RESTARTABLE(dup2(fd_from, fd_to), err);
+ return err;
+}
+
+int
+closeSafely(int fd)
+{
+ return (fd == -1) ? 0 : close(fd);
+}
+
+int
+isAsciiDigit(char c)
+{
+ return c >= '0' && c <= '9';
+}
+
+#ifdef _ALLBSD_SOURCE
+#define FD_DIR "/dev/fd"
+#define dirent64 dirent
+#define readdir64 readdir
+#else
+#define FD_DIR "/proc/self/fd"
+#endif
+
+int
+closeDescriptors(void)
+{
+ DIR *dp;
+ struct dirent64 *dirp;
+ int from_fd = FAIL_FILENO + 1;
+
+ /* We're trying to close all file descriptors, but opendir() might
+ * itself be implemented using a file descriptor, and we certainly
+ * don't want to close that while it's in use. We assume that if
+ * opendir() is implemented using a file descriptor, then it uses
+ * the lowest numbered file descriptor, just like open(). So we
+ * close a couple explicitly. */
+
+ close(from_fd); /* for possible use by opendir() */
+ close(from_fd + 1); /* another one for good luck */
+
+ if ((dp = opendir(FD_DIR)) == NULL)
+ return 0;
+
+ /* We use readdir64 instead of readdir to work around Solaris bug
+ * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9
+ */
+ while ((dirp = readdir64(dp)) != NULL) {
+ int fd;
+ if (isAsciiDigit(dirp->d_name[0]) &&
+ (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2)
+ close(fd);
+ }
+
+ closedir(dp);
+
+ return 1;
+}
+
+int
+moveDescriptor(int fd_from, int fd_to)
+{
+ if (fd_from != fd_to) {
+ if ((restartableDup2(fd_from, fd_to) == -1) ||
+ (close(fd_from) == -1))
+ return -1;
+ }
+ return 0;
+}
+
+int
+magicNumber() {
+ return 43110;
+}
+
+/*
+ * Reads nbyte bytes from file descriptor fd into buf,
+ * The read operation is retried in case of EINTR or partial reads.
+ *
+ * Returns number of bytes read (normally nbyte, but may be less in
+ * case of EOF). In case of read errors, returns -1 and sets errno.
+ */
+ssize_t
+readFully(int fd, void *buf, size_t nbyte)
+{
+ ssize_t remaining = nbyte;
+ for (;;) {
+ ssize_t n = read(fd, buf, remaining);
+ if (n == 0) {
+ return nbyte - remaining;
+ } else if (n > 0) {
+ remaining -= n;
+ if (remaining <= 0)
+ return nbyte;
+ /* We were interrupted in the middle of reading the bytes.
+ * Unlikely, but possible. */
+ buf = (void *) (((char *)buf) + n);
+ } else if (errno == EINTR) {
+ /* Strange signals like SIGJVM1 are possible at any time.
+ * See http://www.dreamsongs.com/WorseIsBetter.html */
+ } else {
+ return -1;
+ }
+ }
+}
+
+void
+initVectorFromBlock(const char**vector, const char* block, int count)
+{
+ int i;
+ const char *p;
+ for (i = 0, p = block; i < count; i++) {
+ /* Invariant: p always points to the start of a C string. */
+ vector[i] = p;
+ while (*(p++));
+ }
+ vector[count] = NULL;
+}
+
+/**
+ * Exec FILE as a traditional Bourne shell script (i.e. one without #!).
+ * If we could do it over again, we would probably not support such an ancient
+ * misfeature, but compatibility wins over sanity. The original support for
+ * this was imported accidentally from execvp().
+ */
+void
+execve_as_traditional_shell_script(const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ /* Use the extra word of space provided for us in argv by caller. */
+ const char *argv0 = argv[0];
+ const char *const *end = argv;
+ while (*end != NULL)
+ ++end;
+ memmove(argv+2, argv+1, (end-argv) * sizeof(*end));
+ argv[0] = "/bin/sh";
+ argv[1] = file;
+ execve(argv[0], (char **) argv, (char **) envp);
+ /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */
+ memmove(argv+1, argv+2, (end-argv) * sizeof(*end));
+ argv[0] = argv0;
+}
+
+/**
+ * Like execve(2), except that in case of ENOEXEC, FILE is assumed to
+ * be a shell script and the system default shell is invoked to run it.
+ */
+void
+execve_with_shell_fallback(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ if (mode == MODE_CLONE || mode == MODE_VFORK) {
+ /* shared address space; be very careful. */
+ execve(file, (char **) argv, (char **) envp);
+ if (errno == ENOEXEC)
+ execve_as_traditional_shell_script(file, argv, envp);
+ } else {
+ /* unshared address space; we can mutate environ. */
+ environ = (char **) envp;
+ execvp(file, (char **) argv);
+ }
+}
+
+/**
+ * 'execvpe' should have been included in the Unix standards,
+ * and is a GNU extension in glibc 2.10.
+ *
+ * JDK_execvpe is identical to execvp, except that the child environment is
+ * specified via the 3rd argument instead of being inherited from environ.
+ */
+void
+JDK_execvpe(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[])
+{
+ if (envp == NULL || (char **) envp == environ) {
+ execvp(file, (char **) argv);
+ return;
+ }
+
+ if (*file == '\0') {
+ errno = ENOENT;
+ return;
+ }
+
+ if (strchr(file, '/') != NULL) {
+ execve_with_shell_fallback(mode, file, argv, envp);
+ } else {
+ /* We must search PATH (parent's, not child's) */
+ char expanded_file[PATH_MAX];
+ int filelen = strlen(file);
+ int sticky_errno = 0;
+ const char * const * dirs;
+ for (dirs = parentPathv; *dirs; dirs++) {
+ const char * dir = *dirs;
+ int dirlen = strlen(dir);
+ if (filelen + dirlen + 2 >= PATH_MAX) {
+ errno = ENAMETOOLONG;
+ continue;
+ }
+ memcpy(expanded_file, dir, dirlen);
+ if (expanded_file[dirlen - 1] != '/')
+ expanded_file[dirlen++] = '/';
+ memcpy(expanded_file + dirlen, file, filelen);
+ expanded_file[dirlen + filelen] = '\0';
+ execve_with_shell_fallback(mode, expanded_file, argv, envp);
+ /* There are 3 responses to various classes of errno:
+ * return immediately, continue (especially for ENOENT),
+ * or continue with "sticky" errno.
+ *
+ * From exec(3):
+ *
+ * If permission is denied for a file (the attempted
+ * execve returned EACCES), these functions will continue
+ * searching the rest of the search path. If no other
+ * file is found, however, they will return with the
+ * global variable errno set to EACCES.
+ */
+ switch (errno) {
+ case EACCES:
+ sticky_errno = errno;
+ /* FALLTHRU */
+ case ENOENT:
+ case ENOTDIR:
+#ifdef ELOOP
+ case ELOOP:
+#endif
+#ifdef ESTALE
+ case ESTALE:
+#endif
+#ifdef ENODEV
+ case ENODEV:
+#endif
+#ifdef ETIMEDOUT
+ case ETIMEDOUT:
+#endif
+ break; /* Try other directories in PATH */
+ default:
+ return;
+ }
+ }
+ if (sticky_errno != 0)
+ errno = sticky_errno;
+ }
+}
+
+/**
+ * Child process after a successful fork() or clone().
+ * This function must not return, and must be prepared for either all
+ * of its address space to be shared with its parent, or to be a copy.
+ * It must not modify global variables such as "environ".
+ */
+int
+childProcess(void *arg)
+{
+ const ChildStuff* p = (const ChildStuff*) arg;
+
+ /* Close the parent sides of the pipes.
+ Closing pipe fds here is redundant, since closeDescriptors()
+ would do it anyways, but a little paranoia is a good thing. */
+ if ((closeSafely(p->in[1]) == -1) ||
+ (closeSafely(p->out[0]) == -1) ||
+ (closeSafely(p->err[0]) == -1) ||
+ (closeSafely(p->childenv[0]) == -1) ||
+ (closeSafely(p->childenv[1]) == -1) ||
+ (closeSafely(p->fail[0]) == -1))
+ goto WhyCantJohnnyExec;
+
+ /* Give the child sides of the pipes the right fileno's. */
+ /* Note: it is possible for in[0] == 0 */
+ if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0],
+ STDIN_FILENO) == -1) ||
+ (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1],
+ STDOUT_FILENO) == -1))
+ goto WhyCantJohnnyExec;
+
+ if (p->redirectErrorStream) {
+ if ((closeSafely(p->err[1]) == -1) ||
+ (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1))
+ goto WhyCantJohnnyExec;
+ } else {
+ if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2],
+ STDERR_FILENO) == -1)
+ goto WhyCantJohnnyExec;
+ }
+
+ if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1)
+ goto WhyCantJohnnyExec;
+
+ /* close everything */
+ if (closeDescriptors() == 0) { /* failed, close the old way */
+ int max_fd = (int)sysconf(_SC_OPEN_MAX);
+ int fd;
+ for (fd = FAIL_FILENO + 1; fd < max_fd; fd++)
+ if (close(fd) == -1 && errno != EBADF)
+ goto WhyCantJohnnyExec;
+ }
+
+ /* change to the new working directory */
+ if (p->pdir != NULL && chdir(p->pdir) < 0)
+ goto WhyCantJohnnyExec;
+
+ if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1)
+ goto WhyCantJohnnyExec;
+
+ JDK_execvpe(p->mode, p->argv[0], p->argv, p->envv);
+
+ WhyCantJohnnyExec:
+ /* We used to go to an awful lot of trouble to predict whether the
+ * child would fail, but there is no reliable way to predict the
+ * success of an operation without *trying* it, and there's no way
+ * to try a chdir or exec in the parent. Instead, all we need is a
+ * way to communicate any failure back to the parent. Easy; we just
+ * send the errno back to the parent over a pipe in case of failure.
+ * The tricky thing is, how do we communicate the *success* of exec?
+ * We use FD_CLOEXEC together with the fact that a read() on a pipe
+ * yields EOF when the write ends (we have two of them!) are closed.
+ */
+ {
+ int errnum = errno;
+ restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum));
+ }
+ close(FAIL_FILENO);
+ _exit(-1);
+ return 0; /* Suppress warning "no return value from function" */
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/src/solaris/native/java/lang/childproc.h Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef CHILDPROC_MD_H
+#define CHILDPROC_MD_H
+
+#include <sys/types.h>
+
+#ifdef __APPLE__
+#include <crt_externs.h>
+#define environ (*_NSGetEnviron())
+#else
+/* This is one of the rare times it's more portable to declare an
+ * external symbol explicitly, rather than via a system header.
+ * The declaration is standardized as part of UNIX98, but there is
+ * no standard (not even de-facto) header file where the
+ * declaration is to be found. See:
+ * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html
+ * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html
+ *
+ * "All identifiers in this volume of IEEE Std 1003.1-2001, except
+ * environ, are defined in at least one of the headers" (!)
+ */
+extern char **environ;
+#endif
+
+#ifdef __linux__
+#include <sched.h>
+#endif
+
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+#ifndef SA_NOCLDSTOP
+#define SA_NOCLDSTOP 0
+#endif
+
+#ifndef SA_RESTART
+#define SA_RESTART 0
+#endif
+
+#define FAIL_FILENO (STDERR_FILENO + 1)
+
+/* TODO: Refactor. */
+#define RESTARTABLE(_cmd, _result) do { \
+ do { \
+ _result = _cmd; \
+ } while((_result == -1) && (errno == EINTR)); \
+} while(0)
+
+/* These numbers must be the same as the Enum in UNIXProcess.java
+ * Must be a better way of doing this.
+ */
+#define MODE_FORK 1
+#define MODE_POSIX_SPAWN 2
+#define MODE_VFORK 3
+#define MODE_CLONE 4
+
+typedef struct _ChildStuff
+{
+ int in[2];
+ int out[2];
+ int err[2];
+ int fail[2];
+ int childenv[2];
+ int fds[3];
+ int mode;
+ const char **argv;
+ int argc;
+ const char **envv;
+ const char *pdir;
+ int redirectErrorStream;
+ void *clone_stack;
+} ChildStuff;
+
+/* following used in addition when mode is SPAWN */
+typedef struct _SpawnInfo {
+ int nargv; /* number of argv array elements */
+ int argvBytes; /* total number of bytes in argv array */
+ int nenvv; /* number of envv array elements */
+ int envvBytes; /* total number of bytes in envv array */
+ int dirlen; /* length of home directory string */
+ int nparentPathv; /* number of elements in parentPathv array */
+ int parentPathvBytes; /* total number of bytes in parentPathv array */
+} SpawnInfo;
+
+/**
+ * The cached and split version of the JDK's effective PATH.
+ * (We don't support putenv("PATH=...") in native code)
+ */
+const char * const *parentPathv;
+
+ssize_t restartableWrite(int fd, const void *buf, size_t count);
+int restartableDup2(int fd_from, int fd_to);
+int closeSafely(int fd);
+int isAsciiDigit(char c);
+int closeDescriptors(void);
+int moveDescriptor(int fd_from, int fd_to);
+
+int magicNumber();
+ssize_t readFully(int fd, void *buf, size_t nbyte);
+void initVectorFromBlock(const char**vector, const char* block, int count);
+void execve_as_traditional_shell_script(const char *file,
+ const char *argv[],
+ const char *const envp[]);
+void execve_with_shell_fallback(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[]);
+void JDK_execvpe(int mode, const char *file,
+ const char *argv[],
+ const char *const envp[]);
+int childProcess(void *arg);
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/src/solaris/native/java/lang/jspawnhelper.c Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "childproc.h"
+
+extern int errno;
+
+#define ALLOC(X,Y) { \
+ void *mptr; \
+ mptr = malloc (Y); \
+ if (mptr == 0) { \
+ error (fdout, ERR_MALLOC); \
+ } \
+ X = mptr; \
+}
+
+#define ERR_MALLOC 1
+#define ERR_PIPE 2
+#define ERR_ARGS 3
+
+void error (int fd, int err) {
+ write (fd, &err, sizeof(err));
+ exit (1);
+}
+
+void shutItDown() {
+ fprintf(stdout, "This command is not for general use and should ");
+ fprintf(stdout, "only be run as the result of a call to\n");
+ fprintf(stdout, "ProcessBuilder.start() or Runtime.exec() in a java ");
+ fprintf(stdout, "application\n");
+ _exit(1);
+}
+
+/*
+ * read the following off the pipefd
+ * - the ChildStuff struct
+ * - the SpawnInfo struct
+ * - the data strings for fields in ChildStuff
+ */
+void initChildStuff (int fdin, int fdout, ChildStuff *c) {
+ int n;
+ int argvBytes, nargv, envvBytes, nenvv;
+ int dirlen;
+ char *buf;
+ SpawnInfo sp;
+ int bufsize, offset=0;
+ int magic;
+ int res;
+
+ res = readFully (fdin, &magic, sizeof(magic));
+ if (res != 4 || magic != magicNumber()) {
+ error (fdout, ERR_PIPE);
+ }
+
+ if (readFully (fdin, c, sizeof(*c)) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ if (readFully (fdin, &sp, sizeof(sp)) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ bufsize = sp.argvBytes + sp.envvBytes +
+ sp.dirlen + sp.parentPathvBytes;
+
+ ALLOC(buf, bufsize);
+
+ if (readFully (fdin, buf, bufsize) == -1) {
+ error (fdout, ERR_PIPE);
+ }
+
+ /* Initialize argv[] */
+ ALLOC(c->argv, sizeof(char *) * sp.nargv);
+ initVectorFromBlock (c->argv, buf+offset, sp.nargv-1);
+ offset += sp.argvBytes;
+
+ /* Initialize envv[] */
+ if (sp.nenvv == 0) {
+ c->envv = 0;
+ } else {
+ ALLOC(c->envv, sizeof(char *) * sp.nenvv);
+ initVectorFromBlock (c->envv, buf+offset, sp.nenvv-1);
+ offset += sp.envvBytes;
+ }
+
+ /* Initialize pdir */
+ if (sp.dirlen == 0) {
+ c->pdir = 0;
+ } else {
+ c->pdir = buf+offset;
+ offset += sp.dirlen;
+ }
+
+ /* Initialize parentPathv[] */
+ ALLOC(parentPathv, sizeof (char *) * sp.nparentPathv)
+ initVectorFromBlock ((const char**)parentPathv, buf+offset, sp.nparentPathv-1);
+ offset += sp.parentPathvBytes;
+}
+
+int main(int argc, char *argv[]) {
+ ChildStuff c;
+ int t;
+ struct stat buf;
+ /* argv[0] contains the fd number to read all the child info */
+ int r, fdin, fdout;
+
+ r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout);
+ if (r == 2 && fcntl(fdin, F_GETFD) != -1) {
+ fstat(fdin, &buf);
+ if (!S_ISFIFO(buf.st_mode))
+ shutItDown();
+ } else {
+ shutItDown();
+ }
+ initChildStuff (fdin, fdout, &c);
+
+ childProcess (&c);
+ return 0; /* NOT REACHED */
+}
--- ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/solaris/native/sun/awt/awt_LoadLibrary.c Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -96,7 +96,7 @@
jvm = vm;
/* Get address of this library and the directory containing it. */
- dladdr((void *)JNI_OnLoad, &dlinfo);
+ dladdr((void *)AWT_OnLoad, &dlinfo);
realpath((char *)dlinfo.dli_fname, buf);
len = strlen(buf);
p = strrchr(buf, '/');
--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
import static sun.awt.shell.Win32ShellFolder2.*;
import sun.awt.OSInfo;
+import sun.misc.ThreadGroupUtils;
// NOTE: This class supersedes Win32ShellFolderManager, which was removed
// from distribution after version 1.4.2.
@@ -505,23 +506,19 @@
}
}
};
- comThread =
- AccessController.doPrivileged(
- new PrivilegedAction<Thread>() {
- public Thread run() {
+ comThread = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
+ @Override
+ public Thread run() {
/* The thread must be a member of a thread group
* which will not get GCed before VM exit.
* Make its parent the top-level thread group.
*/
- ThreadGroup tg = Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null;
- tg = tgn, tgn = tg.getParent());
- Thread thread = new Thread(tg, comRun, "Swing-Shell");
- thread.setDaemon(true);
- return thread;
- }
- }
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ Thread thread = new Thread(rootTG, comRun, "Swing-Shell");
+ thread.setDaemon(true);
+ return thread;
+ }
+ }
);
return comThread;
}
--- ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/classes/sun/awt/windows/WClipboard.java Tue Mar 18 12:35:25 2014 -0700
@@ -63,7 +63,6 @@
}
protected void setContentsNative(Transferable contents) {
-
// Don't use delayed Clipboard rendering for the Transferable's data.
// If we did that, we would call Transferable.getTransferData on
// the Toolkit thread, which is a security hole.
@@ -72,7 +71,7 @@
// translated. Then, for each format, translate the data and post
// it to the Clipboard.
Map formatMap = WDataTransferer.getInstance().
- getFormatsForTransferable(contents, flavorMap);
+ getFormatsForTransferable(contents, getDefaultFlavorTable());
openClipboard(this);
--- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,7 @@
import java.security.PrivilegedAction;
import sun.awt.AWTAutoShutdown;
import sun.awt.SunToolkit;
+import sun.misc.ThreadGroupUtils;
import sun.awt.Win32GraphicsDevice;
import sun.awt.Win32GraphicsEnvironment;
import sun.java2d.d3d.D3DRenderQueue;
@@ -215,7 +216,7 @@
private static native void postDispose();
- private static native boolean startToolkitThread(Runnable thread);
+ private static native boolean startToolkitThread(Runnable thread, ThreadGroup rootThreadGroup);
public WToolkit() {
// Startup toolkit threads
@@ -232,8 +233,15 @@
*/
AWTAutoShutdown.notifyToolkitThreadBusy();
- if (!startToolkitThread(this)) {
- Thread toolkitThread = new Thread(this, "AWT-Windows");
+ // Find a root TG and attach Appkit thread to it
+ ThreadGroup rootTG = AccessController.doPrivileged(new PrivilegedAction<ThreadGroup>() {
+ @Override
+ public ThreadGroup run() {
+ return ThreadGroupUtils.getRootThreadGroup();
+ }
+ });
+ if (!startToolkitThread(this, rootTG)) {
+ Thread toolkitThread = new Thread(rootTG, this, "AWT-Windows");
toolkitThread.setDaemon(true);
toolkitThread.start();
}
@@ -263,14 +271,7 @@
private final void registerShutdownHook() {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
- ThreadGroup currentTG =
- Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = currentTG.getParent();
- while (parentTG != null) {
- currentTG = parentTG;
- parentTG = currentTG.getParent();
- }
- Thread shutdown = new Thread(currentTG, new Runnable() {
+ Thread shutdown = new Thread(ThreadGroupUtils.getRootThreadGroup(), new Runnable() {
public void run() {
shutdown();
}
@@ -283,7 +284,14 @@
}
public void run() {
- Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1);
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ Thread.currentThread().setContextClassLoader(null);
+ return null;
+ }
+ });
+ Thread.currentThread().setPriority(Thread.NORM_PRIORITY + 1);
boolean startPump = init();
if (startPump) {
--- ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -36,8 +36,9 @@
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.HashMap;
-import sun.awt.SunToolkit;
+
import sun.awt.AWTAccessor;
+import sun.misc.ThreadGroupUtils;
import sun.awt.Win32GraphicsConfig;
import sun.awt.windows.WComponentPeer;
import sun.java2d.InvalidPipeException;
@@ -92,30 +93,26 @@
public D3DScreenUpdateManager() {
done = false;
AccessController.doPrivileged(
- new PrivilegedAction() {
- public Object run() {
- ThreadGroup currentTG =
- Thread.currentThread().getThreadGroup();
- ThreadGroup parentTG = currentTG.getParent();
- while (parentTG != null) {
- currentTG = parentTG;
- parentTG = currentTG.getParent();
- }
- Thread shutdown = new Thread(currentTG, new Runnable() {
+ new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ Thread shutdown = new Thread(rootTG, new Runnable() {
+ @Override
public void run() {
done = true;
wakeUpUpdateThread();
}
});
- shutdown.setContextClassLoader(null);
- try {
- Runtime.getRuntime().addShutdownHook(shutdown);
- } catch (Exception e) {
- done = true;
+ shutdown.setContextClassLoader(null);
+ try {
+ Runtime.getRuntime().addShutdownHook(shutdown);
+ } catch (Exception e) {
+ done = true;
+ }
+ return null;
}
- return null;
}
- }
);
}
@@ -354,21 +351,20 @@
*/
private synchronized void startUpdateThread() {
if (screenUpdater == null) {
- screenUpdater = (Thread)java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public Object run() {
- ThreadGroup tg =
- Thread.currentThread().getThreadGroup();
- for (ThreadGroup tgn = tg;
- tgn != null; tg = tgn, tgn = tg.getParent());
- Thread t = new Thread(tg, D3DScreenUpdateManager.this,
- "D3D Screen Updater");
- // REMIND: should it be higher?
- t.setPriority(Thread.NORM_PRIORITY + 2);
- t.setDaemon(true);
- return t;
- }
- });
+ screenUpdater = AccessController.doPrivileged(
+ new PrivilegedAction<Thread>() {
+ @Override
+ public Thread run() {
+ ThreadGroup rootTG = ThreadGroupUtils.getRootThreadGroup();
+ Thread t = new Thread(rootTG,
+ D3DScreenUpdateManager.this,
+ "D3D Screen Updater");
+ // REMIND: should it be higher?
+ t.setPriority(Thread.NORM_PRIORITY + 2);
+ t.setDaemon(true);
+ return t;
+ }
+ });
screenUpdater.start();
} else {
wakeUpUpdateThread();
--- ./jdk/src/windows/native/java/lang/java_props_md.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/native/java/lang/java_props_md.c Tue Mar 18 12:35:25 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -448,6 +448,7 @@
case 0: sprops.os_name = "Windows Vista"; break;
case 1: sprops.os_name = "Windows 7"; break;
case 2: sprops.os_name = "Windows 8"; break;
+ case 3: sprops.os_name = "Windows 8.1"; break;
default: sprops.os_name = "Windows NT (unknown)";
}
} else {
@@ -455,6 +456,7 @@
case 0: sprops.os_name = "Windows Server 2008"; break;
case 1: sprops.os_name = "Windows Server 2008 R2"; break;
case 2: sprops.os_name = "Windows Server 2012"; break;
+ case 3: sprops.os_name = "Windows Server 2012 R2"; break;
default: sprops.os_name = "Windows NT (unknown)";
}
}
--- ./jdk/src/windows/native/sun/font/fontpath.c Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/native/sun/font/fontpath.c Tue Mar 18 12:35:25 2014 -0700
@@ -185,6 +185,12 @@
return 0;
}
+/* This HDC is initialised and released in the populate family map
+ * JNI entry point, and used within the call which would otherwise
+ * create many DCs.
+ */
+static HDC screenDC = NULL;
+
static int DifferentFamily(wchar_t *family, wchar_t* fullName) {
LOGFONTW lfw;
CheckFamilyInfo info;
@@ -202,7 +208,7 @@
memset(&lfw, 0, sizeof(lfw));
wcscpy(lfw.lfFaceName, fullName);
lfw.lfCharSet = DEFAULT_CHARSET;
- EnumFontFamiliesExW(GetDC(NULL), &lfw,
+ EnumFontFamiliesExW(screenDC, &lfw,
(FONTENUMPROCW)CheckFontFamilyProcW,
(LPARAM)(&info), 0L);
@@ -299,7 +305,7 @@
memset(&lfa, 0, sizeof(lfa));
strcpy(lfa.lfFaceName, lpelfe->elfLogFont.lfFaceName);
lfa.lfCharSet = lpelfe->elfLogFont.lfCharSet;
- EnumFontFamiliesExA(GetDC(NULL), &lfa,
+ EnumFontFamiliesExA(screenDC, &lfa,
(FONTENUMPROCA)EnumFontFacesInFamilyProcA,
lParam, 0L);
return 1;
@@ -353,7 +359,7 @@
memset(&lfw, 0, sizeof(lfw));
wcscpy(lfw.lfFaceName, lpelfe->elfLogFont.lfFaceName);
lfw.lfCharSet = lpelfe->elfLogFont.lfCharSet;
- EnumFontFamiliesExW(GetDC(NULL), &lfw,
+ EnumFontFamiliesExW(screenDC, &lfw,
(FONTENUMPROCW)EnumFontFacesInFamilyProcW,
lParam, 0L);
return 1;
@@ -613,13 +619,17 @@
return;
}
+ screenDC = GetDC(NULL);
+ if (screenDC == NULL) {
+ return;
+ }
/* Enumerate fonts via GDI to build maps of fonts and families */
if (IS_NT) {
LOGFONTW lfw;
memset(&lfw, 0, sizeof(lfw));
lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */
wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */
- EnumFontFamiliesExW(GetDC(NULL), &lfw,
+ EnumFontFamiliesExW(screenDC, &lfw,
(FONTENUMPROCW)EnumFamilyNamesW,
(LPARAM)(&fmi), 0L);
} else {
@@ -627,7 +637,7 @@
memset(&lfa, 0, sizeof(lfa));
lfa.lfCharSet = DEFAULT_CHARSET; /* all charsets */
strcpy(lfa.lfFaceName, ""); /* one face per family */
- ret = EnumFontFamiliesExA(GetDC(NULL), &lfa,
+ ret = EnumFontFamiliesExA(screenDC, &lfa,
(FONTENUMPROCA)EnumFamilyNamesA,
(LPARAM)(&fmi), 0L);
}
@@ -637,6 +647,8 @@
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
fontKeyName, 0L, KEY_READ, &hkeyFonts);
if (ret != ERROR_SUCCESS) {
+ ReleaseDC(NULL, screenDC);
+ screenDC = NULL;
return;
}
@@ -653,6 +665,8 @@
dwMaxValueNameLen >= MAX_BUFFER ||
dwMaxValueDataLen >= MAX_BUFFER) {
RegCloseKey(hkeyFonts);
+ ReleaseDC(NULL, screenDC);
+ screenDC = NULL;
return;
}
for (nval = 0; nval < dwNumValues; nval++ ) {
@@ -692,4 +706,6 @@
}
}
RegCloseKey(hkeyFonts);
+ ReleaseDC(NULL, screenDC);
+ screenDC = NULL;
}
--- ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Tue Mar 18 12:35:25 2014 -0700
@@ -365,6 +365,7 @@
HANDLE hCompleted;
jobject thread;
+ jobject threadGroup;
};
void ToolkitThreadProc(void *param)
@@ -377,7 +378,7 @@
JavaVMAttachArgs attachArgs;
attachArgs.version = JNI_VERSION_1_2;
attachArgs.name = "AWT-Windows";
- attachArgs.group = NULL;
+ attachArgs.group = data->threadGroup;
jint res = jvm->AttachCurrentThreadAsDaemon((void **)&env, &attachArgs);
if (res < 0) {
@@ -416,17 +417,18 @@
/*
* Class: sun_awt_windows_WToolkit
* Method: startToolkitThread
- * Signature: (Ljava/lang/Runnable;)Z
+ * Signature: (Ljava/lang/Runnable;Ljava/lang/ThreadGroup)Z
*/
JNIEXPORT jboolean JNICALL
-Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread)
+Java_sun_awt_windows_WToolkit_startToolkitThread(JNIEnv *env, jclass cls, jobject thread, jobject threadGroup)
{
AwtToolkit& tk = AwtToolkit::GetInstance();
ToolkitThreadProc_Data data;
data.result = false;
data.thread = env->NewGlobalRef(thread);
- if (data.thread == NULL) {
+ data.threadGroup = env->NewGlobalRef(threadGroup);
+ if (data.thread == NULL || data.threadGroup == NULL) {
return JNI_FALSE;
}
data.hCompleted = ::CreateEvent(NULL, FALSE, FALSE, NULL);
@@ -444,6 +446,7 @@
::CloseHandle(data.hCompleted);
env->DeleteGlobalRef(data.thread);
+ env->DeleteGlobalRef(data.threadGroup);
return result ? JNI_TRUE : JNI_FALSE;
}
--- ./jdk/src/windows/resource/java.manifest Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/src/windows/resource/java.manifest Tue Mar 18 12:35:25 2014 -0700
@@ -44,9 +44,15 @@
<!-- Indicate this JDK version is Windows 7 compatible -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
+ <!-- Windows Vista -->
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+ <!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
- <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+ <!-- Windows 8 -->
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ <!-- Windows 8.1 -->
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
- </compatibility>
+ </compatibility>
</assembly>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/awt/Graphics2D/DrawString/DrawRotatedString.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+/**
+ * @test
+ * @bug 7190349
+ * @summary Verifies that we get correct direction, when draw rotated string.
+ * @author Sergey Bylokhov
+ * @run main/othervm DrawRotatedString
+ */
+public final class DrawRotatedString {
+
+ private static final int SIZE = 500;
+
+ public static void main(final String[] args) throws IOException {
+ BufferedImage bi = createBufferedImage(true);
+ verify(bi);
+ bi = createBufferedImage(false);
+ verify(bi);
+ System.out.println("Passed");
+ }
+
+ private static void verify(BufferedImage bi) throws IOException {
+ for (int i = 0; i < SIZE; ++i) {
+ for (int j = 0; j < 99; ++j) {
+ //Text should not appear before 100
+ if (bi.getRGB(i, j) != Color.RED.getRGB()) {
+ ImageIO.write(bi, "png", new File("image.png"));
+ throw new RuntimeException("Failed: wrong text location");
+ }
+ }
+ }
+ }
+
+ private static BufferedImage createBufferedImage(final boolean aa) {
+ final BufferedImage bi = new BufferedImage(SIZE, SIZE,
+ BufferedImage.TYPE_INT_RGB);
+ final Graphics2D bg = bi.createGraphics();
+ bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ aa ? RenderingHints.VALUE_ANTIALIAS_ON
+ : RenderingHints.VALUE_ANTIALIAS_OFF);
+ bg.setColor(Color.RED);
+ bg.fillRect(0, 0, SIZE, SIZE);
+ bg.translate(100, 100);
+ bg.rotate(Math.toRadians(90));
+ bg.setColor(Color.BLACK);
+ bg.setFont(bg.getFont().deriveFont(20.0f));
+ bg.drawString("MMMMMMMMMMMMMMMM", 0, 0);
+ bg.dispose();
+ return bi;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/awt/Graphics2D/IncorrectTextSize/IncorrectTextSize.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+/**
+ * @test
+ * @bug 8013569
+ * @author Sergey Bylokhov
+ */
+public final class IncorrectTextSize {
+
+ static final int scale = 2;
+ static final int width = 1200;
+ static final int height = 100;
+ static BufferedImage bi = new BufferedImage(width, height,
+ BufferedImage.TYPE_INT_ARGB);
+ static final String TEXT = "The quick brown fox jumps over the lazy dog"
+ + "The quick brown fox jumps over the lazy dog";
+
+ public static void main(final String[] args) throws IOException {
+ for (int point = 5; point < 11; ++point) {
+ Graphics2D g2d = bi.createGraphics();
+ g2d.setFont(new Font(Font.DIALOG, Font.PLAIN, point));
+ g2d.scale(scale, scale);
+ g2d.setColor(Color.WHITE);
+ g2d.fillRect(0, 0, width, height);
+ g2d.setColor(Color.green);
+ g2d.drawString(TEXT, 0, 20);
+ int length = g2d.getFontMetrics().stringWidth(TEXT);
+ if (length < 0) {
+ throw new RuntimeException("Negative length");
+ }
+ for (int i = (length + 1) * scale; i < width; ++i) {
+ for (int j = 0; j < height; ++j) {
+ if (bi.getRGB(i, j) != Color.white.getRGB()) {
+ g2d.drawLine(length, 0, length, height);
+ ImageIO.write(bi, "png", new File("image.png"));
+ System.out.println("length = " + length);
+ System.err.println("Wrong color at x=" + i + ",y=" + j);
+ System.err.println("Color is:" + new Color(bi.getRGB(i,
+ j)));
+ throw new RuntimeException("Test failed.");
+ }
+ }
+ }
+ g2d.dispose();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/awt/Toolkit/LoadAWTCrashTest/LoadAWTCrashTest.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ @test
+ @bug 8031477
+ @summary Crash while awt starting
+ @author Petr Pchelko
+ @run main/othervm LoadAWTCrashTest
+*/
+
+public class LoadAWTCrashTest {
+ public static void main(String[] args) {
+ System.loadLibrary("awt");
+ // If the bug is present JVM would crash or deadlock
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/awt/font/TextLayout/TestAATMorxFont.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/* @test
+ * @summary verify rendering of MORX fonts on OS X.
+ * @bug 8031462
+ */
+
+import javax.swing.*;
+import javax.swing.border.LineBorder;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+
+public class TestAATMorxFont extends JComponent {
+ public static void main(String[] args) {
+ String osName = System.getProperty("os.name");
+ System.out.println("OS is " + osName);
+ osName = osName.toLowerCase();
+ if (!osName.startsWith("mac")) {
+ return;
+ }
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ JFrame frame = new JFrame("Test Morx");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ TestAATMorxFont panel = new TestAATMorxFont();
+ frame.add(panel);
+ frame.pack();
+ frame.setVisible(true);
+ }
+ });
+ }
+
+ public Dimension getPreferredSize() {
+ return new Dimension(1200, 400);
+ }
+
+ public void paintComponent(Graphics g) {
+ Graphics2D g2d = (Graphics2D)g;
+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ int y = 50;
+ g.setFont(new Font("Gujarati MT", Font.PLAIN, 40));
+ System.out.println(g.getFont());
+ g.drawString("\u0A95\u0ACD \u0A95\u0A95\u0A95 \u0A95\u0ACD\u0A95\u0ACD\u0A95", 20, y);
+ y += 50;
+ g.setFont(new Font("Tamil Sangam MN", Font.PLAIN, 40));
+ System.out.println(g.getFont());
+ g.drawString("\u0b95\u0bCD \u0b95\u0b95\u0b95 \u0b95\u0bCD\u0b95\u0bCD\u0b95", 20, y);
+ y += 50;
+ g.setFont(new Font("Telugu Sangam MN", Font.PLAIN, 40));
+ System.out.println(g.getFont());
+ g.drawString("\u0c15\u0c4D \u0c15\u0c15\u0c15 \u0c15\u0c4D\u0c15\u0c4D\u0c15", 20, y);
+ y += 50;
+ g.setFont(new Font("Devanagari Sangam MN", Font.PLAIN, 40));
+ System.out.println(g.getFont());
+ g.drawString("\u0915\u0940 \u0915\u0947 \u0915\u0942", 20, y);
+ y += 50;
+ g.drawString("\u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
+ y += 50;
+ g.drawString("\u0930\u093F\u0935\u094D\u092F\u0942 \u0915\u0947 \u092C\u093E\u0926 \u0935\u093F\u0915\u093E\u0938 \u0913\u0932\u0902\u092A\u093F\u0915 \u0938\u0947 \u092C\u093E\u0939\u0930 (\u0926\u0947\u0935\u0928\u093E\u0917\u0930\u0940) (\u0939\u093F\u0928\u094D\u0926\u0940) \u0907\u0930\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915\u094D\u0915", 20, y);
+
+ }
+}
+
--- ./jdk/test/java/beans/Introspector/TestTypeResolver.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/test/java/beans/Introspector/TestTypeResolver.java Tue Mar 18 12:35:25 2014 -0700
@@ -113,6 +113,8 @@
// by private implementations of the various Type interfaces
if (expect.equals(t) && t.equals(expect))
System.out.println(", as expected");
+ else if ((expect.equals(t) || t.equals(expect)) && expect.toString().equals(t.toString()))
+ System.out.println(", as workaround of the 8023301 bug");
else {
System.out.println(" BUT SHOULD BE " + expect);
failedCases.add(c);
--- ./jdk/test/java/lang/ProcessBuilder/Basic.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/test/java/lang/ProcessBuilder/Basic.java Tue Mar 18 12:35:25 2014 -0700
@@ -29,6 +29,7 @@
* 4947220 7018606 7034570
* @summary Basic tests for Process and Environment Variable code
* @run main/othervm/timeout=300 Basic
+ * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic
* @author Martin Buchholz
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/lang/ProcessBuilder/BasicLauncher.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 5049299
+ * @summary (process) Use posix_spawn, not fork, on S10 to avoid swap exhaustion
+ * @compile BasicLauncher.java Basic.java
+ * @run main BasicLauncher
+ */
+
+import java.io.*;
+import java.nio.file.*;
+
+public class BasicLauncher {
+
+ private static boolean passed = false;
+
+ public static void main(String args[]) throws Exception {
+ String osName = System.getProperty("os.name");
+ if (osName.startsWith("SunOS")) {
+ BasicLauncher l = new BasicLauncher();
+ l.start();
+ }
+ }
+
+ private void start() throws Exception {
+ String separator = System.getProperty("file.separator");
+ String jdkpath = System.getProperty("test.jdk") + separator + "bin" + separator;
+ String srcpath = System.getProperty("test.src", ".") + separator;
+ String testClasses = System.getProperty("test.classes", ".");
+
+ ProcessBuilder builder = new ProcessBuilder(
+ jdkpath + "java",
+ "-cp",
+ testClasses,
+ "-Djdk.lang.Process.launchMechanism=posix_spawn",
+ "Basic");
+ builder.redirectErrorStream(true);
+ Process testProc = builder.start();
+ printProcessThread ppt =
+ new printProcessThread(testProc, "testproc");
+ ppt.start();
+ testProc.waitFor();
+ System.out.println("testproc done");
+
+ if (!passed)
+ throw new RuntimeException("Test Failed: ");
+ }
+
+
+ class printProcessThread extends Thread {
+ Process p;
+ String pName;
+
+ public printProcessThread(Process p, String pName) {
+ this.p = p;
+ this.pName = pName;
+ }
+
+ @Override
+ public void run() {
+ try (BufferedReader reader =
+ new BufferedReader(new InputStreamReader(p.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ System.out.println("[Output: " + pName + "]" + line);
+ if (line.contains("failed = 0")) {
+ passed = true;
+ }
+ }
+
+ } catch (Exception e) {
+ System.out.println("Exception encountered in " + pName
+ + " thread\n" + e);
+ }
+ }
+ }
+}
--- ./jdk/test/java/util/logging/TestAppletLoggerContext.java Thu Dec 19 09:01:16 2013 -0800
+++ ./jdk/test/java/util/logging/TestAppletLoggerContext.java Tue Mar 18 12:35:25 2014 -0700
@@ -110,28 +110,19 @@
}
TestExc exc;
- TestExc global = new TestExc();
@Override
- public Object getContext() { return active ? global : null; }
+ public Object getAppletContext() { return active ? exc : null; }
@Override
- public Object getExecutionContext() { return active ? exc : null; }
+ public Object get(Object o) { return exc.get(o); }
@Override
- public Object get(Object o, Object o1) { return TestExc.exc(o).get(o1); }
+ public void put(Object o, Object o1) { exc.put(o, o1); }
@Override
- public void put(Object o, Object o1, Object o2) { TestExc.exc(o).put(o1, o2); }
- @Override
- public void remove(Object o, Object o1) { TestExc.exc(o).remove(o1); }
- @Override
- public Object get(Object o) { return global.get(o); }
- @Override
- public void put(Object o, Object o1) { global.put(o, o1); }
- @Override
- public void remove(Object o) { global.remove(o); }
+ public void remove(Object o) { exc.remove(o); }
@Override
public boolean isDisposed() { return false; }
@Override
- public boolean isMainAppContext() { return exc == null; }
+ public boolean isMainAppContext() { return !active || exc == null; }
}
final static JavaAWTAccessStub javaAwtAccess = new JavaAWTAccessStub();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/util/logging/TestLoggingWithMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.logging.Logger;
+import javax.imageio.ImageIO;
+
+/**
+ * @test
+ * @bug 8019853 8023258
+ * @summary Test that the default user context is used when in the main
+ * application context. This test must not be run in same VM or agent
+ * VM mode: it would not test the intended behavior.
+ * @run main/othervm TestLoggingWithMainAppContext
+ */
+public class TestLoggingWithMainAppContext {
+
+ public static void main(String[] args) throws IOException {
+ System.out.println("Creating loggers.");
+
+ // These loggers will be created in the default user context.
+ final Logger foo1 = Logger.getLogger( "foo" );
+ final Logger bar1 = Logger.getLogger( "foo.bar" );
+ if (bar1.getParent() != foo1) {
+ throw new RuntimeException("Parent logger of bar1 "+bar1+" is not "+foo1);
+ }
+ System.out.println("bar1.getParent() is the same as foo1");
+
+ // Set a security manager
+ System.setSecurityManager(new SecurityManager());
+ System.out.println("Now running with security manager");
+
+ // Triggers the creation of the main AppContext
+ ByteArrayInputStream is = new ByteArrayInputStream(new byte[] { 0, 1 });
+ ImageIO.read(is); // triggers calls to system loggers & creation of main AppContext
+
+ // verify that we're still using the default user context
+ final Logger bar2 = Logger.getLogger( "foo.bar" );
+ if (bar1 != bar2) {
+ throw new RuntimeException("bar2 "+bar2+" is not the same as bar1 "+bar1);
+ }
+ System.out.println("bar2 is the same as bar1");
+ if (bar2.getParent() != foo1) {
+ throw new RuntimeException("Parent logger of bar2 "+bar2+" is not foo1 "+foo1);
+ }
+ System.out.println("bar2.getParent() is the same as foo1");
+ final Logger foo2 = Logger.getLogger("foo");
+ if (foo1 != foo2) {
+ throw new RuntimeException("foo2 "+foo2+" is not the same as foo1 "+foo1);
+ }
+ System.out.println("foo2 is the same as foo1");
+
+ System.out.println("Test passed.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/java/util/logging/TestMainAppContext.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.util.logging.Logger;
+import sun.awt.AppContext;
+import sun.awt.SunToolkit;
+
+
+/**
+ * @test
+ * @bug 8026404
+ * @summary checks that calling getLogger() from a Thread whose ThreadGroup is
+ * a child of the main root group doesn't throw an exception.
+ * @build TestMainAppContext
+ * @run main/othervm TestMainAppContext
+ * @author danielfuchs
+ */
+public class TestMainAppContext {
+
+ static volatile Throwable thrown = null;
+
+ public static void main(String... args) throws Exception {
+ ThreadGroup rootTG = Thread.currentThread().getThreadGroup();
+ while (rootTG.getParent() != null) {
+ rootTG = rootTG.getParent();
+ }
+
+ ThreadGroup tg = new ThreadGroup(rootTG, "FakeApplet");
+ final Thread t1 = new Thread(tg, "createNewAppContext") {
+ @Override
+ public void run() {
+ try {
+ AppContext context = SunToolkit.createNewAppContext();
+ } catch(Throwable t) {
+ thrown = t;
+ }
+ }
+ };
+ t1.start();
+ t1.join();
+ if (thrown != null) {
+ throw new RuntimeException("Unexpected exception: " + thrown, thrown);
+ }
+ Thread t2 = new Thread(tg, "BugDetector") {
+
+ @Override
+ public void run() {
+ try {
+ Logger.getLogger("foo").info("Done");
+ } catch (Throwable x) {
+ thrown = x;
+ }
+ }
+
+ };
+
+ System.setSecurityManager(new SecurityManager());
+ t2.start();
+ t2.join();
+ if (thrown != null) {
+ throw new RuntimeException("Test failed: " + thrown, thrown);
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ ./jdk/test/javax/imageio/plugins/jpeg/TruncatedImageWarningTest.java Tue Mar 18 12:35:25 2014 -0700
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.event.IIOReadWarningListener;
+import javax.imageio.stream.ImageInputStream;
+
+public class TruncatedImageWarningTest implements IIOReadWarningListener {
+
+ private static String fileName = "truncated.jpg";
+ boolean receivedWarning = false;
+
+ public static void main(String[] args) throws IOException {
+
+ String sep = System.getProperty("file.separator");
+ String dir = System.getProperty("test.src", ".");
+ String filePath = dir+sep+fileName;
+ System.out.println("Test file: " + filePath);
+ File f = new File(filePath);
+ ImageInputStream in = ImageIO.createImageInputStream(f);
+ ImageReader reader = ImageIO.getImageReaders(in).next();
+ TruncatedImageWarningTest twt = new TruncatedImageWarningTest();
+ reader.addIIOReadWarningListener(twt);
+ reader.setInput(in);
+ reader.read(0);
+ if (!twt.receivedWarning) {
+ throw new RuntimeException("No expected warning");
+ }
+ }
+
+ public void warningOccurred(ImageReader source, String warning) {
+ System.out.println("Expected warning: " + warning);
+ receivedWarning = true;
+ }
+}
Binary file test/javax/imageio/plugins/jpeg/truncated.jpg has changed
--- ./langtools/.hgtags Thu Dec 19 09:01:27 2013 -0800
+++ ./langtools/.hgtags Tue Mar 18 12:45:26 2014 -0700
@@ -381,6 +381,9 @@
ba3ff27d4082f2cf0d06e635b2b6e01f80e78589 jdk7u45-b18
164cf7491ba2f371354ba343a604eee4c61c529d jdk7u45-b30
7f5cfaedb25c2c2774d6839810d6ae543557ca01 jdk7u45-b31
+ef7bdbe7f1fa42fd58723e541d9cdedcacb2649a jdk7u45-b33
+bcb3e939d046d75436c7c8511600b6edce42e6da jdk7u45-b34
+efbda7abd821f280ec3a3aa6819ad62d45595e55 jdk7u45-b35
18d1864abca976ca68cb71612e9b20c908455d3d jdk7u51-b00
14d1cf2630aea549cfba9d052200c7ebcabd875c jdk7u51-b01
f0168ccf171ed6080267fe0a7f7aed0b46bd5713 jdk7u51-b02
@@ -395,3 +398,21 @@
c9d8d8793d9330d592190c334260ccf26c986df6 jdk7u51-b11
5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u51-b12
4d0807934c302f2e35e6a5acc6cdc720c82b5671 jdk7u51-b13
+ada23e55d76a378cb2fc2cd7ffae8c147aaf0055 jdk7u51-b30
+e3d4896d52ab4ad0fc0b7a45d60340dbdcb8826d jdk7u51-b31
+fb3ff30ecd8ea1637551461bfaf09fc8204b536c jdk7u51-b33
+4adc6c094545774b324d2e5511723ada2b32e6c4 jdk7u51-b34
+5b44df2114e466da85c3816627bfcd1b59c6499d jdk7u55-b00
+3e64e49131b88c839733c9869ff8aebcd15cf828 jdk7u55-b01
+2a9f5c00ba46f895bc9d16a584bf7d80c1822268 jdk7u55-b02
+0479d260ac835eb3f0c7f3d7d15be0599b92a20a jdk7u55-b03
+a244cc40ae0b29028ff8503ee516cb5f9e3db6e3 jdk7u55-b04
+25d63d986653d81522b01bbd2664083ae5fdc243 jdk7u55-b05
+76eeeaace70d38795eef5215f758493421cee0ac jdk7u55-b06
+08f7914d6aa947e73269b4e60110ed12573ffa28 jdk7u55-b07
+e64301b473b43609cb28d8cfe7e5db17d9bf8a4a jdk7u55-b08
+a296112a3fd774c258375912c7ada38daf8eee1e jdk7u55-b09
+faa9f8c51a6e3fcb444729012a798e3ad09c3da4 jdk7u55-b10
+2bdd105e433da7fbf7f37ec2f75fc4bed4e54280 jdk7u55-b11
+a3cdca5d3773f67a49091f9131a4d073bc6b83d9 jdk7u55-b12
+81bf1ca3a3a71c628b7d952ba47c6f200a223f27 jdk7u55-b13
--- ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Thu Dec 19 09:01:27 2013 -0800
+++ ./langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java Tue Mar 18 12:45:26 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -235,7 +235,7 @@
} else if (opt.equals("-doctitle")) {
doctitle = os[1];
} else if (opt.equals("-windowtitle")) {
- windowtitle = os[1];
+ windowtitle = os[1].replaceAll("\\<.*?>", "");
} else if (opt.equals("-top")) {
top = os[1];
} else if (opt.equals("-bottom")) {
--- ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Thu Dec 19 09:01:27 2013 -0800
+++ ./langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java Tue Mar 18 12:45:26 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8016675
+ * @bug 8016675 8026736
* @summary Test for window title.
* @author Bhavesh Patel
* @library ../lib/
@@ -34,26 +34,153 @@
public class TestWindowTitle extends JavadocTester {
private static final String BUG_ID = "8016675";
- private static final String WIN_TITLE =
+ //Window title with JavaScript special characters.
+ private static final String TITLE_JS_CHARS =
"Testing \"Window 'Title'\" with a \\ backslash and a / " +
"forward slash and a \u00e8 unicode char also a tab and also a " +
"\t special character another \u0002 unicode)";
- private static final String[][] TEST = {
- {BUG_ID + FS + "overview-summary.html",
+ private static final String[] ARGS_JS_CHARS = new String[]{
+ "-d", BUG_ID + "-1", "-windowtitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_JS_CHARS = {
+ {BUG_ID + "-1" + FS + "overview-summary.html",
"parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
"with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
"also a tab and also a \\t special character another \\u0002 unicode))\";"
},
};
- private static final String[][] NEG_TEST = {
- {BUG_ID + FS + "overview-summary.html",
+ private static final String[][] NEG_TEST_JS_CHARS = {
+ {BUG_ID + "-1" + FS + "overview-summary.html",
"parent.document.title=\"Overview (Testing \"Window \'Title\'\" " +
"with a \\ backslash and a / forward slash and a \u00E8 unicode char " +
"also a tab and also a \t special character another \u0002 unicode))\";"
+ }
+ };
+
+ //Window title with a script tag.
+ private static final String TITLE_SCRIPT_TAG =
+ "Testing script tag in title </title><script>alert(\"Should not pop up\")</script>.";
+ private static final String[] ARGS_SCRIPT_TAG = new String[]{
+ "-d", BUG_ID + "-2", "-windowtitle", TITLE_SCRIPT_TAG, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_SCRIPT_TAG = {
+ {BUG_ID + "-2" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing script tag in title alert" +
+ "(\\\"Should not pop up\\\").)\";"
},
+ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
+ "parent.document.title=\"C2 (Testing script tag in title alert" +
+ "(\\\"Should not pop up\\\").)\";"
+ }
};
- private static final String[] ARGS = new String[]{
- "-d", BUG_ID, "-windowtitle", WIN_TITLE, "-sourcepath", SRC_DIR, "p1", "p2"
+ private static final String[][] NEG_TEST_SCRIPT_TAG = {
+ {BUG_ID + "-2" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing script tag in title </title><script>" +
+ "alert(\\\"Should not pop up\\\")</script>.)\";"
+ },
+ {BUG_ID + "-2" + FS + "p2" + FS + "C2.html",
+ "parent.document.title=\"C2 (Testing script tag in title </title><script>" +
+ "alert(\\\"Should not pop up\\\")</script>.)\";"
+ }
+ };
+
+ //Window title with other HTML tags.
+ private static final String TITLE_HTML_TAGS =
+ "Testing another <p>HTML</p> tag. Another <h1>tag</h1>. A " +
+ "<span id=\"testTag\">tag with attributes</span>. <script and </p are not tags.";
+ private static final String[] ARGS_HTML_TAGS = new String[]{
+ "-d", BUG_ID + "-3", "-windowtitle", TITLE_HTML_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_HTML_TAGS = {
+ {BUG_ID + "-3" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing another HTML tag. Another tag. A " +
+ "tag with attributes. <script and </p are not tags.)\";"
+ }
+ };
+ private static final String[][] NEG_TEST_HTML_TAGS = {
+ {BUG_ID + "-3" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing another <p>HTML</p> tag. Another " +
+ "<h1>tag</h1>. A <span id=\"testTag\">tag with attributes</span>. <script and " +
+ "</p are not tags.)\";"
+ }
+ };
+
+ //Window title using entities.
+ private static final String TITLE_HTML_ENTITIES =
+ "Testing entities &lt;script&gt;alert(\"Should not pop up\")&lt;/script&gt;.";
+ private static final String[] ARGS_HTML_ENTITIES = new String[]{
+ "-d", BUG_ID + "-4", "-windowtitle", TITLE_HTML_ENTITIES, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_HTML_ENTITIES = {
+ {BUG_ID + "-4" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing entities &lt;script&gt;alert(\\\"Should " +
+ "not pop up\\\")&lt;/script&gt;.)\";"
+ }
+ };
+ private static final String[][] NEG_TEST_HTML_ENTITIES = {
+ {BUG_ID + "-4" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing entities alert(\\\"Should not pop up\\\").)\";"
+ }
+ };
+
+ //Window title with just empty HTML tags.
+ private static final String TITLE_EMPTY_TAGS =
+ "</title><script></script>";
+ private static final String[] ARGS_EMPTY_TAGS = new String[]{
+ "-d", BUG_ID + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_EMPTY_TAGS = {
+ {BUG_ID + "-5" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview\";"
+ }
+ };
+ private static final String[][] NEG_TEST_EMPTY_TAGS = {
+ {BUG_ID + "-5" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (</title><script></script>)\";"
+ }
+ };
+
+ //Window title with unicode characters.
+ private static final String TITLE_UNICODE_CHARS =
+ "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e.";
+ private static final String[] ARGS_UNICODE_CHARS = new String[]{
+ "-d", BUG_ID + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_UNICODE_CHARS = {
+ {BUG_ID + "-6" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " +
+ "not pop up\\\").)\";"
+ }
+ };
+ private static final String[][] NEG_TEST_UNICODE_CHARS = {
+ {BUG_ID + "-6" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing unicode <script>alert(\\\"Should not pop up\\\")" +
+ "</script>.)\";"
+ }
+ };
+
+ //An empty window title.
+ private static final String TITLE_EMPTY =
+ "";
+ private static final String[] ARGS_EMPTY_TITLE = new String[]{
+ "-d", BUG_ID + "-7", "-windowtitle", TITLE_EMPTY, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] TEST_EMPTY = {
+ {BUG_ID + "-7" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview\";"
+ }
+ };
+
+ //Test doctitle.
+ private static final String[] ARGS_DOCTITLE = new String[]{
+ "-d", BUG_ID + "-8", "-doctitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2"
+ };
+ private static final String[][] NEG_TEST_DOCTITLE = {
+ {BUG_ID + "-8" + FS + "overview-summary.html",
+ "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " +
+ "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " +
+ "also a tab and also a \\t special character another \\u0002 unicode)\";"
+ },
};
/**
@@ -62,7 +189,14 @@
*/
public static void main(String[] args) {
TestWindowTitle tester = new TestWindowTitle();
- run(tester, ARGS, TEST, NEG_TEST);
+ run(tester, ARGS_JS_CHARS, TEST_JS_CHARS, NEG_TEST_JS_CHARS);
+ run(tester, ARGS_SCRIPT_TAG, TEST_SCRIPT_TAG, NEG_TEST_SCRIPT_TAG);
+ run(tester, ARGS_HTML_TAGS, TEST_HTML_TAGS, NEG_TEST_HTML_TAGS);
+ run(tester, ARGS_HTML_ENTITIES, TEST_HTML_ENTITIES, NEG_TEST_HTML_ENTITIES);
+ run(tester, ARGS_EMPTY_TAGS, TEST_EMPTY_TAGS, NEG_TEST_EMPTY_TAGS);
+ run(tester, ARGS_UNICODE_CHARS, TEST_UNICODE_CHARS, NEG_TEST_UNICODE_CHARS);
+ run(tester, ARGS_EMPTY_TITLE, TEST_EMPTY, NO_TEST);
+ run(tester, ARGS_DOCTITLE, NO_TEST, NEG_TEST_DOCTITLE);
tester.printSummary();
}