summaryrefslogtreecommitdiff
path: root/java/openjdk7/files/patch-7u65-b31
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk7/files/patch-7u65-b31')
-rw-r--r--java/openjdk7/files/patch-7u65-b3113021
1 files changed, 13021 insertions, 0 deletions
diff --git a/java/openjdk7/files/patch-7u65-b31 b/java/openjdk7/files/patch-7u65-b31
new file mode 100644
index 000000000000..90705302ecb0
--- /dev/null
+++ b/java/openjdk7/files/patch-7u65-b31
@@ -0,0 +1,13021 @@
+--- ./.hgtags Wed May 07 19:25:50 2014 -0700
++++ ./.hgtags Wed Jun 25 09:01:10 2014 -0700
+@@ -405,6 +405,7 @@
+ b829c5947c6cd473f42cadfe2c61399fb67c2da6 jdk7u55-b02
+ a72b902cdd39d9f2f2d353d5ad629e543cbc01ae jdk7u55-b03
+ 6a8ee38075621564dd276e8ed7be576d637acf79 jdk7u55-b04
++92ac508efb9e00d88b04a2bd79ab8a55f450a048 jdk7u65-b00
+ 92ac508efb9e00d88b04a2bd79ab8a55f450a048 jdk7u55-b05
+ 6c7cd2146f69cf0823765b3cf84c338c1dc7157c jdk7u55-b06
+ 5cad0f56c685a0673944dbc5632ea9ae7b9340c7 jdk7u55-b07
+@@ -418,6 +419,11 @@
+ 0820b4707cfa75f8211b88b0daa67bba8475f498 jdk7u55-b30
+ 997ab3897d6ede80b0decdda94b569e57dd7dd90 jdk7u55-b14
+ 1f52edec29fd44c8bacce11ba7440287b37d04d1 jdk7u55-b31
++5b15555172019b3c92484abff7c92f066e162d29 jdk7u55-b32
++fa5ead8cb7d2de49cd138d93fb86fa5a10b07037 jdk7u55-b33
++6041c68893932ee16a272a8d5a42069e217d888c jdk7u55-b34
++8733fb47b3338e9285870b09eb326e758cf69771 jdk7u55-b35
++b9c954604ecaaf8d8a1568ababd9508ff09b742e jdk7u55-b36
+ 11147a12bd8c6b02f98016a8d1151e56f42a43b6 jdk7u60-b00
+ 88113cabda386320a087b288d43e792f523cc0ba jdk7u60-b01
+ 6bdacebbc97f0a03be45be48a6d5b5cf2f7fe77d jdk7u60-b02
+@@ -435,6 +441,28 @@
+ 1ca6a368aec38ee91a41dc03899d7dc1037de44d jdk7u60-b14
+ a95b821a2627295b90fb4ae8f3b8bc2ff9c64acc jdk7u60-b15
+ 19a3f6f48c541a8cf144eedffa0e52e108052e82 jdk7u60-b16
++472f5930e6cc8f307b5508995ee2edcf9913a852 jdk7u60-b17
+ 472f5930e6cc8f307b5508995ee2edcf9913a852 jdk7u60-b18
+-472f5930e6cc8f307b5508995ee2edcf9913a852 jdk7u60-b17
++b9264ea7e0887d511318bf7b53d12f944760bbbb jdk7u65-b01
+ 2a7a5e774023944f291ee27ca5b3ad89e0e62aaf jdk7u60-b19
++ac5183999ba532c6b89f24fe01f6f0eb96799719 jdk7u60-b30
++7e9c1a4c2d50e10ccc6d81b8dc0786e82128a676 jdk7u60-b31
++f792c1446b57932f5cd661afa72bcf41cfe6d1a6 jdk7u60-b32
++870408bbbfa50a6f44997a844c6c31c0cb0cbc40 jdk7u60-b33
++3a683f1730a148bcc1ca6eb9137116db427093f6 jdk7u65-b02
++c154a8de7d34128ab75f46a2b6a909796f63b6e3 jdk7u65-b03
++62e22dbc36410d76716bfa5e9fd679fcb4b1d845 jdk7u65-b04
++4cab26e4e27f8ff382b8d6487224af59dc7c1fa1 jdk7u65-b05
++b2cd3babc4ca1fb48b6073665e627f8bfb65d547 jdk7u65-b06
++bc5e69657c0f6d58775ac7441033bbcbbaee3268 jdk7u65-b07
++48eb3345e05fe904d2e92067da0abd04a9b375e4 jdk7u65-b08
++2e7881991d5294061023f8862b702e4730f2860d jdk7u65-b09
++db03cbff389500c7ccfd4b476ab78319f6e24d2d jdk7u65-b10
++9f629f70ec6c4249baadaadd05b0f32c9129ad05 jdk7u65-b11
++71cd7866ca68b333e36330e179ab1d69d721aaee jdk7u65-b12
++49dbfea9d3a4b709f3230d581a09d960c2de5109 jdk7u65-b13
++0cfadcb9f8006ac5601bb0ce8b74211d6b223c11 jdk7u65-b14
++3cce3737be368dc3d304508cd0d6e354f8a19f55 jdk7u65-b15
++2c8b05ed9802cf4e5f61439a6d6286e7f7cd444e jdk7u65-b16
++927d8d3db13c5221237b51efe45206054ee6e3f3 jdk7u65-b17
++b51ccd32894662064192857007ef41175d433901 jdk7u65-b30
+--- ./corba/.hgtags Wed May 07 19:25:52 2014 -0700
++++ ./corba/.hgtags Wed Jun 25 09:01:20 2014 -0700
+@@ -407,6 +407,7 @@
+ db2e6d87bade9d2061646ff9a6b39b5159fba0ec jdk7u55-b02
+ 02ff18f156bd3382fe22e4758b138370f5238e97 jdk7u55-b03
+ 6a88a170331fb38af5046e54bf75f38176af5c41 jdk7u55-b04
++a8d27c3fc4e4e6cd99fa164f04c30a71f474a2d6 jdk7u65-b00
+ a8d27c3fc4e4e6cd99fa164f04c30a71f474a2d6 jdk7u55-b05
+ af7f1808106bf4e9b4680d943677299829245d08 jdk7u55-b06
+ 44801796d42bebc90e8c4c7fb5bd79db04b10b75 jdk7u55-b07
+@@ -420,6 +421,11 @@
+ e041c52fe69128ec3439d26afef9b0fcba00684c jdk7u55-b30
+ a0bfd0e80ae0ae6e3a29bf527b5911c83163b3f5 jdk7u55-b14
+ 55ff6957449cf6c79f5d5bb159df27f51ece1659 jdk7u55-b31
++fba15e177b15873e3c63b0efc7c0f5647a243a79 jdk7u55-b32
++6503115cbedda9216083fc1798e2fa5a2775f68a jdk7u55-b33
++c8614d56bc1c5c60431f938a0c33d8fc42e7aef0 jdk7u55-b34
++be587f9142bcb694b647642fbbb05dbaa7b1b1b3 jdk7u55-b35
++05ea23fd127a217965eb304932e8c0ce5933f04b jdk7u55-b36
+ c5b5886004e6446b8b27ccdc1fd073354c1dc614 jdk7u60-b00
+ a531112cc6d0b0a1e7d4ffdaa3ba53addcd25cf4 jdk7u60-b01
+ d81370c5b863acc19e8fb07315b1ec687ac1136a jdk7u60-b02
+@@ -437,6 +443,28 @@
+ 02bdeb33754315f589bd650dde656d2c9947976d jdk7u60-b14
+ e5946b2cf82bdea3a4b85917e903168e65a543a7 jdk7u60-b15
+ e424fb8452851b56db202488a4e9a283934c4887 jdk7u60-b16
++b96d90694be873372cc417b38b01afed6ac1b239 jdk7u60-b17
+ b96d90694be873372cc417b38b01afed6ac1b239 jdk7u60-b18
+-b96d90694be873372cc417b38b01afed6ac1b239 jdk7u60-b17
++550ae238459e0f59d9a85d183bc2b4520adac05b jdk7u65-b01
+ 5d1b39fe68944cff6380db56fbe2fbaa28091bf6 jdk7u60-b19
++39734d26e279098fae06cee5a127e126090ddec9 jdk7u60-b30
++8939f268abb8c153de653f2659fff6716e5f83f8 jdk7u60-b31
++9665790000e22370daefddbf56dd81e89e07b7c4 jdk7u60-b32
++437b4b2aed4811af16efcafca7995684493d205b jdk7u60-b33
++6a89d959cbade46fcd281f421ac40a804d098f0b jdk7u65-b02
++afed3d62e8051fe65f431abe87dad50cbeba3800 jdk7u65-b03
++38fabf72970ae509350f57ffad99f6ac8fc6fdad jdk7u65-b04
++12c1621ce88defa65ebc1bdffb7141bd7d0089a6 jdk7u65-b05
++5041c713522c0fc68239fc91f7fb9498dd7edebb jdk7u65-b06
++144887a766dc17a139524dd43f1a0bc8f2a2a3a2 jdk7u65-b07
++5b8210c41bc41135687028bcb000ca116e2090f6 jdk7u65-b08
++1f7156e0a46129dbaf5b248802371564d92630a3 jdk7u65-b09
++be3cbbea3ec1e14b6492acbbd5c08222c24a5061 jdk7u65-b10
++fd7e4972cfefa174ce3d6dcb7f4b409df11a745b jdk7u65-b11
++792ef0370bf7bcf83c9404d2b44f08722dcd73aa jdk7u65-b12
++b95f46ae5207853a89d52b0453a2fb99fffee817 jdk7u65-b13
++6efadedfe3295dbf2af4a350d813524af029b116 jdk7u65-b14
++78966cf34d868ef18b8a3fa7edec368e1cc4739d jdk7u65-b15
++d765ed30bd5ed2bdd71fda56c056333e1b4b0d7d jdk7u65-b16
++cd642d59aca29ff2b56e7ed016be758828f199cd jdk7u65-b17
++8740dc71b1ceb49c76470b46205c28c1302e864d jdk7u65-b30
+--- ./corba/src/share/classes/org/omg/CORBA/ORB.java Wed May 07 19:25:52 2014 -0700
++++ ./corba/src/share/classes/org/omg/CORBA/ORB.java Wed Jun 25 09:01:20 2014 -0700
+@@ -291,28 +291,12 @@
+ (className.equals("com.sun.corba.se.impl.orb.ORBSingleton"))) {
+ singleton = new com.sun.corba.se.impl.orb.ORBSingleton();
+ } else {
+- singleton = create_impl_with_systemclassloader(className);
++ singleton = create_impl(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)
+--- ./hotspot/.hgtags Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/.hgtags Wed Jun 25 09:01:56 2014 -0700
+@@ -616,6 +616,7 @@
+ 408028d410e316a99495c42df0031018890c22fe jdk7u55-b02
+ 50fb91504dd8cdf410eb956075442daf3aacf1db jdk7u55-b03
+ 3be3b8a032a5508646c1c5620cee18d3e69fc708 jdk7u55-b04
++b86119fa2748bd91ae4984ff2264da92b6626f8c jdk7u65-b00
+ b86119fa2748bd91ae4984ff2264da92b6626f8c jdk7u55-b05
+ 260d919d52e500a0b20f911fade2a7710474067a jdk7u55-b06
+ 8cf6e0a3a0651c4132ae034c2b68ddf4eb5c4d88 jdk7u55-b07
+@@ -629,6 +630,11 @@
+ d27b468d5f3be3329ff1ff342f3347e6b2e0303b jdk7u55-b30
+ dff9147a781672f20bb0577a94233264ea4a95d1 jdk7u55-b14
+ 8175599864880938d68d0a515fa561043d7d5fd0 jdk7u55-b31
++ba9270b8fb1f4852ff1d9dab15571eb9e0714495 jdk7u55-b32
++0901a8cf66a0494b55bf104c9666d4e3c6ff93f0 jdk7u55-b33
++278d7e230b297a4632b94ddc07d591e74736e039 jdk7u55-b34
++db88943dba0b7672a09e22974934022fbe8ba8dd jdk7u55-b35
++b3e388601b0fc0922b311e2cc68b9417cedd16ef jdk7u55-b36
+ ae4adc1492d1c90a70bd2d139a939fc0c8329be9 jdk7u60-b00
+ af1fc2868a2b919727bfbb0858449bd991bbee4a jdk7u40-b60
+ cc83359f5e5eb46dd9176b0a272390b1a0a51fdc hs24.60-b01
+@@ -655,6 +661,28 @@
+ b226be2040f971855626f5b88cb41a7d5299fea0 jdk7u60-b14
+ 2871f345b7e5585e20dc7aa91035967fe774cfba jdk7u60-b15
+ ec76bacbb5b90efc7988dee5345c656126b97561 jdk7u60-b16
++617a6338e0c4f7699eed5061d7e8f576c3ace029 jdk7u60-b17
+ 617a6338e0c4f7699eed5061d7e8f576c3ace029 jdk7u60-b18
+-617a6338e0c4f7699eed5061d7e8f576c3ace029 jdk7u60-b17
++4a9635c98a917cfcef506ca5d034c733a33c53f3 jdk7u65-b01
+ 361493c7cdb5f75b28efc63389d6cebaaaa43a2c jdk7u60-b19
++13f561930b3e80a94e2baddc51dfc6c43c5ca601 jdk7u60-b30
++35b2dbe7f7c69ea0f2feb1e66fe8651511a5fb6d jdk7u60-b31
++f166d2e391993f1b12b4ad1685baf999c78e6372 jdk7u60-b32
++cc1fea28c886ef100632247a708eac0c83640914 jdk7u60-b33
++eb797fab50d3b440b17b3e7c5d83f42bfa73655e jdk7u65-b02
++bb00df28ecdbd0da89ab4ed81f6f2b732fa512da jdk7u65-b03
++848481af9003067546c7f34c166bb8d745b95d5f jdk7u65-b04
++98a884fa64a9ef1753a28691106efe10942b9d70 jdk7u65-b05
++6f1dddf9c632bfb14121c9521d17b64bd0be0cd2 jdk7u65-b06
++a053d3d805355ffcd85c17e653182e17d4456bd5 jdk7u65-b07
++6f03dfb50363d26599fcf726586ea3f6d0e0347d jdk7u65-b08
++b4930eb1ea7630b4d8609e2efe6f000d3dc83235 jdk7u65-b09
++4736382ac9d999044b05eb26932ab6fc59dbb159 jdk7u65-b10
++7345c7bf20fd8c91492240a95082af9a201b3a96 jdk7u65-b11
++28b81694b89f88541e28bbc767d78e77ec66cce6 jdk7u65-b12
++f4ed018b4c51dae699da835617b19e8a49c124a4 jdk7u65-b13
++7ec585caae47f7202fb5357607f9ad058b03870e jdk7u65-b14
++7058f0d30de6826b6866ce2d146c63e943be33af jdk7u65-b15
++f1b2970a2564c3360db420431cfbba215da6ae43 jdk7u65-b16
++4c6df9a369cb9d54fe2d898452883a22b8ec6640 jdk7u65-b17
++aca05127f95b5704ee3a34104a8f86e36326f0c0 jdk7u65-b30
+--- ./hotspot/make/hotspot_version Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/make/hotspot_version Wed Jun 25 09:01:56 2014 -0700
+@@ -34,8 +34,8 @@
+ HOTSPOT_VM_COPYRIGHT=Copyright 2014
+
+ HS_MAJOR_VER=24
+-HS_MINOR_VER=60
+-HS_BUILD_NUMBER=09
++HS_MINOR_VER=65
++HS_BUILD_NUMBER=04
+
+ JDK_MAJOR_VER=1
+ JDK_MINOR_VER=7
+--- ./hotspot/src/os/bsd/vm/os_bsd.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2013, 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
+@@ -1819,9 +1819,6 @@
+ ::abort();
+ }
+
+-// unused on bsd for now.
+-void os::set_error_file(const char *logfile) {}
+-
+
+ // This method is a copy of JDK's sysGetLastErrorString
+ // from src/solaris/hpi/src/system_md.c
+@@ -2585,6 +2582,7 @@
+ // determine if this is a legacy image or modules image
+ // modules image doesn't have "jre" subdirectory
+ len = strlen(buf);
++ assert(len < buflen, "Ran out of buffer space");
+ jrelib_p = buf + len;
+
+ // Add the appropriate library subdir
+@@ -2620,7 +2618,7 @@
+ }
+ }
+
+- strcpy(saved_jvm_path, buf);
++ strncpy(saved_jvm_path, buf, MAXPATHLEN);
+ }
+
+ void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
+--- ./hotspot/src/os/linux/vm/os_linux.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/os/linux/vm/os_linux.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2013, 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
+@@ -1614,9 +1614,6 @@
+ ::abort();
+ }
+
+-// unused on linux for now.
+-void os::set_error_file(const char *logfile) {}
+-
+
+ // This method is a copy of JDK's sysGetLastErrorString
+ // from src/solaris/hpi/src/system_md.c
+@@ -2413,6 +2410,7 @@
+ // determine if this is a legacy image or modules image
+ // modules image doesn't have "jre" subdirectory
+ len = strlen(buf);
++ assert(len < buflen, "Ran out of buffer room");
+ jrelib_p = buf + len;
+ snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
+ if (0 != access(buf, F_OK)) {
+@@ -2435,7 +2433,7 @@
+ }
+ }
+
+- strcpy(saved_jvm_path, buf);
++ strncpy(saved_jvm_path, buf, MAXPATHLEN);
+ }
+
+ void os::print_jni_name_prefix_on(outputStream* st, int args_size) {
+--- ./hotspot/src/os/solaris/vm/os_solaris.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/os/solaris/vm/os_solaris.cpp Wed Jun 25 09:01:56 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
+@@ -1877,9 +1877,6 @@
+ ::abort(); // dump core (for debugging)
+ }
+
+-// unused
+-void os::set_error_file(const char *logfile) {}
+-
+ // DLL functions
+
+ const char* os::dll_file_extension() { return ".so"; }
+@@ -2561,6 +2558,7 @@
+ // determine if this is a legacy image or modules image
+ // modules image doesn't have "jre" subdirectory
+ len = strlen(buf);
++ assert(len < buflen, "Ran out of buffer space");
+ jrelib_p = buf + len;
+ snprintf(jrelib_p, buflen-len, "/jre/lib/%s", cpu_arch);
+ if (0 != access(buf, F_OK)) {
+@@ -2581,7 +2579,7 @@
+ }
+ }
+
+- strcpy(saved_jvm_path, buf);
++ strncpy(saved_jvm_path, buf, MAXPATHLEN);
+ }
+
+
+--- ./hotspot/src/os/windows/vm/os_windows.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/os/windows/vm/os_windows.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1773,27 +1773,28 @@
+ // libjvm.so is installed there (append a fake suffix
+ // hotspot/libjvm.so).
+ char* java_home_var = ::getenv("JAVA_HOME");
+- if (java_home_var != NULL && java_home_var[0] != 0) {
+-
+- strncpy(buf, java_home_var, buflen);
+-
+- // determine if this is a legacy image or modules image
+- // modules image doesn't have "jre" subdirectory
+- size_t len = strlen(buf);
+- char* jrebin_p = buf + len;
+- jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
+- if (0 != _access(buf, 0)) {
+- jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
+- }
+- len = strlen(buf);
+- jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
++ if (java_home_var != NULL && java_home_var[0] != 0 &&
++ strlen(java_home_var) < (size_t)buflen) {
++
++ strncpy(buf, java_home_var, buflen);
++
++ // determine if this is a legacy image or modules image
++ // modules image doesn't have "jre" subdirectory
++ size_t len = strlen(buf);
++ char* jrebin_p = buf + len;
++ jio_snprintf(jrebin_p, buflen-len, "\\jre\\bin\\");
++ if (0 != _access(buf, 0)) {
++ jio_snprintf(jrebin_p, buflen-len, "\\bin\\");
++ }
++ len = strlen(buf);
++ jio_snprintf(buf + len, buflen-len, "hotspot\\jvm.dll");
+ }
+ }
+
+ if(buf[0] == '\0') {
+- GetModuleFileName(vm_lib_handle, buf, buflen);
+- }
+- strcpy(saved_jvm_path, buf);
++ GetModuleFileName(vm_lib_handle, buf, buflen);
++ }
++ strncpy(saved_jvm_path, buf, MAX_PATH);
+ }
+
+
+@@ -2218,17 +2219,6 @@
+ #endif //_WIN64
+
+
+-// Fatal error reporting is single threaded so we can make this a
+-// static and preallocated. If it's more than MAX_PATH silently ignore
+-// it.
+-static char saved_error_file[MAX_PATH] = {0};
+-
+-void os::set_error_file(const char *logfile) {
+- if (strlen(logfile) <= MAX_PATH) {
+- strncpy(saved_error_file, logfile, MAX_PATH);
+- }
+-}
+-
+ static inline void report_error(Thread* t, DWORD exception_code,
+ address addr, void* siginfo, void* context) {
+ VMError err(t, exception_code, addr, siginfo, context);
+--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -961,7 +961,7 @@
+ "Wrong size %u for field's Signature attribute in class file %s",
+ attribute_length, CHECK);
+ }
+- generic_signature_index = cfs->get_u2(CHECK);
++ generic_signature_index = parse_generic_signature_attribute(cp, CHECK);
+ } else if (attribute_name == vmSymbols::tag_runtime_visible_annotations()) {
+ runtime_visible_annotations_length = attribute_length;
+ runtime_visible_annotations = cfs->get_u1_buffer();
+@@ -1698,7 +1698,8 @@
+ }
+
+ // Sift through annotations, looking for those significant to the VM:
+-void ClassFileParser::parse_annotations(u1* buffer, int limit,
++void ClassFileParser::parse_annotations(Handle class_loader,
++ u1* buffer, int limit,
+ constantPoolHandle cp,
+ ClassFileParser::AnnotationCollector* coll,
+ TRAPS) {
+@@ -1736,7 +1737,7 @@
+ }
+
+ // Here is where parsing particular annotations will take place.
+- AnnotationCollector::ID id = coll->annotation_index(aname);
++ AnnotationCollector::ID id = coll->annotation_index(class_loader, is_anonymous(), aname);
+ if (id == AnnotationCollector::_unknown) continue;
+ coll->set_annotation(id);
+ // If there are no values, just set the bit and move on:
+@@ -1765,20 +1766,30 @@
+ }
+ }
+
+-ClassFileParser::AnnotationCollector::ID ClassFileParser::AnnotationCollector::annotation_index(Symbol* name) {
++ClassFileParser::AnnotationCollector::ID ClassFileParser::AnnotationCollector::annotation_index(Handle class_loader,
++ bool is_anonymous,
++ Symbol* name) {
+ vmSymbols::SID sid = vmSymbols::find_sid(name);
++ // Privileged code can use all annotations. Other code silently drops some.
++ const bool privileged = class_loader.is_null() || is_anonymous ||
++ class_loader()->klass()->klass_part()->name() ==
++ vmSymbols::sun_misc_Launcher_ExtClassLoader();
+ switch (sid) {
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_ForceInline_signature):
+ if (_location != _in_method) break; // only allow for methods
++ if (!privileged) break; // only allow in privileged code
+ return _method_ForceInline;
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_DontInline_signature):
+ if (_location != _in_method) break; // only allow for methods
++ if (!privileged) break; // only allow in privileged code
+ return _method_DontInline;
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature):
+ if (_location != _in_method) break; // only allow for methods
++ if (!privileged) break; // only allow in privileged code
+ return _method_LambdaForm_Compiled;
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Hidden_signature):
+ if (_location != _in_method) break; // only allow for methods
++ if (!privileged) break; // only allow in privileged code
+ return _method_LambdaForm_Hidden;
+ default: break;
+ }
+@@ -1818,8 +1829,8 @@
+ // from the method back up to the containing klass. These flag values
+ // are added to klass's access_flags.
+
+-methodHandle ClassFileParser::parse_method(constantPoolHandle cp, bool is_interface,
+- AccessFlags *promoted_flags,
++methodHandle ClassFileParser::parse_method(Handle class_loader, constantPoolHandle cp,
++ bool is_interface, AccessFlags *promoted_flags,
+ typeArrayHandle* method_annotations,
+ typeArrayHandle* method_parameter_annotations,
+ typeArrayHandle* method_default_annotations,
+@@ -2122,13 +2133,12 @@
+ "Invalid Signature attribute length %u in class file %s",
+ method_attribute_length, CHECK_(nullHandle));
+ }
+- cfs->guarantee_more(2, CHECK_(nullHandle)); // generic_signature_index
+- generic_signature_index = cfs->get_u2_fast();
++ generic_signature_index = parse_generic_signature_attribute(cp, CHECK_(nullHandle));
+ } else if (method_attribute_name == vmSymbols::tag_runtime_visible_annotations()) {
+ runtime_visible_annotations_length = method_attribute_length;
+ runtime_visible_annotations = cfs->get_u1_buffer();
+ assert(runtime_visible_annotations != NULL, "null visible annotations");
+- parse_annotations(runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle));
++ parse_annotations(class_loader, runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle));
+ cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle));
+ } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) {
+ runtime_invisible_annotations_length = method_attribute_length;
+@@ -2357,8 +2367,8 @@
+ // from the methods back up to the containing klass. These flag values
+ // are added to klass's access_flags.
+
+-objArrayHandle ClassFileParser::parse_methods(constantPoolHandle cp, bool is_interface,
+- AccessFlags* promoted_flags,
++objArrayHandle ClassFileParser::parse_methods(Handle class_loader, constantPoolHandle cp,
++ bool is_interface, AccessFlags* promoted_flags,
+ bool* has_final_method,
+ objArrayOop* methods_annotations_oop,
+ objArrayOop* methods_parameter_annotations_oop,
+@@ -2381,7 +2391,8 @@
+ objArrayHandle methods_parameter_annotations;
+ objArrayHandle methods_default_annotations;
+ for (int index = 0; index < length; index++) {
+- methodHandle method = parse_method(cp, is_interface,
++ methodHandle method = parse_method(class_loader, cp,
++ is_interface,
+ promoted_flags,
+ &method_annotations,
+ &method_parameter_annotations,
+@@ -2490,6 +2501,17 @@
+ }
+ }
+
++// Parse generic_signature attribute for methods and fields
++u2 ClassFileParser::parse_generic_signature_attribute(constantPoolHandle cp, TRAPS) {
++ ClassFileStream* cfs = stream();
++ cfs->guarantee_more(2, CHECK_0); // generic_signature_index
++ u2 generic_signature_index = cfs->get_u2_fast();
++ check_property(
++ valid_symbol_at(cp, generic_signature_index),
++ "Invalid Signature attribute at constant pool index %u in class file %s",
++ generic_signature_index, CHECK_0);
++ return generic_signature_index;
++}
+
+ void ClassFileParser::parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS) {
+ ClassFileStream* cfs = stream();
+@@ -2654,18 +2676,19 @@
+ ClassFileStream* cfs = stream();
+ u1* current_start = cfs->current();
+
+- cfs->guarantee_more(2, CHECK); // length
+- int attribute_array_length = cfs->get_u2_fast();
+-
+- guarantee_property(_max_bootstrap_specifier_index < attribute_array_length,
+- "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);
+
++ cfs->guarantee_more(attribute_byte_length, CHECK);
++
++ int attribute_array_length = cfs->get_u2_fast();
++
++ guarantee_property(_max_bootstrap_specifier_index < attribute_array_length,
++ "Short length on BootstrapMethods in class file %s",
++ CHECK);
++
+ // The attribute contains a counted array of counted tuples of shorts,
+ // represending bootstrap specifiers:
+ // length*{bootstrap_method_index, argument_count*{argument_index}}
+@@ -2726,7 +2749,8 @@
+ }
+
+
+-void ClassFileParser::parse_classfile_attributes(constantPoolHandle cp,
++void ClassFileParser::parse_classfile_attributes(Handle class_loader,
++ constantPoolHandle cp,
+ ClassFileParser::ClassAnnotationCollector* parsed_annotations,
+ TRAPS) {
+ ClassFileStream* cfs = stream();
+@@ -2809,7 +2833,8 @@
+ runtime_visible_annotations_length = attribute_length;
+ runtime_visible_annotations = cfs->get_u1_buffer();
+ assert(runtime_visible_annotations != NULL, "null visible annotations");
+- parse_annotations(runtime_visible_annotations,
++ parse_annotations(class_loader,
++ runtime_visible_annotations,
+ runtime_visible_annotations_length,
+ cp,
+ parsed_annotations,
+@@ -3172,7 +3197,8 @@
+ objArrayOop methods_annotations_oop = NULL;
+ objArrayOop methods_parameter_annotations_oop = NULL;
+ objArrayOop methods_default_annotations_oop = NULL;
+- objArrayHandle methods = parse_methods(cp, access_flags.is_interface(),
++ objArrayHandle methods = parse_methods(class_loader, cp,
++ access_flags.is_interface(),
+ &promoted_flags,
+ &has_final_method,
+ &methods_annotations_oop,
+@@ -3186,7 +3212,7 @@
+
+ // Additional attributes
+ ClassAnnotationCollector parsed_annotations;
+- parse_classfile_attributes(cp, &parsed_annotations, CHECK_(nullHandle));
++ parse_classfile_attributes(class_loader, cp, &parsed_annotations, CHECK_(nullHandle));
+
+ // Make sure this is the end of class file stream
+ guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle));
+--- ./hotspot/src/share/vm/classfile/classFileParser.hpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jun 25 09:01:56 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
+@@ -102,7 +102,7 @@
+ assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, "");
+ }
+ // If this annotation name has an ID, report it (or _none).
+- ID annotation_index(Symbol* name);
++ ID annotation_index(Handle class_loader, bool is_anonymous, Symbol* name);
+ // Set the annotation name:
+ void set_annotation(ID id) {
+ assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob");
+@@ -169,14 +169,14 @@
+ u2* java_fields_count_ptr, TRAPS);
+
+ // Method parsing
+- methodHandle parse_method(constantPoolHandle cp, bool is_interface,
+- AccessFlags* promoted_flags,
++ methodHandle parse_method(Handle class_loader, constantPoolHandle cp,
++ bool is_interface, AccessFlags* promoted_flags,
+ typeArrayHandle* method_annotations,
+ typeArrayHandle* method_parameter_annotations,
+ typeArrayHandle* method_default_annotations,
+ TRAPS);
+- objArrayHandle parse_methods (constantPoolHandle cp, bool is_interface,
+- AccessFlags* promoted_flags,
++ objArrayHandle parse_methods (Handle class_loader, constantPoolHandle cp,
++ bool is_interface, AccessFlags* promoted_flags,
+ bool* has_final_method,
+ objArrayOop* methods_annotations_oop,
+ objArrayOop* methods_parameter_annotations_oop,
+@@ -202,6 +202,7 @@
+ typeArrayOop parse_stackmap_table(u4 code_attribute_length, TRAPS);
+
+ // Classfile attribute parsing
++ u2 parse_generic_signature_attribute(constantPoolHandle cp, TRAPS);
+ void parse_classfile_sourcefile_attribute(constantPoolHandle cp, TRAPS);
+ void parse_classfile_source_debug_extension_attribute(constantPoolHandle cp, int length, TRAPS);
+ u2 parse_classfile_inner_classes_attribute(u1* inner_classes_attribute_start,
+@@ -210,7 +211,8 @@
+ u2 enclosing_method_method_index,
+ constantPoolHandle cp,
+ TRAPS);
+- void parse_classfile_attributes(constantPoolHandle cp,
++ void parse_classfile_attributes(Handle class_loader,
++ constantPoolHandle cp,
+ ClassAnnotationCollector* parsed_annotations,
+ TRAPS);
+ void parse_classfile_synthetic_attribute(constantPoolHandle cp, TRAPS);
+@@ -224,7 +226,7 @@
+ int runtime_invisible_annotations_length, TRAPS);
+ int skip_annotation(u1* buffer, int limit, int index);
+ int skip_annotation_value(u1* buffer, int limit, int index);
+- void parse_annotations(u1* buffer, int limit, constantPoolHandle cp,
++ void parse_annotations(Handle class_loader, u1* buffer, int limit, constantPoolHandle cp,
+ /* Results (currently, only one result is supported): */
+ AnnotationCollector* result,
+ TRAPS);
+@@ -335,6 +337,12 @@
+ : cp->tag_at(index).is_klass_reference());
+ }
+
++ // Checks that the cpool index is in range and is a utf8
++ bool valid_symbol_at(constantPoolHandle cp, int cpool_index) {
++ return (cp->is_within_bounds(cpool_index) &&
++ cp->tag_at(cpool_index).is_utf8());
++ }
++
+ public:
+ // Constructor
+ ClassFileParser(ClassFileStream* st) { set_stream(st); }
+--- ./hotspot/src/share/vm/classfile/stackMapTable.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/classfile/stackMapTable.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -134,6 +134,7 @@
+ }
+ // check if uninitialized objects exist on backward branches
+ check_new_object(frame, target, CHECK_VERIFY(frame->verifier()));
++ frame->verifier()->update_furthest_jump(target);
+ }
+
+ void StackMapTable::check_new_object(
+--- ./hotspot/src/share/vm/classfile/verifier.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/classfile/verifier.cpp Wed Jun 25 09:01:56 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
+@@ -629,6 +629,9 @@
+ bool no_control_flow = false; // Set to true when there is no direct control
+ // flow from current instruction to the next
+ // instruction in sequence
++
++ set_furthest_jump(0);
++
+ Bytecodes::Code opcode;
+ while (!bcs.is_last_bytecode()) {
+ // Check for recursive re-verification before each bytecode.
+@@ -2239,6 +2242,29 @@
+ "Bad <init> method call");
+ return;
+ }
++
++ // Make sure that this call is not jumped over.
++ if (bci < furthest_jump()) {
++ verify_error(ErrorContext::bad_code(bci),
++ "Bad <init> method call from inside of a branch");
++ return;
++ }
++
++ // Make sure that this call is not done from within a TRY block because
++ // that can result in returning an incomplete object. Simply checking
++ // (bci >= start_pc) also ensures that this call is not done after a TRY
++ // block. That is also illegal because this call must be the first Java
++ // statement in the constructor.
++ ExceptionTable exhandlers(_method());
++ int exlength = exhandlers.length();
++ for(int i = 0; i < exlength; i++) {
++ if (bci >= exhandlers.start_pc(i)) {
++ verify_error(ErrorContext::bad_code(bci),
++ "Bad <init> method call from after the start of a try block");
++ return;
++ }
++ }
++
+ current_frame->initialize_object(type, current_type());
+ *this_uninit = true;
+ } else if (type.is_uninitialized()) {
+@@ -2275,6 +2301,11 @@
+ methodOop m = instanceKlass::cast(ref_klass)->uncached_lookup_method(
+ vmSymbols::object_initializer_name(),
+ cp->signature_ref_at(bcs->get_index_u2()));
++ if (m == NULL) {
++ verify_error(ErrorContext::bad_code(bci),
++ "Call to missing <init> method");
++ return;
++ }
+ instanceKlassHandle mh(THREAD, m->method_holder());
+ if (m->is_protected() && !mh->is_same_class_package(_klass())) {
+ bool assignable = current_type().is_assignable_from(
+--- ./hotspot/src/share/vm/classfile/verifier.hpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/classfile/verifier.hpp Wed Jun 25 09:01:56 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
+@@ -256,6 +256,9 @@
+
+ ErrorContext _error_context; // contains information about an error
+
++ // Used to detect illegal jumps over calls to super() and this() in ctors.
++ int32_t _furthest_jump;
++
+ void verify_method(methodHandle method, TRAPS);
+ char* generate_code_data(methodHandle m, u4 code_length, TRAPS);
+ void verify_exception_handler_table(u4 code_length, char* code_data,
+@@ -398,6 +401,20 @@
+ Symbol* create_temporary_symbol(const char *s, int length, TRAPS);
+
+ TypeOrigin ref_ctx(const char* str, TRAPS);
++
++ // Keep track of the furthest branch done in a method to make sure that
++ // there are no branches over calls to super() or this() from inside of
++ // a constructor.
++ int32_t furthest_jump() { return _furthest_jump; }
++
++ void set_furthest_jump(int32_t target) {
++ _furthest_jump = target;
++ }
++
++ void update_furthest_jump(int32_t target) {
++ if (target > _furthest_jump) _furthest_jump = target;
++ }
++
+ };
+
+ inline int ClassVerifier::change_sig_to_verificationType(
+--- ./hotspot/src/share/vm/compiler/compileBroker.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/compiler/compileBroker.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1999, 2012, 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
+@@ -1921,6 +1921,7 @@
+ ResourceMark rm;
+ char* method_name = method->name()->as_C_string();
+ strncpy(_last_method_compiled, method_name, CompileBroker::name_buffer_length);
++ _last_method_compiled[CompileBroker::name_buffer_length - 1] = '\0'; // ensure null terminated
+ char current_method[CompilerCounters::cmname_buffer_length];
+ size_t maxLen = CompilerCounters::cmname_buffer_length;
+
+--- ./hotspot/src/share/vm/oops/klassVtable.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/oops/klassVtable.cpp Wed Jun 25 09:01:56 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
+@@ -209,6 +209,17 @@
+ // For bytecodes not produced by javac together it is possible that a method does not override
+ // the superclass's method, but might indirectly override a super-super class's vtable entry
+ // If none found, return a null superk, else return the superk of the method this does override
++// For public and protected methods: if they override a superclass, they will
++// also be overridden themselves appropriately.
++// Private methods do not override and are not overridden.
++// Package Private methods are trickier:
++// e.g. P1.A, pub m
++// P2.B extends A, package private m
++// P1.C extends B, public m
++// P1.C.m needs to override P1.A.m and can not override P2.B.m
++// Therefore: all package private methods need their own vtable entries for
++// them to be the root of an inheritance overriding decision
++// Package private methods may also override other vtable entries
+ instanceKlass* klassVtable::find_transitive_override(instanceKlass* initialsuper, methodHandle target_method,
+ int vtable_index, Handle target_loader, Symbol* target_classname, Thread * THREAD) {
+ instanceKlass* superk = initialsuper;
+@@ -310,8 +321,12 @@
+ ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION)
+ && ((super_klass = find_transitive_override(super_klass, target_method, i, target_loader,
+ target_classname, THREAD)) != (instanceKlass*)NULL))) {
+- // overriding, so no new entry
+- allocate_new = false;
++
++ // Package private methods always need a new entry to root their own
++ // overriding. They may also override other methods.
++ if (!target_method()->is_package_private()) {
++ allocate_new = false;
++ }
+
+ if (checkconstraints) {
+ // Override vtable entry if passes loader constraint check
+@@ -433,6 +448,12 @@
+ return true;
+ }
+
++ // Package private methods always need a new entry to root their own
++ // overriding. This allows transitive overriding to work.
++ if (target_method()->is_package_private()) {
++ return true;
++ }
++
+ // search through the super class hierarchy to see if we need
+ // a new entry
+ ResourceMark rm;
+--- ./hotspot/src/share/vm/opto/graphKit.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/opto/graphKit.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1120,6 +1120,17 @@
+ }
+ return _gvn.transform( new (C) ConvI2LNode(offset));
+ }
++
++Node* GraphKit::ConvI2UL(Node* offset) {
++ juint offset_con = (juint) find_int_con(offset, Type::OffsetBot);
++ if (offset_con != (juint) Type::OffsetBot) {
++ return longcon((julong) offset_con);
++ }
++ Node* conv = _gvn.transform( new (C) ConvI2LNode(offset));
++ Node* mask = _gvn.transform( ConLNode::make(C, (julong) max_juint) );
++ return _gvn.transform( new (C) AndLNode(conv, mask) );
++}
++
+ Node* GraphKit::ConvL2I(Node* offset) {
+ // short-circuit a common case
+ jlong offset_con = find_long_con(offset, (jlong)Type::OffsetBot);
+--- ./hotspot/src/share/vm/opto/graphKit.hpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/opto/graphKit.hpp Wed Jun 25 09:01:56 2014 -0700
+@@ -338,6 +338,7 @@
+ // Convert between int and long, and size_t.
+ // (See macros ConvI2X, etc., in type.hpp for ConvI2X, etc.)
+ Node* ConvI2L(Node* offset);
++ Node* ConvI2UL(Node* offset);
+ Node* ConvL2I(Node* offset);
+ // Find out the klass of an object.
+ Node* load_object_klass(Node* object);
+--- ./hotspot/src/share/vm/opto/library_call.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/opto/library_call.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -2432,7 +2432,7 @@
+ case T_ADDRESS:
+ // Cast to an int type.
+ p = _gvn.transform(new (C) CastP2XNode(NULL, p));
+- p = ConvX2L(p);
++ p = ConvX2UL(p);
+ break;
+ default:
+ fatal(err_msg_res("unexpected type %d: %s", type, type2name(type)));
+--- ./hotspot/src/share/vm/opto/type.hpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/opto/type.hpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1348,6 +1348,7 @@
+ #define ConvL2X(x) (x)
+ #define ConvX2I(x) ConvL2I(x)
+ #define ConvX2L(x) (x)
++#define ConvX2UL(x) (x)
+
+ #else
+
+@@ -1392,6 +1393,7 @@
+ #define ConvL2X(x) ConvL2I(x)
+ #define ConvX2I(x) (x)
+ #define ConvX2L(x) ConvI2L(x)
++#define ConvX2UL(x) ConvI2UL(x)
+
+ #endif
+
+--- ./hotspot/src/share/vm/runtime/os.hpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/runtime/os.hpp Wed Jun 25 09:01:56 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
+@@ -460,9 +460,6 @@
+ // run cmd in a separate process and return its exit code; or -1 on failures
+ static int fork_and_exec(char *cmd);
+
+- // Set file to send error reports.
+- static void set_error_file(const char *logfile);
+-
+ // os::exit() is merged with vm_exit()
+ // static void exit(int num);
+
+--- ./hotspot/src/share/vm/utilities/events.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/utilities/events.cpp Wed Jun 25 09:01:56 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
+@@ -93,7 +93,7 @@
+ va_start(ap, format);
+ // Save a copy of begin message and log it.
+ _buffer.printv(format, ap);
+- Events::log(NULL, _buffer);
++ Events::log(NULL, "%s", (const char*)_buffer);
+ va_end(ap);
+ }
+ }
+@@ -102,6 +102,6 @@
+ if (LogEvents) {
+ // Append " done" to the begin message and log it
+ _buffer.append(" done");
+- Events::log(NULL, _buffer);
++ Events::log(NULL, "%s", (const char*)_buffer);
+ }
+ }
+--- ./hotspot/src/share/vm/utilities/vmError.cpp Wed May 07 19:26:16 2014 -0700
++++ ./hotspot/src/share/vm/utilities/vmError.cpp Wed Jun 25 09:01:56 2014 -0700
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -951,7 +951,6 @@
+ if (fd != -1) {
+ out.print_raw("# An error report file with more information is saved as:\n# ");
+ out.print_raw_cr(buffer);
+- os::set_error_file(buffer);
+
+ log.set_fd(fd);
+ } else {
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./hotspot/test/compiler/6653795/UnsafeGetAddressTest.java Wed Jun 25 09:01:56 2014 -0700
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++/*
++ * @test
++ * @bug 6653795
++ * @summary C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems
++ * @run main UnsafeGetAddressTest
++ *
++ */
++
++import sun.misc.Unsafe;
++import java.lang.reflect.*;
++
++public class UnsafeGetAddressTest {
++ private static Unsafe unsafe;
++
++ public static void main(String[] args) throws Exception {
++ Class c = UnsafeGetAddressTest.class.getClassLoader().loadClass("sun.misc.Unsafe");
++ Field f = c.getDeclaredField("theUnsafe");
++ f.setAccessible(true);
++ unsafe = (Unsafe)f.get(c);
++
++ long address = unsafe.allocateMemory(unsafe.addressSize());
++ unsafe.putAddress(address, 0x0000000080000000L);
++ // from sun.misc.Unsafe.getAddress' documentation:
++ // "If the native pointer is less than 64 bits wide, it is
++ // extended as an unsigned number to a Java long."
++ result = unsafe.getAddress(address);
++ System.out.printf("1: was 0x%x, expected 0x%x\n", result,
++ 0x0000000080000000L);
++ for (int i = 0; i < 1000000; i++) {
++ result = unsafe.getAddress(address);
++ }
++
++ // The code has got compiled, check the result now
++ System.out.printf("2: was 0x%x, expected 0x%x\n", result,
++ 0x0000000080000000L);
++ if (result != 0x0000000080000000L) {
++ System.out.println("Test Failed");
++ System.exit(97);
++ } else {
++ System.out.println("Test Passed");
++ }
++ }
++ static volatile long result;
++}
++
+--- ./jaxp/.hgtags Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/.hgtags Wed Jun 25 09:03:02 2014 -0700
+@@ -408,6 +408,7 @@
+ 8275dc4db7f852edb331ae48d663d08b9ab2b5c7 jdk7u55-b02
+ 381e73f93a83e8d3bfd7dbf79f4f363a8fd6442f jdk7u55-b03
+ c72c57f71c2ba6362d9ccfbf4743947b9ecefcac jdk7u55-b04
++5592b0c44617022e3c136eedfa1e98d4f254c964 jdk7u65-b00
+ 5592b0c44617022e3c136eedfa1e98d4f254c964 jdk7u55-b05
+ c59d714090080ad2e06f0ca5e8d354403059d8ce jdk7u55-b06
+ 125ea54089add3a16898b801a9989bf6cca05da6 jdk7u55-b07
+@@ -421,6 +422,11 @@
+ 01f26830f88cf4f10897416fe1f4f372efcdecf5 jdk7u55-b30
+ 26187a65c765b3177f1b7ff0638259bf66f9ec47 jdk7u55-b14
+ 5be97f6c25d9eb3ef0a05fc860964cb3d27134b0 jdk7u55-b31
++94f3ad704f28d5ec65f7a3b1cbf5cfe7e42151f3 jdk7u55-b32
++476aad2c130e2b1b7033fa6789754c03151da95c jdk7u55-b33
++32aa4a5892b0567b19da2bc5b72aa3f3a3398130 jdk7u55-b34
++1f8449a6e05ee0a495ba89c3b4021b46f641ff40 jdk7u55-b35
++7767e8740aea3283703e634ffdbfccd0fbebe82d jdk7u55-b36
+ d9b92749a0f4c8e6c6f4fe11210c2a02d70bae74 jdk7u60-b00
+ ad39e88c503948fc4fc01e97c75b6e3c24599d23 jdk7u60-b01
+ 050986fd54e3ec4515032ee938bc59e86772b6c0 jdk7u60-b02
+@@ -438,6 +444,28 @@
+ 2814f43a6c73414dcb2b799e1a52d5b44688590d jdk7u60-b14
+ 10eed57b66336660f71f7524f2283478bdf373dc jdk7u60-b15
+ fefd2d5c524b0be78876d9b98d926abda2828e79 jdk7u60-b16
++ba6b0b5dfe5a0f50fac95c488c8a5400ea07d4f8 jdk7u60-b17
+ ba6b0b5dfe5a0f50fac95c488c8a5400ea07d4f8 jdk7u60-b18
+-ba6b0b5dfe5a0f50fac95c488c8a5400ea07d4f8 jdk7u60-b17
++dd5a398eedc7031a4fb8682bc423e787db465c9e jdk7u65-b01
+ 581752d32aebea959fec84e8ae692e1f63d2c4a8 jdk7u60-b19
++cef2dec8b5d76555c5b7b2e1a62275206f76a07a jdk7u60-b30
++bfa8403a1e28bdc1e94ba61d89e170e4ccc7d58b jdk7u60-b31
++33a8a292a02aa76139d0d04970a0d87cc674f2e3 jdk7u60-b32
++583c5eeb9f31275121aecca60307b8885a1a80d0 jdk7u60-b33
++27909f138bdb9ffdd2ab4bded231c7ccc2264046 jdk7u65-b02
++b3307181bd0f1a2c6e1e2c403b87a76e34452110 jdk7u65-b03
++efa9425faaf402b7ea9c6226eb08236d8fa1ff2b jdk7u65-b04
++319df7bff5bf7a9c2d659dd9021b918e729fa56f jdk7u65-b05
++5fd236e2f1bbc09349858f9c56dd223b6d6f21f6 jdk7u65-b06
++e1ae0b54e22200f2d67de39f6a16899ad4a1e574 jdk7u65-b07
++86e93799766d67102a37559b3831abcc825d7e24 jdk7u65-b08
++e24ee8ca453937c11be2fdbab0b4244aa7ec22bd jdk7u65-b09
++6c20039a2e0104f30697e22dc06fe83ff7a43d39 jdk7u65-b10
++50625e7c71b9b1d31bb901aec66366cacc239b3b jdk7u65-b11
++b56b145c3d85b649188a40a91106005a3ebfcf2b jdk7u65-b12
++3a8933cb0219594b72c797732768070fa23c491e jdk7u65-b13
++ddb29a56b839563502b9f80deca5d6064641f1d7 jdk7u65-b14
++708c636721447ebf679c2c754cb36a503c6177b8 jdk7u65-b15
++a34a9f6740955e1cd844c5b701d76dbe7290913a jdk7u65-b16
++178512d1bd9caf56d61811ad0d4b4269475407aa jdk7u65-b17
++be897d0fd2a0b5f43b0d0e48075e5b070ca584d4 jdk7u65-b30
+--- ./jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xalan/internal/XalanConstants.java Wed Jun 25 09:03:02 2014 -0700
+@@ -91,6 +91,13 @@
+ */
+ public static final String JDK_XML_NAME_LIMIT =
+ ORACLE_JAXP_PROPERTY_PREFIX + "maxXMLNameLimit";
++
++ /**
++ * JDK maxElementDepth limit
++ */
++ public static final String JDK_MAX_ELEMENT_DEPTH =
++ ORACLE_JAXP_PROPERTY_PREFIX + "maxElementDepth";
++
+ /**
+ * JDK property indicating whether the parser shall print out entity
+ * count information
+@@ -139,6 +146,11 @@
+ */
+ public static final String SP_XML_NAME_LIMIT = "jdk.xml.maxXMLNameLimit";
+
++ /**
++ * JDK maxElementDepth limit
++ */
++ public static final String SP_MAX_ELEMENT_DEPTH = "jdk.xml.maxElementDepth";
++
+ //legacy System Properties
+ public final static String ENTITY_EXPANSION_LIMIT = "entityExpansionLimit";
+ public static final String ELEMENT_ATTRIBUTE_LIMIT = "elementAttributeLimit" ;
+--- ./jaxp/src/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java Wed Jun 25 09:03:02 2014 -0700
+@@ -76,7 +76,9 @@
+ GENEAL_ENTITY_SIZE_LIMIT(XalanConstants.JDK_GENEAL_ENTITY_SIZE_LIMIT,
+ XalanConstants.SP_GENEAL_ENTITY_SIZE_LIMIT, 0, 0),
+ PARAMETER_ENTITY_SIZE_LIMIT(XalanConstants.JDK_PARAMETER_ENTITY_SIZE_LIMIT,
+- XalanConstants.SP_PARAMETER_ENTITY_SIZE_LIMIT, 0, 1000000);
++ XalanConstants.SP_PARAMETER_ENTITY_SIZE_LIMIT, 0, 1000000),
++ MAX_ELEMENT_DEPTH_LIMIT(XalanConstants.JDK_MAX_ELEMENT_DEPTH,
++ XalanConstants.SP_MAX_ELEMENT_DEPTH, 0, 0);
+
+ final String apiProperty;
+ final String systemProperty;
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/Constants.java Wed Jun 25 09:03:02 2014 -0700
+@@ -252,6 +252,13 @@
+ */
+ public static final String JDK_XML_NAME_LIMIT =
+ ORACLE_JAXP_PROPERTY_PREFIX + "maxXMLNameLimit";
++
++ /**
++ * JDK maxElementDepth limit
++ */
++ public static final String JDK_MAX_ELEMENT_DEPTH =
++ ORACLE_JAXP_PROPERTY_PREFIX + "maxElementDepth";
++
+ /**
+ * JDK property to allow printing out information from the limit analyzer
+ */
+@@ -297,6 +304,11 @@
+ */
+ public static final String SP_XML_NAME_LIMIT = "jdk.xml.maxXMLNameLimit";
+
++ /**
++ * JDK maxElementDepth limit
++ */
++ public static final String SP_MAX_ELEMENT_DEPTH = "jdk.xml.maxElementDepth";
++
+ //legacy System Properties
+ public final static String ENTITY_EXPANSION_LIMIT = "entityExpansionLimit";
+ public static final String ELEMENT_ATTRIBUTE_LIMIT = "elementAttributeLimit" ;
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Wed Jun 25 09:03:02 2014 -0700
+@@ -1309,6 +1309,7 @@
+
+ fAttributes.removeAllAttributes();
+
++ checkDepth(rawname);
+ if(!seekCloseOfStartTag()){
+ fReadingAttributes = true;
+ fAttributeCacheUsedCount =0;
+@@ -1913,6 +1914,21 @@
+ // utility methods
+
+ /**
++ * Check if the depth exceeds the maxElementDepth limit
++ * @param elementName name of the current element
++ */
++ void checkDepth(String elementName) {
++ fLimitAnalyzer.addValue(Limit.MAX_ELEMENT_DEPTH_LIMIT, elementName, fElementStack.fDepth);
++ if (fSecurityManager.isOverLimit(Limit.MAX_ELEMENT_DEPTH_LIMIT,fLimitAnalyzer)) {
++ fSecurityManager.debugPrint(fLimitAnalyzer);
++ reportFatalError("MaxElementDepthLimit", new Object[]{elementName,
++ fLimitAnalyzer.getTotalValue(Limit.MAX_ELEMENT_DEPTH_LIMIT),
++ fSecurityManager.getLimit(Limit.MAX_ELEMENT_DEPTH_LIMIT),
++ "maxElementDepth"});
++ }
++ }
++
++ /**
+ * Calls document handler with a single character resulting from
+ * built-in entity resolution.
+ *
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLNSDocumentScannerImpl.java Wed Jun 25 09:03:02 2014 -0700
+@@ -220,6 +220,7 @@
+ fCurrentElement = fElementQName;
+
+ String rawname = fElementQName.rawname;
++ checkDepth(rawname);
+ if (fBindNamespaces) {
+ fNamespaceContext.pushContext();
+ if (fScannerState == SCANNER_STATE_ROOT_ELEMENT) {
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -299,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: The length of entity \"{0}\" is \"{1}\" that exceeds the \"{2}\" limit set by \"{3}\".
+ TotalEntitySizeLimit=JAXP00010004: The accumulated size \"{0}\" of entities exceeded the \"{1}\" limit set by \"{2}\".
+ MaxXMLNameLimit=JAXP00010005: The name \"{0}\" exceeded the \"{1}\" limit set by \"{2}\".
++ MaxElementDepthLimit=JAXP00010006: The element \"{0}\" has a depth of \"{1}\" that exceeds the limit \"{2}\" set by \"{3}\".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -276,7 +251,7 @@
+ NMTOKENInvalid = Attributwert "{0}" mit dem Typ NMTOKEN muss ein Namenstoken sein.
+ NMTOKENSInvalid = Attributwert "{0}" mit dem Typ NMTOKENS muss mindestens ein Namenstoken sein.
+ NoNotationOnEmptyElement = Elementtyp "{0}", der als EMPTY deklariert wurde, kann nicht das Attribut "{1}" mit dem Typ NOTATION deklarieren.
+- RootElementTypeMustMatchDoctypedecl = Dokument-Root-Element "{1}"muss mit DOCTYPE-Root "{0}" \u00FCbereinstimmen.
++ RootElementTypeMustMatchDoctypedecl = Document Root-Element "{1}"muss mit DOCTYPE-Root "{0}" \u00FCbereinstimmen.
+ UndeclaredElementInContentSpec = Contentmodell des Elements "{0}" verweist auf das nicht deklarierte Element "{1}".
+ UniqueNotationName = Deklaration f\u00FCr die Notation "{0}" ist nicht eindeutig. Ein jeweiliger Name darf nicht in mehreren Notationsdeklarationen deklariert werden.
+ ENTITYFailedInitializeGrammar = ENTITYDatatype-Validator: Nicht erfolgreich. Initialisierungsmethode muss mit einer g\u00FCltigen Grammatikreferenz aufgerufen werden. \t
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: Die L\u00E4nge von Entit\u00E4t "{0}" ist "{1}" und \u00FCberschreitet den Grenzwert "{2}", der von "{3}" festgelegt wurde.
+ TotalEntitySizeLimit=JAXP00010004: Die akkumulierte Gr\u00F6\u00DFe "{0}" der Entit\u00E4ten \u00FCberschreitet den Grenzwert "{1}", der von "{2}" festgelegt wurde.
+ MaxXMLNameLimit=JAXP00010005: Der Name "{0}" \u00FCberschreitet den Grenzwert "{1}", der von "{2}" festgelegt wurde.
++ MaxElementDepthLimit=JAXP00010006: Die Tiefe von Element "{0}" ist "{1}" und \u00FCberschreitet den Grenzwert "{2}", der von "{3}" festgelegt wurde.
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_es.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_es.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: la longitud de la entidad "{0}" es "{1}", que excede el l\u00EDmite de "{2}" que ha definido "{3}".
+ TotalEntitySizeLimit=JAXP00010004: el tama\u00F1o acumulado "{0}" de las entidades ha excedido el l\u00EDmite de "{1}" que ha definido "{2}".
+ MaxXMLNameLimit=JAXP00010005: el nombre "{0}" ha excedido el l\u00EDmite de "{1}" que ha definido "{2}".
++ MaxElementDepthLimit=JAXP00010006: El elemento "{0}" tiene una profundidad de "{1}" que excede el l\u00EDmite "{2}" definido por "{3}".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_fr.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_fr.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003 : La longueur de l''entit\u00E9 "{0}" est de "{1}". Cette valeur d\u00E9passe la limite de "{2}" d\u00E9finie par "{3}".
+ TotalEntitySizeLimit=JAXP00010004 : La taille cumul\u00E9e des entit\u00E9s ("{0}") d\u00E9passe la limite de "{1}" d\u00E9finie par "{2}".
+ MaxXMLNameLimit=JAXP00010005 : le nom "{0}" d\u00E9passe la limite de "{1}" d\u00E9finie par "{2}".
++ MaxElementDepthLimit=JAXP00010006 : l''\u00E9l\u00E9ment "{0}" a une profondeur de "{1}" qui d\u00E9passe la limite de "{2}" d\u00E9finie par "{3}".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_it.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_it.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: la lunghezza dell''entit\u00E0 "{0}" \u00E8 "{1}". Tale valore supera il limite "{2}" definito da "{3}".
+ TotalEntitySizeLimit=JAXP00010004: le dimensioni accumulate "{0}" delle entit\u00E0 supera il limite "{1}" definito da "{2}".
+ MaxXMLNameLimit=JAXP00010005: il nome "{0}" supera il limite "{1}" definito da "{2}".
++ MaxElementDepthLimit=JAXP00010006: la profondit\u00E0 dell''elemento "{0}" \u00E8 "{1}". Tale valore supera il limite "{2}" definito da "{3}".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ja.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,27 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -146,7 +122,7 @@
+ ExpectedByte = {1}\u30D0\u30A4\u30C8\u306EUTF-8\u30B7\u30FC\u30B1\u30F3\u30B9\u306E\u30D0\u30A4\u30C8{0}\u304C\u5FC5\u8981\u3067\u3059\u3002
+ InvalidHighSurrogate = UTF-8\u30B7\u30FC\u30B1\u30F3\u30B9\u306E\u4E0A\u4F4D\u30B5\u30ED\u30B2\u30FC\u30C8\u30FB\u30D3\u30C3\u30C8\u306E\u4E0A\u9650\u306F0x10\u3067\u3059\u304C\u30010x{0}\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F\u3002
+ OperationNotSupported = \u64CD\u4F5C"{0}"\u306F{1}\u30EA\u30FC\u30C0\u30FC\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
+- InvalidASCII = \u30D0\u30A4\u30C8"{0}"\u306F\u3001(7\u30D3\u30C3\u30C8) ASCII\u30AD\u30E3\u30E9\u30AF\u30BF\u30FB\u30BB\u30C3\u30C8\u306E\u30E1\u30F3\u30D0\u30FC\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002
++ InvalidASCII = \u30D0\u30A4\u30C8"{0}"\u306F\u3001(7\u30D3\u30C3\u30C8) ASCII\u6587\u5B57\u30BB\u30C3\u30C8\u306E\u30E1\u30F3\u30D0\u30FC\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002
+ CharConversionFailure = \u7279\u5B9A\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u3067\u3042\u308B\u3068\u78BA\u5B9A\u3055\u308C\u305F\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u306B\u306F\u3001\u305D\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u3067\u4E0D\u6B63\u306A\u30B7\u30FC\u30B1\u30F3\u30B9\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
+
+ # DTD Messages
+@@ -323,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: \u30A8\u30F3\u30C6\u30A3\u30C6\u30A3"{0}"\u306E\u9577\u3055\u306F"{1}"\u3067\u3001"{3}"\u3067\u8A2D\u5B9A\u3055\u308C\u305F\u5236\u9650"{2}"\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002
+ TotalEntitySizeLimit=JAXP00010004: \u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u306E\u7D2F\u7A4D\u30B5\u30A4\u30BA"{0}"\u306F\u3001"{2}"\u3067\u8A2D\u5B9A\u3055\u308C\u305F\u5236\u9650"{1}"\u3092\u8D85\u3048\u307E\u3057\u305F\u3002
+ MaxXMLNameLimit=JAXP00010005: \u540D\u524D"{0}"\u306F\u3001"{2}"\u3067\u8A2D\u5B9A\u3055\u308C\u305F\u5236\u9650"{1}"\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002
++ MaxElementDepthLimit=JAXP00010006: \u8981\u7D20"{0}"\u306E\u6DF1\u3055\u306F"{1}"\u3067\u3001"{3}"\u3067\u8A2D\u5B9A\u3055\u308C\u305F\u5236\u9650"{2}"\u3092\u8D85\u3048\u3066\u3044\u307E\u3059\u3002
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ko.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_ko.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: "{0}" \uC5D4\uD2F0\uD2F0\uC758 \uAE38\uC774\uAC00 "{3}"\uC5D0\uC11C \uC124\uC815\uB41C "{2}" \uC81C\uD55C\uC744 \uCD08\uACFC\uD558\uB294 "{1}"\uC785\uB2C8\uB2E4.
+ TotalEntitySizeLimit=JAXP00010004: \uC5D4\uD2F0\uD2F0\uC758 \uB204\uC801 \uD06C\uAE30 "{0}"\uC774(\uAC00) "{2}"\uC5D0\uC11C \uC124\uC815\uB41C "{1}" \uC81C\uD55C\uC744 \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.
+ MaxXMLNameLimit=JAXP00010005: "{0}" \uC774\uB984\uC774 "{2}"\uC5D0\uC11C \uC124\uC815\uB41C "{1}" \uC81C\uD55C\uC744 \uCD08\uACFC\uD588\uC2B5\uB2C8\uB2E4.
++ MaxElementDepthLimit=JAXP00010006: "{0}" \uC694\uC18C\uC758 \uAE4A\uC774\uAC00 "{3}"\uC5D0\uC11C \uC124\uC815\uB41C "{2}" \uC81C\uD55C\uC744 \uCD08\uACFC\uD558\uB294 "{1}"\uC785\uB2C8\uB2E4.
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_pt_BR.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_pt_BR.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -154,7 +129,7 @@
+ # 2.2 Characters
+ InvalidCharInEntityValue = Um caractere XML inv\u00E1lido (Unicode: 0x {0}) foi encontrado no valor da entidade da literal.
+ InvalidCharInExternalSubset = Um caractere XML inv\u00E1lido (Unicode: 0x {0}) foi encontrado no subconjunto externo do DTD.
+- InvalidCharInIgnoreSect = Um caractere XML inv\u00E1lido (Unicode: 0x{0}) foi encontrado na se\u00E7\u00E3o condicional deletada.
++ InvalidCharInIgnoreSect = Um caractere XML inv\u00E1lido (Unicode: 0x{0}) foi encontrado na se\u00E7\u00E3o condicional exclu\u00EDda.
+ InvalidCharInPublicID = Um caractere XML inv\u00E1lido (Unicode: 0x{0}) foi encontrado no identificador p\u00FAblico.
+ InvalidCharInSystemID = Um caractere XML inv\u00E1lido (Unicode: 0x{0}) foi encontrado no identificador do sistema.
+ # 2.3 Common Syntactic Constructs
+@@ -173,7 +148,7 @@
+ PEReferenceWithinMarkup = A refer\u00EAncia da entidade do par\u00E2metro "%{0};" n\u00E3o pode ocorrer na marca\u00E7\u00E3o no subconjunto interno do DTD.
+ MSG_MARKUP_NOT_RECOGNIZED_IN_DTD = As declara\u00E7\u00F5es de marca\u00E7\u00E3o contidas ou apontadas pela declara\u00E7\u00E3o do tipo de documento devem estar corretas.
+ # 2.10 White Space Handling
+- MSG_XML_SPACE_DECLARATION_ILLEGAL = Deve ser fornecida a declara\u00E7\u00E3o do atributo para "xml:space" como um tipo enumerado, cujo os \u00FAnicos valores poss\u00EDveis s\u00E3o "default" e "preserve".
++ MSG_XML_SPACE_DECLARATION_ILLEGAL = Deve ser fornecida a declara\u00E7\u00E3o do atributo para "xml:space" como um tipo enumerado, cujo os \u00FAnicos valores poss\u00EDveis s\u00E3o "padr\u00E3o" e "preserve".
+ # 3.2 Element Type Declarations
+ MSG_SPACE_REQUIRED_BEFORE_ELEMENT_TYPE_IN_ELEMENTDECL = O espa\u00E7o em branco \u00E9 necess\u00E1rio ap\u00F3s "<!ELEMENT" na declara\u00E7\u00E3o do tipo de elemento.
+ MSG_ELEMENT_TYPE_REQUIRED_IN_ELEMENTDECL = O tipo de elemento \u00E9 necess\u00E1rio na declara\u00E7\u00E3o do tipo de elemento.
+@@ -194,7 +169,7 @@
+ AttNameRequiredInAttDef = O nome do atributo deve ser especificado na declara\u00E7\u00E3o da lista de atributos do elemento "{0}".
+ MSG_SPACE_REQUIRED_BEFORE_ATTTYPE_IN_ATTDEF = \u00C9 necess\u00E1rio o espa\u00E7o em branco antes do tipo de atributo na declara\u00E7\u00E3o do atributo "{1}" do elemento "{0}".
+ AttTypeRequiredInAttDef = \u00C9 necess\u00E1rio o tipo de atributo na declara\u00E7\u00E3o do atributo "{1}" do elemento "{0}".
+- MSG_SPACE_REQUIRED_BEFORE_DEFAULTDECL_IN_ATTDEF = \u00C9 necess\u00E1rio o espa\u00E7o em branco antes do default do atributo na declara\u00E7\u00E3o do atributo "{1}" do elemento "{0}".
++ MSG_SPACE_REQUIRED_BEFORE_DEFAULTDECL_IN_ATTDEF = \u00C9 necess\u00E1rio o espa\u00E7o em branco antes do padr\u00E3o do atributo na declara\u00E7\u00E3o do atributo "{1}" do elemento "{0}".
+ MSG_DUPLICATE_ATTRIBUTE_DEFINITION = Mais de uma defini\u00E7\u00E3o de atributo fornecida para o mesmo atributo "{1}" de um determinado elemento "{0}".
+ # 3.3.1 Attribute Types
+ MSG_SPACE_REQUIRED_AFTER_NOTATION_IN_NOTATIONTYPE = O espa\u00E7o em branco deve aparecer ap\u00F3s "NOTATION" na declara\u00E7\u00E3o do atributo "{1}".
+@@ -241,7 +216,7 @@
+ DuplicateTypeInMixedContent = O tipo de elemento "{1}" j\u00E1 foi especificado no modelo de conte\u00FAdo da declara\u00E7\u00E3o do elemento "{0}".
+ ENTITIESInvalid = O valor do atributo "{1}" do tipo ENTITIES deve ser o nome de uma ou mais entidades n\u00E3o submetidas a parsing.
+ ENTITYInvalid = O valor do atributo "{1}" do tipo ENTITY deve ser o nome de uma entidade n\u00E3o submetida a parsing.
+- IDDefaultTypeInvalid = O atributo do ID "{0}" deve ter um default declarado "#IMPLIED" ou "#REQUIRED".
++ IDDefaultTypeInvalid = O atributo do ID "{0}" deve ter um padr\u00E3o declarado "#IMPLIED" ou "#REQUIRED".
+ IDInvalid = O valor do atributo "{0}" do ID de tipo deve ser um nome.
+ IDInvalidWithNamespaces = O valor do atributo "{0}" do ID de tipo deve ser um NCName quando os namespaces estiverem ativados.
+ IDNotUnique = O valor do atributo "{0}" do ID de tipo deve ser exclusivo no documento.
+@@ -258,7 +233,7 @@
+ MSG_CONTENT_INCOMPLETE = O conte\u00FAdo do tipo de elemento "{0}" est\u00E1 incompleto; ele deve corresponder a "{1}".
+ MSG_CONTENT_INVALID = O conte\u00FAdo do tipo de elemento "{0}" deve corresponder a "{1}".
+ MSG_CONTENT_INVALID_SPECIFIED = O conte\u00FAdo do tipo de elemento "{0}" deve corresponder a "{1}". N\u00E3o s\u00E3o permitidos os filhos do tipo "{2}".
+- MSG_DEFAULTED_ATTRIBUTE_NOT_SPECIFIED = O atributo "{1}" do tipo de elemento "{0}" tem um valor default e deve ser especificado em um documento stand-alone.
++ MSG_DEFAULTED_ATTRIBUTE_NOT_SPECIFIED = O atributo "{1}" do tipo de elemento "{0}" tem um valor padr\u00E3o e deve ser especificado em um documento stand-alone.
+ MSG_DUPLICATE_ATTDEF = O atributo "{1}" j\u00E1 foi declarado para o tipo de elemento "{0}".
+ MSG_ELEMENT_ALREADY_DECLARED = O tipo de elemento "{0}" n\u00E3o deve ser declarado mais de uma vez.
+ MSG_ELEMENT_NOT_DECLARED = O tipo de elemento "{0}" deve ser declarado.
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: o tamanho da entidade "{0}" \u00E9 "{1}", o que excede o limite de "{2}" definido por "{3}".
+ TotalEntitySizeLimit=JAXP00010004: o tamanho acumulado "{0}" de entidades excedeu o limite de "{1}" definido por "{2}".
+ MaxXMLNameLimit=JAXP00010005: o nome "{0}" excedeu o limite de "{1}" definido por "{2}".
++ MaxElementDepthLimit=JAXP00010006: o elemento "{0}" tem uma profundidade de "{1}" que excede o limite de "{2}" definido por "{3}".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_sv.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_sv.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -32,7 +7,7 @@
+ FormatFailed = Ett internt fel intr\u00E4ffade vid formatering av f\u00F6ljande meddelande:\n
+
+ # Document messages
+- PrematureEOF=F\u00F6r tidigt filslut (EOF).
++ PrematureEOF=Filen har avslutats f\u00F6r tidigt.
+ # 2.1 Well-Formed XML Documents
+ RootElementRequired = Rotelementet kr\u00E4vs i ett v\u00E4lformulerat dokument.
+ # 2.2 Characters
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: L\u00E4ngden p\u00E5 enheten "{0}" \u00E4r "{1}" som \u00F6verskriver gr\u00E4nsv\u00E4rdet p\u00E5 "{2}" som anges av "{3}".
+ TotalEntitySizeLimit=JAXP00010004: Den ackumulerade storleken "{0}" f\u00F6r enheter \u00F6verskred gr\u00E4nsv\u00E4rdet p\u00E5 "{1}" som anges av "{2}".
+ MaxXMLNameLimit=JAXP00010005: Namnet "{0}" \u00F6verskred gr\u00E4nsv\u00E4rdet p\u00E5 "{1}" som anges av "{2}".
++ MaxElementDepthLimit=JAXP00010006: Elementet "{0}" har djupet "{1}" vilket \u00E4r st\u00F6rre \u00E4n gr\u00E4nsen "{2}" som anges av "{3}".
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_CN.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,27 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -323,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: \u5B9E\u4F53 "{0}" \u7684\u957F\u5EA6\u4E3A "{1}", \u8D85\u8FC7\u4E86 "{3}" \u8BBE\u7F6E\u7684 "{2}" \u9650\u5236\u3002
+ TotalEntitySizeLimit=JAXP00010004: \u5B9E\u4F53\u7684\u7D2F\u8BA1\u5927\u5C0F "{0}" \u8D85\u8FC7\u4E86 "{2}" \u8BBE\u7F6E\u7684 "{1}" \u9650\u5236\u3002
+ MaxXMLNameLimit=JAXP00010005: \u540D\u79F0 "{0}" \u8D85\u8FC7\u4E86 "{2}" \u8BBE\u7F6E\u7684 "{1}" \u9650\u5236\u3002
++ MaxElementDepthLimit=JAXP00010006: \u5143\u7D20 "{0}" \u7684\u6DF1\u5EA6 "{1}" \u8D85\u8FC7\u4E86 "{3}" \u8BBE\u7F6E\u7684\u9650\u5236 "{2}"\u3002
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_TW.properties Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_zh_TW.properties Wed Jun 25 09:03:02 2014 -0700
+@@ -1,28 +1,3 @@
+-#
+-# Copyright (c) 2009, 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.
+-#
+-
+ # This file contains error and warning messages related to XML
+ # The messages are arranged in key and value tuples in a ListResourceBundle.
+ #
+@@ -324,4 +299,5 @@
+ MaxEntitySizeLimit=JAXP00010003: \u5BE6\u9AD4 "{0}" \u7684\u9577\u5EA6\u70BA "{1}"\uFF0C\u8D85\u904E "{3}" \u6240\u8A2D\u5B9A\u7684 "{2}" \u9650\u5236\u3002
+ TotalEntitySizeLimit=JAXP00010004: \u5BE6\u9AD4\u7684\u7D2F\u7A4D\u5927\u5C0F "{0}" \u8D85\u904E "{2}" \u8A2D\u5B9A\u7684 "{1}" \u9650\u5236\u3002
+ MaxXMLNameLimit=JAXP00010005: \u540D\u7A31 "{0}" \u8D85\u904E "{2}" \u8A2D\u5B9A\u7684 "{1}" \u9650\u5236\u3002
++ MaxElementDepthLimit=JAXP00010006: \u5143\u7D20 "{0}" \u7684\u6DF1\u5EA6\u70BA "{1}"\uFF0C\u8D85\u904E "{3}" \u8A2D\u5B9A\u7684 "{2}" \u9650\u5236\u3002
+
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Wed Jun 25 09:03:02 2014 -0700
+@@ -132,6 +132,10 @@
+ totalValue[index] += value;
+ return;
+ }
++ if (index == Limit.MAX_ELEMENT_DEPTH_LIMIT.ordinal()) {
++ totalValue[index] = value;
++ return;
++ }
+
+ Map<String, Integer> cache;
+ if (caches[index] == null) {
+--- ./jaxp/src/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java Wed May 07 19:26:26 2014 -0700
++++ ./jaxp/src/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java Wed Jun 25 09:03:02 2014 -0700
+@@ -66,7 +66,8 @@
+ ELEMENT_ATTRIBUTE_LIMIT(Constants.JDK_ELEMENT_ATTRIBUTE_LIMIT, Constants.SP_ELEMENT_ATTRIBUTE_LIMIT, 0, 10000),
+ TOTAL_ENTITY_SIZE_LIMIT(Constants.JDK_TOTAL_ENTITY_SIZE_LIMIT, Constants.SP_TOTAL_ENTITY_SIZE_LIMIT, 0, 50000000),
+ GENEAL_ENTITY_SIZE_LIMIT(Constants.JDK_GENEAL_ENTITY_SIZE_LIMIT, Constants.SP_GENEAL_ENTITY_SIZE_LIMIT, 0, 0),
+- PARAMETER_ENTITY_SIZE_LIMIT(Constants.JDK_PARAMETER_ENTITY_SIZE_LIMIT, Constants.SP_PARAMETER_ENTITY_SIZE_LIMIT, 0, 1000000);
++ PARAMETER_ENTITY_SIZE_LIMIT(Constants.JDK_PARAMETER_ENTITY_SIZE_LIMIT, Constants.SP_PARAMETER_ENTITY_SIZE_LIMIT, 0, 1000000),
++ MAX_ELEMENT_DEPTH_LIMIT(Constants.JDK_MAX_ELEMENT_DEPTH, Constants.SP_MAX_ELEMENT_DEPTH, 0, 0);
+
+ final String apiProperty;
+ final String systemProperty;
+@@ -429,9 +430,10 @@
+ return false;
+ }
+
+- if (index==Limit.ELEMENT_ATTRIBUTE_LIMIT.ordinal() ||
+- index==Limit.ENTITY_EXPANSION_LIMIT.ordinal() ||
+- index==Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal()) {
++ if (index == Limit.ELEMENT_ATTRIBUTE_LIMIT.ordinal() ||
++ index == Limit.ENTITY_EXPANSION_LIMIT.ordinal() ||
++ index == Limit.TOTAL_ENTITY_SIZE_LIMIT.ordinal() ||
++ index == Limit.MAX_ELEMENT_DEPTH_LIMIT.ordinal()) {
+ return (limitAnalyzer.getTotalValue(index) > values[index]);
+ } else {
+ return (limitAnalyzer.getValue(index) > values[index]);
+--- ./jaxws/.hgtags Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/.hgtags Wed Jun 25 09:03:17 2014 -0700
+@@ -407,6 +407,7 @@
+ a257072fc2aa482abd6ffa28e235dbe532af6d00 jdk7u55-b02
+ 2916fdfc475bf29bc702887bf5ba02df67c98916 jdk7u55-b03
+ f4759b4547602b3bc865db8c5f356f46979c6389 jdk7u55-b04
++8a8dfdbc66149b89f804c5a50e4692c2520569ae jdk7u65-b00
+ 8a8dfdbc66149b89f804c5a50e4692c2520569ae jdk7u55-b05
+ 2696d6747826cea92a97b2d80be4a59ff99462bd jdk7u55-b06
+ 1ad971afe2b5db93420654fa65b23f827760fed7 jdk7u55-b07
+@@ -420,6 +421,11 @@
+ 5d726bf8fedc1f10d250e980653315919b7602f2 jdk7u55-b30
+ 81d0f297557c4a876727cabeb2bfcdf066a1fc9d jdk7u55-b14
+ 2d103c97c9bd0b3357e6d5e2b5b9ffb64c271288 jdk7u55-b31
++b15b4084288fa4ea9caf7f6b4e79d164c77bb1d6 jdk7u55-b32
++efd71c6ca0832e894b7e1619111860062fa96458 jdk7u55-b33
++485d7912bc20775bda670ea2236c883366590dd7 jdk7u55-b34
++587be38f9a6d60fbefc92dbe9fbd4c83d579c680 jdk7u55-b35
++62332eaec2ff8fc8bece2a905554ac08e375a661 jdk7u55-b36
+ cb5f95263f620967f5097c5ff8e0b27cfb9e8c44 jdk7u60-b00
+ f675dfce1e61a6ed01732ae7cfbae941791cba74 jdk7u60-b01
+ 8a3b9e8492a5ac4e2e0c166dbfc5d058be244377 jdk7u60-b02
+@@ -437,6 +443,28 @@
+ 43b5a7cf08e7ee018b1fa42a89510b4c381dc4c5 jdk7u60-b14
+ d00389bf5439e5c42599604d2ebc909d26df8dcf jdk7u60-b15
+ 2fc16d3a321212abc0cc93462b22c4be7f693ab9 jdk7u60-b16
++b312ec543dc09db784e161eb89607d4afd4cab1e jdk7u60-b17
+ b312ec543dc09db784e161eb89607d4afd4cab1e jdk7u60-b18
+-b312ec543dc09db784e161eb89607d4afd4cab1e jdk7u60-b17
++23598a667bb89b57d5abab5b37781a0952e16cf9 jdk7u65-b01
+ 1d21eb9011a060c7761c9a8a53e69d58bbea4893 jdk7u60-b19
++39e67887a3b112bf74f84df2aac0f46c65bfb005 jdk7u60-b30
++dfc2c4b9b16bd2d68435ddc9bb12036982021844 jdk7u60-b31
++0e17943c39fadb810b4dd2e9ac732503b86043f4 jdk7u60-b32
++910559d7f754d8fd6ab80a627869877443358316 jdk7u60-b33
++8ac19021e6af5d92b46111a6c41430f36ccdb901 jdk7u65-b02
++a70d681bc273a110d10cf3c4f9b35b25ca6a600f jdk7u65-b03
++7cd17f96988509e99fbb71003aeb76d92b638fef jdk7u65-b04
++7bafb24c6466999bc08742b160d0e450bc12a2c5 jdk7u65-b05
++35b31c516cab0a81fa9d2a119ec101be3f5a2969 jdk7u65-b06
++eb89c1c30a93b1d43cbc1b7520bca46d31d0829a jdk7u65-b07
++d63ca1c5bdb9fb2e36ec4afda431c0d1dfdfc07c jdk7u65-b08
++e4cc1e93c6332c8463e75a25c3d735884d185259 jdk7u65-b09
++d10ec17267415303a71d358ae6202369db77ba96 jdk7u65-b10
++2f5dcee6d56b00551db21408ebad2ff2faad7c7a jdk7u65-b11
++f03350485cd388620981bb7e7faa2d1890d11a1b jdk7u65-b12
++471f883e9830d8341248b99da7c9cfab9fcc94d6 jdk7u65-b13
++11deffa2096f08dab69de13d4fcf361c6d252636 jdk7u65-b14
++39ad61a579fd824fbec1bec4e071376449ba8195 jdk7u65-b15
++198bf1acd262f2c16715d3be5e33d7b8de1e7776 jdk7u65-b16
++df4dc644fe344e973fc1692c28683eec8ba82600 jdk7u65-b17
++0e0ca87a6d5212a0885f0c8c00b8f7cf24a64d89 jdk7u65-b30
+--- ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/model/nav/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/tools/internal/xjc/model/nav/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/api/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/api/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.java Wed Jun 25 09:03:17 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
+@@ -130,14 +130,6 @@
+ private final Map<TypeReference,Bridge> bridges = new LinkedHashMap<TypeReference,Bridge>();
+
+ /**
+- * Shared instance of {@link TransformerFactory}.
+- * Lock before use, because a {@link TransformerFactory} is not thread-safe
+- * whereas {@link JAXBContextImpl} is.
+- * Lazily created.
+- */
+- private volatile static SAXTransformerFactory tf;
+-
+- /**
+ * Shared instance of {@link DocumentBuilder}.
+ * Lock before use. Lazily created.
+ */
+@@ -702,13 +694,7 @@
+ */
+ static Transformer createTransformer() {
+ try {
+- if (tf==null) {
+- synchronized(JAXBContextImpl.class) {
+- if (tf==null) {
+- tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+- }
+- }
+- }
++ SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+ return tf.newTransformer();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+@@ -720,13 +706,7 @@
+ */
+ public static TransformerHandler createTransformerHandler() {
+ try {
+- if (tf==null) {
+- synchronized(JAXBContextImpl.class) {
+- if (tf==null) {
+- tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+- }
+- }
+- }
++ SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+ return tf.newTransformerHandler();
+ } catch (TransformerConfigurationException e) {
+ throw new Error(e); // impossible
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/model/Utils.java Wed May 07 19:26:28 2014 -0700
++++ ./jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/model/Utils.java Wed Jun 25 09:03:17 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
+@@ -31,6 +31,8 @@
+ import java.lang.reflect.InvocationTargetException;
+ import java.lang.reflect.Method;
+ import java.lang.reflect.Type;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+
+@@ -41,22 +43,32 @@
+ *
+ * Has *package private* access to avoid inappropriate usage.
+ */
+-/* package */ final class Utils {
++final class Utils {
+
+ private static final Logger LOGGER = Logger.getLogger(Utils.class.getName());
+
+ /**
+ * static ReflectionNavigator field to avoid usage of reflection every time we use it.
+ */
+- /* package */ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
++ static final Navigator<Type, Class, Field, Method> REFLECTION_NAVIGATOR;
+
+ static { // we statically initializing REFLECTION_NAVIGATOR property
+- Class refNav = null;
+ try {
+- refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
++ Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
+ //noinspection unchecked
+- Method getInstance = refNav.getDeclaredMethod("getInstance");
+- getInstance.setAccessible(true);
++ final Method getInstance = refNav.getDeclaredMethod("getInstance");
++
++ // requires accessClassInPackage privilege
++ AccessController.doPrivileged(
++ new PrivilegedAction<Object>() {
++ @Override
++ public Object run() {
++ getInstance.setAccessible(true);
++ return null;
++ }
++ }
++ );
++
+ //noinspection unchecked
+ REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
+ } catch (ClassNotFoundException e) {
+--- ./jdk/.hgtags Wed May 07 19:26:47 2014 -0700
++++ ./jdk/.hgtags Wed Apr 16 12:37:49 2014 +0400
+@@ -391,6 +391,7 @@
+ 2ca3e1fa4455ad564228ad6e654498167af2f20d jdk7u55-b02
+ c12b3c81366cb067ff4444952209d54bfa387353 jdk7u55-b03
+ 476d1bddaa32bf440953c3b1814ba38f16886c03 jdk7u55-b04
++7fa6d3ba2cc77cd1e6f24e33f0c39788cb2893b8 jdk7u65-b00
+ 7fa6d3ba2cc77cd1e6f24e33f0c39788cb2893b8 jdk7u55-b05
+ 795654fce29c38d4c8504f760d8d8a36248d38ed jdk7u55-b06
+ 4b2ed892b195e95f7541aaa3b129a2caa5faae1d jdk7u55-b07
+@@ -404,6 +405,11 @@
+ 4a5651c84b1e6cf26dc9b19f00747e5004efba68 jdk7u55-b30
+ ffd99c5975217a14609851602c5f5dc005234aba jdk7u55-b14
+ 88f1bf248cc520e0bf7ef17bc862f87aab958373 jdk7u55-b31
++b83f5194edf23b752fe2c0a9be361455f87196df jdk7u55-b32
++01a4cd03a6c85abb62eb5d1c2b5bf7d2f544c04e jdk7u55-b33
++3f54f8a387c1a908c07106b685183b19a5fc1064 jdk7u55-b34
++2cdc52ec4813abe38b4e52ae9c9f0ff5dcc87faa jdk7u55-b35
++6845d311ff990d422f9376d37e3e82d5d06bff3f jdk7u55-b36
+ db5a29c812ee25c34ce9cd97de6e0dae284a4e34 jdk7u60-b00
+ def34c4a798678c424786a8f0d0508e90185958d jdk7u60-b01
+ ff67c89658525e8903fb870861ed3645befd6bc5 jdk7u60-b02
+@@ -421,6 +427,28 @@
+ b7fbd9b4febf8961091fdf451d3da477602a8f1d jdk7u60-b14
+ 04882f9a073e8de153ec7ad32486569fd9a087ec jdk7u60-b15
+ 41547583c3a035c3924ffedfa8704e58d69e5c50 jdk7u60-b16
++e484202d9a4104840d758a21b2bba1250e766343 jdk7u60-b17
+ e484202d9a4104840d758a21b2bba1250e766343 jdk7u60-b18
+-e484202d9a4104840d758a21b2bba1250e766343 jdk7u60-b17
++c220d329a78161f79df73048ed55db91f538e3b7 jdk7u65-b01
+ 7190843ddaf4f3ad158c3071be0f4ca42a5802dc jdk7u60-b19
++8dc56d0f3e860658619eaa57d10fb1a4182d71cd jdk7u60-b30
++feac9624a1e1ffebe09a19ae351d88e3ef98c441 jdk7u60-b31
++fb40615ef352e03ee94c0682a6ca0a0e6a33a70b jdk7u60-b32
++9cfcdeeecfac66004cb5bbb2c5bba5c57e170539 jdk7u60-b33
++a42a3bb22f6991d8f6a30e4f1782ad620c40eb65 jdk7u65-b02
++756071871d61e1ca410c63a3f1c4dabcc51a90df jdk7u65-b03
++bac16c82c14a35d1e9d3c4d0bd317dbbb296f34e jdk7u65-b04
++14b3f82c245fb8d0eeb21dc99ff0b4985571910c jdk7u65-b05
++7d8e5d90789533b5cc22eeb15c19ce1bb8a20573 jdk7u65-b06
++cde691a6989fa875107a3974aa92681d286be6ec jdk7u65-b07
++d5353f8e1e02e12a1262d65ed85183425b0cdf13 jdk7u65-b08
++45913a29c1edd3e63c9c818ffab7aebd4d75fa40 jdk7u65-b09
++3bb943c6ff7dd614cb428501db8c2c655e5f5223 jdk7u65-b10
++b84e98280630be44a87f4336009f61350f3c7dc0 jdk7u65-b11
++61d15f512305655a51c04811006850e4955936bd jdk7u65-b12
++69698344d0a1771ed9162ecad2065829ca1f8994 jdk7u65-b13
++2e6105ddad44866c4cdc1ba06620b48685e34111 jdk7u65-b14
++8cff6ce00a91820b4cb7ef24ed42063c2305127d jdk7u65-b15
++190017413768f02addea8b2c5106157e3c4076c7 jdk7u65-b16
++23e78e36bc39f4f761ac2b0e055c562c3ff204f5 jdk7u65-b17
++96d1fa382dda17ae105f28083bda41f79fc3093f jdk7u65-b30
+--- ./jdk/make/java/util/FILES_properties.gmk Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/java/util/FILES_properties.gmk Wed Apr 16 12:37:49 2014 +0400
+@@ -107,6 +107,7 @@
+ sun/util/resources/CalendarData_pl.properties \
+ sun/util/resources/CalendarData_pt.properties \
+ sun/util/resources/CalendarData_pt_PT.properties \
++ sun/util/resources/CalendarData_pt_BR.properties \
+ sun/util/resources/CalendarData_ro.properties \
+ sun/util/resources/CalendarData_ru.properties \
+ sun/util/resources/CalendarData_sk.properties \
+--- ./jdk/make/sun/javazic/tzdata/VERSION Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/javazic/tzdata/VERSION Wed Apr 16 12:37:49 2014 +0400
+@@ -21,4 +21,4 @@
+ # or visit www.oracle.com if you need additional information or have any
+ # questions.
+ #
+-tzdata2014b
++tzdata2014c
+--- ./jdk/make/sun/javazic/tzdata/africa Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/javazic/tzdata/africa Wed Apr 16 12:37:49 2014 +0400
+@@ -358,11 +358,54 @@
+ # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html
+ # </a>
+
++# From Ahmad El-Dardiry (2014-05-07):
++# Egypt is to change back to Daylight system on May 15
++# http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx
++
++# From Gunther Vermier (2015-05-13):
++# our Egypt office confirms that the change will be at 15 May "midnight" (24:00)
++
++# From Paul Eggert (2014-05-13):
++# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says
++# the change is because of blackouts in Cairo, even though Ahram Online (cited
++# above) says DST had no affect on electricity consumption. The AP story says
++# DST will not be observed during Ramadan. There is no information about when
++# DST will end. See:
++# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833
++#
++# For now, guess that later transitions will use 2010's rules, and that
++# Egypt will agree with Morocco (see below) about the date Ramadan starts and
++# ends, though (unlike Morocco) it will switch at 00:00 standard time. In
++# Egypt the spring-forward transitions are removed for 2020-2022, when the
++# guessed spring-forward date falls during the estimated Ramadan, and all
++# transitions removed for 2023-2038, where the estimated Ramadan falls entirely
++# outside the guessed daylight-saving time. Ramadan intrudes on the guessed
++# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff.
++
+ Rule Egypt 2008 only - Aug lastThu 23:00s 0 -
+ Rule Egypt 2009 only - Aug 20 23:00s 0 -
+ Rule Egypt 2010 only - Aug 11 0:00 0 -
+ Rule Egypt 2010 only - Sep 10 0:00 1:00 S
+ Rule Egypt 2010 only - Sep lastThu 23:00s 0 -
++Rule Egypt 2014 only - May 15 24:00 1:00 S
++Rule Egypt 2014 only - Jun 29 0:00s 0 -
++Rule Egypt 2014 only - Jul 29 0:00s 1:00 S
++Rule Egypt 2014 max - Sep lastThu 23:00s 0 -
++Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S
++Rule Egypt 2015 only - Jun 18 0:00s 0 -
++Rule Egypt 2015 only - Jul 18 0:00s 1:00 S
++Rule Egypt 2016 only - Jun 7 0:00s 0 -
++Rule Egypt 2016 only - Jul 7 0:00s 1:00 S
++Rule Egypt 2017 only - May 27 0:00s 0 -
++Rule Egypt 2017 only - Jun 26 0:00s 1:00 S
++Rule Egypt 2018 only - May 16 0:00s 0 -
++Rule Egypt 2018 only - Jun 15 0:00s 1:00 S
++Rule Egypt 2019 only - May 6 0:00s 0 -
++Rule Egypt 2019 only - Jun 5 0:00s 1:00 S
++Rule Egypt 2020 only - May 24 0:00s 1:00 S
++Rule Egypt 2021 only - May 13 0:00s 1:00 S
++Rule Egypt 2022 only - May 3 0:00s 1:00 S
++Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S
+
+ # Zone NAME GMTOFF RULES FORMAT [UNTIL]
+ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct
+--- ./jdk/make/sun/javazic/tzdata/asia Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/javazic/tzdata/asia Wed Apr 16 12:37:49 2014 +0400
+@@ -1370,22 +1370,6 @@
+ # "Jordan will switch to winter time on Friday, October 27".
+ #
+
+-# From Phil Pizzey (2009-04-02):
+-# ...I think I may have spotted an error in the timezone data for
+-# Jordan.
+-# The current (2009d) asia file shows Jordan going to daylight
+-# saving
+-# time on the last Thursday in March.
+-#
+-# Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S
+-#
+-# However timeanddate.com, which I usually find reliable, shows Jordan
+-# going to daylight saving time on the last Friday in March since 2002.
+-# Please see
+-# <a href="http://www.timeanddate.com/worldclock/timezone.html?n=11">
+-# http://www.timeanddate.com/worldclock/timezone.html?n=11
+-# </a>
+-
+ # From Steffen Thorsen (2009-04-02):
+ # This single one might be good enough, (2009-03-24, Arabic):
+ # <a href="http://petra.gov.jo/Artical.aspx?Lng=2&Section=8&Artical=95279">
+--- ./jdk/make/sun/javazic/tzdata/europe Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/javazic/tzdata/europe Wed Apr 16 12:37:49 2014 +0400
+@@ -2989,6 +2989,10 @@
+ # From Alexander Krivenyshev (2014-03-17):
+ # time change at 2:00 (2am) on March 30, 2014
+ # http://vz.ru/news/2014/3/17/677464.html
++# From Paul Eggert (2014-03-30):
++# Simferopol and Sevastopol reportedly changed their central town clocks
++# late the previous day, but this appears to have been ceremonial
++# and the discrepancies are small enough to not worry about.
+ 2:00 EU EE%sT 2014 Mar 30 2:00
+ 4:00 - MSK
+
+--- ./jdk/make/sun/lwawt/FILES_export_macosx.gmk Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/lwawt/FILES_export_macosx.gmk Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -141,7 +141,6 @@
+ sun/lwawt/macosx/CMenuBar.java \
+ sun/lwawt/macosx/CMenuComponent.java \
+ sun/lwawt/macosx/CMenuItem.java \
+- sun/lwawt/macosx/CMouseInfoPeer.java \
+ sun/lwawt/macosx/CPlatformView.java \
+ sun/lwawt/macosx/CPlatformWindow.java \
+ sun/lwawt/macosx/CPlatformComponent.java \
+--- ./jdk/make/sun/security/ec/mapfile-vers Wed May 07 19:26:47 2014 -0700
++++ ./jdk/make/sun/security/ec/mapfile-vers Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ #
+-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
++# Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ #
+ # This code is free software; you can redistribute it and/or modify it
+@@ -28,7 +28,6 @@
+ SUNWprivate_1.1 {
+ global:
+ Java_sun_security_ec_ECKeyPairGenerator_generateECKeyPair;
+- Java_sun_security_ec_ECKeyPairGenerator_getEncodedBytes;
+ Java_sun_security_ec_ECDSASignature_signDigest;
+ Java_sun_security_ec_ECDSASignature_verifySignedDigest;
+ Java_sun_security_ec_ECDHKeyAgreement_deriveKey;
+--- ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -89,10 +89,15 @@
+
+ private volatile int windowState = Frame.NORMAL;
+
++ // check that the mouse is over the window
++ private volatile boolean isMouseOver = false;
++ // A peer where the last mouse event came to. Used by cursor manager to
++ // find the component under cursor
++ private static volatile LWComponentPeer lastCommonMouseEventPeer = null;
++
+ // A peer where the last mouse event came to. Used to generate
+- // MOUSE_ENTERED/EXITED notifications and by cursor manager to
+- // find the component under cursor
+- private static volatile LWComponentPeer lastMouseEventPeer = null;
++ // MOUSE_ENTERED/EXITED notifications
++ private volatile LWComponentPeer lastMouseEventPeer;
+
+ // Peers where all dragged/released events should come to,
+ // depending on what mouse button is being dragged according to Cocoa
+@@ -773,59 +778,62 @@
+ Rectangle r = getBounds();
+ // findPeerAt() expects parent coordinates
+ LWComponentPeer targetPeer = findPeerAt(r.x + x, r.y + y);
+- LWWindowPeer lastWindowPeer =
+- (lastMouseEventPeer != null) ? lastMouseEventPeer.getWindowPeerOrSelf() : null;
+- LWWindowPeer curWindowPeer =
+- (targetPeer != null) ? targetPeer.getWindowPeerOrSelf() : null;
+
+ if (id == MouseEvent.MOUSE_EXITED) {
+- // Sometimes we may get MOUSE_EXITED after lastMouseEventPeer is switched
+- // to a peer from another window. So we must first check if this peer is
+- // the same as lastWindowPeer
+- if (lastWindowPeer == this) {
+- if (isEnabled()) {
++ isMouseOver = false;
++ if (lastMouseEventPeer != null) {
++ if (lastMouseEventPeer.isEnabled()) {
+ Point lp = lastMouseEventPeer.windowToLocal(x, y,
+- lastWindowPeer);
++ this);
+ Component target = lastMouseEventPeer.getTarget();
+ postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_EXITED,
+ when, modifiers, lp,
+ screenX, screenY, clickCount, popupTrigger, button);
+ }
++
++ // Sometimes we may get MOUSE_EXITED after lastCommonMouseEventPeer is switched
++ // to a peer from another window. So we must first check if this peer is
++ // the same as lastWindowPeer
++ if (lastCommonMouseEventPeer != null && lastCommonMouseEventPeer.getWindowPeerOrSelf() == this) {
++ lastCommonMouseEventPeer = null;
++ }
+ lastMouseEventPeer = null;
+ }
+- } else {
+- if (targetPeer != lastMouseEventPeer) {
+- // lastMouseEventPeer may be null if mouse was out of Java windows
+- if (lastMouseEventPeer != null && lastMouseEventPeer.isEnabled()) {
+- // Sometimes, MOUSE_EXITED is not sent by delegate (or is sent a bit
+- // later), in which case lastWindowPeer is another window
+- if (lastWindowPeer != this) {
+- Point oldp = lastMouseEventPeer.windowToLocal(x, y, lastWindowPeer);
+- // Additionally translate from this to lastWindowPeer coordinates
+- Rectangle lr = lastWindowPeer.getBounds();
+- oldp.x += r.x - lr.x;
+- oldp.y += r.y - lr.y;
+- Component target = lastMouseEventPeer.getTarget();
+- postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_EXITED,
+- when, modifiers, oldp,
+- screenX, screenY, clickCount, popupTrigger, button);
+- } else {
+- Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
+- Component target = lastMouseEventPeer.getTarget();
+- postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_EXITED,
+- when, modifiers, oldp,
+- screenX, screenY, clickCount, popupTrigger, button);
+- }
+- }
+- lastMouseEventPeer = targetPeer;
+- if (targetPeer != null && targetPeer.isEnabled() && id != MouseEvent.MOUSE_ENTERED) {
+- Point newp = targetPeer.windowToLocal(x, y, curWindowPeer);
++ } else if (id == MouseEvent.MOUSE_ENTERED) {
++ isMouseOver = true;
++ if (targetPeer != null) {
++ if (targetPeer.isEnabled()) {
++ Point lp = targetPeer.windowToLocal(x, y, this);
+ Component target = targetPeer.getTarget();
+- postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_ENTERED,
+- when, modifiers, newp,
++ postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_ENTERED, when, modifiers, lp,
+ screenX, screenY, clickCount, popupTrigger, button);
+ }
++ lastCommonMouseEventPeer = targetPeer;
++ lastMouseEventPeer = targetPeer;
+ }
++ } else {
++ PlatformWindow topmostPlatformWindow =
++ platformWindow.getTopmostPlatformWindowUnderMouse();
++
++ LWWindowPeer topmostWindowPeer =
++ topmostPlatformWindow != null ? topmostPlatformWindow.getPeer() : null;
++
++ // topmostWindowPeer == null condition is added for the backword
++ // compatibility with applets. It can be removed when the
++ // getTopmostPlatformWindowUnderMouse() method will be properly
++ // implemented i CPlatformEmbeddedFrame class
++ if (topmostWindowPeer == this || topmostWindowPeer == null) {
++ generateMouseEnterExitEventsForComponents(when, button, x, y,
++ screenX, screenY, modifiers, clickCount, popupTrigger,
++ targetPeer);
++ } else {
++ LWComponentPeer topmostTargetPeer =
++ topmostWindowPeer != null ? topmostWindowPeer.findPeerAt(r.x + x, r.y + y) : null;
++ topmostWindowPeer.generateMouseEnterExitEventsForComponents(when, button, x, y,
++ screenX, screenY, modifiers, clickCount, popupTrigger,
++ topmostTargetPeer);
++ }
++
+ // TODO: fill "bdata" member of AWTEvent
+
+ int eventButtonMask = (button > 0)? MouseEvent.getMaskForButton(button) : 0;
+@@ -875,19 +883,13 @@
+ // mouseClickButtons is updated below, after MOUSE_CLICK is sent
+ }
+
+- // check if we receive mouseEvent from outside the window's bounds
+- // it can be either mouseDragged or mouseReleased
+- if (curWindowPeer == null) {
+- //TODO This can happen if this window is invisible. this is correct behavior in this case?
+- curWindowPeer = this;
+- }
+ if (targetPeer == null) {
+ //TODO This can happen if this window is invisible. this is correct behavior in this case?
+ targetPeer = this;
+ }
+
+
+- Point lp = targetPeer.windowToLocal(x, y, curWindowPeer);
++ Point lp = targetPeer.windowToLocal(x, y, this);
+ if (targetPeer.isEnabled()) {
+ if (id == MouseEvent.MOUSE_ENTERED || id == MouseEvent.MOUSE_EXITED) {
+ postMouseEnteredExitedEvent(targetPeer.getTarget(), id,
+@@ -918,6 +920,33 @@
+ notifyUpdateCursor();
+ }
+
++ private void generateMouseEnterExitEventsForComponents(long when,
++ int button, int x, int y, int screenX, int screenY,
++ int modifiers, int clickCount, boolean popupTriger,
++ LWComponentPeer targetPeer) {
++ if (!isMouseOver || targetPeer == lastMouseEventPeer) {
++ return;
++ }
++
++ // Generate Mouse Exit for components
++ if (lastMouseEventPeer != null && lastMouseEventPeer.isEnabled()) {
++ Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
++ Component target = lastMouseEventPeer.getTarget();
++ postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_EXITED, when, modifiers,
++ oldp, screenX, screenY, clickCount, popupTriger, button);
++ }
++ lastCommonMouseEventPeer = targetPeer;
++ lastMouseEventPeer = targetPeer;
++
++ // Genrate Mouse Enter for Componetns
++ if (targetPeer != null && targetPeer.isEnabled()) {
++ Point newp = targetPeer.windowToLocal(x, y, this);
++ Component target = targetPeer.getTarget();
++ postMouseEnteredExitedEvent(target, MouseEvent.MOUSE_ENTERED, when, modifiers,
++ newp, screenX, screenY, clickCount, popupTriger, button);
++ }
++ }
++
+ private void postMouseEnteredExitedEvent(
+ Component target, int id, long when, int modifiers,
+ Point loc, int xAbs, int yAbs,
+@@ -1198,11 +1227,11 @@
+ }
+
+ public static LWWindowPeer getWindowUnderCursor() {
+- return lastMouseEventPeer != null ? lastMouseEventPeer.getWindowPeerOrSelf() : null;
++ return lastCommonMouseEventPeer != null ? lastCommonMouseEventPeer.getWindowPeerOrSelf() : null;
+ }
+
+ public static LWComponentPeer<?, ?> getPeerUnderCursor() {
+- return lastMouseEventPeer;
++ return lastCommonMouseEventPeer;
+ }
+
+ /*
+--- ./jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -118,6 +118,8 @@
+
+ public void setAlwaysOnTop(boolean value);
+
++ public PlatformWindow getTopmostPlatformWindowUnderMouse();
++
+ public void updateFocusableWindowState();
+
+ public boolean rejectFocusRequest(CausedFocusEvent.Cause cause);
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Wed May 07 19:26:47 2014 -0700
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,45 +0,0 @@
+-/*
+- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+- * 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.lwawt.macosx;
+-
+-import java.awt.Window;
+-import sun.lwawt.LWMouseInfoPeer;
+-import sun.lwawt.LWWindowPeer;
+-
+-public class CMouseInfoPeer extends LWMouseInfoPeer
+-{
+- //If a new window is to appear under the cursor,
+- //we get wrong window.
+- //This is a workaround for macosx.
+- @Override
+- public boolean isWindowUnderMouse(Window w) {
+- if (w == null) {
+- return false;
+- }
+-
+- return ((LWWindowPeer)w.getPeer()).getPlatformWindow().isUnderMouse();
+- }
+-}
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -151,6 +151,11 @@
+ @Override
+ public void setAlwaysOnTop(boolean value) {}
+
++ // This method should be properly implemented for applets.
++ // It returns null just as a stub.
++ @Override
++ public PlatformWindow getTopmostPlatformWindowUnderMouse() { return null; }
++
+ @Override
+ public void updateFocusableWindowState() {}
+
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -61,8 +61,9 @@
+ private static native void nativeSetNSWindowMinimizedIcon(long nsWindowPtr, long nsImage);
+ private static native void nativeSetNSWindowRepresentedFilename(long nsWindowPtr, String representedFilename);
+ private static native void nativeSetEnabled(long nsWindowPtr, boolean isEnabled);
+- private static native void nativeSynthesizeMouseEnteredExitedEvents(long nsWindowPtr);
++ private static native void nativeSynthesizeMouseEnteredExitedEvents();
+ private static native void nativeDispose(long nsWindowPtr);
++ private static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse();
+
+ // Loger to report issues happened during execution but that do not affect functionality
+ private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow");
+@@ -593,7 +594,7 @@
+ }
+ }
+
+- nativeSynthesizeMouseEnteredExitedEvents(nsWindowPtr);
++ nativeSynthesizeMouseEnteredExitedEvents();
+
+ // Configure stuff #2
+ updateFocusabilityForAutoRequestFocus(true);
+@@ -738,6 +739,9 @@
+ setStyleBits(ALWAYS_ON_TOP, isAlwaysOnTop);
+ }
+
++ public PlatformWindow getTopmostPlatformWindowUnderMouse() {
++ return CPlatformWindow.nativeGetTopmostPlatformWindowUnderMouse();
++ }
+ @Override
+ public void setOpacity(float opacity) {
+ CWrapper.NSWindow.setAlphaValue(getNSWindowPtr(), opacity);
+@@ -830,7 +834,7 @@
+ throw new RuntimeException("Unknown window state: " + windowState);
+ }
+
+- nativeSynthesizeMouseEnteredExitedEvents(nsWindowPtr);
++ nativeSynthesizeMouseEnteredExitedEvents();
+
+ // NOTE: the SWP.windowState field gets updated to the newWindowState
+ // value when the native notification comes to us
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -148,6 +148,11 @@
+ }
+
+ @Override
++ public PlatformWindow getTopmostPlatformWindowUnderMouse() {
++ return null;
++ }
++
++ @Override
+ public void updateFocusableWindowState() {
+ }
+
+--- ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -300,11 +300,6 @@
+ }
+
+ @Override
+- protected MouseInfoPeer createMouseInfoPeerImpl() {
+- return new CMouseInfoPeer();
+- }
+-
+- @Override
+ protected int getScreenHeight() {
+ return GraphicsEnvironment.getLocalGraphicsEnvironment()
+ .getDefaultScreenDevice().getDefaultConfiguration().getBounds().height;
+--- ./jdk/src/macosx/native/sun/awt/AWTView.h Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/native/sun/awt/AWTView.h Wed Apr 16 12:37:49 2014 +0400
+@@ -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,8 +33,8 @@
+ @private
+ jobject m_cPlatformView;
+
+- // Handler for the tracking rect needed for Enter/Exit events management.
+- NSTrackingRectTag rolloverTrackingRectTag;
++ // Handler for the tracking area needed for Enter/Exit events management.
++ NSTrackingArea* rolloverTrackingArea;
+
+ // TODO: NSMenu *contextualMenu;
+
+@@ -61,7 +61,7 @@
+
+ - (id) initWithRect:(NSRect) rect platformView:(jobject)cPlatformView windowLayer:(CALayer*)windowLayer;
+ - (void) deliverJavaMouseEvent: (NSEvent *) event;
+-- (void) resetTrackingRect;
++- (void) resetTrackingArea;
+ - (void) deliverJavaKeyEventHelper: (NSEvent *) event;
+ - (jobject) awtComponent:(JNIEnv *)env;
+
+--- ./jdk/src/macosx/native/sun/awt/AWTView.m Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/native/sun/awt/AWTView.m Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -82,6 +82,7 @@
+ fPAHNeedsToSelect = NO;
+
+ mouseIsOver = NO;
++ [self resetTrackingArea];
+
+ if (windowLayer != nil) {
+ self.cglLayer = windowLayer;
+@@ -149,7 +150,7 @@
+ [[self window] makeFirstResponder: self];
+ }];
+ if ([self window] != NULL) {
+- [self resetTrackingRect];
++ [self resetTrackingArea];
+ }
+ }
+
+@@ -380,30 +381,31 @@
+ JNFCallVoidMethod(env, m_cPlatformView, jm_deliverMouseEvent, jEvent);
+ }
+
++- (void) resetTrackingArea {
++ if (rolloverTrackingArea != nil) {
++ [self removeTrackingArea:rolloverTrackingArea];
++ [rolloverTrackingArea release];
++ }
+
+-- (void) clearTrackingRect {
+- if (rolloverTrackingRectTag > 0) {
+- [self removeTrackingRect:rolloverTrackingRectTag];
+- rolloverTrackingRectTag = 0;
+- }
+-}
++ int options = (NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited |
++ NSTrackingMouseMoved | NSTrackingEnabledDuringMouseDrag);
+
+-- (void) resetTrackingRect {
+- [self clearTrackingRect];
+- rolloverTrackingRectTag = [self addTrackingRect:[self visibleRect]
+- owner:self
+- userData:NULL
+- assumeInside:NO];
++ rolloverTrackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
++ options:options
++ owner:self
++ userInfo:nil
++ ];
++ [self addTrackingArea:rolloverTrackingArea];
+ }
+
+ - (void)updateTrackingAreas {
+ [super updateTrackingAreas];
+- [self resetTrackingRect];
++ [self resetTrackingArea];
+ }
+
+ - (void) resetCursorRects {
+ [super resetCursorRects];
+- [self resetTrackingRect];
++ [self resetTrackingArea];
+ }
+
+ -(void) deliverJavaKeyEventHelper: (NSEvent *) event {
+--- ./jdk/src/macosx/native/sun/awt/AWTWindow.m Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/macosx/native/sun/awt/AWTWindow.m Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -314,10 +314,8 @@
+ return [window isKindOfClass: [AWTWindow_Panel class]] || [window isKindOfClass: [AWTWindow_Normal class]];
+ }
+
+-// checks that this window is under the mouse cursor and this point is not overlapped by others windows
+-- (BOOL) isTopmostWindowUnderMouse {
+-
+- int currentWinID = [self.nsWindow windowNumber];
++// return id for the topmost window under mouse
+++ (NSInteger) getTopmostWindowUnderMouseID {
+
+ NSRect screenRect = [[NSScreen mainScreen] frame];
+ NSPoint nsMouseLocation = [NSEvent mouseLocation];
+@@ -327,51 +325,75 @@
+
+
+ for (NSDictionary *window in windows) {
+- int layer = [[window objectForKey:(id)kCGWindowLayer] intValue];
++ NSInteger layer = [[window objectForKey:(id)kCGWindowLayer] integerValue];
+ if (layer == 0) {
+- int winID = [[window objectForKey:(id)kCGWindowNumber] intValue];
+ CGRect rect;
+ CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:(id)kCGWindowBounds], &rect);
+ if (CGRectContainsPoint(rect, cgMouseLocation)) {
+- return currentWinID == winID;
+- } else if (currentWinID == winID) {
+- return NO;
++ return [[window objectForKey:(id)kCGWindowNumber] integerValue];
+ }
+ }
+ }
+- return NO;
++ return -1;
+ }
+
+-- (void) synthesizeMouseEnteredExitedEvents {
++// checks that this window is under the mouse cursor and this point is not overlapped by other windows
++- (BOOL) isTopmostWindowUnderMouse {
++ return [self.nsWindow windowNumber] == [AWTWindow getTopmostWindowUnderMouseID];
++}
+
+- int eventType = 0;
+- BOOL isUnderMouse = [self isTopmostWindowUnderMouse];
+- BOOL mouseIsOver = [[self.nsWindow contentView] mouseIsOver];
+++ (AWTWindow *) getTopmostWindowUnderMouse {
++ NSEnumerator *windowEnumerator = [[NSApp windows] objectEnumerator];
++ NSWindow *window;
+
+- if (isUnderMouse && !mouseIsOver) {
+- eventType = NSMouseEntered;
+- } else if (!isUnderMouse && mouseIsOver) {
+- eventType = NSMouseExited;
+- } else {
+- return;
++ NSInteger topmostWindowUnderMouseID = [AWTWindow getTopmostWindowUnderMouseID];
++
++ while ((window = [windowEnumerator nextObject]) != nil) {
++ if ([window windowNumber] == topmostWindowUnderMouseID) {
++ BOOL isAWTWindow = [AWTWindow isAWTWindow: window];
++ return isAWTWindow ? (AWTWindow *) [window delegate] : nil;
++ }
+ }
++ return nil;
++}
++
+++ (void) synthesizeMouseEnteredExitedEvents:(NSWindow*)window withType:(NSEventType)eventType {
+
+ NSPoint screenLocation = [NSEvent mouseLocation];
+- NSPoint windowLocation = [self.nsWindow convertScreenToBase: screenLocation];
++ NSPoint windowLocation = [window convertScreenToBase: screenLocation];
+ int modifierFlags = (eventType == NSMouseEntered) ? NSMouseEnteredMask : NSMouseExitedMask;
+
+ NSEvent *mouseEvent = [NSEvent enterExitEventWithType: eventType
+ location: windowLocation
+ modifierFlags: modifierFlags
+ timestamp: 0
+- windowNumber: [self.nsWindow windowNumber]
++ windowNumber: [window windowNumber]
+ context: nil
+ eventNumber: 0
+ trackingNumber: 0
+ userData: nil
+ ];
+
+- [[self.nsWindow contentView] deliverJavaMouseEvent: mouseEvent];
++ [[window contentView] deliverJavaMouseEvent: mouseEvent];
++}
++
+++(void) synthesizeMouseEnteredExitedEventsForAllWindows {
++ NSInteger topmostWindowUnderMouseID = [AWTWindow getTopmostWindowUnderMouseID];
++ NSArray *windows = [NSApp windows];
++ NSWindow *window;
++
++ NSEnumerator *windowEnumerator = [windows objectEnumerator];
++ while ((window = [windowEnumerator nextObject]) != nil) {
++ if ([AWTWindow isAWTWindow: window]) {
++ BOOL isUnderMouse = ([window windowNumber] == topmostWindowUnderMouseID);
++ BOOL mouseIsOver = [[window contentView] mouseIsOver];
++ if (isUnderMouse && !mouseIsOver) {
++ [AWTWindow synthesizeMouseEnteredExitedEvents: window withType:NSMouseEntered];
++ } else if (!isUnderMouse && mouseIsOver) {
++ [AWTWindow synthesizeMouseEnteredExitedEvents: window withType:NSMouseExited];
++ }
++ }
++ }
+ }
+
+ + (NSNumber *) getNSWindowDisplayID_AppKitThread:(NSWindow *)window {
+@@ -979,7 +1001,7 @@
+ // (this will also re-enable screen updates, which were disabled above)
+ // TODO: send PaintEvent
+
+- [window synthesizeMouseEnteredExitedEvents];
++ [AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows];
+ }];
+
+ JNF_COCOA_EXIT(env);
+@@ -1158,19 +1180,40 @@
+
+ /*
+ * Class: sun_lwawt_macosx_CPlatformWindow
++ * Method: nativeGetTopMostWindowUnderMouse
++ * Signature: (J)V
++ */
++JNIEXPORT jobject
++JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeGetTopmostPlatformWindowUnderMouse
++(JNIEnv *env, jclass clazz)
++{
++ jobject topmostWindowUnderMouse = nil;
++
++ JNF_COCOA_ENTER(env);
++ AWT_ASSERT_APPKIT_THREAD;
++
++ AWTWindow *awtWindow = [AWTWindow getTopmostWindowUnderMouse];
++ if (awtWindow != nil) {
++ topmostWindowUnderMouse = [awtWindow.javaPlatformWindow jObject];
++ }
++
++ JNF_COCOA_EXIT(env);
++
++ return topmostWindowUnderMouse;
++}
++
++/*
++ * Class: sun_lwawt_macosx_CPlatformWindow
+ * Method: nativeSynthesizeMouseEnteredExitedEvents
+ * Signature: (J)V
+ */
+ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSynthesizeMouseEnteredExitedEvents
+-(JNIEnv *env, jclass clazz, jlong windowPtr)
++(JNIEnv *env, jclass clazz)
+ {
+ JNF_COCOA_ENTER(env);
+
+- NSWindow *nsWindow = OBJC(windowPtr);
+ [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+- AWTWindow *window = (AWTWindow*)[nsWindow delegate];
+-
+- [window synthesizeMouseEnteredExitedEvents];
++ [AWTWindow synthesizeMouseEnteredExitedEventsForAllWindows];
+ }];
+
+ JNF_COCOA_EXIT(env);
+--- ./jdk/src/share/classes/com/sun/crypto/provider/RSACipher.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/com/sun/crypto/provider/RSACipher.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -39,6 +39,8 @@
+
+ import sun.security.rsa.*;
+ import sun.security.jca.Providers;
++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec;
++import sun.security.util.KeyUtil;
+
+ /**
+ * RSA cipher implementation. Supports RSA en/decryption and signing/verifying
+@@ -91,8 +93,8 @@
+ // padding object
+ private RSAPadding padding;
+
+- // cipher parameter for OAEP padding
+- private OAEPParameterSpec spec = null;
++ // cipher parameter for OAEP padding and TLS RSA premaster secret
++ private AlgorithmParameterSpec spec = null;
+
+ // buffer for the data
+ private byte[] buffer;
+@@ -110,6 +112,9 @@
+ // hash algorithm for OAEP
+ private String oaepHashAlgorithm = "SHA-1";
+
++ // the source of randomness
++ private SecureRandom random;
++
+ public RSACipher() {
+ paddingType = PAD_PKCS1;
+ }
+@@ -175,7 +180,7 @@
+
+ // see JCE spec
+ protected AlgorithmParameters engineGetParameters() {
+- if (spec != null) {
++ if (spec != null && spec instanceof OAEPParameterSpec) {
+ try {
+ AlgorithmParameters params =
+ AlgorithmParameters.getInstance("OAEP", "SunJCE");
+@@ -278,8 +283,13 @@
+ buffer = new byte[n];
+ } else if (paddingType == PAD_PKCS1) {
+ if (params != null) {
+- throw new InvalidAlgorithmParameterException
+- ("Parameters not supported");
++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new InvalidAlgorithmParameterException(
++ "Parameters not supported");
++ }
++
++ spec = params;
++ this.random = random; // for TLS RSA premaster secret
+ }
+ int blockType = (mode <= MODE_DECRYPT) ? RSAPadding.PAD_BLOCKTYPE_2
+ : RSAPadding.PAD_BLOCKTYPE_1;
+@@ -295,19 +305,18 @@
+ throw new InvalidKeyException
+ ("OAEP cannot be used to sign or verify signatures");
+ }
+- OAEPParameterSpec myParams;
+ if (params != null) {
+ if (!(params instanceof OAEPParameterSpec)) {
+ throw new InvalidAlgorithmParameterException
+ ("Wrong Parameters for OAEP Padding");
+ }
+- myParams = (OAEPParameterSpec) params;
++ spec = params;
+ } else {
+- myParams = new OAEPParameterSpec(oaepHashAlgorithm, "MGF1",
++ spec = new OAEPParameterSpec(oaepHashAlgorithm, "MGF1",
+ MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT);
+ }
+ padding = RSAPadding.getInstance(RSAPadding.PAD_OAEP_MGF1, n,
+- random, myParams);
++ random, (OAEPParameterSpec)spec);
+ if (encrypt) {
+ int k = padding.getMaxDataSize();
+ buffer = new byte[k];
+@@ -422,17 +431,40 @@
+ if (wrappedKey.length > buffer.length) {
+ throw new InvalidKeyException("Key is too long for unwrapping");
+ }
++
++ boolean isTlsRsaPremasterSecret =
++ algorithm.equals("TlsRsaPremasterSecret");
++ Exception failover = null;
++ byte[] encoded = null;
++
+ update(wrappedKey, 0, wrappedKey.length);
+ try {
+- byte[] encoded = doFinal();
+- return ConstructKeys.constructKey(encoded, algorithm, type);
++ encoded = doFinal();
+ } catch (BadPaddingException e) {
+- // should not occur
+- throw new InvalidKeyException("Unwrapping failed", e);
++ if (isTlsRsaPremasterSecret) {
++ failover = e;
++ } else {
++ throw new InvalidKeyException("Unwrapping failed", e);
++ }
+ } catch (IllegalBlockSizeException e) {
+ // should not occur, handled with length check above
+ throw new InvalidKeyException("Unwrapping failed", e);
+ }
++
++ if (isTlsRsaPremasterSecret) {
++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new IllegalStateException(
++ "No TlsRsaPremasterSecretParameterSpec specified");
++ }
++
++ // polish the TLS premaster secret
++ encoded = KeyUtil.checkTlsPreMasterSecretKey(
++ ((TlsRsaPremasterSecretParameterSpec)spec).getClientVersion(),
++ ((TlsRsaPremasterSecretParameterSpec)spec).getServerVersion(),
++ random, encoded, (failover != null));
++ }
++
++ return ConstructKeys.constructKey(encoded, algorithm, type);
+ }
+
+ // see JCE spec
+@@ -440,5 +472,4 @@
+ RSAKey rsaKey = RSAKeyFactory.toRSAKey(key);
+ return rsaKey.getModulus().bitLength();
+ }
+-
+ }
+--- ./jdk/src/share/classes/com/sun/crypto/provider/TlsRsaPremasterSecretGenerator.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/com/sun/crypto/provider/TlsRsaPremasterSecretGenerator.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -56,7 +56,7 @@
+
+ protected void engineInit(AlgorithmParameterSpec params,
+ SecureRandom random) throws InvalidAlgorithmParameterException {
+- if (params instanceof TlsRsaPremasterSecretParameterSpec == false) {
++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
+ throw new InvalidAlgorithmParameterException(MSG);
+ }
+ this.spec = (TlsRsaPremasterSecretParameterSpec)params;
+@@ -67,21 +67,20 @@
+ throw new InvalidParameterException(MSG);
+ }
+
++ // Only can be used in client side to generate TLS RSA premaster secret.
+ protected SecretKey engineGenerateKey() {
+ if (spec == null) {
+ throw new IllegalStateException(
+ "TlsRsaPremasterSecretGenerator must be initialized");
+ }
+- byte[] b = spec.getEncodedSecret();
+- if (b == null) {
+- if (random == null) {
+- random = new SecureRandom();
+- }
+- b = new byte[48];
+- random.nextBytes(b);
+- b[0] = (byte)spec.getMajorVersion();
+- b[1] = (byte)spec.getMinorVersion();
++
++ if (random == null) {
++ random = new SecureRandom();
+ }
++ byte[] b = new byte[48];
++ random.nextBytes(b);
++ b[0] = (byte)spec.getMajorVersion();
++ b[1] = (byte)spec.getMinorVersion();
+
+ return new SecretKeySpec(b, "TlsRsaPremasterSecret");
+ }
+--- ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/com/sun/jmx/remote/security/SubjectDelegator.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2006, 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
+@@ -34,22 +34,14 @@
+
+ import javax.management.remote.SubjectDelegationPermission;
+
+-import com.sun.jmx.remote.util.CacheMap;
+-import java.util.ArrayList;
+-import java.util.Collection;
++import java.util.*;
+
+ public class SubjectDelegator {
+- private static final int PRINCIPALS_CACHE_SIZE = 10;
+- private static final int ACC_CACHE_SIZE = 10;
+-
+- private CacheMap<Subject, Principal[]> principalsCache;
+- private CacheMap<Subject, AccessControlContext> accCache;
+-
+ /* Return the AccessControlContext appropriate to execute an
+ operation on behalf of the delegatedSubject. If the
+ authenticatedAccessControlContext does not have permission to
+ delegate to that subject, throw SecurityException. */
+- public synchronized AccessControlContext
++ public AccessControlContext
+ delegatedContext(AccessControlContext authenticatedACC,
+ Subject delegatedSubject,
+ boolean removeCallerContext)
+@@ -58,56 +50,14 @@
+ if (System.getSecurityManager() != null && authenticatedACC == null) {
+ throw new SecurityException("Illegal AccessControlContext: null");
+ }
+- if (principalsCache == null || accCache == null) {
+- principalsCache =
+- new CacheMap<>(PRINCIPALS_CACHE_SIZE);
+- accCache =
+- new CacheMap<>(ACC_CACHE_SIZE);
+- }
+-
+- // Retrieve the principals for the given
+- // delegated subject from the cache
+- //
+- Principal[] delegatedPrincipals = principalsCache.get(delegatedSubject);
+-
+- // Convert the set of principals stored in the
+- // delegated subject into an array of principals
+- // and store it in the cache
+- //
+- if (delegatedPrincipals == null) {
+- delegatedPrincipals =
+- delegatedSubject.getPrincipals().toArray(new Principal[0]);
+- principalsCache.put(delegatedSubject, delegatedPrincipals);
+- }
+-
+- // Retrieve the access control context for the
+- // given delegated subject from the cache
+- //
+- AccessControlContext delegatedACC = accCache.get(delegatedSubject);
+-
+- // Build the access control context to be used
+- // when executing code as the delegated subject
+- // and store it in the cache
+- //
+- if (delegatedACC == null) {
+- if (removeCallerContext) {
+- delegatedACC =
+- JMXSubjectDomainCombiner.getDomainCombinerContext(
+- delegatedSubject);
+- } else {
+- delegatedACC =
+- JMXSubjectDomainCombiner.getContext(delegatedSubject);
+- }
+- accCache.put(delegatedSubject, delegatedACC);
+- }
+
+ // Check if the subject delegation permission allows the
+ // authenticated subject to assume the identity of each
+ // principal in the delegated subject
+ //
+- final Principal[] dp = delegatedPrincipals;
+- final Collection<Permission> permissions = new ArrayList<>(dp.length);
+- for(Principal p : dp) {
++ Collection<Principal> ps = getSubjectPrincipals(delegatedSubject);
++ final Collection<Permission> permissions = new ArrayList<>(ps.size());
++ for(Principal p : ps) {
+ final String pname = p.getClass().getName() + "." + p.getName();
+ permissions.add(new SubjectDelegationPermission(pname));
+ }
+@@ -122,7 +72,15 @@
+ };
+ AccessController.doPrivileged(action, authenticatedACC);
+
+- return delegatedACC;
++ return getDelegatedAcc(delegatedSubject, removeCallerContext);
++ }
++
++ private AccessControlContext getDelegatedAcc(Subject delegatedSubject, boolean removeCallerContext) {
++ if (removeCallerContext) {
++ return JMXSubjectDomainCombiner.getDomainCombinerContext(delegatedSubject);
++ } else {
++ return JMXSubjectDomainCombiner.getContext(delegatedSubject);
++ }
+ }
+
+ /**
+@@ -137,11 +95,9 @@
+ public static synchronized boolean
+ checkRemoveCallerContext(Subject subject) {
+ try {
+- final Principal[] dp =
+- subject.getPrincipals().toArray(new Principal[0]);
+- for (int i = 0 ; i < dp.length ; i++) {
++ for (Principal p : getSubjectPrincipals(subject)) {
+ final String pname =
+- dp[i].getClass().getName() + "." + dp[i].getName();
++ p.getClass().getName() + "." + p.getName();
+ final Permission sdp =
+ new SubjectDelegationPermission(pname);
+ AccessController.checkPermission(sdp);
+@@ -151,4 +107,19 @@
+ }
+ return true;
+ }
++
++ /**
++ * Retrieves the {@linkplain Subject} principals
++ * @param subject The subject
++ * @return If the {@code Subject} is immutable it will return the principals directly.
++ * If the {@code Subject} is mutable it will create an unmodifiable copy.
++ */
++ private static Collection<Principal> getSubjectPrincipals(Subject subject) {
++ if (subject.isReadOnly()) {
++ return subject.getPrincipals();
++ }
++
++ List<Principal> principals = Arrays.asList(subject.getPrincipals().toArray(new Principal[0]));
++ return Collections.unmodifiableList(principals);
++ }
+ }
+--- ./jdk/src/share/classes/com/sun/jmx/remote/util/CacheMap.java Wed May 07 19:26:47 2014 -0700
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,121 +0,0 @@
+-/*
+- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+- * 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.jmx.remote.util;
+-
+-import java.lang.ref.SoftReference;
+-import java.util.Iterator;
+-import java.util.LinkedList;
+-import java.util.List;
+-import java.util.WeakHashMap;
+-
+-import com.sun.jmx.mbeanserver.Util;
+-
+-/**
+- * <p>Like WeakHashMap, except that the keys of the <em>n</em> most
+- * recently-accessed entries are kept as {@link SoftReference soft
+- * references}. Accessing an element means creating it, or retrieving
+- * it with {@link #get(Object) get}. Because these entries are kept
+- * with soft references, they will tend to remain even if their keys
+- * are not referenced elsewhere. But if memory is short, they will
+- * be removed.</p>
+- */
+-public class CacheMap<K, V> extends WeakHashMap<K, V> {
+- /**
+- * <p>Create a <code>CacheMap</code> that can keep up to
+- * <code>nSoftReferences</code> as soft references.</p>
+- *
+- * @param nSoftReferences Maximum number of keys to keep as soft
+- * references. Access times for {@link #get(Object) get} and
+- * {@link #put(Object, Object) put} have a component that scales
+- * linearly with <code>nSoftReferences</code>, so this value
+- * should not be too great.
+- *
+- * @throws IllegalArgumentException if
+- * <code>nSoftReferences</code> is negative.
+- */
+- public CacheMap(int nSoftReferences) {
+- if (nSoftReferences < 0) {
+- throw new IllegalArgumentException("nSoftReferences = " +
+- nSoftReferences);
+- }
+- this.nSoftReferences = nSoftReferences;
+- }
+-
+- public V put(K key, V value) {
+- cache(key);
+- return super.put(key, value);
+- }
+-
+- public V get(Object key) {
+- cache(Util.<K>cast(key));
+- return super.get(key);
+- }
+-
+- /* We don't override remove(Object) or try to do something with
+- the map's iterators to detect removal. So we may keep useless
+- entries in the soft reference list for keys that have since
+- been removed. The assumption is that entries are added to the
+- cache but never removed. But the behavior is not wrong if
+- they are in fact removed -- the caching is just less
+- performant. */
+-
+- private void cache(K key) {
+- Iterator<SoftReference<K>> it = cache.iterator();
+- while (it.hasNext()) {
+- SoftReference<K> sref = it.next();
+- K key1 = sref.get();
+- if (key1 == null)
+- it.remove();
+- else if (key.equals(key1)) {
+- // Move this element to the head of the LRU list
+- it.remove();
+- cache.add(0, sref);
+- return;
+- }
+- }
+-
+- int size = cache.size();
+- if (size == nSoftReferences) {
+- if (size == 0)
+- return; // degenerate case, equivalent to WeakHashMap
+- it.remove();
+- }
+-
+- cache.add(0, new SoftReference<K>(key));
+- }
+-
+- /* List of soft references for the most-recently referenced keys.
+- The list is in most-recently-used order, i.e. the first element
+- is the most-recently referenced key. There are never more than
+- nSoftReferences elements of this list.
+-
+- If we didn't care about J2SE 1.3 compatibility, we could use
+- LinkedHashSet in conjunction with a subclass of SoftReference
+- whose equals and hashCode reflect the referent. */
+- private final LinkedList<SoftReference<K>> cache =
+- new LinkedList<SoftReference<K>>();
+- private final int nSoftReferences;
+-}
+--- ./jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/com/sun/security/sasl/CramMD5Base.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 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
+@@ -32,6 +32,7 @@
+ import java.security.NoSuchAlgorithmException;
+ import java.security.MessageDigest;
+
++import java.util.Arrays;
+ import java.util.logging.Logger;
+
+ /**
+@@ -159,7 +160,7 @@
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
+
+ /* digest the key if longer than 64 bytes */
+- if (key.length > 64) {
++ if (key.length > MD5_BLOCKSIZE) {
+ key = md5.digest(key);
+ }
+
+@@ -169,13 +170,9 @@
+ int i;
+
+ /* store key in pads */
+- for (i = 0; i < MD5_BLOCKSIZE; i++) {
+- for ( ; i < key.length; i++) {
+- ipad[i] = key[i];
+- opad[i] = key[i];
+- }
+- ipad[i] = 0x00;
+- opad[i] = 0x00;
++ for (i = 0; i < key.length; i++) {
++ ipad[i] = key[i];
++ opad[i] = key[i];
+ }
+
+ /* XOR key with pads */
+@@ -207,6 +204,11 @@
+ }
+ }
+
++ Arrays.fill(ipad, (byte)0);
++ Arrays.fill(opad, (byte)0);
++ ipad = null;
++ opad = null;
++
+ return (digestString.toString());
+ }
+
+--- ./jdk/src/share/classes/java/awt/Component.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/awt/Component.java Wed Apr 16 12:37:49 2014 +0400
+@@ -7922,7 +7922,7 @@
+ res = toFocus.requestFocusInWindow(CausedFocusEvent.Cause.TRAVERSAL_BACKWARD);
+ }
+ }
+- if (!res) {
++ if (clearOnFailure && !res) {
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+ focusLog.finer("clear global focus owner");
+ }
+--- ./jdk/src/share/classes/java/awt/KeyboardFocusManager.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/awt/KeyboardFocusManager.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2000, 2011, 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
+@@ -248,15 +248,7 @@
+ public static void setCurrentKeyboardFocusManager(
+ KeyboardFocusManager newManager) throws SecurityException
+ {
+- SecurityManager security = System.getSecurityManager();
+- if (security != null) {
+- if (replaceKeyboardFocusManagerPermission == null) {
+- replaceKeyboardFocusManagerPermission =
+- new AWTPermission("replaceKeyboardFocusManager");
+- }
+- security.
+- checkPermission(replaceKeyboardFocusManagerPermission);
+- }
++ checkReplaceKFMPermission();
+
+ KeyboardFocusManager oldManager = null;
+
+@@ -508,7 +500,7 @@
+ */
+ protected Component getGlobalFocusOwner() throws SecurityException {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ return focusOwner;
+ }
+ }
+@@ -543,7 +535,7 @@
+
+ if (focusOwner == null || focusOwner.isFocusable()) {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+
+ oldFocusOwner = getFocusOwner();
+
+@@ -595,7 +587,7 @@
+ */
+ public void clearGlobalFocusOwner() {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ }
+ if (!GraphicsEnvironment.isHeadless()) {
+ // Toolkit must be fully initialized, otherwise
+@@ -676,7 +668,7 @@
+ throws SecurityException
+ {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ return permanentFocusOwner;
+ }
+ }
+@@ -712,7 +704,7 @@
+
+ if (permanentFocusOwner == null || permanentFocusOwner.isFocusable()) {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+
+ oldPermanentFocusOwner = getPermanentFocusOwner();
+
+@@ -779,7 +771,7 @@
+ */
+ protected Window getGlobalFocusedWindow() throws SecurityException {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ return focusedWindow;
+ }
+ }
+@@ -811,7 +803,7 @@
+
+ if (focusedWindow == null || focusedWindow.isFocusableWindow()) {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+
+ oldFocusedWindow = getFocusedWindow();
+
+@@ -879,7 +871,7 @@
+ */
+ protected Window getGlobalActiveWindow() throws SecurityException {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ return activeWindow;
+ }
+ }
+@@ -909,7 +901,7 @@
+ protected void setGlobalActiveWindow(Window activeWindow) {
+ Window oldActiveWindow;
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+
+ oldActiveWindow = getActiveWindow();
+ if (focusLog.isLoggable(PlatformLogger.FINER)) {
+@@ -1205,7 +1197,7 @@
+ throws SecurityException
+ {
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+ return currentFocusCycleRoot;
+ }
+ }
+@@ -1230,7 +1222,7 @@
+ Container oldFocusCycleRoot;
+
+ synchronized (KeyboardFocusManager.class) {
+- checkCurrentKFMSecurity();
++ checkKFMSecurity();
+
+ oldFocusCycleRoot = getCurrentFocusCycleRoot();
+ currentFocusCycleRoot = newFocusCycleRoot;
+@@ -2368,7 +2360,8 @@
+ focusLog.finest("Request {0}", String.valueOf(hwFocusRequest));
+ }
+ if (hwFocusRequest == null &&
+- heavyweight == nativeFocusOwner)
++ heavyweight == nativeFocusOwner &&
++ heavyweight.getContainingWindow() == nativeFocusedWindow)
+ {
+ if (descendant == currentFocusOwner) {
+ // Redundant request.
+@@ -3050,13 +3043,36 @@
+ }
+ }
+
+- private void checkCurrentKFMSecurity() {
++ private static void checkReplaceKFMPermission()
++ throws SecurityException
++ {
++ SecurityManager security = System.getSecurityManager();
++ if (security != null) {
++ if (replaceKeyboardFocusManagerPermission == null) {
++ replaceKeyboardFocusManagerPermission =
++ new AWTPermission("replaceKeyboardFocusManager");
++ }
++ security.
++ checkPermission(replaceKeyboardFocusManagerPermission);
++ }
++ }
++
++ // Checks if this KeyboardFocusManager instance is the current KFM,
++ // or otherwise checks if the calling thread has "replaceKeyboardFocusManager"
++ // permission. Here's the reasoning to do so:
++ //
++ // A system KFM instance (which is the current KFM by default) may have no
++ // "replaceKFM" permission when a client code is on the call stack beneath,
++ // but still it should be able to execute the methods protected by this check
++ // due to the system KFM is trusted (and so it does like "privileged").
++ //
++ // If this KFM instance is not the current KFM but the client code has all
++ // permissions we can't throw SecurityException because it would contradict
++ // the security concepts. In this case the trusted client code is responsible
++ // for calling the secured methods from KFM instance which is not current.
++ private void checkKFMSecurity() {
+ if (this != getCurrentKeyboardFocusManager()) {
+- if (focusLog.isLoggable(PlatformLogger.FINER)) {
+- focusLog.finer("This manager is " + this +
+- ", current is " + getCurrentKeyboardFocusManager());
+- }
+- throw new SecurityException(notPrivileged);
++ checkReplaceKFMPermission();
+ }
+ }
+ }
+--- ./jdk/src/share/classes/java/io/ObjectOutputStream.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/io/ObjectOutputStream.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1254,7 +1254,7 @@
+ }
+
+ bout.setBlockDataMode(true);
+- if (isCustomSubclass()) {
++ if (cl != null && isCustomSubclass()) {
+ ReflectUtil.checkPackageAccess(cl);
+ }
+ annotateProxyClass(cl);
+@@ -1283,7 +1283,7 @@
+
+ Class cl = desc.forClass();
+ bout.setBlockDataMode(true);
+- if (isCustomSubclass()) {
++ if (cl != null && isCustomSubclass()) {
+ ReflectUtil.checkPackageAccess(cl);
+ }
+ annotateClass(cl);
+--- ./jdk/src/share/classes/java/lang/Class.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/Class.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -2338,44 +2338,110 @@
+ }
+
+ /**
++ * Atomic operations support.
++ */
++ private static class Atomic {
++ // initialize Unsafe machinery here, since we need to call Class.class instance method
++ // and have to avoid calling it in the static initializer of the Class class...
++ private static final Unsafe unsafe = Unsafe.getUnsafe();
++ // offset of Class.reflectionData instance field
++ private static final long reflectionDataOffset;
++ // offset of Class.annotationType instance field
++ private static final long annotationTypeOffset;
++
++ static {
++ Field[] fields = Class.class.getDeclaredFields0(false); // bypass caches
++ reflectionDataOffset = objectFieldOffset(fields, "reflectionData");
++ annotationTypeOffset = objectFieldOffset(fields, "annotationType");
++ }
++
++ private static long objectFieldOffset(Field[] fields, String fieldName) {
++ Field field = searchFields(fields, fieldName);
++ if (field == null) {
++ throw new Error("No " + fieldName + " field found in java.lang.Class");
++ }
++ return unsafe.objectFieldOffset(field);
++ }
++
++ static <T> boolean casReflectionData(Class<?> clazz,
++ SoftReference<ReflectionData<T>> oldData,
++ SoftReference<ReflectionData<T>> newData) {
++ return unsafe.compareAndSwapObject(clazz, reflectionDataOffset, oldData, newData);
++ }
++
++ static <T> boolean casAnnotationType(Class<?> clazz,
++ AnnotationType oldType,
++ AnnotationType newType) {
++ return unsafe.compareAndSwapObject(clazz, annotationTypeOffset, oldType, newType);
++ }
++ }
++
++ /**
+ * Reflection support.
+ */
+
+ // Caches for certain reflective results
+ private static boolean useCaches = true;
+- private volatile transient SoftReference<Field[]> declaredFields;
+- private volatile transient SoftReference<Field[]> publicFields;
+- private volatile transient SoftReference<Method[]> declaredMethods;
+- private volatile transient SoftReference<Method[]> publicMethods;
+- private volatile transient SoftReference<Constructor<T>[]> declaredConstructors;
+- private volatile transient SoftReference<Constructor<T>[]> publicConstructors;
+- // Intermediate results for getFields and getMethods
+- private volatile transient SoftReference<Field[]> declaredPublicFields;
+- private volatile transient SoftReference<Method[]> declaredPublicMethods;
++
++ // reflection data that might get invalidated when JVM TI RedefineClasses() is called
++ static class ReflectionData<T> {
++ volatile Field[] declaredFields;
++ volatile Field[] publicFields;
++ volatile Method[] declaredMethods;
++ volatile Method[] publicMethods;
++ volatile Constructor<T>[] declaredConstructors;
++ volatile Constructor<T>[] publicConstructors;
++ // Intermediate results for getFields and getMethods
++ volatile Field[] declaredPublicFields;
++ volatile Method[] declaredPublicMethods;
++ // Value of classRedefinedCount when we created this ReflectionData instance
++ final int redefinedCount;
++
++ ReflectionData(int redefinedCount) {
++ this.redefinedCount = redefinedCount;
++ }
++ }
++
++ private volatile transient SoftReference<ReflectionData<T>> reflectionData;
+
+ // Incremented by the VM on each call to JVM TI RedefineClasses()
+ // that redefines this class or a superclass.
+ private volatile transient int classRedefinedCount = 0;
+
+- // Value of classRedefinedCount when we last cleared the cached values
+- // that are sensitive to class redefinition.
+- private volatile transient int lastRedefinedCount = 0;
++ // Lazily create and cache ReflectionData
++ private ReflectionData<T> reflectionData() {
++ SoftReference<ReflectionData<T>> reflectionData = this.reflectionData;
++ int classRedefinedCount = this.classRedefinedCount;
++ ReflectionData<T> rd;
++ if (useCaches &&
++ reflectionData != null &&
++ (rd = reflectionData.get()) != null &&
++ rd.redefinedCount == classRedefinedCount) {
++ return rd;
++ }
++ // else no SoftReference or cleared SoftReference or stale ReflectionData
++ // -> create and replace new instance
++ return newReflectionData(reflectionData, classRedefinedCount);
++ }
+
+- // Clears cached values that might possibly have been obsoleted by
+- // a class redefinition.
+- private void clearCachesOnClassRedefinition() {
+- if (lastRedefinedCount != classRedefinedCount) {
+- declaredFields = publicFields = declaredPublicFields = null;
+- declaredMethods = publicMethods = declaredPublicMethods = null;
+- declaredConstructors = publicConstructors = null;
+- annotations = declaredAnnotations = null;
++ private ReflectionData<T> newReflectionData(SoftReference<ReflectionData<T>> oldReflectionData,
++ int classRedefinedCount) {
++ if (!useCaches) return null;
+
+- // Use of "volatile" (and synchronization by caller in the case
+- // of annotations) ensures that no thread sees the update to
+- // lastRedefinedCount before seeing the caches cleared.
+- // We do not guard against brief windows during which multiple
+- // threads might redundantly work to fill an empty cache.
+- lastRedefinedCount = classRedefinedCount;
++ while (true) {
++ ReflectionData<T> rd = new ReflectionData<>(classRedefinedCount);
++ // try to CAS it...
++ if (Atomic.casReflectionData(this, oldReflectionData, new SoftReference<>(rd))) {
++ return rd;
++ }
++ // else retry
++ oldReflectionData = this.reflectionData;
++ classRedefinedCount = this.classRedefinedCount;
++ if (oldReflectionData != null &&
++ (rd = oldReflectionData.get()) != null &&
++ rd.redefinedCount == classRedefinedCount) {
++ return rd;
++ }
+ }
+ }
+
+@@ -2403,7 +2469,7 @@
+ }
+
+ // Annotations handling
+- private native byte[] getRawAnnotations();
++ native byte[] getRawAnnotations();
+
+ native ConstantPool getConstantPool();
+
+@@ -2418,27 +2484,19 @@
+ // via ReflectionFactory.copyField.
+ private Field[] privateGetDeclaredFields(boolean publicOnly) {
+ checkInitted();
+- Field[] res = null;
+- if (useCaches) {
+- clearCachesOnClassRedefinition();
+- if (publicOnly) {
+- if (declaredPublicFields != null) {
+- res = declaredPublicFields.get();
+- }
+- } else {
+- if (declaredFields != null) {
+- res = declaredFields.get();
+- }
+- }
++ Field[] res;
++ ReflectionData<T> rd = reflectionData();
++ if (rd != null) {
++ res = publicOnly ? rd.declaredPublicFields : rd.declaredFields;
+ if (res != null) return res;
+ }
+ // No cached value available; request value from VM
+ res = Reflection.filterFields(this, getDeclaredFields0(publicOnly));
+- if (useCaches) {
++ if (rd != null) {
+ if (publicOnly) {
+- declaredPublicFields = new SoftReference<>(res);
++ rd.declaredPublicFields = res;
+ } else {
+- declaredFields = new SoftReference<>(res);
++ rd.declaredFields = res;
+ }
+ }
+ return res;
+@@ -2449,12 +2507,10 @@
+ // via ReflectionFactory.copyField.
+ private Field[] privateGetPublicFields(Set<Class<?>> traversedInterfaces) {
+ checkInitted();
+- Field[] res = null;
+- if (useCaches) {
+- clearCachesOnClassRedefinition();
+- if (publicFields != null) {
+- res = publicFields.get();
+- }
++ Field[] res;
++ ReflectionData<T> rd = reflectionData();
++ if (rd != null) {
++ res = rd.publicFields;
+ if (res != null) return res;
+ }
+
+@@ -2487,8 +2543,8 @@
+
+ res = new Field[fields.size()];
+ fields.toArray(res);
+- if (useCaches) {
+- publicFields = new SoftReference<>(res);
++ if (rd != null) {
++ rd.publicFields = res;
+ }
+ return res;
+ }
+@@ -2511,18 +2567,10 @@
+ // instead be copied via ReflectionFactory.copyConstructor.
+ private Constructor<T>[] privateGetDeclaredConstructors(boolean publicOnly) {
+ checkInitted();
+- Constructor<T>[] res = null;
+- if (useCaches) {
+- clearCachesOnClassRedefinition();
+- if (publicOnly) {
+- if (publicConstructors != null) {
+- res = publicConstructors.get();
+- }
+- } else {
+- if (declaredConstructors != null) {
+- res = declaredConstructors.get();
+- }
+- }
++ Constructor<T>[] res;
++ ReflectionData<T> rd = reflectionData();
++ if (rd != null) {
++ res = publicOnly ? rd.publicConstructors : rd.declaredConstructors;
+ if (res != null) return res;
+ }
+ // No cached value available; request value from VM
+@@ -2531,11 +2579,11 @@
+ } else {
+ res = getDeclaredConstructors0(publicOnly);
+ }
+- if (useCaches) {
++ if (rd != null) {
+ if (publicOnly) {
+- publicConstructors = new SoftReference<>(res);
++ rd.publicConstructors = res;
+ } else {
+- declaredConstructors = new SoftReference<>(res);
++ rd.declaredConstructors = res;
+ }
+ }
+ return res;
+@@ -2552,27 +2600,19 @@
+ // via ReflectionFactory.copyMethod.
+ private Method[] privateGetDeclaredMethods(boolean publicOnly) {
+ checkInitted();
+- Method[] res = null;
+- if (useCaches) {
+- clearCachesOnClassRedefinition();
+- if (publicOnly) {
+- if (declaredPublicMethods != null) {
+- res = declaredPublicMethods.get();
+- }
+- } else {
+- if (declaredMethods != null) {
+- res = declaredMethods.get();
+- }
+- }
++ Method[] res;
++ ReflectionData<T> rd = reflectionData();
++ if (rd != null) {
++ res = publicOnly ? rd.declaredPublicMethods : rd.declaredMethods;
+ if (res != null) return res;
+ }
+ // No cached value available; request value from VM
+ res = Reflection.filterMethods(this, getDeclaredMethods0(publicOnly));
+- if (useCaches) {
++ if (rd != null) {
+ if (publicOnly) {
+- declaredPublicMethods = new SoftReference<>(res);
++ rd.declaredPublicMethods = res;
+ } else {
+- declaredMethods = new SoftReference<>(res);
++ rd.declaredMethods = res;
+ }
+ }
+ return res;
+@@ -2674,12 +2714,10 @@
+ // via ReflectionFactory.copyMethod.
+ private Method[] privateGetPublicMethods() {
+ checkInitted();
+- Method[] res = null;
+- if (useCaches) {
+- clearCachesOnClassRedefinition();
+- if (publicMethods != null) {
+- res = publicMethods.get();
+- }
++ Method[] res;
++ ReflectionData<T> rd = reflectionData();
++ if (rd != null) {
++ res = rd.publicMethods;
+ if (res != null) return res;
+ }
+
+@@ -2727,8 +2765,8 @@
+ methods.addAllIfNotPresent(inheritedMethods);
+ methods.compactAndTrim();
+ res = methods.getArray();
+- if (useCaches) {
+- publicMethods = new SoftReference<>(res);
++ if (rd != null) {
++ rd.publicMethods = res;
+ }
+ return res;
+ }
+@@ -2738,7 +2776,7 @@
+ // Helpers for fetchers of one field, method, or constructor
+ //
+
+- private Field searchFields(Field[] fields, String name) {
++ private static Field searchFields(Field[] fields, String name) {
+ String internedName = name.intern();
+ for (int i = 0; i < fields.length; i++) {
+ if (fields[i].getName() == internedName) {
+@@ -2756,7 +2794,7 @@
+ // of Field objects which have to be created for the common
+ // case where the field being requested is declared in the
+ // class which is being queried.
+- Field res = null;
++ Field res;
+ // Search declared public fields
+ if ((res = searchFields(privateGetDeclaredFields(true), name)) != null) {
+ return res;
+@@ -2808,7 +2846,7 @@
+ // number of Method objects which have to be created for the
+ // common case where the method being requested is declared in
+ // the class which is being queried.
+- Method res = null;
++ Method res;
+ // Search declared public methods
+ if ((res = searchMethods(privateGetDeclaredMethods(true),
+ name,
+@@ -3209,9 +3247,20 @@
+ // Annotations cache
+ private transient Map<Class<? extends Annotation>, Annotation> annotations;
+ private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
++ // Value of classRedefinedCount when we last cleared the cached annotations and declaredAnnotations fields
++ private transient int lastAnnotationsRedefinedCount = 0;
++
++ // Clears cached values that might possibly have been obsoleted by
++ // a class redefinition.
++ private void clearAnnotationCachesOnClassRedefinition() {
++ if (lastAnnotationsRedefinedCount != classRedefinedCount) {
++ annotations = declaredAnnotations = null;
++ lastAnnotationsRedefinedCount = classRedefinedCount;
++ }
++ }
+
+ private synchronized void initAnnotationsIfNecessary() {
+- clearCachesOnClassRedefinition();
++ clearAnnotationCachesOnClassRedefinition();
+ if (annotations != null)
+ return;
+ declaredAnnotations = AnnotationParser.parseAnnotations(
+@@ -3233,10 +3282,11 @@
+
+ // Annotation types cache their internal (AnnotationType) form
+
+- private AnnotationType annotationType;
++ @SuppressWarnings("UnusedDeclaration")
++ private volatile transient AnnotationType annotationType;
+
+- void setAnnotationType(AnnotationType type) {
+- annotationType = type;
++ boolean casAnnotationType(AnnotationType oldType, AnnotationType newType) {
++ return Atomic.casAnnotationType(this, oldType, newType);
+ }
+
+ AnnotationType getAnnotationType() {
+--- ./jdk/src/share/classes/java/lang/ProcessBuilder.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/ProcessBuilder.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1018,6 +1018,12 @@
+
+ String dir = directory == null ? null : directory.toString();
+
++ for (int i = 1; i < cmdarray.length; i++) {
++ if (cmdarray[i].indexOf('\u0000') >= 0) {
++ throw new IOException("invalid null character in command");
++ }
++ }
++
+ try {
+ return ProcessImpl.start(cmdarray,
+ environment,
+--- ./jdk/src/share/classes/java/lang/System.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/System.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -1178,12 +1178,15 @@
+ public sun.reflect.ConstantPool getConstantPool(Class klass) {
+ return klass.getConstantPool();
+ }
+- public void setAnnotationType(Class klass, AnnotationType type) {
+- klass.setAnnotationType(type);
++ public boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType) {
++ return klass.casAnnotationType(oldType, newType);
+ }
+ public AnnotationType getAnnotationType(Class klass) {
+ return klass.getAnnotationType();
+ }
++ public byte[] getRawClassAnnotations(Class<?> klass) {
++ return klass.getRawAnnotations();
++ }
+ public <E extends Enum<E>>
+ E[] getEnumConstantsShared(Class<E> klass) {
+ return klass.getEnumConstantsShared();
+--- ./jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/DirectMethodHandle.java Wed Apr 16 12:37:49 2014 +0400
+@@ -243,12 +243,12 @@
+ assert(names.length == nameCursor);
+ if (doesAlloc) {
+ // names = { argx,y,z,... new C, init method }
+- names[NEW_OBJ] = new Name(NF_allocateInstance, names[DMH_THIS]);
+- names[GET_MEMBER] = new Name(NF_constructorMethod, names[DMH_THIS]);
++ names[NEW_OBJ] = new Name(Lazy.NF_allocateInstance, names[DMH_THIS]);
++ names[GET_MEMBER] = new Name(Lazy.NF_constructorMethod, names[DMH_THIS]);
+ } else if (needsInit) {
+- names[GET_MEMBER] = new Name(NF_internalMemberNameEnsureInit, names[DMH_THIS]);
++ names[GET_MEMBER] = new Name(Lazy.NF_internalMemberNameEnsureInit, names[DMH_THIS]);
+ } else {
+- names[GET_MEMBER] = new Name(NF_internalMemberName, names[DMH_THIS]);
++ names[GET_MEMBER] = new Name(Lazy.NF_internalMemberName, names[DMH_THIS]);
+ }
+ Object[] outArgs = Arrays.copyOfRange(names, ARG_BASE, GET_MEMBER+1, Object[].class);
+ assert(outArgs[outArgs.length-1] == names[GET_MEMBER]); // look, shifted args!
+@@ -596,18 +596,18 @@
+ final int RESULT = nameCursor-1; // either the call or the cast
+ Name[] names = arguments(nameCursor - ARG_LIMIT, mtype.invokerType());
+ if (needsInit)
+- names[INIT_BAR] = new Name(NF_ensureInitialized, names[DMH_THIS]);
++ names[INIT_BAR] = new Name(Lazy.NF_ensureInitialized, names[DMH_THIS]);
+ if (needsCast && !isGetter)
+- names[PRE_CAST] = new Name(NF_checkCast, names[DMH_THIS], names[SET_VALUE]);
++ names[PRE_CAST] = new Name(Lazy.NF_checkCast, names[DMH_THIS], names[SET_VALUE]);
+ Object[] outArgs = new Object[1 + linkerType.parameterCount()];
+ assert(outArgs.length == (isGetter ? 3 : 4));
+ outArgs[0] = UNSAFE;
+ if (isStatic) {
+- outArgs[1] = names[F_HOLDER] = new Name(NF_staticBase, names[DMH_THIS]);
+- outArgs[2] = names[F_OFFSET] = new Name(NF_staticOffset, names[DMH_THIS]);
++ outArgs[1] = names[F_HOLDER] = new Name(Lazy.NF_staticBase, names[DMH_THIS]);
++ outArgs[2] = names[F_OFFSET] = new Name(Lazy.NF_staticOffset, names[DMH_THIS]);
+ } else {
+- outArgs[1] = names[OBJ_CHECK] = new Name(NF_checkBase, names[OBJ_BASE]);
+- outArgs[2] = names[F_OFFSET] = new Name(NF_fieldOffset, names[DMH_THIS]);
++ outArgs[1] = names[OBJ_CHECK] = new Name(Lazy.NF_checkBase, names[OBJ_BASE]);
++ outArgs[2] = names[F_OFFSET] = new Name(Lazy.NF_fieldOffset, names[DMH_THIS]);
+ }
+ if (!isGetter) {
+ outArgs[3] = (needsCast ? names[PRE_CAST] : names[SET_VALUE]);
+@@ -615,7 +615,7 @@
+ for (Object a : outArgs) assert(a != null);
+ names[LINKER_CALL] = new Name(linker, outArgs);
+ if (needsCast && isGetter)
+- names[POST_CAST] = new Name(NF_checkCast, names[DMH_THIS], names[LINKER_CALL]);
++ names[POST_CAST] = new Name(Lazy.NF_checkCast, names[DMH_THIS], names[LINKER_CALL]);
+ for (Name n : names) assert(n != null);
+ String fieldOrStatic = (isStatic ? "Static" : "Field");
+ String lambdaName = (linkerName + fieldOrStatic); // significant only for debugging
+@@ -624,48 +624,54 @@
+ return new LambdaForm(lambdaName, ARG_LIMIT, names, RESULT);
+ }
+
+- private static final NamedFunction
+- NF_internalMemberName,
+- NF_internalMemberNameEnsureInit,
+- NF_ensureInitialized,
+- NF_fieldOffset,
+- NF_checkBase,
+- NF_staticBase,
+- NF_staticOffset,
+- NF_checkCast,
+- NF_allocateInstance,
+- NF_constructorMethod;
+- static {
+- try {
+- NamedFunction nfs[] = {
+- NF_internalMemberName = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("internalMemberName", Object.class)),
+- NF_internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("internalMemberNameEnsureInit", Object.class)),
+- NF_ensureInitialized = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("ensureInitialized", Object.class)),
+- NF_fieldOffset = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("fieldOffset", Object.class)),
+- NF_checkBase = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("checkBase", Object.class)),
+- NF_staticBase = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("staticBase", Object.class)),
+- NF_staticOffset = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("staticOffset", Object.class)),
+- NF_checkCast = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("checkCast", Object.class, Object.class)),
+- NF_allocateInstance = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("allocateInstance", Object.class)),
+- NF_constructorMethod = new NamedFunction(DirectMethodHandle.class
+- .getDeclaredMethod("constructorMethod", Object.class))
+- };
+- for (NamedFunction nf : nfs) {
+- // Each nf must be statically invocable or we get tied up in our bootstraps.
+- assert(InvokerBytecodeGenerator.isStaticallyInvocable(nf.member)) : nf;
+- nf.resolve();
++ /**
++ * Pre-initialized NamedFunctions for bootstrapping purposes.
++ * Factored in an inner class to delay initialization until first usage.
++ */
++ private static class Lazy {
++ static final NamedFunction
++ NF_internalMemberName,
++ NF_internalMemberNameEnsureInit,
++ NF_ensureInitialized,
++ NF_fieldOffset,
++ NF_checkBase,
++ NF_staticBase,
++ NF_staticOffset,
++ NF_checkCast,
++ NF_allocateInstance,
++ NF_constructorMethod;
++ static {
++ try {
++ NamedFunction nfs[] = {
++ NF_internalMemberName = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("internalMemberName", Object.class)),
++ NF_internalMemberNameEnsureInit = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("internalMemberNameEnsureInit", Object.class)),
++ NF_ensureInitialized = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("ensureInitialized", Object.class)),
++ NF_fieldOffset = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("fieldOffset", Object.class)),
++ NF_checkBase = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("checkBase", Object.class)),
++ NF_staticBase = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("staticBase", Object.class)),
++ NF_staticOffset = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("staticOffset", Object.class)),
++ NF_checkCast = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("checkCast", Object.class, Object.class)),
++ NF_allocateInstance = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("allocateInstance", Object.class)),
++ NF_constructorMethod = new NamedFunction(DirectMethodHandle.class
++ .getDeclaredMethod("constructorMethod", Object.class))
++ };
++ for (NamedFunction nf : nfs) {
++ // Each nf must be statically invocable or we get tied up in our bootstraps.
++ assert(InvokerBytecodeGenerator.isStaticallyInvocable(nf.member)) : nf;
++ nf.resolve();
++ }
++ } catch (ReflectiveOperationException ex) {
++ throw newInternalError(ex);
+ }
+- } catch (ReflectiveOperationException ex) {
+- throw newInternalError(ex);
+ }
+ }
+ }
+--- ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java Wed Apr 16 12:37:49 2014 +0400
+@@ -613,6 +613,12 @@
+ return false; // inner class of some sort
+ if (cls.getClassLoader() != MethodHandle.class.getClassLoader())
+ return false; // not on BCP
++ MethodType mtype = member.getMethodOrFieldType();
++ if (!isStaticallyNameable(mtype.returnType()))
++ return false;
++ for (Class<?> ptype : mtype.parameterArray())
++ if (!isStaticallyNameable(ptype))
++ return false;
+ if (!member.isPrivate() && VerifyAccess.isSamePackage(MethodHandle.class, cls))
+ return true; // in java.lang.invoke package
+ if (member.isPublic() && isStaticallyNameable(cls))
+--- ./jdk/src/share/classes/java/lang/invoke/Invokers.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/Invokers.java Wed Apr 16 12:37:49 2014 +0400
+@@ -318,6 +318,7 @@
+ // let mt=TYPEOF(a*:R), tmh=asType(mh, mt);
+ // tmh.invokeBasic(a*)
+ outArgs = Arrays.copyOfRange(names, CALL_MH, OUTARG_LIMIT, Object[].class);
++ outArgs[0] = names[CHECK_TYPE];
+ outCallType = mtype;
+ } else {
+ names[CHECK_TYPE] = new Name(NF_checkGenericType, names[CALL_MH], mtypeArg);
+--- ./jdk/src/share/classes/java/lang/invoke/MethodHandle.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandle.java Wed Apr 16 12:37:49 2014 +0400
+@@ -753,6 +753,10 @@
+ * to the target method handle.
+ * (The array may also be null when zero elements are required.)
+ * <p>
++ * If, when the adapter is called, the supplied array argument does
++ * not have the correct number of elements, the adapter will throw
++ * an {@link IllegalArgumentException} instead of invoking the target.
++ * <p>
+ * Here are some simple examples of array-spreading method handles:
+ * <blockquote><pre>
+ MethodHandle equals = publicLookup()
+@@ -763,6 +767,12 @@
+ MethodHandle eq2 = equals.asSpreader(Object[].class, 2);
+ assert( (boolean) eq2.invokeExact(new Object[]{ "me", "me" }));
+ assert(!(boolean) eq2.invokeExact(new Object[]{ "me", "thee" }));
++// try to spread from anything but a 2-array:
++for (int n = 0; n <= 10; n++) {
++ Object[] badArityArgs = (n == 2 ? null : new Object[n]);
++ try { assert((boolean) eq2.invokeExact(badArityArgs) && false); }
++ catch (IllegalArgumentException ex) { } // OK
++}
+ // spread both arguments from a String array:
+ MethodHandle eq2s = equals.asSpreader(String[].class, 2);
+ assert( (boolean) eq2s.invokeExact(new String[]{ "me", "me" }));
+--- ./jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandleImpl.java Wed Apr 16 12:37:49 2014 +0400
+@@ -430,7 +430,7 @@
+ // Spread the array.
+ MethodHandle aload = MethodHandles.arrayElementGetter(spreadArgType);
+ Name array = names[argIndex];
+- names[nameCursor++] = new Name(NF_checkSpreadArgument, array, spreadArgCount);
++ names[nameCursor++] = new Name(Lazy.NF_checkSpreadArgument, array, spreadArgCount);
+ for (int j = 0; j < spreadArgCount; i++, j++) {
+ indexes[i] = nameCursor;
+ names[nameCursor++] = new Name(aload, array, j);
+@@ -454,14 +454,8 @@
+ }
+
+ static void checkSpreadArgument(Object av, int n) {
+- // FIXME: regression test for bug 7141637 erroneously expects an NPE, and other tests may expect IAE
+- // but the actual exception raised by an arity mismatch should be WMTE
+- final boolean RAISE_RANDOM_EXCEPTIONS = true; // FIXME: delete in JSR 292 M1
+ if (av == null) {
+ if (n == 0) return;
+- int len;
+- if (RAISE_RANDOM_EXCEPTIONS)
+- len = ((Object[])av).length; // throw NPE; but delete this after tests are fixed
+ } else if (av instanceof Object[]) {
+ int len = ((Object[])av).length;
+ if (len == n) return;
+@@ -470,19 +464,23 @@
+ if (len == n) return;
+ }
+ // fall through to error:
+- if (RAISE_RANDOM_EXCEPTIONS)
+- throw newIllegalArgumentException("Array is not of length "+n);
+- throw new WrongMethodTypeException("Array is not of length "+n);
++ throw newIllegalArgumentException("array is not of length "+n);
+ }
+
+- private static final NamedFunction NF_checkSpreadArgument;
+- static {
+- try {
+- NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class
+- .getDeclaredMethod("checkSpreadArgument", Object.class, int.class));
+- NF_checkSpreadArgument.resolve();
+- } catch (ReflectiveOperationException ex) {
+- throw newInternalError(ex);
++ /**
++ * Pre-initialized NamedFunctions for bootstrapping purposes.
++ * Factored in an inner class to delay initialization until first usage.
++ */
++ private static class Lazy {
++ static final NamedFunction NF_checkSpreadArgument;
++ static {
++ try {
++ NF_checkSpreadArgument = new NamedFunction(MethodHandleImpl.class
++ .getDeclaredMethod("checkSpreadArgument", Object.class, int.class));
++ NF_checkSpreadArgument.resolve();
++ } catch (ReflectiveOperationException ex) {
++ throw newInternalError(ex);
++ }
+ }
+ }
+
+--- ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/invoke/MethodHandles.java Wed Apr 16 12:37:49 2014 +0400
+@@ -26,12 +26,15 @@
+ package java.lang.invoke;
+
+ import java.lang.reflect.*;
++
+ import sun.invoke.util.ValueConversions;
+ import sun.invoke.util.VerifyAccess;
+ import sun.invoke.util.Wrapper;
++
+ import java.util.List;
+ import java.util.ArrayList;
+ import java.util.Arrays;
++
+ import sun.reflect.CallerSensitive;
+ import sun.reflect.Reflection;
+ import sun.reflect.misc.ReflectUtil;
+@@ -245,6 +248,9 @@
+ * In general, the conditions under which a method handle may be
+ * looked up for a method {@code M} are exactly equivalent to the conditions
+ * under which the lookup class could have compiled and resolved a call to {@code M}.
++ * Where the JVM would raise exceptions like {@code NoSuchMethodError},
++ * a method handle lookup will generally raise a corresponding
++ * checked exception, such as {@code NoSuchMethodException}.
+ * And the effect of invoking the method handle resulting from the lookup
+ * is exactly equivalent to executing the compiled and resolved call to {@code M}.
+ * The same point is true of fields and constructors.
+@@ -261,6 +267,12 @@
+ * (which will necessarily be a superclass of the lookup class)
+ * to the lookup class itself.
+ * <p>
++ * The JVM represents constructors and static initializer blocks as internal methods
++ * with special names ({@code "<init>"} and {@code "<clinit>"}).
++ * The internal syntax of invocation instructions allows them to refer to such internal
++ * methods as if they were normal methods, but the JVM verifier rejects them.
++ * A lookup of such an internal method will produce a {@code NoSuchMethodException}.
++ * <p>
+ * In some cases, access between nested classes is obtained by the Java compiler by creating
+ * an wrapper method to access a private method of another class
+ * in the same top-level declaration.
+@@ -575,6 +587,15 @@
+ * The returned method handle will have
+ * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
+ * the method's variable arity modifier bit ({@code 0x0080}) is set.
++ * <b>Example:</b>
++ * <p><blockquote><pre>{@code
++import static java.lang.invoke.MethodHandles.*;
++import static java.lang.invoke.MethodType.*;
++...
++MethodHandle MH_asList = publicLookup().findStatic(Arrays.class,
++ "asList", methodType(List.class, Object[].class));
++assertEquals("[x, y]", MH_asList.invoke("x", "y").toString());
++ * }</pre></blockquote>
+ * @param refc the class from which the method is accessed
+ * @param name the name of the method
+ * @param type the type of the method
+@@ -625,6 +646,34 @@
+ * {@link java.lang.invoke.MethodHandles#invoker MethodHandles.invoker}
+ * with the same {@code type} argument.
+ *
++ * <b>Example:</b>
++ * <p><blockquote><pre>{@code
++import static java.lang.invoke.MethodHandles.*;
++import static java.lang.invoke.MethodType.*;
++...
++MethodHandle MH_concat = publicLookup().findVirtual(String.class,
++ "concat", methodType(String.class, String.class));
++MethodHandle MH_hashCode = publicLookup().findVirtual(Object.class,
++ "hashCode", methodType(int.class));
++MethodHandle MH_hashCode_String = publicLookup().findVirtual(String.class,
++ "hashCode", methodType(int.class));
++assertEquals("xy", (String) MH_concat.invokeExact("x", "y"));
++assertEquals("xy".hashCode(), (int) MH_hashCode.invokeExact((Object)"xy"));
++assertEquals("xy".hashCode(), (int) MH_hashCode_String.invokeExact("xy"));
++// interface method:
++MethodHandle MH_subSequence = publicLookup().findVirtual(CharSequence.class,
++ "subSequence", methodType(CharSequence.class, int.class, int.class));
++assertEquals("def", MH_subSequence.invoke("abcdefghi", 3, 6).toString());
++// constructor "internal method" must be accessed differently:
++MethodType MT_newString = methodType(void.class); //()V for new String()
++try { assertEquals("impossible", lookup()
++ .findVirtual(String.class, "<init>", MT_newString));
++ } catch (NoSuchMethodException ex) { } // OK
++MethodHandle MH_newString = publicLookup()
++ .findConstructor(String.class, MT_newString);
++assertEquals("", (String) MH_newString.invokeExact());
++ * }</pre></blockquote>
++ *
+ * @param refc the class or interface from which the method is accessed
+ * @param name the name of the method
+ * @param type the type of the method, with the receiver argument omitted
+@@ -666,12 +715,30 @@
+ * If the constructor's class has not yet been initialized, that is done
+ * immediately, before the method handle is returned.
+ * <p>
+- * Note: The requested type must have a return type of {@code void}.
+- * This is consistent with the JVM's treatment of constructor type descriptors.
++ * <em>(Note: The requested type must have a return type of {@code void}.
++ * This is consistent with the JVM's treatment of constructor type descriptors.)</em>
+ * <p>
+ * The returned method handle will have
+ * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
+ * the constructor's variable arity modifier bit ({@code 0x0080}) is set.
++ * <b>Example:</b>
++ * <p><blockquote><pre>{@code
++import static java.lang.invoke.MethodHandles.*;
++import static java.lang.invoke.MethodType.*;
++...
++MethodHandle MH_newArrayList = publicLookup().findConstructor(
++ ArrayList.class, methodType(void.class, Collection.class));
++Collection orig = Arrays.asList("x", "y");
++Collection copy = (ArrayList) MH_newArrayList.invokeExact(orig);
++assert(orig != copy);
++assertEquals(orig, copy);
++// a variable-arity constructor:
++MethodHandle MH_newProcessBuilder = publicLookup().findConstructor(
++ ProcessBuilder.class, methodType(void.class, String[].class));
++ProcessBuilder pb = (ProcessBuilder)
++ MH_newProcessBuilder.invoke("x", "y", "z");
++assertEquals("[x, y, z]", pb.command().toString());
++ * }</pre></blockquote>
+ * @param refc the class or interface from which the method is accessed
+ * @param type the type of the method, with the receiver argument omitted, and a void return type
+ * @return the desired method handle
+@@ -711,6 +778,45 @@
+ * The returned method handle will have
+ * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
+ * the method's variable arity modifier bit ({@code 0x0080}) is set.
++ * <p>
++ * <em>(Note: JVM internal methods named {@code <init>} not visible to this API,
++ * even though the {@code invokespecial} instruction can refer to them
++ * in special circumstances. Use {@link #findConstructor findConstructor}
++ * to access instance initialization methods in a safe manner.)</em>
++ * <b>Example:</b>
++ * <p><blockquote><pre>{@code
++import static java.lang.invoke.MethodHandles.*;
++import static java.lang.invoke.MethodType.*;
++...
++static class Listie extends ArrayList {
++ public String toString() { return "[wee Listie]"; }
++ static Lookup lookup() { return MethodHandles.lookup(); }
++}
++...
++// no access to constructor via invokeSpecial:
++MethodHandle MH_newListie = Listie.lookup()
++ .findConstructor(Listie.class, methodType(void.class));
++Listie l = (Listie) MH_newListie.invokeExact();
++try { assertEquals("impossible", Listie.lookup().findSpecial(
++ Listie.class, "<init>", methodType(void.class), Listie.class));
++ } catch (NoSuchMethodException ex) { } // OK
++// access to super and self methods via invokeSpecial:
++MethodHandle MH_super = Listie.lookup().findSpecial(
++ ArrayList.class, "toString" , methodType(String.class), Listie.class);
++MethodHandle MH_this = Listie.lookup().findSpecial(
++ Listie.class, "toString" , methodType(String.class), Listie.class);
++MethodHandle MH_duper = Listie.lookup().findSpecial(
++ Object.class, "toString" , methodType(String.class), Listie.class);
++assertEquals("[]", (String) MH_super.invokeExact(l));
++assertEquals(""+l, (String) MH_this.invokeExact(l));
++assertEquals("[]", (String) MH_duper.invokeExact(l)); // ArrayList method
++try { assertEquals("inaccessible", Listie.lookup().findSpecial(
++ String.class, "toString", methodType(String.class), Listie.class));
++ } catch (IllegalAccessException ex) { } // OK
++Listie subl = new Listie() { public String toString() { return "[subclass]"; } };
++assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method
++ * }</pre></blockquote>
++ *
+ * @param refc the class or interface from which the method is accessed
+ * @param name the name of the method (which must not be "&lt;init&gt;")
+ * @param type the type of the method, with the receiver argument omitted
+@@ -1014,15 +1120,16 @@
+ /// Helper methods, all package-private.
+
+ MemberName resolveOrFail(byte refKind, Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
++ name.getClass(); type.getClass(); // NPE
+ checkSymbolicClass(refc); // do this before attempting to resolve
+- name.getClass(); type.getClass(); // NPE
+ return IMPL_NAMES.resolveOrFail(refKind, new MemberName(refc, name, type, refKind), lookupClassOrNull(),
+ NoSuchFieldException.class);
+ }
+
+ MemberName resolveOrFail(byte refKind, Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
++ type.getClass(); // NPE
+ checkSymbolicClass(refc); // do this before attempting to resolve
+- name.getClass(); type.getClass(); // NPE
++ checkMethodName(refKind, name);
+ return IMPL_NAMES.resolveOrFail(refKind, new MemberName(refc, name, type, refKind), lookupClassOrNull(),
+ NoSuchMethodException.class);
+ }
+@@ -1033,6 +1140,12 @@
+ throw new MemberName(refc).makeAccessException("symbolic reference class is not public", this);
+ }
+
++ void checkMethodName(byte refKind, String name) throws NoSuchMethodException {
++ if (name.startsWith("<") && refKind != REF_newInvokeSpecial)
++ throw new NoSuchMethodException("illegal method name: "+name);
++ }
++
++
+ /**
+ * Find my trustable caller class if m is a caller sensitive method.
+ * If this lookup object has private access, then the caller class is the lookupClass.
+@@ -1155,6 +1268,10 @@
+ int allowedModes = this.allowedModes;
+ if (allowedModes == TRUSTED) return;
+ int mods = m.getModifiers();
++ if (Modifier.isProtected(mods) && refKind == REF_newInvokeSpecial) {
++ // cannot "new" a protected ctor in a different package
++ mods ^= Modifier.PROTECTED;
++ }
+ if (Modifier.isFinal(mods) &&
+ MethodHandleNatives.refKindIsSetter(refKind))
+ throw m.makeAccessException("unexpected set of a final field", this);
+@@ -1399,6 +1516,9 @@
+ * <p>
+ * Before invoking its target, the invoker will spread the final array, apply
+ * reference casts as necessary, and unbox and widen primitive arguments.
++ * If, when the invoker is called, the supplied array argument does
++ * not have the correct number of elements, the invoker will throw
++ * an {@link IllegalArgumentException} instead of invoking the target.
+ * <p>
+ * This method is equivalent to the following code (though it may be more efficient):
+ * <p><blockquote><pre>
+--- ./jdk/src/share/classes/java/lang/reflect/Proxy.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/lang/reflect/Proxy.java Wed Apr 16 12:37:49 2014 +0400
+@@ -396,12 +396,13 @@
+ Class<?>... interfaces)
+ throws IllegalArgumentException
+ {
+- SecurityManager sm = System.getSecurityManager();
++ final Class<?>[] intfs = interfaces.clone();
++ final SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+- checkProxyAccess(Reflection.getCallerClass(), loader, interfaces);
++ checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
+ }
+
+- return getProxyClass0(loader, interfaces);
++ return getProxyClass0(loader, intfs);
+ }
+
+ /*
+@@ -725,15 +726,16 @@
+ throw new NullPointerException();
+ }
+
++ final Class<?>[] intfs = interfaces.clone();
+ final SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+- checkProxyAccess(Reflection.getCallerClass(), loader, interfaces);
++ checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
+ }
+
+ /*
+ * Look up or generate the designated proxy class.
+ */
+- Class<?> cl = getProxyClass0(loader, interfaces);
++ Class<?> cl = getProxyClass0(loader, intfs);
+
+ /*
+ * Invoke its constructor with the designated invocation handler.
+--- ./jdk/src/share/classes/java/security/Provider.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/security/Provider.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -1017,7 +1017,7 @@
+ * <p>This class defines the methods {@link #supportsParameter
+ * supportsParameter()} and {@link #newInstance newInstance()}
+ * which are used by the Java security framework when it searches for
+- * suitable services and instantes them. The valid arguments to those
++ * suitable services and instantiates them. The valid arguments to those
+ * methods depend on the type of service. For the service types defined
+ * within Java SE, see the
+ * <a href="../../../technotes/guides/security/crypto/CryptoSpec.html">
+@@ -1207,7 +1207,7 @@
+ *
+ * @throws InvalidParameterException if the value of
+ * constructorParameter is invalid for this type of service.
+- * @throws NoSuchAlgorithmException if instantation failed for
++ * @throws NoSuchAlgorithmException if instantiation failed for
+ * any other reason.
+ */
+ public Object newInstance(Object constructorParameter)
+@@ -1235,7 +1235,9 @@
+ + " engines");
+ }
+ Class clazz = getImplClass();
+- return clazz.newInstance();
++ Class<?>[] empty = {};
++ Constructor<?> con = clazz.getConstructor(empty);
++ return con.newInstance();
+ } else {
+ Class paramClass = cap.getConstructorParameterClass();
+ if (constructorParameter != null) {
+@@ -1278,13 +1280,18 @@
+ } else {
+ clazz = cl.loadClass(className);
+ }
++ if (!Modifier.isPublic(clazz.getModifiers())) {
++ throw new NoSuchAlgorithmException
++ ("class configured for " + type + " (provider: " +
++ provider.getName() + ") is not public.");
++ }
+ classRef = new WeakReference<Class>(clazz);
+ }
+ return clazz;
+ } catch (ClassNotFoundException e) {
+ throw new NoSuchAlgorithmException
+ ("class configured for " + type + "(provider: " +
+- provider.getName() + ")" + "cannot be found.", e);
++ provider.getName() + ") cannot be found.", e);
+ }
+ }
+
+@@ -1297,15 +1304,21 @@
+ throws Exception {
+ Class clazz = getImplClass();
+ if (constructorParameter == null) {
+- Object o = clazz.newInstance();
+- return o;
++ // create instance with public no-arg constructor if it exists
++ try {
++ Class<?>[] empty = {};
++ Constructor<?> con = clazz.getConstructor(empty);
++ return con.newInstance();
++ } catch (NoSuchMethodException e) {
++ throw new NoSuchAlgorithmException("No public no-arg "
++ + "constructor found in class " + className);
++ }
+ }
+ Class argClass = constructorParameter.getClass();
+ Constructor[] cons = clazz.getConstructors();
+ // find first public constructor that can take the
+ // argument as parameter
+- for (int i = 0; i < cons.length; i++) {
+- Constructor con = cons[i];
++ for (Constructor<?> con : cons) {
+ Class[] paramTypes = con.getParameterTypes();
+ if (paramTypes.length != 1) {
+ continue;
+@@ -1313,10 +1326,9 @@
+ if (paramTypes[0].isAssignableFrom(argClass) == false) {
+ continue;
+ }
+- Object o = con.newInstance(new Object[] {constructorParameter});
+- return o;
++ return con.newInstance(constructorParameter);
+ }
+- throw new NoSuchAlgorithmException("No constructor matching "
++ throw new NoSuchAlgorithmException("No public constructor matching "
+ + argClass.getName() + " found in class " + className);
+ }
+
+--- ./jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/java/util/concurrent/atomic/AtomicReferenceFieldUpdater.java Wed Apr 16 12:37:49 2014 +0400
+@@ -221,6 +221,8 @@
+
+ if (vclass != fieldClass)
+ throw new ClassCastException();
++ if (vclass.isPrimitive())
++ throw new IllegalArgumentException("Must be reference type");
+
+ if (!Modifier.isVolatile(modifiers))
+ throw new IllegalArgumentException("Must be volatile type");
+--- ./jdk/src/share/classes/javax/crypto/JceSecurity.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/javax/crypto/JceSecurity.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 1997, 2009, 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
+@@ -216,26 +216,28 @@
+ private static final Map codeBaseCacheRef = new WeakHashMap();
+
+ /*
+- * Retuns the CodeBase for the given class.
++ * Returns the CodeBase for the given class.
+ */
+ static URL getCodeBase(final Class clazz) {
+- URL url = (URL)codeBaseCacheRef.get(clazz);
+- if (url == null) {
+- url = (URL)AccessController.doPrivileged(new PrivilegedAction() {
+- public Object run() {
+- ProtectionDomain pd = clazz.getProtectionDomain();
+- if (pd != null) {
+- CodeSource cs = pd.getCodeSource();
+- if (cs != null) {
+- return cs.getLocation();
++ synchronized (codeBaseCacheRef) {
++ URL url = (URL)codeBaseCacheRef.get(clazz);
++ if (url == null) {
++ url = (URL)AccessController.doPrivileged(new PrivilegedAction() {
++ public Object run() {
++ ProtectionDomain pd = clazz.getProtectionDomain();
++ if (pd != null) {
++ CodeSource cs = pd.getCodeSource();
++ if (cs != null) {
++ return cs.getLocation();
++ }
+ }
++ return NULL_URL;
+ }
+- return NULL_URL;
+- }
+- });
+- codeBaseCacheRef.put(clazz, url);
++ });
++ codeBaseCacheRef.put(clazz, url);
++ }
++ return (url == NULL_URL) ? null : url;
+ }
+- return (url == NULL_URL) ? null : url;
+ }
+
+ private static void setupJurisdictionPolicies() throws Exception {
+--- ./jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/javax/swing/filechooser/FileSystemView.java Wed Apr 16 12:37:49 2014 +0400
+@@ -718,7 +718,8 @@
+ * @return the Desktop folder.
+ */
+ public File getHomeDirectory() {
+- return getRoots()[0];
++ File[] roots = getRoots();
++ return (roots.length == 0) ? null : roots[0];
+ }
+
+ /**
+--- ./jdk/src/share/classes/sun/awt/AppContext.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/AppContext.java Wed Apr 16 12:37:49 2014 +0400
+@@ -323,6 +323,20 @@
+ while (context == null) {
+ threadGroup = threadGroup.getParent();
+ if (threadGroup == null) {
++ // We've got up to the root thread group and did not find an AppContext
++ // Try to get it from the security manager
++ SecurityManager securityManager = System.getSecurityManager();
++ if (securityManager != null) {
++ ThreadGroup smThreadGroup = securityManager.getThreadGroup();
++ if (smThreadGroup != null) {
++ /*
++ * If we get this far then it's likely that
++ * the ThreadGroup does not actually belong
++ * to the applet, so do not cache it.
++ */
++ return threadGroup2appContext.get(smThreadGroup);
++ }
++ }
+ return null;
+ }
+ context = threadGroup2appContext.get(threadGroup);
+--- ./jdk/src/share/classes/sun/awt/FontConfiguration.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/FontConfiguration.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -867,7 +867,7 @@
+ return descriptors;
+ }
+
+- private FontDescriptor[] buildFontDescriptors(int fontIndex, int styleIndex) {
++ protected FontDescriptor[] buildFontDescriptors(int fontIndex, int styleIndex) {
+ String fontName = fontNames[fontIndex];
+ String styleName = styleNames[styleIndex];
+
+--- ./jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/ByteBandedRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -755,10 +755,22 @@
+ + scanlineStride);
+ }
+
+- for (int i = 0; i < data.length; i++) {
+- if (scanlineStride > data[i].length) {
+- throw new RasterFormatException("Incorrect scanline stride: "
+- + scanlineStride);
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
++
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ for (int i = 0; i < data.length; i++) {
++ if (scanlineStride > data[i].length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
+ }
+ }
+
+--- ./jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/ByteComponentRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -885,15 +885,31 @@
+ }
+ }
+
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
+ // we can be sure that width and height are greater than 0
+ if (scanlineStride < 0 ||
+- scanlineStride > (Integer.MAX_VALUE / height) ||
+- scanlineStride > data.length)
++ scanlineStride > (Integer.MAX_VALUE / height))
+ {
+ // integer overflow
+ throw new RasterFormatException("Incorrect scanline stride: "
+ + scanlineStride);
+ }
++
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ if (scanlineStride > data.length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
++ }
++
+ int lastScanOffset = (height - 1) * scanlineStride;
+
+ if (pixelStride < 0 ||
+--- ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1386,13 +1386,28 @@
+ throw new RasterFormatException("Invalid raster dimension");
+ }
+
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
+ if (scanlineStride < 0 ||
+- scanlineStride > (Integer.MAX_VALUE / height) ||
+- scanlineStride > data.length)
++ scanlineStride > (Integer.MAX_VALUE / height))
+ {
+ throw new RasterFormatException("Invalid scanline stride");
+ }
+
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ if (scanlineStride > data.length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
++ }
++
+ int lastbit = (dataBitOffset
+ + (height-1) * scanlineStride * 8
+ + (width-1) * pixelBitStride
+--- ./jdk/src/share/classes/sun/awt/image/IntegerComponentRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/IntegerComponentRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -654,15 +654,31 @@
+ ") must be >= 0");
+ }
+
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
+ // we can be sure that width and height are greater than 0
+ if (scanlineStride < 0 ||
+- scanlineStride > (Integer.MAX_VALUE / height) ||
+- scanlineStride > data.length)
++ scanlineStride > (Integer.MAX_VALUE / height))
+ {
+ // integer overflow
+ throw new RasterFormatException("Incorrect scanline stride: "
+ + scanlineStride);
+ }
++
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ if (scanlineStride > data.length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
++ }
++
+ int lastScanOffset = (height - 1) * scanlineStride;
+
+ if (pixelStride < 0 ||
+--- ./jdk/src/share/classes/sun/awt/image/ShortBandedRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/ShortBandedRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -754,10 +754,21 @@
+ + scanlineStride);
+ }
+
+- for (int i = 0; i < data.length; i++) {
+- if (scanlineStride > data[i].length) {
+- throw new RasterFormatException("Incorrect scanline stride: "
+- + scanlineStride);
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ for (int i = 0; i < data.length; i++) {
++ if (scanlineStride > data[i].length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
+ }
+ }
+
+--- ./jdk/src/share/classes/sun/awt/image/ShortComponentRaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/awt/image/ShortComponentRaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -819,15 +819,31 @@
+ }
+ }
+
++ if ((long)minX - sampleModelTranslateX < 0 ||
++ (long)minY - sampleModelTranslateY < 0) {
++
++ throw new RasterFormatException("Incorrect origin/translate: (" +
++ minX + ", " + minY + ") / (" +
++ sampleModelTranslateX + ", " + sampleModelTranslateY + ")");
++ }
++
+ // we can be sure that width and height are greater than 0
+ if (scanlineStride < 0 ||
+- scanlineStride > (Integer.MAX_VALUE / height) ||
+- scanlineStride > data.length)
++ scanlineStride > (Integer.MAX_VALUE / height))
+ {
+ // integer overflow
+ throw new RasterFormatException("Incorrect scanline stride: "
+ + scanlineStride);
+ }
++
++ if (height > 1 || minY - sampleModelTranslateY > 0) {
++ // buffer should contain at least one scanline
++ if (scanlineStride > data.length) {
++ throw new RasterFormatException("Incorrect scanline stride: "
++ + scanlineStride);
++ }
++ }
++
+ int lastScanOffset = (height - 1) * scanlineStride;
+
+ if (pixelStride < 0 ||
+--- ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Wed Apr 16 12:37:49 2014 +0400
+@@ -89,35 +89,28 @@
+ if (allowedModes == 0) return false;
+ assert((allowedModes & PUBLIC) != 0 &&
+ (allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED)) == 0);
+- // Usually refc and defc are the same, but if they differ, verify them both.
+- if (refc != defc) {
+- if (!isClassAccessible(refc, lookupClass, allowedModes)) {
+- // Note that defc is verified in the switch below.
+- return false;
+- }
+- if ((mods & (ALL_ACCESS_MODES|STATIC)) == (PROTECTED|STATIC) &&
+- (allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0) {
+- // Apply the special rules for refc here.
+- if (!isRelatedClass(refc, lookupClass))
+- return isSamePackage(defc, lookupClass);
+- // If refc == defc, the call to isPublicSuperClass will do
+- // the whole job, since in that case refc (as defc) will be
+- // a superclass of the lookup class.
+- }
++ // The symbolic reference class (refc) must always be fully verified.
++ if (!isClassAccessible(refc, lookupClass, allowedModes)) {
++ return false;
+ }
++ // Usually refc and defc are the same, but verify defc also in case they differ.
+ if (defc == lookupClass &&
+ (allowedModes & PRIVATE) != 0)
+ return true; // easy check; all self-access is OK
+ switch (mods & ALL_ACCESS_MODES) {
+ case PUBLIC:
+- if (refc != defc) return true; // already checked above
+- return isClassAccessible(refc, lookupClass, allowedModes);
++ return true; // already checked above
+ case PROTECTED:
+ if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 &&
+ isSamePackage(defc, lookupClass))
+ return true;
++ if ((allowedModes & PROTECTED) == 0)
++ return false;
++ if ((mods & STATIC) != 0 &&
++ !isRelatedClass(refc, lookupClass))
++ return false;
+ if ((allowedModes & PROTECTED) != 0 &&
+- isPublicSuperClass(defc, lookupClass))
++ isSuperClass(defc, lookupClass))
+ return true;
+ return false;
+ case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access.
+@@ -139,8 +132,8 @@
+ lookupClass.isAssignableFrom(refc));
+ }
+
+- static boolean isPublicSuperClass(Class<?> defc, Class<?> lookupClass) {
+- return isPublic(defc.getModifiers()) && defc.isAssignableFrom(lookupClass);
++ static boolean isSuperClass(Class<?> defc, Class<?> lookupClass) {
++ return defc.isAssignableFrom(lookupClass);
+ }
+
+ /**
+--- ./jdk/src/share/classes/sun/misc/JavaLangAccess.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/misc/JavaLangAccess.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2006, 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
+@@ -35,10 +35,10 @@
+ ConstantPool getConstantPool(Class klass);
+
+ /**
+- * Set the AnnotationType instance corresponding to this class.
++ * Compare-And-Swap the AnnotationType instance corresponding to this class.
+ * (This method only applies to annotation types.)
+ */
+- void setAnnotationType(Class klass, AnnotationType annotationType);
++ boolean casAnnotationType(Class<?> klass, AnnotationType oldType, AnnotationType newType);
+
+ /**
+ * Get the AnnotationType instance corresponding to this class.
+@@ -47,6 +47,12 @@
+ AnnotationType getAnnotationType(Class klass);
+
+ /**
++ * Get the array of bytes that is the class-file representation
++ * of this Class' annotations.
++ */
++ byte[] getRawClassAnnotations(Class<?> klass);
++
++ /**
+ * Returns the elements of an enum class or null if the
+ * Class object does not represent an enum type;
+ * the result is uncloned, cached, and shared by all callers.
+--- ./jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/reflect/annotation/AnnotationParser.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2005, 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
+@@ -67,7 +67,35 @@
+ return Collections.emptyMap();
+
+ try {
+- return parseAnnotations2(rawAnnotations, constPool, container);
++ return parseAnnotations2(rawAnnotations, constPool, container, null);
++ } catch(BufferUnderflowException e) {
++ throw new AnnotationFormatError("Unexpected end of annotations.");
++ } catch(IllegalArgumentException e) {
++ // Type mismatch in constant pool
++ throw new AnnotationFormatError(e);
++ }
++ }
++
++ /**
++ * Like {@link #parseAnnotations(byte[], sun.reflect.ConstantPool, Class)}
++ * with an additional parameter {@code selectAnnotationClasses} which selects the
++ * annotation types to parse (other than selected are quickly skipped).<p>
++ * This method is only used to parse select meta annotations in the construction
++ * phase of {@link AnnotationType} instances to prevent infinite recursion.
++ *
++ * @param selectAnnotationClasses an array of annotation types to select when parsing
++ */
++ @SafeVarargs
++ static Map<Class<? extends Annotation>, Annotation> parseSelectAnnotations(
++ byte[] rawAnnotations,
++ ConstantPool constPool,
++ Class<?> container,
++ Class<? extends Annotation> ... selectAnnotationClasses) {
++ if (rawAnnotations == null)
++ return Collections.emptyMap();
++
++ try {
++ return parseAnnotations2(rawAnnotations, constPool, container, selectAnnotationClasses);
+ } catch(BufferUnderflowException e) {
+ throw new AnnotationFormatError("Unexpected end of annotations.");
+ } catch(IllegalArgumentException e) {
+@@ -79,22 +107,23 @@
+ private static Map<Class<? extends Annotation>, Annotation> parseAnnotations2(
+ byte[] rawAnnotations,
+ ConstantPool constPool,
+- Class<?> container) {
++ Class<?> container,
++ Class<? extends Annotation>[] selectAnnotationClasses) {
+ Map<Class<? extends Annotation>, Annotation> result =
+ new LinkedHashMap<Class<? extends Annotation>, Annotation>();
+ ByteBuffer buf = ByteBuffer.wrap(rawAnnotations);
+ int numAnnotations = buf.getShort() & 0xFFFF;
+ for (int i = 0; i < numAnnotations; i++) {
+- Annotation a = parseAnnotation(buf, constPool, container, false);
++ Annotation a = parseAnnotation2(buf, constPool, container, false, selectAnnotationClasses);
+ if (a != null) {
+ Class<? extends Annotation> klass = a.annotationType();
+- AnnotationType type = AnnotationType.getInstance(klass);
+- if (type.retention() == RetentionPolicy.RUNTIME)
+- if (result.put(klass, a) != null)
++ if (AnnotationType.getInstance(klass).retention() == RetentionPolicy.RUNTIME &&
++ result.put(klass, a) != null) {
+ throw new AnnotationFormatError(
+ "Duplicate annotation for class: "+klass+": " + a);
+ }
+ }
++ }
+ return result;
+ }
+
+@@ -191,6 +220,15 @@
+ ConstantPool constPool,
+ Class<?> container,
+ boolean exceptionOnMissingAnnotationClass) {
++ return parseAnnotation2(buf, constPool, container, exceptionOnMissingAnnotationClass, null);
++ }
++
++ @SuppressWarnings("unchecked")
++ private static Annotation parseAnnotation2(ByteBuffer buf,
++ ConstantPool constPool,
++ Class<?> container,
++ boolean exceptionOnMissingAnnotationClass,
++ Class<? extends Annotation>[] selectAnnotationClasses) {
+ int typeIndex = buf.getShort() & 0xFFFF;
+ Class<? extends Annotation> annotationClass = null;
+ String sig = "[unknown]";
+@@ -216,6 +254,10 @@
+ skipAnnotation(buf, false);
+ return null;
+ }
++ if (selectAnnotationClasses != null && !contains(selectAnnotationClasses, annotationClass)) {
++ skipAnnotation(buf, false);
++ return null;
++ }
+ AnnotationType type = null;
+ try {
+ type = AnnotationType.getInstance(annotationClass);
+@@ -791,6 +833,17 @@
+ skipMemberValue(buf);
+ }
+
++ /**
++ * Searches for given {@code element} in given {@code array} by identity.
++ * Returns {@code true} if found {@code false} if not.
++ */
++ private static boolean contains(Object[] array, Object element) {
++ for (Object e : array)
++ if (e == element)
++ return true;
++ return false;
++ }
++
+ /*
+ * This method converts the annotation map returned by the parseAnnotations()
+ * method to an array. It is called by Field.getDeclaredAnnotations(),
+--- ./jdk/src/share/classes/sun/reflect/annotation/AnnotationType.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/reflect/annotation/AnnotationType.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2006, 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
+@@ -25,6 +25,8 @@
+
+ package sun.reflect.annotation;
+
++import sun.misc.JavaLangAccess;
++
+ import java.lang.annotation.*;
+ import java.lang.reflect.*;
+ import java.util.*;
+@@ -45,29 +47,28 @@
+ * types. This matches the return value that must be used for a
+ * dynamic proxy, allowing for a simple isInstance test.
+ */
+- private final Map<String, Class<?>> memberTypes = new HashMap<String,Class<?>>();
++ private final Map<String, Class<?>> memberTypes;
+
+ /**
+ * Member name -> default value mapping.
+ */
+- private final Map<String, Object> memberDefaults =
+- new HashMap<String, Object>();
++ private final Map<String, Object> memberDefaults;
+
+ /**
+- * Member name -> Method object mapping. This (and its assoicated
++ * Member name -> Method object mapping. This (and its associated
+ * accessor) are used only to generate AnnotationTypeMismatchExceptions.
+ */
+- private final Map<String, Method> members = new HashMap<String, Method>();
++ private final Map<String, Method> members;
+
+ /**
+ * The retention policy for this annotation type.
+ */
+- private RetentionPolicy retention = RetentionPolicy.RUNTIME;;
++ private final RetentionPolicy retention;
+
+ /**
+ * Whether this annotation type is inherited.
+ */
+- private boolean inherited = false;
++ private final boolean inherited;
+
+ /**
+ * Returns an AnnotationType instance for the specified annotation type.
+@@ -75,13 +76,20 @@
+ * @throw IllegalArgumentException if the specified class object for
+ * does not represent a valid annotation type
+ */
+- public static synchronized AnnotationType getInstance(
++ public static AnnotationType getInstance(
+ Class<? extends Annotation> annotationClass)
+ {
+- AnnotationType result = sun.misc.SharedSecrets.getJavaLangAccess().
+- getAnnotationType(annotationClass);
+- if (result == null)
+- result = new AnnotationType((Class<? extends Annotation>) annotationClass);
++ JavaLangAccess jla = sun.misc.SharedSecrets.getJavaLangAccess();
++ AnnotationType result = jla.getAnnotationType(annotationClass); // volatile read
++ if (result == null) {
++ result = new AnnotationType(annotationClass);
++ // try to CAS the AnnotationType: null -> result
++ if (!jla.casAnnotationType(annotationClass, null, result)) {
++ // somebody was quicker -> read it's result
++ result = jla.getAnnotationType(annotationClass);
++ assert result != null;
++ }
++ }
+
+ return result;
+ }
+@@ -105,6 +113,9 @@
+ }
+ });
+
++ memberTypes = new HashMap<String,Class<?>>(methods.length+1, 1.0f);
++ memberDefaults = new HashMap<String, Object>(0);
++ members = new HashMap<String, Method>(methods.length+1, 1.0f);
+
+ for (Method method : methods) {
+ if (method.getParameterTypes().length != 0)
+@@ -117,20 +128,27 @@
+ Object defaultValue = method.getDefaultValue();
+ if (defaultValue != null)
+ memberDefaults.put(name, defaultValue);
+-
+- members.put(name, method);
+ }
+
+- sun.misc.SharedSecrets.getJavaLangAccess().
+- setAnnotationType(annotationClass, this);
+-
+ // Initialize retention, & inherited fields. Special treatment
+ // of the corresponding annotation types breaks infinite recursion.
+ if (annotationClass != Retention.class &&
+ annotationClass != Inherited.class) {
+- Retention ret = annotationClass.getAnnotation(Retention.class);
++ JavaLangAccess jla = sun.misc.SharedSecrets.getJavaLangAccess();
++ Map<Class<? extends Annotation>, Annotation> metaAnnotations =
++ AnnotationParser.parseSelectAnnotations(
++ jla.getRawClassAnnotations(annotationClass),
++ jla.getConstantPool(annotationClass),
++ annotationClass,
++ Retention.class, Inherited.class
++ );
++ Retention ret = (Retention) metaAnnotations.get(Retention.class);
+ retention = (ret == null ? RetentionPolicy.CLASS : ret.value());
+- inherited = annotationClass.isAnnotationPresent(Inherited.class);
++ inherited = metaAnnotations.containsKey(Inherited.class);
++ }
++ else {
++ retention = RetentionPolicy.RUNTIME;
++ inherited = false;
+ }
+ }
+
+@@ -205,11 +223,10 @@
+ * For debugging.
+ */
+ public String toString() {
+- StringBuffer s = new StringBuffer("Annotation Type:" + "\n");
+- s.append(" Member types: " + memberTypes + "\n");
+- s.append(" Member defaults: " + memberDefaults + "\n");
+- s.append(" Retention policy: " + retention + "\n");
+- s.append(" Inherited: " + inherited);
+- return s.toString();
++ return "Annotation Type:\n" +
++ " Member types: " + memberTypes + "\n" +
++ " Member defaults: " + memberDefaults + "\n" +
++ " Retention policy: " + retention + "\n" +
++ " Inherited: " + inherited;
+ }
+ }
+--- ./jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/ec/ECKeyPairGenerator.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -123,19 +123,19 @@
+
+ try {
+
+- long[] handles = generateECKeyPair(keySize, encodedParams, seed);
++ Object[] keyBytes = generateECKeyPair(keySize, encodedParams, seed);
+
+ // The 'params' object supplied above is equivalent to the native
+ // one so there is no need to fetch it.
+
+- // handles[0] points to the native private key
+- BigInteger s = new BigInteger(1, getEncodedBytes(handles[0]));
++ // keyBytes[0] is the encoding of the native private key
++ BigInteger s = new BigInteger(1, (byte[])keyBytes[0]);
+
+ PrivateKey privateKey =
+ new ECPrivateKeyImpl(s, (ECParameterSpec)params);
+
+- // handles[1] points to the native public key
+- ECPoint w = ECParameters.decodePoint(getEncodedBytes(handles[1]),
++ // keyBytes[1] is the encoding of the native public key
++ ECPoint w = ECParameters.decodePoint((byte[])keyBytes[1],
+ ((ECParameterSpec)params).getCurve());
+ PublicKey publicKey =
+ new ECPublicKeyImpl(w, (ECParameterSpec)params);
+@@ -160,14 +160,9 @@
+ }
+
+ /*
+- * Generates the keypair and returns a 2-element array of handles.
+- * The first handle points to the private key, the second to the public key.
++ * Generates the keypair and returns a 2-element array of encoding bytes.
++ * The first one is for the private key, the second for the public key.
+ */
+- private static native long[] generateECKeyPair(int keySize,
++ private static native Object[] generateECKeyPair(int keySize,
+ byte[] encodedParams, byte[] seed) throws GeneralSecurityException;
+-
+- /*
+- * Extracts the encoded key data using the supplied handle.
+- */
+- private static native byte[] getEncodedBytes(long handle);
+ }
+--- ./jdk/src/share/classes/sun/security/internal/spec/TlsRsaPremasterSecretParameterSpec.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/internal/spec/TlsRsaPremasterSecretParameterSpec.java Wed Apr 16 12:37:49 2014 +0400
+@@ -26,11 +26,11 @@
+ package sun.security.internal.spec;
+
+ import java.security.spec.AlgorithmParameterSpec;
++import java.security.AccessController;
++import java.security.PrivilegedAction;
+
+ /**
+- * Parameters for SSL/TLS RSA Premaster secret generation.
+- * This class is used by SSL/TLS client to initialize KeyGenerators of the
+- * type "TlsRsaPremasterSecret".
++ * Parameters for SSL/TLS RSA premaster secret.
+ *
+ * <p>Instances of this class are immutable.
+ *
+@@ -43,90 +43,108 @@
+ public class TlsRsaPremasterSecretParameterSpec
+ implements AlgorithmParameterSpec {
+
+- private final int majorVersion;
+- private final int minorVersion;
+- private final byte[] encodedSecret;
++ /*
++ * The TLS spec says that the version in the RSA premaster secret must
++ * be the maximum version supported by the client (i.e. the version it
++ * requested in its client hello version). However, we (and other
++ * implementations) used to send the active negotiated version. The
++ * system property below allows to toggle the behavior.
++ */
++ private final static String PROP_NAME =
++ "com.sun.net.ssl.rsaPreMasterSecretFix";
++
++ /*
++ * Default is "false" (old behavior) for compatibility reasons in
++ * SSLv3/TLSv1. Later protocols (TLSv1.1+) do not use this property.
++ */
++ private final static boolean rsaPreMasterSecretFix =
++ AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
++ public Boolean run() {
++ String value = System.getProperty(PROP_NAME);
++ if (value != null && value.equalsIgnoreCase("true")) {
++ return Boolean.TRUE;
++ }
++
++ return Boolean.FALSE;
++ }
++ });
++
++ private final int clientVersion;
++ private final int serverVersion;
+
+ /**
+ * Constructs a new TlsRsaPremasterSecretParameterSpec.
+- * <P>
+- * The version numbers will be placed inside the premaster secret to
+- * detect version rollbacks attacks as described in the TLS specification.
+- * Note that they do not indicate the protocol version negotiated for
+- * the handshake.
+ *
+- * @param majorVersion the major number of the protocol version
+- * @param minorVersion the minor number of the protocol version
++ * @param clientVersion the version of the TLS protocol by which the
++ * client wishes to communicate during this session
++ * @param serverVersion the negotiated version of the TLS protocol which
++ * contains the lower of that suggested by the client in the client
++ * hello and the highest supported by the server.
+ *
+- * @throws IllegalArgumentException if minorVersion or majorVersion are
+- * negative or larger than 255
++ * @throws IllegalArgumentException if clientVersion or serverVersion are
++ * negative or larger than (2^16 - 1)
+ */
+- public TlsRsaPremasterSecretParameterSpec(int majorVersion,
+- int minorVersion) {
+- this.majorVersion =
+- TlsMasterSecretParameterSpec.checkVersion(majorVersion);
+- this.minorVersion =
+- TlsMasterSecretParameterSpec.checkVersion(minorVersion);
+- this.encodedSecret = null;
++ public TlsRsaPremasterSecretParameterSpec(
++ int clientVersion, int serverVersion) {
++
++ this.clientVersion = checkVersion(clientVersion);
++ this.serverVersion = checkVersion(serverVersion);
+ }
+
+ /**
+- * Constructs a new TlsRsaPremasterSecretParameterSpec.
+- * <P>
+- * The version numbers will be placed inside the premaster secret to
+- * detect version rollbacks attacks as described in the TLS specification.
+- * Note that they do not indicate the protocol version negotiated for
+- * the handshake.
+- * <P>
+- * Usually, the encoded secret key is a random number that acts as
+- * dummy pre_master_secret to avoid vulnerabilities described by
+- * section 7.4.7.1, RFC 5246.
++ * Returns the version of the TLS protocol by which the client wishes to
++ * communicate during this session.
+ *
+- * @param majorVersion the major number of the protocol version
+- * @param minorVersion the minor number of the protocol version
+- * @param encodedSecret the encoded secret key
+- *
+- * @throws IllegalArgumentException if minorVersion or majorVersion are
+- * negative or larger than 255, or encodedSecret is not exactly 48 bytes.
++ * @return the version of the TLS protocol in ClientHello message
+ */
+- public TlsRsaPremasterSecretParameterSpec(int majorVersion,
+- int minorVersion, byte[] encodedSecret) {
+- this.majorVersion =
+- TlsMasterSecretParameterSpec.checkVersion(majorVersion);
+- this.minorVersion =
+- TlsMasterSecretParameterSpec.checkVersion(minorVersion);
+-
+- if (encodedSecret == null || encodedSecret.length != 48) {
+- throw new IllegalArgumentException(
+- "Encoded secret is not exactly 48 bytes");
+- }
+- this.encodedSecret = encodedSecret.clone();
++ public int getClientVersion() {
++ return clientVersion;
+ }
+
+ /**
+- * Returns the major version.
++ * Returns the negotiated version of the TLS protocol which contains the
++ * lower of that suggested by the client in the client hello and the
++ * highest supported by the server.
+ *
+- * @return the major version.
++ * @return the negotiated version of the TLS protocol in ServerHello message
+ */
+- public int getMajorVersion() {
+- return majorVersion;
++ public int getServerVersion() {
++ return serverVersion;
+ }
+
+ /**
+- * Returns the minor version.
++ * Returns the major version used in RSA premaster secret.
+ *
+- * @return the minor version.
++ * @return the major version used in RSA premaster secret.
+ */
+- public int getMinorVersion() {
+- return minorVersion;
++ public int getMajorVersion() {
++ if (rsaPreMasterSecretFix || clientVersion >= 0x0302) {
++ // 0x0302: TLSv1.1
++ return (clientVersion >>> 8) & 0xFF;
++ }
++
++ return (serverVersion >>> 8) & 0xFF;
+ }
+
+ /**
+- * Returns the encoded secret.
++ * Returns the minor version used in RSA premaster secret.
+ *
+- * @return the encoded secret, may be null if no encoded secret.
++ * @return the minor version used in RSA premaster secret.
+ */
+- public byte[] getEncodedSecret() {
+- return encodedSecret == null ? null : encodedSecret.clone();
++ public int getMinorVersion() {
++ if (rsaPreMasterSecretFix || clientVersion >= 0x0302) {
++ // 0x0302: TLSv1.1
++ return clientVersion & 0xFF;
++ }
++
++ return serverVersion & 0xFF;
++ }
++
++ private int checkVersion(int version) {
++ if ((version < 0) || (version > 0xFFFF)) {
++ throw new IllegalArgumentException(
++ "Version must be between 0 and 65,535");
++ }
++ return version;
+ }
+ }
+--- ./jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/pkcs11/P11RSACipher.java Wed Apr 16 12:37:49 2014 +0400
+@@ -37,6 +37,8 @@
+ import static sun.security.pkcs11.TemplateManager.*;
+ import sun.security.pkcs11.wrapper.*;
+ import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec;
++import sun.security.util.KeyUtil;
+
+ /**
+ * RSA Cipher implementation class. We currently only support
+@@ -102,6 +104,12 @@
+ // maximum output size. this is the length of the key
+ private int outputSize;
+
++ // cipher parameter for TLS RSA premaster secret
++ private AlgorithmParameterSpec spec = null;
++
++ // the source of randomness
++ private SecureRandom random;
++
+ P11RSACipher(Token token, String algorithm, long mechanism)
+ throws PKCS11Exception {
+ super();
+@@ -165,8 +173,12 @@
+ AlgorithmParameterSpec params, SecureRandom random)
+ throws InvalidKeyException, InvalidAlgorithmParameterException {
+ if (params != null) {
+- throw new InvalidAlgorithmParameterException
+- ("Parameters not supported");
++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new InvalidAlgorithmParameterException(
++ "Parameters not supported");
++ }
++ spec = params;
++ this.random = random; // for TLS RSA premaster secret
+ }
+ implInit(opmode, key);
+ }
+@@ -176,8 +188,8 @@
+ SecureRandom random)
+ throws InvalidKeyException, InvalidAlgorithmParameterException {
+ if (params != null) {
+- throw new InvalidAlgorithmParameterException
+- ("Parameters not supported");
++ throw new InvalidAlgorithmParameterException(
++ "Parameters not supported");
+ }
+ implInit(opmode, key);
+ }
+@@ -452,21 +464,101 @@
+ protected Key engineUnwrap(byte[] wrappedKey, String algorithm,
+ int type) throws InvalidKeyException, NoSuchAlgorithmException {
+
+- // XXX implement unwrap using C_Unwrap() for all keys
+- implInit(Cipher.DECRYPT_MODE, p11Key);
+- if (wrappedKey.length > maxInputSize) {
+- throw new InvalidKeyException("Key is too long for unwrapping");
++ boolean isTlsRsaPremasterSecret =
++ algorithm.equals("TlsRsaPremasterSecret");
++ Exception failover = null;
++
++ SecureRandom secureRandom = random;
++ if (secureRandom == null && isTlsRsaPremasterSecret) {
++ secureRandom = new SecureRandom();
+ }
+- implUpdate(wrappedKey, 0, wrappedKey.length);
+- try {
+- byte[] encoded = doFinal();
++
++ // Should C_Unwrap be preferred for non-TLS RSA premaster secret?
++ if (token.supportsRawSecretKeyImport()) {
++ // XXX implement unwrap using C_Unwrap() for all keys
++ implInit(Cipher.DECRYPT_MODE, p11Key);
++ if (wrappedKey.length > maxInputSize) {
++ throw new InvalidKeyException("Key is too long for unwrapping");
++ }
++
++ byte[] encoded = null;
++ implUpdate(wrappedKey, 0, wrappedKey.length);
++ try {
++ encoded = doFinal();
++ } catch (BadPaddingException e) {
++ if (isTlsRsaPremasterSecret) {
++ failover = e;
++ } else {
++ throw new InvalidKeyException("Unwrapping failed", e);
++ }
++ } catch (IllegalBlockSizeException e) {
++ // should not occur, handled with length check above
++ throw new InvalidKeyException("Unwrapping failed", e);
++ }
++
++ if (isTlsRsaPremasterSecret) {
++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new IllegalStateException(
++ "No TlsRsaPremasterSecretParameterSpec specified");
++ }
++
++ // polish the TLS premaster secret
++ TlsRsaPremasterSecretParameterSpec psps =
++ (TlsRsaPremasterSecretParameterSpec)spec;
++ encoded = KeyUtil.checkTlsPreMasterSecretKey(
++ psps.getClientVersion(), psps.getServerVersion(),
++ secureRandom, encoded, (failover != null));
++ }
++
+ return ConstructKeys.constructKey(encoded, algorithm, type);
+- } catch (BadPaddingException e) {
+- // should not occur
+- throw new InvalidKeyException("Unwrapping failed", e);
+- } catch (IllegalBlockSizeException e) {
+- // should not occur, handled with length check above
+- throw new InvalidKeyException("Unwrapping failed", e);
++ } else {
++ Session s = null;
++ SecretKey secretKey = null;
++ try {
++ try {
++ s = token.getObjSession();
++ long keyType = CKK_GENERIC_SECRET;
++ CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
++ new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY),
++ new CK_ATTRIBUTE(CKA_KEY_TYPE, keyType),
++ };
++ attributes = token.getAttributes(
++ O_IMPORT, CKO_SECRET_KEY, keyType, attributes);
++ long keyID = token.p11.C_UnwrapKey(s.id(),
++ new CK_MECHANISM(mechanism), p11Key.keyID,
++ wrappedKey, attributes);
++ secretKey = P11Key.secretKey(s, keyID,
++ algorithm, 48 << 3, attributes);
++ } catch (PKCS11Exception e) {
++ if (isTlsRsaPremasterSecret) {
++ failover = e;
++ } else {
++ throw new InvalidKeyException("unwrap() failed", e);
++ }
++ }
++
++ if (isTlsRsaPremasterSecret) {
++ byte[] replacer = new byte[48];
++ if (failover == null) {
++ // Does smart compiler dispose this operation?
++ secureRandom.nextBytes(replacer);
++ }
++
++ TlsRsaPremasterSecretParameterSpec psps =
++ (TlsRsaPremasterSecretParameterSpec)spec;
++
++ // Please use the tricky failover and replacer byte array
++ // as the parameters so that smart compiler won't dispose
++ // the unused variable .
++ secretKey = polishPreMasterSecretKey(token, s,
++ failover, replacer, secretKey,
++ psps.getClientVersion(), psps.getServerVersion());
++ }
++
++ return secretKey;
++ } finally {
++ token.releaseSession(s);
++ }
+ }
+ }
+
+@@ -475,6 +567,34 @@
+ int n = P11KeyFactory.convertKey(token, key, algorithm).length();
+ return n;
+ }
++
++ private static SecretKey polishPreMasterSecretKey(
++ Token token, Session session,
++ Exception failover, byte[] replacer, SecretKey secretKey,
++ int clientVersion, int serverVersion) {
++
++ if (failover != null) {
++ CK_VERSION version = new CK_VERSION(
++ (clientVersion >>> 8) & 0xFF, clientVersion & 0xFF);
++ try {
++ CK_ATTRIBUTE[] attributes = token.getAttributes(
++ O_GENERATE, CKO_SECRET_KEY,
++ CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]);
++ long keyID = token.p11.C_GenerateKey(session.id(),
++ // new CK_MECHANISM(CKM_TLS_PRE_MASTER_KEY_GEN, version),
++ new CK_MECHANISM(CKM_SSL3_PRE_MASTER_KEY_GEN, version),
++ attributes);
++ return P11Key.secretKey(session,
++ keyID, "TlsRsaPremasterSecret", 48 << 3, attributes);
++ } catch (PKCS11Exception e) {
++ throw new ProviderException(
++ "Could not generate premaster secret", e);
++ }
++ }
++
++ return secretKey;
++ }
++
+ }
+
+ final class ConstructKeys {
+--- ./jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java Wed Apr 16 12:37:49 2014 +0400
+@@ -73,7 +73,7 @@
+
+ protected void engineInit(AlgorithmParameterSpec params,
+ SecureRandom random) throws InvalidAlgorithmParameterException {
+- if (params instanceof TlsRsaPremasterSecretParameterSpec == false) {
++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
+ throw new InvalidAlgorithmParameterException(MSG);
+ }
+ this.spec = (TlsRsaPremasterSecretParameterSpec)params;
+@@ -83,38 +83,32 @@
+ throw new InvalidParameterException(MSG);
+ }
+
++ // Only can be used in client side to generate TLS RSA premaster secret.
+ protected SecretKey engineGenerateKey() {
+ if (spec == null) {
+ throw new IllegalStateException
+ ("TlsRsaPremasterSecretGenerator must be initialized");
+ }
+
+- byte[] b = spec.getEncodedSecret();
+- if (b == null) {
+- CK_VERSION version = new CK_VERSION(
++ CK_VERSION version = new CK_VERSION(
+ spec.getMajorVersion(), spec.getMinorVersion());
+- Session session = null;
+- try {
+- session = token.getObjSession();
+- CK_ATTRIBUTE[] attributes = token.getAttributes(
+- O_GENERATE, CKO_SECRET_KEY,
+- CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]);
+- long keyID = token.p11.C_GenerateKey(session.id(),
+- new CK_MECHANISM(mechanism, version), attributes);
+- SecretKey key = P11Key.secretKey(session,
+- keyID, "TlsRsaPremasterSecret", 48 << 3, attributes);
+- return key;
+- } catch (PKCS11Exception e) {
+- throw new ProviderException(
+- "Could not generate premaster secret", e);
+- } finally {
+- token.releaseSession(session);
+- }
++ Session session = null;
++ try {
++ session = token.getObjSession();
++ CK_ATTRIBUTE[] attributes = token.getAttributes(
++ O_GENERATE, CKO_SECRET_KEY,
++ CKK_GENERIC_SECRET, new CK_ATTRIBUTE[0]);
++ long keyID = token.p11.C_GenerateKey(session.id(),
++ new CK_MECHANISM(mechanism, version), attributes);
++ SecretKey key = P11Key.secretKey(session,
++ keyID, "TlsRsaPremasterSecret", 48 << 3, attributes);
++ return key;
++ } catch (PKCS11Exception e) {
++ throw new ProviderException(
++ "Could not generate premaster secret", e);
++ } finally {
++ token.releaseSession(session);
+ }
+-
+- // Won't worry, the TlsRsaPremasterSecret will be soon converted to
+- // TlsMasterSecret.
+- return new SecretKeySpec(b, "TlsRsaPremasterSecret");
+ }
+
+ }
+--- ./jdk/src/share/classes/sun/security/pkcs11/Token.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/pkcs11/Token.java Wed Apr 16 12:37:49 2014 +0400
+@@ -35,6 +35,7 @@
+ import sun.security.jca.JCAUtil;
+
+ import sun.security.pkcs11.wrapper.*;
++import static sun.security.pkcs11.TemplateManager.*;
+ import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
+
+ /**
+@@ -121,6 +122,9 @@
+ private final static CK_MECHANISM_INFO INVALID_MECH =
+ new CK_MECHANISM_INFO(0, 0, 0);
+
++ // flag indicating whether the token supports raw secret key material import
++ private Boolean supportsRawSecretKeyImport;
++
+ Token(SunPKCS11 provider) throws PKCS11Exception {
+ this.provider = provider;
+ this.removable = provider.removable;
+@@ -159,6 +163,36 @@
+ return writeProtected;
+ }
+
++ // return whether the token supports raw secret key material import
++ boolean supportsRawSecretKeyImport() {
++ if (supportsRawSecretKeyImport == null) {
++ SecureRandom random = JCAUtil.getSecureRandom();
++ byte[] encoded = new byte[48];
++ random.nextBytes(encoded);
++
++ CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[3];
++ attributes[0] = new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY);
++ attributes[1] = new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_GENERIC_SECRET);
++ attributes[2] = new CK_ATTRIBUTE(CKA_VALUE, encoded);
++
++ Session session = null;
++ try {
++ attributes = getAttributes(O_IMPORT,
++ CKO_SECRET_KEY, CKK_GENERIC_SECRET, attributes);
++ session = getObjSession();
++ long keyID = p11.C_CreateObject(session.id(), attributes);
++
++ supportsRawSecretKeyImport = Boolean.TRUE;
++ } catch (PKCS11Exception e) {
++ supportsRawSecretKeyImport = Boolean.FALSE;
++ } finally {
++ releaseSession(session);
++ }
++ }
++
++ return supportsRawSecretKeyImport;
++ }
++
+ // return whether we are logged in
+ // uses cached result if current. session is optional and may be null
+ boolean isLoggedIn(Session session) throws PKCS11Exception {
+--- ./jdk/src/share/classes/sun/security/rsa/RSACore.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/rsa/RSACore.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -50,6 +50,15 @@
+ */
+ public final class RSACore {
+
++ // globally enable/disable use of blinding
++ private final static boolean ENABLE_BLINDING = true;
++
++ // cache for blinding parameters. Map<BigInteger, BlindingParameters>
++ // use a weak hashmap so that cached values are automatically cleared
++ // when the modulus is GC'ed
++ private final static Map<BigInteger, BlindingParameters>
++ blindingCache = new WeakHashMap<>();
++
+ private RSACore() {
+ // empty
+ }
+@@ -100,12 +109,12 @@
+ if (key instanceof RSAPrivateCrtKey) {
+ return crtCrypt(msg, (RSAPrivateCrtKey)key);
+ } else {
+- return crypt(msg, key.getModulus(), key.getPrivateExponent());
++ return priCrypt(msg, key.getModulus(), key.getPrivateExponent());
+ }
+ }
+
+ /**
+- * RSA public key ops and non-CRT private key ops. Simple modPow().
++ * RSA public key ops. Simple modPow().
+ */
+ private static byte[] crypt(byte[] msg, BigInteger n, BigInteger exp)
+ throws BadPaddingException {
+@@ -115,22 +124,29 @@
+ }
+
+ /**
++ * RSA non-CRT private key operations.
++ */
++ private static byte[] priCrypt(byte[] msg, BigInteger n, BigInteger exp)
++ throws BadPaddingException {
++
++ BigInteger c = parseMsg(msg, n);
++ BlindingRandomPair brp = null;
++ BigInteger m;
++ if (ENABLE_BLINDING) {
++ brp = getBlindingRandomPair(null, exp, n);
++ c = c.multiply(brp.u).mod(n);
++ m = c.modPow(exp, n);
++ m = m.multiply(brp.v).mod(n);
++ } else {
++ m = c.modPow(exp, n);
++ }
++
++ return toByteArray(m, getByteLength(n));
++ }
++
++ /**
+ * RSA private key operations with CRT. Algorithm and variable naming
+ * are taken from PKCS#1 v2.1, section 5.1.2.
+- *
+- * The only difference is the addition of blinding to twart timing attacks.
+- * This is described in the RSA Bulletin#2 (Jan 96) among other places.
+- * This means instead of implementing RSA as
+- * m = c ^ d mod n (or RSA in CRT variant)
+- * we do
+- * r = random(0, n-1)
+- * c' = c * r^e mod n
+- * m' = c' ^ d mod n (or RSA in CRT variant)
+- * m = m' * r^-1 mod n (where r^-1 is the modular inverse of r mod n)
+- * This works because r^(e*d) * r^-1 = r * r^-1 = 1 (all mod n)
+- *
+- * We do not generate new blinding parameters for each operation but reuse
+- * them BLINDING_MAX_REUSE times (see definition below).
+ */
+ private static byte[] crtCrypt(byte[] msg, RSAPrivateCrtKey key)
+ throws BadPaddingException {
+@@ -141,13 +157,13 @@
+ BigInteger dP = key.getPrimeExponentP();
+ BigInteger dQ = key.getPrimeExponentQ();
+ BigInteger qInv = key.getCrtCoefficient();
++ BigInteger e = key.getPublicExponent();
++ BigInteger d = key.getPrivateExponent();
+
+- BlindingParameters params;
++ BlindingRandomPair brp;
+ if (ENABLE_BLINDING) {
+- params = getBlindingParameters(key);
+- c = c.multiply(params.re).mod(n);
+- } else {
+- params = null;
++ brp = getBlindingRandomPair(e, d, n);
++ c = c.multiply(brp.u).mod(n);
+ }
+
+ // m1 = c ^ dP mod p
+@@ -165,8 +181,8 @@
+ // m = m2 + q * h
+ BigInteger m = h.multiply(q).add(m2);
+
+- if (params != null) {
+- m = m.multiply(params.rInv).mod(n);
++ if (ENABLE_BLINDING) {
++ m = m.multiply(brp.v).mod(n);
+ }
+
+ return toByteArray(m, getByteLength(n));
+@@ -208,82 +224,221 @@
+ return t;
+ }
+
+- // globally enable/disable use of blinding
+- private final static boolean ENABLE_BLINDING = true;
++ /**
++ * Parameters (u,v) for RSA Blinding. This is described in the RSA
++ * Bulletin#2 (Jan 96) and other places:
++ *
++ * ftp://ftp.rsa.com/pub/pdfs/bull-2.pdf
++ *
++ * The standard RSA Blinding decryption requires the public key exponent
++ * (e) and modulus (n), and converts ciphertext (c) to plaintext (p).
++ *
++ * Before the modular exponentiation operation, the input message should
++ * be multiplied by (u (mod n)), and afterward the result is corrected
++ * by multiplying with (v (mod n)). The system should reject messages
++ * equal to (0 (mod n)). That is:
++ *
++ * 1. Generate r between 0 and n-1, relatively prime to n.
++ * 2. Compute x = (c*u) mod n
++ * 3. Compute y = (x^d) mod n
++ * 4. Compute p = (y*v) mod n
++ *
++ * The Java APIs allows for either standard RSAPrivateKey or
++ * RSAPrivateCrtKey RSA keys.
++ *
++ * If the public exponent is available to us (e.g. RSAPrivateCrtKey),
++ * choose a random r, then let (u, v):
++ *
++ * u = r ^ e mod n
++ * v = r ^ (-1) mod n
++ *
++ * The proof follows:
++ *
++ * p = (((c * u) ^ d mod n) * v) mod n
++ * = ((c ^ d) * (u ^ d) * v) mod n
++ * = ((c ^ d) * (r ^ e) ^ d) * (r ^ (-1))) mod n
++ * = ((c ^ d) * (r ^ (e * d)) * (r ^ (-1))) mod n
++ * = ((c ^ d) * (r ^ 1) * (r ^ (-1))) mod n (see below)
++ * = (c ^ d) mod n
++ *
++ * because in RSA cryptosystem, d is the multiplicative inverse of e:
++ *
++ * (r^(e * d)) mod n
++ * = (r ^ 1) mod n
++ * = r mod n
++ *
++ * However, if the public exponent is not available (e.g. RSAPrivateKey),
++ * we mitigate the timing issue by using a similar random number blinding
++ * approach using the private key:
++ *
++ * u = r
++ * v = ((r ^ (-1)) ^ d) mod n
++ *
++ * This returns the same plaintext because:
++ *
++ * p = (((c * u) ^ d mod n) * v) mod n
++ * = ((c ^ d) * (u ^ d) * v) mod n
++ * = ((c ^ d) * (u ^ d) * ((u ^ (-1)) ^d)) mod n
++ * = (c ^ d) mod n
++ *
++ * Computing inverses mod n and random number generation is slow, so
++ * it is often not practical to generate a new random (u, v) pair for
++ * each new exponentiation. The calculation of parameters might even be
++ * subject to timing attacks. However, (u, v) pairs should not be
++ * reused since they themselves might be compromised by timing attacks,
++ * leaving the private exponent vulnerable. An efficient solution to
++ * this problem is update u and v before each modular exponentiation
++ * step by computing:
++ *
++ * u = u ^ 2
++ * v = v ^ 2
++ *
++ * The total performance cost is small.
++ */
++ private final static class BlindingRandomPair {
++ final BigInteger u;
++ final BigInteger v;
+
+- // maximum number of times that we will use a set of blinding parameters
+- // value suggested by Paul Kocher (quoted by NSS)
+- private final static int BLINDING_MAX_REUSE = 50;
+-
+- // cache for blinding parameters. Map<BigInteger, BlindingParameters>
+- // use a weak hashmap so that cached values are automatically cleared
+- // when the modulus is GC'ed
+- private final static Map<BigInteger, BlindingParameters> blindingCache =
+- new WeakHashMap<>();
++ BlindingRandomPair(BigInteger u, BigInteger v) {
++ this.u = u;
++ this.v = v;
++ }
++ }
+
+ /**
+ * Set of blinding parameters for a given RSA key.
+ *
+ * The RSA modulus is usually unique, so we index by modulus in
+- * blindingCache. However, to protect against the unlikely case of two
+- * keys sharing the same modulus, we also store the public exponent.
+- * This means we cannot cache blinding parameters for multiple keys that
+- * share the same modulus, but since sharing moduli is fundamentally broken
+- * an insecure, this does not matter.
++ * {@code blindingCache}. However, to protect against the unlikely
++ * case of two keys sharing the same modulus, we also store the public
++ * or the private exponent. This means we cannot cache blinding
++ * parameters for multiple keys that share the same modulus, but
++ * since sharing moduli is fundamentally broken and insecure, this
++ * does not matter.
+ */
+- private static final class BlindingParameters {
+- // e (RSA public exponent)
+- final BigInteger e;
+- // r ^ e mod n
+- final BigInteger re;
+- // inverse of r mod n
+- final BigInteger rInv;
+- // how many more times this parameter object can be used
+- private volatile int remainingUses;
+- BlindingParameters(BigInteger e, BigInteger re, BigInteger rInv) {
++ private final static class BlindingParameters {
++ private final static BigInteger BIG_TWO = BigInteger.valueOf(2L);
++
++ // RSA public exponent
++ private final BigInteger e;
++
++ // hash code of RSA private exponent
++ private final BigInteger d;
++
++ // r ^ e mod n (CRT), or r mod n (Non-CRT)
++ private BigInteger u;
++
++ // r ^ (-1) mod n (CRT) , or ((r ^ (-1)) ^ d) mod n (Non-CRT)
++ private BigInteger v;
++
++ // e: the public exponent
++ // d: the private exponent
++ // n: the modulus
++ BlindingParameters(BigInteger e, BigInteger d, BigInteger n) {
++ this.u = null;
++ this.v = null;
+ this.e = e;
+- this.re = re;
+- this.rInv = rInv;
+- // initialize remaining uses, subtract current use now
+- remainingUses = BLINDING_MAX_REUSE - 1;
++ this.d = d;
++
++ int len = n.bitLength();
++ SecureRandom random = JCAUtil.getSecureRandom();
++ u = new BigInteger(len, random).mod(n);
++ // Although the possibility is very much limited that u is zero
++ // or is not relatively prime to n, we still want to be careful
++ // about the special value.
++ //
++ // Secure random generation is expensive, try to use BigInteger.ONE
++ // this time if this new generated random number is zero or is not
++ // relatively prime to n. Next time, new generated secure random
++ // number will be used instead.
++ if (u.equals(BigInteger.ZERO)) {
++ u = BigInteger.ONE; // use 1 this time
++ }
++
++ try {
++ // The call to BigInteger.modInverse() checks that u is
++ // relatively prime to n. Otherwise, ArithmeticException is
++ // thrown.
++ v = u.modInverse(n);
++ } catch (ArithmeticException ae) {
++ // if u is not relatively prime to n, use 1 this time
++ u = BigInteger.ONE;
++ v = BigInteger.ONE;
++ }
++
++ if (e != null) {
++ u = u.modPow(e, n); // e: the public exponent
++ // u: random ^ e
++ // v: random ^ (-1)
++ } else {
++ v = v.modPow(d, n); // d: the private exponent
++ // u: random
++ // v: random ^ (-d)
++ }
+ }
+- boolean valid(BigInteger e) {
+- int k = remainingUses--;
+- return (k > 0) && this.e.equals(e);
++
++ // return null if need to reset the parameters
++ BlindingRandomPair getBlindingRandomPair(
++ BigInteger e, BigInteger d, BigInteger n) {
++
++ if ((this.e != null && this.e.equals(e)) ||
++ (this.d != null && this.d.equals(d))) {
++
++ BlindingRandomPair brp = null;
++ synchronized (this) {
++ if (!u.equals(BigInteger.ZERO) &&
++ !v.equals(BigInteger.ZERO)) {
++
++ brp = new BlindingRandomPair(u, v);
++ if (u.compareTo(BigInteger.ONE) <= 0 ||
++ v.compareTo(BigInteger.ONE) <= 0) {
++
++ // need to reset the random pair next time
++ u = BigInteger.ZERO;
++ v = BigInteger.ZERO;
++ } else {
++ u = u.modPow(BIG_TWO, n);
++ v = v.modPow(BIG_TWO, n);
++ }
++ } // Otherwise, need to reset the random pair.
++ }
++ return brp;
++ }
++
++ return null;
+ }
+ }
+
+- /**
+- * Return valid RSA blinding parameters for the given private key.
+- * Use cached parameters if available. If not, generate new parameters
+- * and cache.
+- */
+- private static BlindingParameters getBlindingParameters
+- (RSAPrivateCrtKey key) {
+- BigInteger modulus = key.getModulus();
+- BigInteger e = key.getPublicExponent();
+- BlindingParameters params;
+- // we release the lock between get() and put()
+- // that means threads might concurrently generate new blinding
+- // parameters for the same modulus. this is only a slight waste
+- // of cycles and seems preferable in terms of scalability
+- // to locking out all threads while generating new parameters
++ private static BlindingRandomPair getBlindingRandomPair(
++ BigInteger e, BigInteger d, BigInteger n) {
++
++ BlindingParameters bps = null;
+ synchronized (blindingCache) {
+- params = blindingCache.get(modulus);
++ bps = blindingCache.get(n);
+ }
+- if ((params != null) && params.valid(e)) {
+- return params;
++
++ if (bps == null) {
++ bps = new BlindingParameters(e, d, n);
++ synchronized (blindingCache) {
++ if (blindingCache.get(n) == null) {
++ blindingCache.put(n, bps);
++ }
++ }
+ }
+- int len = modulus.bitLength();
+- SecureRandom random = JCAUtil.getSecureRandom();
+- BigInteger r = new BigInteger(len, random).mod(modulus);
+- BigInteger re = r.modPow(e, modulus);
+- BigInteger rInv = r.modInverse(modulus);
+- params = new BlindingParameters(e, re, rInv);
+- synchronized (blindingCache) {
+- blindingCache.put(modulus, params);
++
++ BlindingRandomPair brp = bps.getBlindingRandomPair(e, d, n);
++ if (brp == null) {
++ // need to reset the blinding parameters
++ bps = new BlindingParameters(e, d, n);
++ synchronized (blindingCache) {
++ if (blindingCache.get(n) != null) {
++ blindingCache.put(n, bps);
++ }
++ }
++ brp = bps.getBlindingRandomPair(e, d, n);
+ }
+- return params;
++
++ return brp;
+ }
+
+ }
+--- ./jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/ssl/RSAClientKeyExchange.java Wed Apr 16 12:37:49 2014 +0400
+@@ -50,23 +50,6 @@
+ */
+ final class RSAClientKeyExchange extends HandshakeMessage {
+
+- /**
+- * The TLS spec says that the version in the RSA premaster secret must
+- * be the maximum version supported by the client (i.e. the version it
+- * requested in its client hello version). However, we (and other
+- * implementations) used to send the active negotiated version. The
+- * system property below allows to toggle the behavior.
+- */
+- private final static String PROP_NAME =
+- "com.sun.net.ssl.rsaPreMasterSecretFix";
+-
+- /*
+- * Default is "false" (old behavior) for compatibility reasons in
+- * SSLv3/TLSv1. Later protocols (TLSv1.1+) do not use this property.
+- */
+- private final static boolean rsaPreMasterSecretFix =
+- Debug.getBooleanProperty(PROP_NAME, false);
+-
+ /*
+ * The following field values were encrypted with the server's public
+ * key (or temp key from server key exchange msg) and are presented
+@@ -90,22 +73,12 @@
+ }
+ this.protocolVersion = protocolVersion;
+
+- int major, minor;
+-
+- if (rsaPreMasterSecretFix || maxVersion.v >= ProtocolVersion.TLS11.v) {
+- major = maxVersion.major;
+- minor = maxVersion.minor;
+- } else {
+- major = protocolVersion.major;
+- minor = protocolVersion.minor;
+- }
+-
+ try {
+ String s = ((protocolVersion.v >= ProtocolVersion.TLS12.v) ?
+ "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret");
+ KeyGenerator kg = JsseJce.getKeyGenerator(s);
+- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor),
+- generator);
++ kg.init(new TlsRsaPremasterSecretParameterSpec(
++ maxVersion.v, protocolVersion.v), generator);
+ preMaster = kg.generateKey();
+
+ Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1);
+@@ -140,18 +113,17 @@
+ }
+ }
+
+- Exception failover = null;
+- byte[] encoded = null;
+ try {
+ Cipher cipher = JsseJce.getCipher(JsseJce.CIPHER_RSA_PKCS1);
+ // Cannot generate key here, please don't use Cipher.UNWRAP_MODE!
+- cipher.init(Cipher.DECRYPT_MODE, privateKey);
+- encoded = cipher.doFinal(encrypted);
+- } catch (BadPaddingException bpe) {
+- failover = bpe;
+- encoded = null;
+- } catch (IllegalBlockSizeException ibse) {
+- // the message it too big to process with RSA
++ cipher.init(Cipher.UNWRAP_MODE, privateKey,
++ new TlsRsaPremasterSecretParameterSpec(
++ maxVersion.v, currentVersion.v),
++ generator);
++ preMaster = (SecretKey)cipher.unwrap(encrypted,
++ "TlsRsaPremasterSecret", Cipher.SECRET_KEY);
++ } catch (InvalidKeyException ibk) {
++ // the message is too big to process with RSA
+ throw new SSLProtocolException(
+ "Unable to process PreMasterSecret, may be too big");
+ } catch (Exception e) {
+@@ -162,124 +134,6 @@
+ }
+ throw new RuntimeException("Could not generate dummy secret", e);
+ }
+-
+- // polish the premaster secret
+- preMaster = polishPreMasterSecretKey(
+- currentVersion, maxVersion, generator, encoded, failover);
+- }
+-
+- /**
+- * To avoid vulnerabilities described by section 7.4.7.1, RFC 5246,
+- * treating incorrectly formatted message blocks and/or mismatched
+- * version numbers in a manner indistinguishable from correctly
+- * formatted RSA blocks.
+- *
+- * RFC 5246 describes the approach as :
+- *
+- * 1. Generate a string R of 48 random bytes
+- *
+- * 2. Decrypt the message to recover the plaintext M
+- *
+- * 3. If the PKCS#1 padding is not correct, or the length of message
+- * M is not exactly 48 bytes:
+- * pre_master_secret = R
+- * else If ClientHello.client_version <= TLS 1.0, and version
+- * number check is explicitly disabled:
+- * premaster secret = M
+- * else If M[0..1] != ClientHello.client_version:
+- * premaster secret = R
+- * else:
+- * premaster secret = M
+- *
+- * Note that #2 has completed before the call of this method.
+- */
+- private SecretKey polishPreMasterSecretKey(ProtocolVersion currentVersion,
+- ProtocolVersion clientHelloVersion, SecureRandom generator,
+- byte[] encoded, Exception failoverException) {
+-
+- this.protocolVersion = clientHelloVersion;
+- if (generator == null) {
+- generator = new SecureRandom();
+- }
+- byte[] random = new byte[48];
+- generator.nextBytes(random);
+-
+- if (failoverException == null && encoded != null) {
+- // check the length
+- if (encoded.length != 48) {
+- if (debug != null && Debug.isOn("handshake")) {
+- System.out.println(
+- "incorrect length of premaster secret: " +
+- encoded.length);
+- }
+-
+- return generatePreMasterSecret(
+- clientHelloVersion, random, generator);
+- }
+-
+- if (clientHelloVersion.major != encoded[0] ||
+- clientHelloVersion.minor != encoded[1]) {
+-
+- if (clientHelloVersion.v <= ProtocolVersion.TLS10.v &&
+- currentVersion.major == encoded[0] &&
+- currentVersion.minor == encoded[1]) {
+- /*
+- * For compatibility, we maintain the behavior that the
+- * version in pre_master_secret can be the negotiated
+- * version for TLS v1.0 and SSL v3.0.
+- */
+- this.protocolVersion = currentVersion;
+- } else {
+- if (debug != null && Debug.isOn("handshake")) {
+- System.out.println("Mismatching Protocol Versions, " +
+- "ClientHello.client_version is " +
+- clientHelloVersion +
+- ", while PreMasterSecret.client_version is " +
+- ProtocolVersion.valueOf(encoded[0], encoded[1]));
+- }
+-
+- encoded = random;
+- }
+- }
+-
+- return generatePreMasterSecret(
+- clientHelloVersion, encoded, generator);
+- }
+-
+- if (debug != null && Debug.isOn("handshake") &&
+- failoverException != null) {
+- System.out.println("Error decrypting premaster secret:");
+- failoverException.printStackTrace(System.out);
+- }
+-
+- return generatePreMasterSecret(clientHelloVersion, random, generator);
+- }
+-
+- // generate a premaster secret with the specified version number
+- private static SecretKey generatePreMasterSecret(
+- ProtocolVersion version, byte[] encodedSecret,
+- SecureRandom generator) {
+-
+- if (debug != null && Debug.isOn("handshake")) {
+- System.out.println("Generating a random fake premaster secret");
+- }
+-
+- try {
+- String s = ((version.v >= ProtocolVersion.TLS12.v) ?
+- "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret");
+- KeyGenerator kg = JsseJce.getKeyGenerator(s);
+- kg.init(new TlsRsaPremasterSecretParameterSpec(
+- version.major, version.minor, encodedSecret), generator);
+- return kg.generateKey();
+- } catch (InvalidAlgorithmParameterException |
+- NoSuchAlgorithmException iae) {
+- // unlikely to happen, otherwise, must be a provider exception
+- if (debug != null && Debug.isOn("handshake")) {
+- System.out.println("RSA premaster secret generation error:");
+- iae.printStackTrace(System.out);
+- }
+- throw new RuntimeException("Could not generate dummy secret", iae);
+- }
+ }
+
+ @Override
+--- ./jdk/src/share/classes/sun/security/util/KeyUtil.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/classes/sun/security/util/KeyUtil.java Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -32,6 +32,7 @@
+ import java.security.interfaces.ECKey;
+ import java.security.interfaces.RSAKey;
+ import java.security.interfaces.DSAKey;
++import java.security.SecureRandom;
+ import java.security.spec.KeySpec;
+ import javax.crypto.SecretKey;
+ import javax.crypto.interfaces.DHKey;
+@@ -157,6 +158,79 @@
+ }
+
+ /**
++ * Check the format of TLS PreMasterSecret.
++ * <P>
++ * To avoid vulnerabilities described by section 7.4.7.1, RFC 5246,
++ * treating incorrectly formatted message blocks and/or mismatched
++ * version numbers in a manner indistinguishable from correctly
++ * formatted RSA blocks.
++ *
++ * RFC 5246 describes the approach as :
++ *
++ * 1. Generate a string R of 48 random bytes
++ *
++ * 2. Decrypt the message to recover the plaintext M
++ *
++ * 3. If the PKCS#1 padding is not correct, or the length of message
++ * M is not exactly 48 bytes:
++ * pre_master_secret = R
++ * else If ClientHello.client_version <= TLS 1.0, and version
++ * number check is explicitly disabled:
++ * premaster secret = M
++ * else If M[0..1] != ClientHello.client_version:
++ * premaster secret = R
++ * else:
++ * premaster secret = M
++ *
++ * Note that #2 should have completed before the call to this method.
++ *
++ * @param clientVersion the version of the TLS protocol by which the
++ * client wishes to communicate during this session
++ * @param serverVersion the negotiated version of the TLS protocol which
++ * contains the lower of that suggested by the client in the client
++ * hello and the highest supported by the server.
++ * @param encoded the encoded key in its "RAW" encoding format
++ * @param isFailover whether or not the previous decryption of the
++ * encrypted PreMasterSecret message run into problem
++ * @return the polished PreMasterSecret key in its "RAW" encoding format
++ */
++ public static byte[] checkTlsPreMasterSecretKey(
++ int clientVersion, int serverVersion, SecureRandom random,
++ byte[] encoded, boolean isFailOver) {
++
++ if (random == null) {
++ random = new SecureRandom();
++ }
++ byte[] replacer = new byte[48];
++ random.nextBytes(replacer);
++
++ if (!isFailOver && (encoded != null)) {
++ // check the length
++ if (encoded.length != 48) {
++ // private, don't need to clone the byte array.
++ return replacer;
++ }
++
++ int encodedVersion =
++ ((encoded[0] & 0xFF) << 8) | (encoded[1] & 0xFF);
++ if (clientVersion != encodedVersion) {
++ if (clientVersion > 0x0301 || // 0x0301: TLSv1
++ serverVersion != encodedVersion) {
++ encoded = replacer;
++ } // Otherwise, For compatibility, we maintain the behavior
++ // that the version in pre_master_secret can be the
++ // negotiated version for TLS v1.0 and SSL v3.0.
++ }
++
++ // private, don't need to clone the byte array.
++ return encoded;
++ }
++
++ // private, don't need to clone the byte array.
++ return replacer;
++ }
++
++ /**
+ * Returns whether the Diffie-Hellman public key is valid or not.
+ *
+ * Per RFC 2631 and NIST SP800-56A, the following algorithm is used to
+@@ -198,7 +272,16 @@
+ "Diffie-Hellman public key is too large");
+ }
+
+- // Don't bother to check against the y^q mod p if safe primes are used.
++ // y^q mod p == 1?
++ // Unable to perform this check as q is unknown in this circumstance.
++
++ // p is expected to be prime. However, it is too expensive to check
++ // that p is prime. Instead, in order to mitigate the impact of
++ // non-prime values, we check that y is not a factor of p.
++ BigInteger r = p.remainder(y);
++ if (r.equals(BigInteger.ZERO)) {
++ throw new InvalidKeyException("Invalid Diffie-Hellman parameters");
++ }
+ }
+
+ /**
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/src/share/classes/sun/util/resources/CalendarData_pt_BR.properties Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,40 @@
++#
++# 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.
++#
++
++# (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
++# (C) Copyright IBM Corp. 1996 - 1999 - All Rights Reserved
++#
++# The original version of this source code and documentation
++# is copyrighted and owned by Taligent, Inc., a wholly-owned
++# subsidiary of IBM. These materials are provided under terms
++# of a License Agreement between Taligent and Sun. This technology
++# is protected by multiple US and International patents.
++#
++# This notice and attribution to Taligent may not be removed.
++# Taligent is a registered trademark of Taligent, Inc.
++
++
++firstDayOfWeek=1
++minimalDaysInFirstWeek=1
+--- ./jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/defines.h Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2001, 2009, 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
+@@ -79,6 +79,7 @@
+ #define ERROR_RESOURCE "Cannot extract resource file"
+ #define ERROR_OVERFLOW "Internal buffer overflow"
+ #define ERROR_INTERNAL "Internal error"
++#define ERROR_INIT "cannot init class members"
+
+ #define LOGFILE_STDOUT "-"
+ #define LOGFILE_STDERR ""
+--- ./jdk/src/share/native/com/sun/java/util/jar/pack/jni.cpp Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/com/sun/java/util/jar/pack/jni.cpp Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+@@ -56,6 +56,45 @@
+
+ #define THROW_IOE(x) JNU_ThrowIOException(env,x)
+
++#define CHECK_EXCEPTION_RETURN_VOID_THROW_IOE(CERVTI_exception, CERVTI_message) \
++ do { \
++ if ((env)->ExceptionOccurred()) { \
++ THROW_IOE(CERVTI_message); \
++ return; \
++ } \
++ if ((CERVTI_exception) == NULL) { \
++ THROW_IOE(CERVTI_message); \
++ return; \
++ } \
++ } while (JNI_FALSE)
++
++
++#define CHECK_EXCEPTION_RETURN_VALUE(CERL_exception, CERL_return_value) \
++ do { \
++ if ((env)->ExceptionOccurred()) { \
++ return CERL_return_value; \
++ } \
++ if ((CERL_exception) == NULL) { \
++ return CERL_return_value; \
++ } \
++ } while (JNI_FALSE)
++
++
++// If these useful macros aren't defined in jni_util.h then define them here
++#ifndef CHECK_NULL_RETURN
++#define CHECK_NULL_RETURN(x, y) \
++ do { \
++ if ((x) == NULL) return (y); \
++ } while (JNI_FALSE)
++#endif
++
++#ifndef CHECK_EXCEPTION_RETURN
++#define CHECK_EXCEPTION_RETURN(env, y) \
++ do { \
++ if ((*env)->ExceptionCheck(env)) return (y); \
++ } while (JNI_FALSE)
++#endif
++
+ static jlong read_input_via_jni(unpacker* self,
+ void* buf, jlong minlen, jlong maxlen);
+
+@@ -92,9 +131,11 @@
+ vm->GetEnv(&envRaw, JNI_VERSION_1_1);
+ JNIEnv* env = (JNIEnv*) envRaw;
+ //fprintf(stderr, "get_unpacker() env=%p\n", env);
+- if (env == null)
+- return null;
++ CHECK_NULL_RETURN(env, NULL);
+ jobject pObj = env->CallStaticObjectMethod(NIclazz, currentInstMID);
++ // We should check upon the known non-null variable because here we want to check
++ // only for pending exceptions. If pObj is null we'll deal with it later.
++ CHECK_EXCEPTION_RETURN_VALUE(env, NULL);
+ //fprintf(stderr, "get_unpacker0() pObj=%p\n", pObj);
+ if (pObj != null) {
+ // Got pObj and env; now do it the easy way.
+@@ -137,20 +178,20 @@
+ while( dbg != null) { sleep(10); }
+ #endif
+ NIclazz = (jclass) env->NewGlobalRef(clazz);
++
+ unpackerPtrFID = env->GetFieldID(clazz, "unpackerPtr", "J");
++ CHECK_EXCEPTION_RETURN_VOID_THROW_IOE(unpackerPtrFID, ERROR_INIT);
++
+ currentInstMID = env->GetStaticMethodID(clazz, "currentInstance",
+ "()Ljava/lang/Object;");
++ CHECK_EXCEPTION_RETURN_VOID_THROW_IOE(currentInstMID, ERROR_INIT);
++
+ readInputMID = env->GetMethodID(clazz, "readInputFn",
+ "(Ljava/nio/ByteBuffer;J)J");
++ CHECK_EXCEPTION_RETURN_VOID_THROW_IOE(readInputMID, ERROR_INIT);
++
+ getUnpackerPtrMID = env->GetMethodID(clazz, "getUnpackerPtr", "()J");
+-
+- if (unpackerPtrFID == null ||
+- currentInstMID == null ||
+- readInputMID == null ||
+- NIclazz == null ||
+- getUnpackerPtrMID == null) {
+- THROW_IOE("cannot init class members");
+- }
++ CHECK_EXCEPTION_RETURN_VOID_THROW_IOE(getUnpackerPtrMID, ERROR_INIT);
+ }
+
+ JNIEXPORT jlong JNICALL
+@@ -160,9 +201,7 @@
+ // valid object pointers and env is intact, if not now is good time to bail.
+ unpacker* uPtr = get_unpacker();
+ //fprintf(stderr, "start(%p) uPtr=%p initializing\n", pObj, uPtr);
+- if (uPtr == null) {
+- return -1;
+- }
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, -1);
+ // redirect our io to the default log file or whatever.
+ uPtr->redirect_stdio();
+
+@@ -200,6 +239,7 @@
+ jobjectArray pParts) {
+
+ unpacker* uPtr = get_unpacker(env, pObj);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, false);
+ unpacker::file* filep = uPtr->get_next_file();
+
+ if (uPtr->aborting()) {
+@@ -207,32 +247,38 @@
+ return false;
+ }
+
+- if (filep == null) {
+- return false; // end of the sequence
+- }
++ CHECK_NULL_RETURN(filep, false);
+ assert(filep == &uPtr->cur_file);
+
+ int pidx = 0, iidx = 0;
+ jintArray pIntParts = (jintArray) env->GetObjectArrayElement(pParts, pidx++);
++ CHECK_EXCEPTION_RETURN_VALUE(pIntParts, false);
+ jint* intParts = env->GetIntArrayElements(pIntParts, null);
+ intParts[iidx++] = (jint)( (julong)filep->size >> 32 );
+ intParts[iidx++] = (jint)( (julong)filep->size >> 0 );
+ intParts[iidx++] = filep->modtime;
+ intParts[iidx++] = filep->deflate_hint() ? 1 : 0;
+ env->ReleaseIntArrayElements(pIntParts, intParts, JNI_COMMIT);
+-
+- env->SetObjectArrayElement(pParts, pidx++, env->NewStringUTF(filep->name));
+-
++ jstring filename = env->NewStringUTF(filep->name);
++ CHECK_EXCEPTION_RETURN_VALUE(filename, false);
++ env->SetObjectArrayElement(pParts, pidx++, filename);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, false);
+ jobject pDataBuf = null;
+- if (filep->data[0].len > 0)
++ if (filep->data[0].len > 0) {
+ pDataBuf = env->NewDirectByteBuffer(filep->data[0].ptr,
+ filep->data[0].len);
++ CHECK_EXCEPTION_RETURN_VALUE(pDataBuf, false);
++ }
+ env->SetObjectArrayElement(pParts, pidx++, pDataBuf);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, false);
+ pDataBuf = null;
+- if (filep->data[1].len > 0)
++ if (filep->data[1].len > 0) {
+ pDataBuf = env->NewDirectByteBuffer(filep->data[1].ptr,
+ filep->data[1].len);
++ CHECK_EXCEPTION_RETURN_VALUE(pDataBuf, false);
++ }
+ env->SetObjectArrayElement(pParts, pidx++, pDataBuf);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, false);
+
+ return true;
+ }
+@@ -241,6 +287,7 @@
+ JNIEXPORT jobject JNICALL
+ Java_com_sun_java_util_jar_pack_NativeUnpack_getUnusedInput(JNIEnv *env, jobject pObj) {
+ unpacker* uPtr = get_unpacker(env, pObj);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, NULL);
+ unpacker::file* filep = &uPtr->cur_file;
+
+ if (uPtr->aborting()) {
+@@ -263,7 +310,7 @@
+ JNIEXPORT jlong JNICALL
+ Java_com_sun_java_util_jar_pack_NativeUnpack_finish(JNIEnv *env, jobject pObj) {
+ unpacker* uPtr = get_unpacker(env, pObj, false);
+- if (uPtr == null) return 0;
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, NULL);
+ size_t consumed = uPtr->input_consumed();
+ free_unpacker(env, pObj, uPtr);
+ return consumed;
+@@ -274,7 +321,9 @@
+ jstring pProp, jstring pValue) {
+ unpacker* uPtr = get_unpacker(env, pObj);
+ const char* prop = env->GetStringUTFChars(pProp, JNI_FALSE);
++ CHECK_EXCEPTION_RETURN_VALUE(prop, false);
+ const char* value = env->GetStringUTFChars(pValue, JNI_FALSE);
++ CHECK_EXCEPTION_RETURN_VALUE(value, false);
+ jboolean retval = uPtr->set_option(prop, value);
+ env->ReleaseStringUTFChars(pProp, prop);
+ env->ReleaseStringUTFChars(pValue, value);
+@@ -286,9 +335,11 @@
+ jstring pProp) {
+
+ unpacker* uPtr = get_unpacker(env, pObj);
++ CHECK_EXCEPTION_RETURN_VALUE(uPtr, NULL);
+ const char* prop = env->GetStringUTFChars(pProp, JNI_FALSE);
++ CHECK_EXCEPTION_RETURN_VALUE(prop, NULL);
+ const char* value = uPtr->get_option(prop);
++ CHECK_EXCEPTION_RETURN_VALUE(value, NULL);
+ env->ReleaseStringUTFChars(pProp, prop);
+- if (value == null) return null;
+ return env->NewStringUTF(value);
+ }
+--- ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -373,14 +373,14 @@
+
+
+ /* Parse the source image */
+- if ((status = awt_parseImage(env, jsrc, &srcImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jsrc, &srcImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ free(dkern);
+ return 0;
+ }
+
+ /* Parse the destination image */
+- if ((status = awt_parseImage(env, jdst, &dstImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jdst, &dstImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ awt_freeParsedImage(srcImageP, TRUE);
+ free(dkern);
+@@ -627,7 +627,7 @@
+ }
+
+ /* Parse the source raster */
+- if ((status = awt_parseRaster(env, jsrc, srcRasterP)) <= 0) {
++ if (awt_parseRaster(env, jsrc, srcRasterP) <= 0) {
+ /* Can't handle any custom rasters */
+ free(srcRasterP);
+ free(dstRasterP);
+@@ -636,7 +636,7 @@
+ }
+
+ /* Parse the destination raster */
+- if ((status = awt_parseRaster(env, jdst, dstRasterP)) <= 0) {
++ if (awt_parseRaster(env, jdst, dstRasterP) <= 0) {
+ /* Can't handle any custom images */
+ awt_freeParsedRaster(srcRasterP, TRUE);
+ free(dstRasterP);
+@@ -839,13 +839,13 @@
+ (*env)->ReleasePrimitiveArrayCritical(env, jmatrix, matrix, JNI_ABORT);
+
+ /* Parse the source image */
+- if ((status = awt_parseImage(env, jsrc, &srcImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jsrc, &srcImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ return 0;
+ }
+
+ /* Parse the destination image */
+- if ((status = awt_parseImage(env, jdst, &dstImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jdst, &dstImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ awt_freeParsedImage(srcImageP, TRUE);
+ return 0;
+@@ -1059,7 +1059,7 @@
+ (*env)->ReleasePrimitiveArrayCritical(env, jmatrix, matrix, JNI_ABORT);
+
+ /* Parse the source raster */
+- if ((status = awt_parseRaster(env, jsrc, srcRasterP)) <= 0) {
++ if (awt_parseRaster(env, jsrc, srcRasterP) <= 0) {
+ /* Can't handle any custom rasters */
+ free(srcRasterP);
+ free(dstRasterP);
+@@ -1067,7 +1067,7 @@
+ }
+
+ /* Parse the destination raster */
+- if ((status = awt_parseRaster(env, jdst, dstRasterP)) <= 0) {
++ if (awt_parseRaster(env, jdst, dstRasterP) <= 0) {
+ /* Can't handle any custom images */
+ awt_freeParsedRaster(srcRasterP, TRUE);
+ free(dstRasterP);
+@@ -1305,13 +1305,13 @@
+ if (s_timeIt) (*start_timer)(3600);
+
+ /* Parse the source image */
+- if ((status = awt_parseImage(env, jsrc, &srcImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jsrc, &srcImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ return 0;
+ }
+
+ /* Parse the destination image */
+- if ((status = awt_parseImage(env, jdst, &dstImageP, FALSE)) <= 0) {
++ if (awt_parseImage(env, jdst, &dstImageP, FALSE) <= 0) {
+ /* Can't handle any custom images */
+ awt_freeParsedImage(srcImageP, TRUE);
+ return 0;
+@@ -1553,14 +1553,14 @@
+ }
+
+ /* Parse the source raster - reject custom images */
+- if ((status = awt_parseRaster(env, jsrc, srcRasterP)) <= 0) {
++ if (awt_parseRaster(env, jsrc, srcRasterP) <= 0) {
+ free(srcRasterP);
+ free(dstRasterP);
+ return 0;
+ }
+
+ /* Parse the destination image - reject custom images */
+- if ((status = awt_parseRaster(env, jdst, dstRasterP)) <= 0) {
++ if (awt_parseRaster(env, jdst, dstRasterP) <= 0) {
+ awt_freeParsedRaster(srcRasterP, TRUE);
+ free(dstRasterP);
+ return 0;
+--- ./jdk/src/share/native/sun/font/freetypeScaler.c Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/sun/font/freetypeScaler.c Wed Apr 16 12:37:49 2014 +0400
+@@ -177,18 +177,10 @@
+ if (numBytes > FILEDATACACHESIZE) {
+ bBuffer = (*env)->NewDirectByteBuffer(env, destBuffer, numBytes);
+ if (bBuffer != NULL) {
+- /* Loop until the read succeeds (or EOF).
+- * This should improve robustness in the event of a problem in
+- * the I/O system. If we find that we ever end up spinning here
+- * we are going to have to do some serious work to recover.
+- * Just returning without reading the data will cause a crash.
+- */
+- while (bread == 0) {
+- bread = (*env)->CallIntMethod(env,
+- scalerInfo->font2D,
+- sunFontIDs.ttReadBlockMID,
+- bBuffer, offset, numBytes);
+- }
++ bread = (*env)->CallIntMethod(env,
++ scalerInfo->font2D,
++ sunFontIDs.ttReadBlockMID,
++ bBuffer, offset, numBytes);
+ return bread;
+ } else {
+ /* We probably hit bug bug 4845371. For reasons that
+@@ -224,19 +216,10 @@
+ (offset + FILEDATACACHESIZE > scalerInfo->fileSize) ?
+ scalerInfo->fileSize - offset : FILEDATACACHESIZE;
+ bBuffer = scalerInfo->directBuffer;
+- /* Loop until all the read succeeds (or EOF).
+- * This should improve robustness in the event of a problem in
+- * the I/O system. If we find that we ever end up spinning here
+- * we are going to have to do some serious work to recover.
+- * Just returning without reading the data will cause a crash.
+- */
+- while (bread == 0) {
+- bread = (*env)->CallIntMethod(env, scalerInfo->font2D,
+- sunFontIDs.ttReadBlockMID,
+- bBuffer, offset,
+- scalerInfo->fontDataLength);
+- }
+-
++ bread = (*env)->CallIntMethod(env, scalerInfo->font2D,
++ sunFontIDs.ttReadBlockMID,
++ bBuffer, offset,
++ scalerInfo->fontDataLength);
+ memcpy(destBuffer, scalerInfo->fontData, numBytes);
+ return numBytes;
+ }
+--- ./jdk/src/share/native/sun/management/GcInfoBuilder.c Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/sun/management/GcInfoBuilder.c Wed Apr 16 12:37:49 2014 +0400
+@@ -190,7 +190,7 @@
+
+ if (ext_att_count <= 0) {
+ JNU_ThrowIllegalArgumentException(env, "Invalid ext_att_count");
+- return;
++ return 0;
+ }
+
+ gc_stat.usage_before_gc = usageBeforeGC;
+--- ./jdk/src/share/native/sun/security/ec/ECC_JNI.cpp Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/share/native/sun/security/ec/ECC_JNI.cpp Wed Apr 16 12:37:49 2014 +0400
+@@ -1,5 +1,5 @@
+ /*
+- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
++ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * 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,24 +62,42 @@
+ SECITEM_FreeItem(&ecparams->curveOID, B_FALSE);
+ if (freeStruct)
+ free(ecparams);
++
++}
++
++jbyteArray getEncodedBytes(JNIEnv *env, SECItem *hSECItem)
++{
++ SECItem *s = (SECItem *)hSECItem;
++
++ jbyteArray jEncodedBytes = env->NewByteArray(s->len);
++ if (jEncodedBytes == NULL) {
++ return NULL;
++ }
++ // Copy bytes from a native SECItem buffer to java byte array
++ env->SetByteArrayRegion(jEncodedBytes, 0, s->len, (jbyte *)s->data);
++ if (env->ExceptionCheck()) { //should never happen
++ return NULL;
++ }
++ return jEncodedBytes;
+ }
+
+ /*
+ * Class: sun_security_ec_ECKeyPairGenerator
+ * Method: generateECKeyPair
+- * Signature: (I[B[B)[J
++ * Signature: (I[B[B)[B
+ */
+-JNIEXPORT jlongArray
++JNIEXPORT jobjectArray
+ JNICALL Java_sun_security_ec_ECKeyPairGenerator_generateECKeyPair
+ (JNIEnv *env, jclass clazz, jint keySize, jbyteArray encodedParams, jbyteArray seed)
+ {
+- ECPrivateKey *privKey; /* contains both public and private values */
++ ECPrivateKey *privKey = NULL; /* contains both public and private values */
+ ECParams *ecparams = NULL;
+ SECKEYECParams params_item;
+ jint jSeedLength;
+ jbyte* pSeedBuffer = NULL;
+- jlongArray result = NULL;
+- jlong* resultElements = NULL;
++ jobjectArray result = NULL;
++ jclass baCls = NULL;
++ jbyteArray jba;
+
+ // Initialize the ECParams struct
+ params_item.len = env->GetArrayLength(encodedParams);
+@@ -106,61 +124,64 @@
+ }
+
+ jboolean isCopy;
+- result = env->NewLongArray(2);
+- resultElements = env->GetLongArrayElements(result, &isCopy);
++ baCls = env->FindClass("[B");
++ if (baCls == NULL) {
++ goto cleanup;
++ }
++ result = env->NewObjectArray(2, baCls, NULL);
++ if (result == NULL) {
++ goto cleanup;
++ }
++ jba = getEncodedBytes(env, &(privKey->privateValue));
++ if (jba == NULL) {
++ result = NULL;
++ goto cleanup;
++ }
++ env->SetObjectArrayElement(result, 0, jba); // big integer
++ if (env->ExceptionCheck()) { // should never happen
++ result = NULL;
++ goto cleanup;
++ }
+
+- resultElements[0] = (jlong) &(privKey->privateValue); // private big integer
+- resultElements[1] = (jlong) &(privKey->publicValue); // encoded ec point
+-
+- // If the array is a copy then we must write back our changes
+- if (isCopy == JNI_TRUE) {
+- env->ReleaseLongArrayElements(result, resultElements, 0);
++ jba = getEncodedBytes(env, &(privKey->publicValue));
++ if (jba == NULL) {
++ result = NULL;
++ goto cleanup;
++ }
++ env->SetObjectArrayElement(result, 1, jba); // encoded ec point
++ if (env->ExceptionCheck()) { // should never happen
++ result = NULL;
++ goto cleanup;
+ }
+
+ cleanup:
+ {
+- if (params_item.data)
++ if (params_item.data) {
+ env->ReleaseByteArrayElements(encodedParams,
+ (jbyte *) params_item.data, JNI_ABORT);
++ }
+
+- if (ecparams)
++ if (ecparams) {
+ FreeECParams(ecparams, true);
++ }
+
+ if (privKey) {
+ FreeECParams(&privKey->ecParams, false);
+ SECITEM_FreeItem(&privKey->version, B_FALSE);
+- // Don't free privKey->privateValue and privKey->publicValue
++ SECITEM_FreeItem(&privKey->privateValue, B_FALSE);
++ SECITEM_FreeItem(&privKey->publicValue, B_FALSE);
++ free(privKey);
+ }
+
+- if (pSeedBuffer)
++ if (pSeedBuffer) {
+ delete [] pSeedBuffer;
++ }
+ }
+
+ return result;
+ }
+
+ /*
+- * Class: sun_security_ec_ECKeyPairGenerator
+- * Method: getEncodedBytes
+- * Signature: (J)[B
+- */
+-JNIEXPORT jbyteArray
+-JNICALL Java_sun_security_ec_ECKeyPairGenerator_getEncodedBytes
+- (JNIEnv *env, jclass clazz, jlong hSECItem)
+-{
+- SECItem *s = (SECItem *)hSECItem;
+- jbyteArray jEncodedBytes = env->NewByteArray(s->len);
+-
+- // Copy bytes from a native SECItem buffer to Java byte array
+- env->SetByteArrayRegion(jEncodedBytes, 0, s->len, (jbyte *)s->data);
+-
+- // Use B_FALSE to free only the SECItem->data
+- SECITEM_FreeItem(s, B_FALSE);
+-
+- return jEncodedBytes;
+-}
+-
+-/*
+ * Class: sun_security_ec_ECDSASignature
+ * Method: signDigest
+ * Signature: ([B[B[B[B)[B
+@@ -234,21 +255,31 @@
+
+ cleanup:
+ {
+- if (params_item.data)
++ if (params_item.data) {
+ env->ReleaseByteArrayElements(encodedParams,
+ (jbyte *) params_item.data, JNI_ABORT);
++ }
+
+- if (pDigestBuffer)
++ if (privKey.privateValue.data) {
++ env->ReleaseByteArrayElements(privateKey,
++ (jbyte *) privKey.privateValue.data, JNI_ABORT);
++ }
++
++ if (pDigestBuffer) {
+ delete [] pDigestBuffer;
++ }
+
+- if (pSignedDigestBuffer)
++ if (pSignedDigestBuffer) {
+ delete [] pSignedDigestBuffer;
++ }
+
+- if (pSeedBuffer)
++ if (pSeedBuffer) {
+ delete [] pSeedBuffer;
++ }
+
+- if (ecparams)
++ if (ecparams) {
+ FreeECParams(ecparams, true);
++ }
+ }
+
+ return jSignedDigest;
+--- ./jdk/src/solaris/classes/sun/font/FcFontConfiguration.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/solaris/classes/sun/font/FcFontConfiguration.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -33,6 +33,7 @@
+ import java.net.InetAddress;
+ import java.net.UnknownHostException;
+ import java.nio.charset.Charset;
++import java.nio.charset.StandardCharsets;
+ import java.nio.file.Files;
+ import java.util.HashMap;
+ import java.util.HashSet;
+@@ -173,8 +174,16 @@
+ }
+
+ @Override
+- public FontDescriptor[] getFontDescriptors(String fontName, int style) {
+- return new FontDescriptor[0];
++ protected FontDescriptor[] buildFontDescriptors(int fontIndex, int styleIndex) {
++ CompositeFontDescriptor[] cfi = get2DCompositeFontInfo();
++ int idx = fontIndex * NUM_STYLES + styleIndex;
++ String[] componentFaceNames = cfi[idx].getComponentFaceNames();
++ FontDescriptor[] ret = new FontDescriptor[componentFaceNames.length];
++ for (int i = 0; i < componentFaceNames.length; i++) {
++ ret[i] = new FontDescriptor(componentFaceNames[i], StandardCharsets.UTF_8.newEncoder(), new int[0]);
++ }
++
++ return ret;
+ }
+
+ @Override
+@@ -250,10 +259,12 @@
+ }
+
+ String[] fileNames = new String[numFonts];
++ String[] faceNames = new String[numFonts];
+
+ int index;
+ for (index = 0; index < fcFonts.length; index++) {
+ fileNames[index] = fcFonts[index].fontFile;
++ faceNames[index] = fcFonts[index].familyName;
+ }
+
+ if (installedFallbackFontFiles != null) {
+@@ -266,7 +277,7 @@
+ = new CompositeFontDescriptor(
+ faceName,
+ 1,
+- null,
++ faceNames,
+ fileNames,
+ null, null);
+ }
+--- ./jdk/src/windows/bin/java_md.c Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/bin/java_md.c Wed Apr 16 12:37:49 2014 +0400
+@@ -1301,6 +1301,14 @@
+ /* save path length */
+ jrePathLen = JLI_StrLen(libraryPath);
+
++ if (jrePathLen + JLI_StrLen("\\bin\\verify.dll") >= MAXPATHLEN) {
++ /* jre path is too long, the library path will not fit there;
++ * report and abort preloading
++ */
++ JLI_ReportErrorMessage(JRE_ERROR11);
++ break;
++ }
++
+ /* load msvcrt 1st */
+ LoadMSVCRT();
+
+--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Wed Apr 16 12:37:49 2014 +0400
+@@ -583,11 +583,18 @@
+
+ // Needs to be accessible to Win32ShellFolderManager2
+ static String getFileSystemPath(final int csidl) throws IOException, InterruptedException {
+- return invoke(new Callable<String>() {
++ String path = invoke(new Callable<String>() {
+ public String call() throws IOException {
+ return getFileSystemPath0(csidl);
+ }
+ }, IOException.class);
++ if (path != null) {
++ SecurityManager security = System.getSecurityManager();
++ if (security != null) {
++ security.checkRead(path);
++ }
++ }
++ return path;
+ }
+
+ // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
+--- ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Wed Apr 16 12:37:49 2014 +0400
+@@ -138,6 +138,8 @@
+ if (desktop == null) {
+ try {
+ desktop = new Win32ShellFolder2(DESKTOP);
++ } catch (SecurityException e) {
++ // Ignore error
+ } catch (IOException e) {
+ // Ignore error
+ } catch (InterruptedException e) {
+@@ -151,6 +153,8 @@
+ if (drives == null) {
+ try {
+ drives = new Win32ShellFolder2(DRIVES);
++ } catch (SecurityException e) {
++ // Ignore error
+ } catch (IOException e) {
+ // Ignore error
+ } catch (InterruptedException e) {
+@@ -167,6 +171,8 @@
+ if (path != null) {
+ recent = createShellFolder(getDesktop(), new File(path));
+ }
++ } catch (SecurityException e) {
++ // Ignore error
+ } catch (InterruptedException e) {
+ // Ignore error
+ } catch (IOException e) {
+@@ -180,6 +186,8 @@
+ if (network == null) {
+ try {
+ network = new Win32ShellFolder2(NETWORK);
++ } catch (SecurityException e) {
++ // Ignore error
+ } catch (IOException e) {
+ // Ignore error
+ } catch (InterruptedException e) {
+@@ -203,6 +211,8 @@
+ personal.setIsPersonal();
+ }
+ }
++ } catch (SecurityException e) {
++ // Ignore error
+ } catch (InterruptedException e) {
+ // Ignore error
+ } catch (IOException e) {
+--- ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/awt/windows/ThemeReader.java Wed Apr 16 12:37:49 2014 +0400
+@@ -56,18 +56,12 @@
+ new ReentrantReadWriteLock();
+ private static final Lock readLock = readWriteLock.readLock();
+ private static final Lock writeLock = readWriteLock.writeLock();
++ private static volatile boolean valid = false;
+
+ static void flush() {
+- writeLock.lock();
+- try {
+- // Close old themes.
+- for (Long value : widgetToTheme.values()) {
+- closeTheme(value.longValue());
+- }
+- widgetToTheme.clear();
+- } finally {
+- writeLock.unlock();
+- }
++ // Could be called on Toolkit thread, so do not try to aquire locks
++ // to avoid deadlock with theme initialization
++ valid = false;
+ }
+
+ public native static boolean isThemed();
+@@ -94,6 +88,24 @@
+ // returns theme value
+ // this method should be invoked with readLock locked
+ private static Long getTheme(String widget) {
++ if (!valid) {
++ readLock.unlock();
++ writeLock.lock();
++ try {
++ if (!valid) {
++ // Close old themes.
++ for (Long value : widgetToTheme.values()) {
++ closeTheme(value);
++ }
++ widgetToTheme.clear();
++ valid = true;
++ }
++ } finally {
++ readLock.lock();
++ writeLock.unlock();
++ }
++ }
++
+ // mostly copied from the javadoc for ReentrantReadWriteLock
+ Long theme = widgetToTheme.get(widget);
+ if (theme == null) {
+--- ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/awt/windows/WToolkit.java Wed Apr 16 12:37:49 2014 +0400
+@@ -864,12 +864,18 @@
+ * Windows doesn't always send WM_SETTINGCHANGE when it should.
+ */
+ private void windowsSettingChange() {
+- EventQueue.invokeLater(new Runnable() {
+- @Override
+- public void run() {
+- updateProperties();
+- }
+- });
++ if (AppContext.getAppContext() == null) {
++ // We cannot post the update to any EventQueue. Listeners will
++ // be called on EDTs by DesktopPropertyChangeSupport
++ updateProperties();
++ } else {
++ EventQueue.invokeLater(new Runnable() {
++ @Override
++ public void run() {
++ updateProperties();
++ }
++ });
++ }
+ }
+
+ private synchronized void updateProperties() {
+--- ./jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/awt/windows/WWindowPeer.java Wed Apr 16 12:37:49 2014 +0400
+@@ -421,6 +421,7 @@
+ */
+ public static long[] getActiveWindowHandles() {
+ AppContext appContext = AppContext.getAppContext();
++ if (appContext == null) return null;
+ synchronized (appContext) {
+ List<WWindowPeer> l = (List<WWindowPeer>)appContext.get(ACTIVE_WINDOWS_KEY);
+ if (l == null) {
+--- ./jdk/src/windows/classes/sun/security/mscapi/RSACipher.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/classes/sun/security/mscapi/RSACipher.java Wed Apr 16 12:37:49 2014 +0400
+@@ -35,6 +35,8 @@
+ import javax.crypto.spec.*;
+
+ import sun.security.rsa.RSAKeyFactory;
++import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec;
++import sun.security.util.KeyUtil;
+
+ /**
+ * RSA cipher implementation using the Microsoft Crypto API.
+@@ -92,9 +94,16 @@
+
+ // the public key, if we were initialized using a public key
+ private sun.security.mscapi.Key publicKey;
++
+ // the private key, if we were initialized using a private key
+ private sun.security.mscapi.Key privateKey;
+
++ // cipher parameter for TLS RSA premaster secret
++ private AlgorithmParameterSpec spec = null;
++
++ // the source of randomness
++ private SecureRandom random;
++
+ public RSACipher() {
+ paddingType = PAD_PKCS1;
+ }
+@@ -155,8 +164,12 @@
+ throws InvalidKeyException, InvalidAlgorithmParameterException {
+
+ if (params != null) {
+- throw new InvalidAlgorithmParameterException
+- ("Parameters not supported");
++ if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new InvalidAlgorithmParameterException(
++ "Parameters not supported");
++ }
++ spec = params;
++ this.random = random; // for TLS RSA premaster secret
+ }
+ init(opmode, key);
+ }
+@@ -356,39 +369,47 @@
+ }
+
+ // see JCE spec
+- protected java.security.Key engineUnwrap(byte[] wrappedKey, String algorithm,
++ protected java.security.Key engineUnwrap(byte[] wrappedKey,
++ String algorithm,
+ int type) throws InvalidKeyException, NoSuchAlgorithmException {
+
+ if (wrappedKey.length > buffer.length) {
+ throw new InvalidKeyException("Key is too long for unwrapping");
+ }
++
++ boolean isTlsRsaPremasterSecret =
++ algorithm.equals("TlsRsaPremasterSecret");
++ Exception failover = null;
++ byte[] encoded = null;
++
+ update(wrappedKey, 0, wrappedKey.length);
+-
+ try {
+- byte[] encoding = doFinal();
+-
+- switch (type) {
+- case Cipher.PUBLIC_KEY:
+- return constructPublicKey(encoding, algorithm);
+-
+- case Cipher.PRIVATE_KEY:
+- return constructPrivateKey(encoding, algorithm);
+-
+- case Cipher.SECRET_KEY:
+- return constructSecretKey(encoding, algorithm);
+-
+- default:
+- throw new InvalidKeyException("Unknown key type " + type);
++ encoded = doFinal();
++ } catch (BadPaddingException e) {
++ if (isTlsRsaPremasterSecret) {
++ failover = e;
++ } else {
++ throw new InvalidKeyException("Unwrapping failed", e);
+ }
+-
+- } catch (BadPaddingException e) {
+- // should not occur
+- throw new InvalidKeyException("Unwrapping failed", e);
+-
+ } catch (IllegalBlockSizeException e) {
+ // should not occur, handled with length check above
+ throw new InvalidKeyException("Unwrapping failed", e);
+ }
++
++ if (isTlsRsaPremasterSecret) {
++ if (!(spec instanceof TlsRsaPremasterSecretParameterSpec)) {
++ throw new IllegalStateException(
++ "No TlsRsaPremasterSecretParameterSpec specified");
++ }
++
++ // polish the TLS premaster secret
++ encoded = KeyUtil.checkTlsPreMasterSecretKey(
++ ((TlsRsaPremasterSecretParameterSpec)spec).getClientVersion(),
++ ((TlsRsaPremasterSecretParameterSpec)spec).getServerVersion(),
++ random, encoded, (failover != null));
++ }
++
++ return constructKey(encoded, algorithm, type);
+ }
+
+ // see JCE spec
+@@ -452,6 +473,22 @@
+ return new SecretKeySpec(encodedKey, encodedKeyAlgorithm);
+ }
+
++ private static Key constructKey(byte[] encodedKey,
++ String encodedKeyAlgorithm,
++ int keyType) throws InvalidKeyException, NoSuchAlgorithmException {
++
++ switch (keyType) {
++ case Cipher.PUBLIC_KEY:
++ return constructPublicKey(encodedKey, encodedKeyAlgorithm);
++ case Cipher.PRIVATE_KEY:
++ return constructPrivateKey(encodedKey, encodedKeyAlgorithm);
++ case Cipher.SECRET_KEY:
++ return constructSecretKey(encodedKey, encodedKeyAlgorithm);
++ default:
++ throw new InvalidKeyException("Unknown key type " + keyType);
++ }
++ }
++
+ /*
+ * Encrypt/decrypt a data buffer using Microsoft Crypto API with HCRYPTKEY.
+ * It expects and returns ciphertext data in big-endian form.
+--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Apr 16 12:37:49 2014 +0400
+@@ -1719,9 +1719,11 @@
+ case WM_IME_SETCONTEXT:
+ // lParam is passed as pointer and it can be modified.
+ mr = WmImeSetContext(static_cast<BOOL>(wParam), &lParam);
++ CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
+ break;
+ case WM_IME_NOTIFY:
+ mr = WmImeNotify(wParam, lParam);
++ CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
+ break;
+ case WM_IME_STARTCOMPOSITION:
+ mr = WmImeStartComposition();
+@@ -4066,7 +4068,7 @@
+ {
+ if (mr != mrConsume) {
+ HWND proxy = GetProxyFocusOwner();
+- if (proxy != NULL) {
++ if (proxy != NULL && ::IsWindowEnabled(proxy)) {
+ retVal = ComCtl32Util::GetInstance().DefWindowProc(NULL, proxy, message, wParam, lParam);
+ mr = mrConsume;
+ }
+--- ./jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed May 07 19:26:47 2014 -0700
++++ ./jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed Apr 16 12:37:49 2014 +0400
+@@ -319,6 +319,8 @@
+ case WM_IME_STARTCOMPOSITION:
+ case WM_IME_ENDCOMPOSITION:
+ case WM_IME_COMPOSITION:
++ case WM_IME_SETCONTEXT:
++ case WM_IME_NOTIFY:
+ case WM_IME_CONTROL:
+ case WM_IME_COMPOSITIONFULL:
+ case WM_IME_SELECT:
+--- ./jdk/test/com/sun/crypto/provider/TLS/TestPremaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/com/sun/crypto/provider/TLS/TestPremaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -33,6 +33,7 @@
+
+ import javax.crypto.KeyGenerator;
+ import javax.crypto.SecretKey;
++import java.util.Formatter;
+
+ import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec;
+
+@@ -52,27 +53,51 @@
+ System.out.println("OK: " + e);
+ }
+
+- test(kg, 3, 0);
+- test(kg, 3, 1);
+- test(kg, 3, 2);
+- test(kg, 4, 0);
++ int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400};
++ for (int clientVersion : protocolVersions) {
++ for (int serverVersion : protocolVersions) {
++ test(kg, clientVersion, serverVersion);
++ if (serverVersion >= clientVersion) {
++ break;
++ }
++ }
++ }
+
+ System.out.println("Done.");
+ }
+
+- private static void test(KeyGenerator kg, int major, int minor)
+- throws Exception {
++ private static void test(KeyGenerator kg,
++ int clientVersion, int serverVersion) throws Exception {
+
+- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor));
++ System.out.printf(
++ "Testing RSA pre-master secret key generation between " +
++ "client (0x%04X) and server(0x%04X)%n",
++ clientVersion, serverVersion);
++ kg.init(new TlsRsaPremasterSecretParameterSpec(
++ clientVersion, serverVersion));
++
+ SecretKey key = kg.generateKey();
+ byte[] encoded = key.getEncoded();
+- if (encoded.length != 48) {
+- throw new Exception("length: " + encoded.length);
+- }
+- if ((encoded[0] != major) || (encoded[1] != minor)) {
+- throw new Exception("version mismatch: " + encoded[0] +
+- "." + encoded[1]);
+- }
+- System.out.println("OK: " + major + "." + minor);
++ if (encoded != null) { // raw key material may be not extractable
++ if (encoded.length != 48) {
++ throw new Exception("length: " + encoded.length);
++ }
++ int v = versionOf(encoded[0], encoded[1]);
++ if (clientVersion != v) {
++ if (serverVersion != v || clientVersion >= 0x0302) {
++ throw new Exception(String.format(
++ "version mismatch: (0x%04X) rather than (0x%04X) " +
++ "is used in pre-master secret", v, clientVersion));
++ }
++ System.out.printf("Use compatible version (0x%04X)%n", v);
++ }
++ System.out.println("Passed, version matches!");
++ } else {
++ System.out.println("Raw key material is not extractable");
++ }
++ }
++
++ private static int versionOf(int major, int minor) {
++ return ((major & 0xFF) << 8) | (minor & 0xFF);
+ }
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Focus/8013611/JDK8013611.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,111 @@
++/*
++ * 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 8013611
++ @summary Tests showing a modal dialog with requesting focus in frame.
++ @author Anton.Tarasov: area=awt.focus
++ @library ../../regtesthelpers
++ @build Util
++ @run main JDK8013611
++*/
++
++import java.awt.*;
++import java.awt.event.*;
++import javax.swing.*;
++import test.java.awt.regtesthelpers.Util;
++
++import java.awt.*;
++
++public class JDK8013611 extends JFrame {
++ static JTextField textField = new JTextField("text");
++ static JButton button1 = new JButton("button1");
++ static JButton button2 = new JButton("button2");
++ static Robot robot;
++
++ static JDialog dialog;
++ static JButton button3 = new JButton("button3");
++
++ public static void main(String[] args) {
++ robot = Util.createRobot();
++
++ JDK8013611 frame = new JDK8013611();
++ frame.setLayout(new FlowLayout());
++ frame.add(textField);
++ frame.add(button1);
++ frame.add(button2);
++ frame.pack();
++
++ dialog = new JDialog(frame, true);
++ dialog.add(button3);
++ dialog.pack();
++
++ textField.addFocusListener(new FocusAdapter() {
++ @Override
++ public void focusLost(FocusEvent e) {
++ dialog.setVisible(true);
++ }
++ });
++
++ button1.addFocusListener(new FocusAdapter() {
++ @Override
++ public void focusGained(FocusEvent e) {
++ button2.requestFocusInWindow();
++ }
++ });
++
++ frame.setVisible(true);
++
++ frame.test();
++ }
++
++ public void test() {
++ if (!testFocused(textField)) {
++ Util.clickOnComp(textField, robot);
++ if (!testFocused(textField)) {
++ throw new RuntimeException("Error: couldn't focus " + textField);
++ }
++ }
++
++ robot.keyPress(KeyEvent.VK_TAB);
++ robot.delay(50);
++ robot.keyRelease(KeyEvent.VK_TAB);
++
++ if (!testFocused(button3)) {
++ throw new RuntimeException("Test failed: dialog didn't get focus!");
++ }
++
++ System.out.println("Test passed.");
++ }
++
++ boolean testFocused(Component c) {
++ for (int i=0; i<10; i++) {
++ if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == c) {
++ return true;
++ }
++ Util.waitForIdle(robot);
++ }
++ return false;
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Focus/DialogTraversFocusBackTest/DialogTraversFocusBackTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,94 @@
++/*
++ * 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 8031075
++ @summary Regression: focus disappears with shift+tab on dialogue having a focus component
++ @author mcherkas
++ @run main DialogTraversFocusBackTest
++*/
++
++import sun.awt.SunToolkit;
++
++import javax.swing.*;
++import java.awt.*;
++import java.awt.event.KeyEvent;
++
++public class DialogTraversFocusBackTest {
++
++ private static Robot robot;
++ private volatile static JButton button;
++ private static Component currentFocusOwner;
++
++ public static void main(String[] args) throws Exception {
++ initUI();
++ sync();
++ initRobot();
++ runScript();
++ sync();
++ validate();
++ }
++
++ public static void sync() {
++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
++ toolkit.realSync();
++ }
++
++ private static void validate() throws Exception {
++ currentFocusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
++ if(currentFocusOwner
++ != button) {
++ throw new Exception("Test failed! Wrong focus owner: " +
++ String.valueOf(currentFocusOwner) + "\n but must be: " +
++ button);
++ }
++ }
++
++ private static void runScript() {
++ robot.keyPress(KeyEvent.VK_SHIFT);
++ robot.keyPress(KeyEvent.VK_TAB);
++ robot.keyRelease(KeyEvent.VK_TAB);
++ robot.keyRelease(KeyEvent.VK_SHIFT);
++
++ }
++
++ private static void initRobot() throws AWTException {
++ robot = new Robot();
++ robot.setAutoDelay(100);
++
++ }
++
++ private static void initUI() throws Exception {
++ SwingUtilities.invokeAndWait( new Runnable() {
++ @Override
++ public void run() {
++ JDialog dialog = new JDialog((Frame)null, "Test Dialog");
++ button = new JButton("Button 1");
++ dialog.add(button);
++ dialog.pack();
++ dialog.setVisible(true);
++ }
++ });
++
++ }
++}
+--- ./jdk/test/java/awt/Frame/7024749/bug7024749.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/awt/Frame/7024749/bug7024749.java Wed Apr 16 12:37:49 2014 +0400
+@@ -23,7 +23,7 @@
+
+ /*
+ * @test
+- * @bug 7024749 7184326
++ * @bug 7024749 7184326 8019990
+ * @summary JDK7 b131---a crash in: Java_sun_awt_windows_ThemeReader_isGetThemeTransitionDurationDefined+0x75
+ * @library ../../regtesthelpers
+ * @build Util
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Mouse/EnterExitEvents/DragWindowTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,219 @@
++/*
++ * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
++ * 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 7154048
++ * @summary Window created under a mouse does not receive mouse enter event.
++ * Mouse Entered/Exited events are wrongly generated during dragging the window
++ * from one component to another
++ * @library ../../regtesthelpers
++ * @build Util
++ * @author alexandr.scherbatiy area=awt.event
++ * @run main DragWindowTest
++ */
++
++import java.awt.*;
++import java.awt.event.*;
++import javax.swing.*;
++
++import java.util.concurrent.*;
++import sun.awt.SunToolkit;
++
++import test.java.awt.regtesthelpers.Util;
++
++public class DragWindowTest {
++
++ private static volatile int dragWindowMouseEnteredCount = 0;
++ private static volatile int dragWindowMouseReleasedCount = 0;
++ private static volatile int buttonMouseEnteredCount = 0;
++ private static volatile int labelMouseReleasedCount = 0;
++ private static MyDragWindow dragWindow;
++ private static JLabel label;
++ private static JButton button;
++
++ public static void main(String[] args) throws Exception {
++
++ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
++ Robot robot = new Robot();
++ robot.setAutoDelay(50);
++
++ SwingUtilities.invokeAndWait(new Runnable() {
++
++ @Override
++ public void run() {
++ createAndShowGUI();
++ }
++ });
++
++ toolkit.realSync();
++
++ Point pointToClick = Util.invokeOnEDT(new Callable<Point>() {
++
++ @Override
++ public Point call() throws Exception {
++ return getCenterPoint(label);
++ }
++ });
++
++
++ robot.mouseMove(pointToClick.x, pointToClick.y);
++ robot.mousePress(InputEvent.BUTTON1_MASK);
++ toolkit.realSync();
++
++ if (dragWindowMouseEnteredCount != 1) {
++ throw new RuntimeException("No MouseEntered event on Drag Window!");
++ }
++
++ Point pointToDrag = Util.invokeOnEDT(new Callable<Point>() {
++
++ @Override
++ public Point call() throws Exception {
++ button.addMouseListener(new ButtonMouseListener());
++ return getCenterPoint(button);
++ }
++ });
++
++ robot.mouseMove(pointToDrag.x, pointToDrag.y);
++ toolkit.realSync();
++
++ if (buttonMouseEnteredCount != 0) {
++ throw new RuntimeException("Extra MouseEntered event on button!");
++ }
++
++ robot.mouseRelease(InputEvent.BUTTON1_MASK);
++ toolkit.realSync();
++
++ if (labelMouseReleasedCount != 1) {
++ throw new RuntimeException("No MouseReleased event on label!");
++ }
++
++ }
++
++ private static Point getCenterPoint(Component comp) {
++ Point p = comp.getLocationOnScreen();
++ Rectangle rect = comp.getBounds();
++ return new Point(p.x + rect.width / 2, p.y + rect.height / 2);
++ }
++
++ private static void createAndShowGUI() {
++
++ JFrame frame = new JFrame("Main Frame");
++ frame.setSize(300, 200);
++ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
++
++ label = new JLabel("Label");
++
++ LabelMouseListener listener = new LabelMouseListener(frame);
++ label.addMouseListener(listener);
++ label.addMouseMotionListener(listener);
++
++ button = new JButton("Button");
++ Panel panel = new Panel(new BorderLayout());
++
++ panel.add(label, BorderLayout.NORTH);
++ panel.add(button, BorderLayout.CENTER);
++
++ frame.getContentPane().add(panel);
++ frame.setVisible(true);
++
++ }
++
++ private static Point getAbsoluteLocation(MouseEvent e) {
++ return new Point(e.getXOnScreen(), e.getYOnScreen());
++ }
++
++ static class MyDragWindow extends Window {
++
++ static int d = 30;
++
++ public MyDragWindow(Window parent, Point location) {
++ super(parent);
++ setSize(150, 150);
++ setVisible(true);
++ JPanel panel = new JPanel();
++ add(panel);
++ setLocation(location.x - d, location.y - d);
++ addMouseListener(new DragWindowMouseListener());
++ }
++
++ void dragTo(Point point) {
++ setLocation(point.x - d, point.y - d);
++ }
++ }
++
++ static class LabelMouseListener extends MouseAdapter {
++
++ Point origin;
++ Window parent;
++
++ public LabelMouseListener(Window parent) {
++ this.parent = parent;
++ }
++
++ @Override
++ public void mousePressed(MouseEvent e) {
++ if (dragWindow == null) {
++ dragWindow = new MyDragWindow(parent, getAbsoluteLocation(e));
++ } else {
++ dragWindow.setVisible(true);
++ dragWindow.dragTo(getAbsoluteLocation(e));
++ }
++ }
++
++ @Override
++ public void mouseReleased(MouseEvent e) {
++ labelMouseReleasedCount++;
++ if (dragWindow != null) {
++ dragWindow.setVisible(false);
++ }
++ }
++
++ public void mouseDragged(MouseEvent e) {
++ if (dragWindow != null) {
++ dragWindow.dragTo(getAbsoluteLocation(e));
++ }
++ }
++ }
++
++ static class DragWindowMouseListener extends MouseAdapter {
++
++ @Override
++ public void mouseEntered(MouseEvent e) {
++ dragWindowMouseEnteredCount++;
++ }
++
++ @Override
++ public void mouseReleased(MouseEvent e) {
++ dragWindowMouseReleasedCount++;
++ }
++ }
++
++ static class ButtonMouseListener extends MouseAdapter {
++
++ @Override
++ public void mouseEntered(MouseEvent e) {
++ buttonMouseEnteredCount++;
++ }
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Mouse/GetMousePositionTest/GetMousePositionWithOverlay.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,108 @@
++/*
++ * 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 test.java.awt.regtesthelpers.Util;
++
++import javax.swing.*;
++import java.awt.*;
++import java.util.concurrent.atomic.AtomicReference;
++
++/**
++ * @test
++ * @bug 8012026
++ * @summary Component.getMousePosition() does not work in an applet on MacOS
++ * @author Petr Pchelko
++ * @library ../../regtesthelpers
++ * @build Util
++ * @compile GetMousePositionWithOverlay.java
++ * @run main/othervm GetMousePositionWithOverlay
++ */
++
++public class GetMousePositionWithOverlay {
++
++ static Frame backFrame;
++ static Frame frontFrame;
++
++ public static void main(String[] args) throws Throwable {
++ try {
++ SwingUtilities.invokeAndWait(new Runnable() {
++ @Override
++ public void run() {
++ constructTestUI();
++ }
++ });
++ Util.waitForIdle(null);
++
++ Robot r = new Robot();
++ Util.pointOnComp(frontFrame, r);
++ Util.waitForIdle(null);
++
++ Point pos = getMousePosition(backFrame);
++ if (pos != null) {
++ throw new RuntimeException("Test failed. Mouse position should be null but was" + pos);
++ }
++
++ pos = getMousePosition(frontFrame);
++ if (pos == null) {
++ throw new RuntimeException("Test failed. Mouse position should not be null");
++ }
++
++ r.mouseMove(189, 189);
++ Util.waitForIdle(null);
++
++ pos = getMousePosition(backFrame);
++ if (pos == null) {
++ throw new RuntimeException("Test failed. Mouse position should not be null");
++ }
++ } finally {
++ SwingUtilities.invokeLater(new Runnable() {
++ @Override
++ public void run() {
++ backFrame.dispose();
++ frontFrame.dispose();
++ }
++ });
++ }
++ }
++
++ private static Point getMousePosition(final Component component) throws Exception {
++ final AtomicReference<Point> pos = new AtomicReference<Point>();
++ SwingUtilities.invokeAndWait(new Runnable() {
++ @Override
++ public void run() {
++ pos.set(component.getMousePosition());
++ }
++ });
++ return pos.get();
++ }
++
++ private static void constructTestUI() {
++ backFrame = new Frame();
++ backFrame.setBounds(100, 100, 100, 100);
++ backFrame.setVisible(true);
++
++ frontFrame = new Frame();
++ frontFrame.setBounds(120, 120, 60, 60);
++ frontFrame.setVisible(true);
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/awt/Mouse/GetMousePositionTest/GetMousePositionWithPopup.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,111 @@
++/*
++ * 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 test.java.awt.regtesthelpers.Util;
++
++import javax.swing.*;
++import java.awt.*;
++import java.awt.event.MouseEvent;
++import java.awt.event.MouseMotionAdapter;
++
++/**
++ * @test
++ * @bug 8012026
++ * @summary Component.getMousePosition() does not work in an applet on MacOS
++ * @author Petr Pchelko
++ * @library ../../regtesthelpers
++ * @build Util
++ * @compile GetMousePositionWithPopup.java
++ * @run main/othervm GetMousePositionWithPopup
++ */
++
++public class GetMousePositionWithPopup {
++
++ private static Frame frame1;
++ private static Frame frame2;
++
++ public static void main(String[] args) throws Exception {
++ try {
++ Robot r = Util.createRobot();
++ r.mouseMove(0, 0);
++ Util.waitForIdle(null);
++
++ SwingUtilities.invokeAndWait(new Runnable() {
++ @Override
++ public void run() {
++ constructTestUI();
++ }
++ });
++
++ Util.waitForIdle(null);
++ r.mouseMove(149, 149);
++ Util.waitForIdle(null);
++ r.mouseMove(150, 150);
++ Util.waitForIdle(null);
++
++ } finally {
++ SwingUtilities.invokeLater(new Runnable() {
++ @Override
++ public void run() {
++ frame1.dispose();
++ frame2.dispose();
++ }
++ });
++ }
++ }
++
++ private static void constructTestUI() {
++ frame1 = new Frame();
++ frame1.setBounds(100, 100, 100, 100);
++ frame1.addMouseMotionListener(new MouseMotionAdapter() {
++
++ private boolean shown = false;
++
++ @Override
++ public void mouseMoved(MouseEvent e) {
++ if (shown) {
++ return;
++ }
++
++ shown = true;
++
++ frame2 = new Frame();
++ frame2.setBounds(120, 120, 120, 120);
++ frame2.setVisible(true);
++
++ Point positionInFrame2 = frame2.getMousePosition();
++ if (positionInFrame2.x != 30 || positionInFrame2.y != 30) {
++ throw new RuntimeException("Wrong position reported. Should be [30, 30] but was [" +
++ positionInFrame2.x + ", " + positionInFrame2.y + "]");
++ }
++
++ Point positionInFrame1 = frame1.getMousePosition();
++ if (positionInFrame1 != null) {
++ throw new RuntimeException("Wrong position reported. Should be null");
++ }
++
++ }
++ });
++ frame1.setVisible(true);
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/io/Serializable/unresolvableObjectStreamClass/UnresolvableObjectStreamClass.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,68 @@
++/*
++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
++ * or visit www.oracle.com if you need additional information or have any
++ * questions.
++ */
++
++/* @test
++ * @bug 8039396
++ * @run main UnresolvableObjectStreamClass serialize
++ * @clean MySerializable
++ * @run main UnresolvableObjectStreamClass deserialize
++ *
++ * @summary NPE when writing a class descriptor object to a custom
++ * ObjectOutputStream
++ */
++
++import java.io.*;
++
++public class UnresolvableObjectStreamClass {
++ public static void main(String[] args) throws Throwable {
++ if (args.length > 0 && args[0].equals("serialize")) {
++ try (FileOutputStream fos = new FileOutputStream("temp1.ser");
++ ObjectOutputStream oos = new ObjectOutputStream(fos)) {
++ ObjectStreamClass osc =
++ ObjectStreamClass.lookup(MySerializable.class);
++ oos.writeObject(osc);
++ }
++ } else if (args.length > 0 && args[0].equals("deserialize")) {
++ try (FileInputStream fis = new FileInputStream("temp1.ser");
++ ObjectInputStream ois = new ObjectInputStream(fis);
++ FileOutputStream fos = new FileOutputStream("temp2.ser");
++ ObjectOutputStream oos = new ObjectOutputStream(fos) {
++ /*must be subclassed*/}) {
++ ObjectStreamClass osc = (ObjectStreamClass)ois.readObject();
++ // serialize it again
++ try {
++ oos.writeObject(osc);
++ } catch (NullPointerException e) {
++ throw new RuntimeException("Failed to write" +
++ " unresolvable ObjectStreamClass", e);
++ }
++ }
++ } else {
++ throw new RuntimeException("The command line option must be" +
++ " one of: serialize or deserialize");
++ }
++ }
++}
++
++class MySerializable implements Serializable {
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/annotation/AnnotationType/AnnotationTypeDeadlockTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,101 @@
++/*
++ * 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 7122142
++ * @summary Test deadlock situation when recursive annotations are parsed
++ */
++
++import java.lang.annotation.Retention;
++import java.lang.management.ManagementFactory;
++import java.lang.management.ThreadInfo;
++import java.lang.management.ThreadMXBean;
++import java.util.concurrent.CountDownLatch;
++import java.util.concurrent.atomic.AtomicInteger;
++
++import static java.lang.annotation.RetentionPolicy.RUNTIME;
++
++public class AnnotationTypeDeadlockTest {
++
++ @Retention(RUNTIME)
++ @AnnB
++ public @interface AnnA {
++ }
++
++ @Retention(RUNTIME)
++ @AnnA
++ public @interface AnnB {
++ }
++
++ static class Task extends Thread {
++ final CountDownLatch prepareLatch;
++ final AtomicInteger goLatch;
++ final Class<?> clazz;
++
++ Task(CountDownLatch prepareLatch, AtomicInteger goLatch, Class<?> clazz) {
++ super(clazz.getSimpleName());
++ setDaemon(true); // in case it deadlocks
++ this.prepareLatch = prepareLatch;
++ this.goLatch = goLatch;
++ this.clazz = clazz;
++ }
++
++ @Override
++ public void run() {
++ prepareLatch.countDown(); // notify we are prepared
++ while (goLatch.get() > 0); // spin-wait before go
++ clazz.getDeclaredAnnotations();
++ }
++ }
++
++ public static void main(String[] args) throws Exception {
++ CountDownLatch prepareLatch = new CountDownLatch(2);
++ AtomicInteger goLatch = new AtomicInteger(1);
++ Task taskA = new Task(prepareLatch, goLatch, AnnA.class);
++ Task taskB = new Task(prepareLatch, goLatch, AnnB.class);
++ taskA.start();
++ taskB.start();
++ // wait until both threads start-up
++ prepareLatch.await();
++ // let them go
++ goLatch.set(0);
++ // obtain ThreadMXBean
++ ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
++ // wait for threads to finish or dead-lock
++ while (taskA.isAlive() || taskB.isAlive()) {
++ // attempt to join threads
++ taskA.join(500L);
++ taskB.join(500L);
++ // detect dead-lock
++ long[] deadlockedIds = threadBean.findMonitorDeadlockedThreads();
++ if (deadlockedIds != null && deadlockedIds.length > 0) {
++ StringBuilder sb = new StringBuilder("deadlock detected:\n\n");
++ for (ThreadInfo ti : threadBean.getThreadInfo(deadlockedIds, Integer.MAX_VALUE)) {
++ sb.append(ti);
++ }
++ throw new IllegalStateException(sb.toString());
++ }
++ }
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/annotation/AnnotationType/AnnotationTypeRuntimeAssumptionTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,187 @@
++/*
++ * 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
++ * 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 7122142
++ * @summary Test consistent parsing of ex-RUNTIME annotations that
++ * were changed and separately compiled to have CLASS retention
++ */
++
++import sun.misc.IOUtils;
++
++import java.io.IOException;
++import java.io.InputStream;
++import java.lang.annotation.Annotation;
++import java.lang.annotation.Retention;
++import java.lang.annotation.RetentionPolicy;
++
++import static java.lang.annotation.RetentionPolicy.CLASS;
++import static java.lang.annotation.RetentionPolicy.RUNTIME;
++
++/**
++ * This test simulates a situation where there are two mutually recursive
++ * {@link RetentionPolicy#RUNTIME RUNTIME} annotations {@link AnnA_v1 AnnA_v1}
++ * and {@link AnnB AnnB} and then the first is changed to have
++ * {@link RetentionPolicy#CLASS CLASS} retention and separately compiled.
++ * When {@link AnnA_v1 AnnA_v1} annotation is looked-up on {@link AnnB AnnB}
++ * it still appears to have {@link RetentionPolicy#RUNTIME RUNTIME} retention.
++ */
++public class AnnotationTypeRuntimeAssumptionTest {
++
++ @Retention(RUNTIME)
++ @AnnB
++ public @interface AnnA_v1 {
++ }
++
++ // An alternative version of AnnA_v1 with CLASS retention instead.
++ // Used to simulate separate compilation (see AltClassLoader below).
++ @Retention(CLASS)
++ @AnnB
++ public @interface AnnA_v2 {
++ }
++
++ @Retention(RUNTIME)
++ @AnnA_v1
++ public @interface AnnB {
++ }
++
++ @AnnA_v1
++ public static class TestTask implements Runnable {
++ @Override
++ public void run() {
++ AnnA_v1 ann1 = getDeclaredAnnotation(TestTask.class, AnnA_v1.class);
++ if (ann1 != null) {
++ throw new IllegalStateException(
++ "@" + ann1.annotationType().getSimpleName() +
++ " found on: " + TestTask.class.getName() +
++ " should not be visible at runtime");
++ }
++ AnnA_v1 ann2 = getDeclaredAnnotation(AnnB.class, AnnA_v1.class);
++ if (ann2 != null) {
++ throw new IllegalStateException(
++ "@" + ann2.annotationType().getSimpleName() +
++ " found on: " + AnnB.class.getName() +
++ " should not be visible at runtime");
++ }
++ }
++
++ private static <A extends Annotation> A getDeclaredAnnotation(Class<?> clazz, Class<A> annotationClass) {
++ for (Annotation ann : clazz.getDeclaredAnnotations()) {
++ if (ann.annotationType() == annotationClass) {
++ return annotationClass.cast(ann);
++ }
++ }
++ return null;
++ }
++ }
++
++ public static void main(String[] args) throws Exception {
++ ClassLoader altLoader = new AltClassLoader(
++ AnnotationTypeRuntimeAssumptionTest.class.getClassLoader());
++
++ Runnable altTask = (Runnable) Class.forName(
++ TestTask.class.getName(),
++ true,
++ altLoader).newInstance();
++
++ altTask.run();
++ }
++
++ /**
++ * A ClassLoader implementation that loads alternative implementations of
++ * classes. If class name ends with "_v1" it locates instead a class with
++ * name ending with "_v2" and loads that class instead.
++ */
++ static class AltClassLoader extends ClassLoader {
++ AltClassLoader(ClassLoader parent) {
++ super(parent);
++ }
++
++ @Override
++ protected Class<?> loadClass(String name, boolean resolve)
++ throws ClassNotFoundException {
++ if (name.indexOf('.') < 0) { // root package is our class
++ synchronized (getClassLoadingLock(name)) {
++ // First, check if the class has already been loaded
++ Class<?> c = findLoadedClass(name);
++ if (c == null) {
++ c = findClass(name);
++ }
++ if (resolve) {
++ resolveClass(c);
++ }
++ return c;
++ }
++ }
++ else { // not our class
++ return super.loadClass(name, resolve);
++ }
++ }
++
++ @Override
++ protected Class<?> findClass(String name)
++ throws ClassNotFoundException {
++ // special class name -> replace it with alternative name
++ if (name.endsWith("_v1")) {
++ String altName = name.substring(0, name.length() - 3) + "_v2";
++ String altPath = altName.replace('.', '/').concat(".class");
++ try (InputStream is = getResourceAsStream(altPath)) {
++ if (is != null) {
++ byte[] bytes = IOUtils.readFully(is, -1, true);
++ // patch class bytes to contain original name
++ for (int i = 0; i < bytes.length - 2; i++) {
++ if (bytes[i] == '_' &&
++ bytes[i + 1] == 'v' &&
++ bytes[i + 2] == '2') {
++ bytes[i + 2] = '1';
++ }
++ }
++ return defineClass(name, bytes, 0, bytes.length);
++ }
++ else {
++ throw new ClassNotFoundException(name);
++ }
++ }
++ catch (IOException e) {
++ throw new ClassNotFoundException(name, e);
++ }
++ }
++ else { // not special class name -> just load the class
++ String path = name.replace('.', '/').concat(".class");
++ try (InputStream is = getResourceAsStream(path)) {
++ if (is != null) {
++ byte[] bytes = IOUtils.readFully(is, -1, true);
++ return defineClass(name, bytes, 0, bytes.length);
++ }
++ else {
++ throw new ClassNotFoundException(name);
++ }
++ }
++ catch (IOException e) {
++ throw new ClassNotFoundException(name, e);
++ }
++ }
++ }
++ }
++}
+--- ./jdk/test/java/lang/invoke/JavaDocExamplesTest.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/lang/invoke/JavaDocExamplesTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -64,7 +64,11 @@
+ new JavaDocExamplesTest().run();
+ }
+ public void run() throws Throwable {
++ testMisc();
++ testFindStatic();
++ testFindConstructor();
+ testFindVirtual();
++ testFindSpecial();
+ testPermuteArguments();
+ testDropArguments();
+ testFilterArguments();
+@@ -110,7 +114,8 @@
+
+ {}
+
+- @Test public void testFindVirtual() throws Throwable {
++ @Test public void testMisc() throws Throwable {
++// Extra tests, not from javadoc:
+ {}
+ MethodHandle CONCAT_3 = LOOKUP.findVirtual(String.class,
+ "concat", methodType(String.class, String.class));
+@@ -125,6 +130,92 @@
+ {}
+ }
+
++ @Test public void testFindStatic() throws Throwable {
++{}
++MethodHandle MH_asList = publicLookup().findStatic(Arrays.class,
++ "asList", methodType(List.class, Object[].class));
++assertEquals("[x, y]", MH_asList.invoke("x", "y").toString());
++{}
++ }
++
++ @Test public void testFindVirtual() throws Throwable {
++{}
++MethodHandle MH_concat = publicLookup().findVirtual(String.class,
++ "concat", methodType(String.class, String.class));
++MethodHandle MH_hashCode = publicLookup().findVirtual(Object.class,
++ "hashCode", methodType(int.class));
++MethodHandle MH_hashCode_String = publicLookup().findVirtual(String.class,
++ "hashCode", methodType(int.class));
++assertEquals("xy", (String) MH_concat.invokeExact("x", "y"));
++assertEquals("xy".hashCode(), (int) MH_hashCode.invokeExact((Object)"xy"));
++assertEquals("xy".hashCode(), (int) MH_hashCode_String.invokeExact("xy"));
++// interface method:
++MethodHandle MH_subSequence = publicLookup().findVirtual(CharSequence.class,
++ "subSequence", methodType(CharSequence.class, int.class, int.class));
++assertEquals("def", MH_subSequence.invoke("abcdefghi", 3, 6).toString());
++// constructor "internal method" must be accessed differently:
++MethodType MT_newString = methodType(void.class); //()V for new String()
++try { assertEquals("impossible", lookup()
++ .findVirtual(String.class, "<init>", MT_newString));
++ } catch (NoSuchMethodException ex) { } // OK
++MethodHandle MH_newString = publicLookup()
++ .findConstructor(String.class, MT_newString);
++assertEquals("", (String) MH_newString.invokeExact());
++{}
++ }
++
++ @Test public void testFindConstructor() throws Throwable {
++{}
++MethodHandle MH_newArrayList = publicLookup().findConstructor(
++ ArrayList.class, methodType(void.class, Collection.class));
++Collection orig = Arrays.asList("x", "y");
++Collection copy = (ArrayList) MH_newArrayList.invokeExact(orig);
++assert(orig != copy);
++assertEquals(orig, copy);
++// a variable-arity constructor:
++MethodHandle MH_newProcessBuilder = publicLookup().findConstructor(
++ ProcessBuilder.class, methodType(void.class, String[].class));
++ProcessBuilder pb = (ProcessBuilder)
++ MH_newProcessBuilder.invoke("x", "y", "z");
++assertEquals("[x, y, z]", pb.command().toString());
++{}
++ }
++
++// for testFindSpecial
++{}
++static class Listie extends ArrayList {
++ public String toString() { return "[wee Listie]"; }
++ static Lookup lookup() { return MethodHandles.lookup(); }
++}
++{}
++
++ @Test public void testFindSpecial() throws Throwable {
++{}
++// no access to constructor via invokeSpecial:
++MethodHandle MH_newListie = Listie.lookup()
++ .findConstructor(Listie.class, methodType(void.class));
++Listie l = (Listie) MH_newListie.invokeExact();
++try { assertEquals("impossible", Listie.lookup().findSpecial(
++ Listie.class, "<init>", methodType(void.class), Listie.class));
++ } catch (NoSuchMethodException ex) { } // OK
++// access to super and self methods via invokeSpecial:
++MethodHandle MH_super = Listie.lookup().findSpecial(
++ ArrayList.class, "toString" , methodType(String.class), Listie.class);
++MethodHandle MH_this = Listie.lookup().findSpecial(
++ Listie.class, "toString" , methodType(String.class), Listie.class);
++MethodHandle MH_duper = Listie.lookup().findSpecial(
++ Object.class, "toString" , methodType(String.class), Listie.class);
++assertEquals("[]", (String) MH_super.invokeExact(l));
++assertEquals(""+l, (String) MH_this.invokeExact(l));
++assertEquals("[]", (String) MH_duper.invokeExact(l)); // ArrayList method
++try { assertEquals("inaccessible", Listie.lookup().findSpecial(
++ String.class, "toString", methodType(String.class), Listie.class));
++ } catch (IllegalAccessException ex) { } // OK
++Listie subl = new Listie() { public String toString() { return "[subclass]"; } };
++assertEquals(""+l, (String) MH_this.invokeExact(subl)); // Listie method
++{}
++ }
++
+ @Test public void testPermuteArguments() throws Throwable {
+ {{
+ {} /// JAVADOC
+@@ -275,6 +366,12 @@
+ MethodHandle eq2 = equals.asSpreader(Object[].class, 2);
+ assert( (boolean) eq2.invokeExact(new Object[]{ "me", "me" }));
+ assert(!(boolean) eq2.invokeExact(new Object[]{ "me", "thee" }));
++// try to spread from anything but a 2-array:
++for (int n = 0; n <= 10; n++) {
++ Object[] badArityArgs = (n == 2 ? null : new Object[n]);
++ try { assert((boolean) eq2.invokeExact(badArityArgs) && false); }
++ catch (IllegalArgumentException ex) { } // OK
++}
+ // spread both arguments from a String array:
+ MethodHandle eq2s = equals.asSpreader(String[].class, 2);
+ assert( (boolean) eq2s.invokeExact(new String[]{ "me", "me" }));
+--- ./jdk/test/java/lang/invoke/MethodHandlesTest.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/lang/invoke/MethodHandlesTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -363,6 +363,7 @@
+ protected Example(String name) { this.name = name; }
+ @SuppressWarnings("LeakingThisInConstructor")
+ protected Example(int x) { this(); called("protected <init>", this, x); }
++ //Example(Void x) { does not exist; lookup elicts NoSuchMethodException }
+ @Override public String toString() { return name; }
+
+ public void v0() { called("v0", this); }
+@@ -463,6 +464,9 @@
+ return lookup.in(defc);
+ }
+
++ /** Is findVirtual (etc.) of "<init>" supposed to elicit a NoSuchMethodException? */
++ final static boolean INIT_REF_CAUSES_NSME = true;
++
+ @Test
+ public void testFindStatic() throws Throwable {
+ if (CAN_SKIP_WORKING) return;
+@@ -483,6 +487,8 @@
+ testFindStatic(Example.class, Object.class, "s7", float.class, double.class);
+
+ testFindStatic(false, PRIVATE, Example.class, void.class, "bogus");
++ testFindStatic(false, PRIVATE, Example.class, void.class, "<init>", int.class);
++ testFindStatic(false, PRIVATE, Example.class, void.class, "<init>", Void.class);
+ testFindStatic(false, PRIVATE, Example.class, void.class, "v0");
+ }
+
+@@ -505,11 +511,12 @@
+ target = maybeMoveIn(lookup, defc).findStatic(defc, methodName, type);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
++ assertExceptionClass(
++ (name.contains("bogus") || INIT_REF_CAUSES_NSME && name.contains("<init>"))
++ ? NoSuchMethodException.class
++ : IllegalAccessException.class,
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (name.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchMethodException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("findStatic "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target
+@@ -527,6 +534,13 @@
+ System.out.print(':');
+ }
+
++ static void assertExceptionClass(Class<? extends Throwable> expected,
++ Throwable actual) {
++ if (expected.isInstance(actual)) return;
++ actual.printStackTrace();
++ assertEquals(expected, actual.getClass());
++ }
++
+ static final boolean DEBUG_METHOD_HANDLE_NAMES = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES");
+
+ // rough check of name string
+@@ -556,6 +570,8 @@
+ testFindVirtual(PubExample.class, void.class, "Pub/pro_v0");
+
+ testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "bogus");
++ testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", int.class);
++ testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "<init>", Void.class);
+ testFindVirtual(false, PRIVATE, Example.class, Example.class, void.class, "s0");
+
+ // test dispatch
+@@ -591,11 +607,12 @@
+ target = maybeMoveIn(lookup, defc).findVirtual(defc, methodName, type);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
++ assertExceptionClass(
++ (name.contains("bogus") || INIT_REF_CAUSES_NSME && name.contains("<init>"))
++ ? NoSuchMethodException.class
++ : IllegalAccessException.class,
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (name.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchMethodException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("findVirtual "+lookup+": "+defc.getName()+"."+name+"/"+type+" => "+target
+@@ -632,11 +649,11 @@
+ testFindSpecial(SubExample.class, Example.class, void.class, "pkg_v0");
+ testFindSpecial(RemoteExample.class, PubExample.class, void.class, "Pub/pro_v0");
+ // Do some negative testing:
+- testFindSpecial(false, EXAMPLE, SubExample.class, Example.class, void.class, "bogus");
+- testFindSpecial(false, PRIVATE, SubExample.class, Example.class, void.class, "bogus");
+ for (Lookup lookup : new Lookup[]{ PRIVATE, EXAMPLE, PACKAGE, PUBLIC }) {
+ testFindSpecial(false, lookup, Object.class, Example.class, void.class, "v0");
++ testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "bogus");
+ testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "<init>", int.class);
++ testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "<init>", Void.class);
+ testFindSpecial(false, lookup, SubExample.class, Example.class, void.class, "s0");
+ }
+ }
+@@ -662,19 +679,25 @@
+ countTest(positive);
+ String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo
+ MethodType type = MethodType.methodType(ret, params);
++ Lookup specialLookup = maybeMoveIn(lookup, specialCaller);
++ boolean specialAccessOK = (specialLookup.lookupClass() == specialCaller &&
++ (specialLookup.lookupModes() & Lookup.PRIVATE) != 0);
+ MethodHandle target = null;
+ Exception noAccess = null;
+ try {
+ if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type);
+- if (verbosity >= 5) System.out.println(" lookup => "+maybeMoveIn(lookup, specialCaller));
+- target = maybeMoveIn(lookup, specialCaller).findSpecial(defc, methodName, type, specialCaller);
++ if (verbosity >= 5) System.out.println(" lookup => "+specialLookup);
++ target = specialLookup.findSpecial(defc, methodName, type, specialCaller);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
++ assertExceptionClass(
++ (!specialAccessOK) // this check should happen first
++ ? IllegalAccessException.class
++ : (name.contains("bogus") || INIT_REF_CAUSES_NSME && name.contains("<init>"))
++ ? NoSuchMethodException.class
++ : IllegalAccessException.class,
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (name.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchMethodException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("findSpecial from "+specialCaller.getName()+" to "+defc.getName()+"."+name+"/"+type+" => "+target
+@@ -719,7 +742,7 @@
+ target = lookup.findConstructor(defc, type);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
+- assertTrue(noAccess instanceof IllegalAccessException);
++ assertTrue(noAccess.getClass().getName(), noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("findConstructor "+defc.getName()+".<init>/"+type+" => "+target
+@@ -750,6 +773,8 @@
+ testBind(Example.class, Object.class, "v2", int.class, Object.class);
+ testBind(Example.class, Object.class, "v2", int.class, int.class);
+ testBind(false, PRIVATE, Example.class, void.class, "bogus");
++ testBind(false, PRIVATE, Example.class, void.class, "<init>", int.class);
++ testBind(false, PRIVATE, Example.class, void.class, "<init>", Void.class);
+ testBind(SubExample.class, void.class, "Sub/v0");
+ testBind(SubExample.class, void.class, "Sub/pkg_v0");
+ testBind(IntExample.Impl.class, void.class, "Int/v0");
+@@ -773,11 +798,12 @@
+ target = maybeMoveIn(lookup, defc).bind(receiver, methodName, type);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
++ assertExceptionClass(
++ (name.contains("bogus") || INIT_REF_CAUSES_NSME && name.contains("<init>"))
++ ? NoSuchMethodException.class
++ : IllegalAccessException.class,
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (name.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchMethodException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("bind "+receiver+"."+name+"/"+type+" => "+target
+@@ -840,6 +866,10 @@
+ countTest(positive);
+ String methodName = name.substring(1 + name.indexOf('/')); // foo/bar => foo
+ MethodType type = MethodType.methodType(ret, params);
++ Lookup specialLookup = (specialCaller != null ? maybeMoveIn(lookup, specialCaller) : null);
++ boolean specialAccessOK = (specialCaller != null &&
++ specialLookup.lookupClass() == specialCaller &&
++ (specialLookup.lookupModes() & Lookup.PRIVATE) != 0);
+ Method rmethod = defc.getDeclaredMethod(methodName, params);
+ MethodHandle target = null;
+ Exception noAccess = null;
+@@ -848,16 +878,15 @@
+ try {
+ if (verbosity >= 4) System.out.println("lookup via "+lookup+" of "+defc+" "+name+type);
+ if (isSpecial)
+- target = maybeMoveIn(lookup, specialCaller).unreflectSpecial(rmethod, specialCaller);
++ target = specialLookup.unreflectSpecial(rmethod, specialCaller);
+ else
+ target = maybeMoveIn(lookup, defc).unreflect(rmethod);
+ } catch (ReflectiveOperationException ex) {
+ noAccess = ex;
++ assertExceptionClass(
++ IllegalAccessException.class, // NSME is impossible, since it was already reflected
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (name.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchMethodException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("unreflect"+(isSpecial?"Special":"")+" "+defc.getName()+"."+name+"/"+type
+@@ -1091,11 +1120,12 @@
+ } catch (ReflectiveOperationException ex) {
+ mh = null;
+ noAccess = ex;
++ assertExceptionClass(
++ (fname.contains("bogus"))
++ ? NoSuchFieldException.class
++ : IllegalAccessException.class,
++ noAccess);
+ if (verbosity >= 5) ex.printStackTrace(System.out);
+- if (fname.contains("bogus"))
+- assertTrue(noAccess instanceof NoSuchFieldException);
+- else
+- assertTrue(noAccess instanceof IllegalAccessException);
+ }
+ if (verbosity >= 3)
+ System.out.println("find"+(isStatic?"Static":"")+(isGetter?"Getter":"Setter")+" "+fclass.getName()+"."+fname+"/"+ftype
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/invoke/ProtectedMemberDifferentPackage/Test.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,33 @@
++/*
++ * 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 8032585 8033278
++ * @summary JSR292: IllegalAccessError when attempting to invoke protected method from different package
++ *
++ * @compile p1/T2.java p2/T3.java
++ * @run main/othervm p2.T3
++ */
++public class Test {}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/invoke/ProtectedMemberDifferentPackage/p1/T2.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,127 @@
++/*
++ * 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.
++ *
++ */
++package p1;
++
++import p2.T3;
++
++import java.lang.invoke.MethodHandle;
++import java.lang.invoke.MethodHandles;
++import java.lang.invoke.MethodHandles.Lookup;
++import java.lang.invoke.MethodType;
++import java.util.concurrent.Callable;
++
++class T1 {
++ protected void m1() {}
++ protected static void m2() {}
++}
++
++public class T2 extends T1 {
++ public static void main(String[] args) throws Throwable {
++ final Lookup LOOKUP = T3.lookup();
++ Class<IllegalAccessException> IAE = IllegalAccessException.class;
++
++ assertFailure(IAE, new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findVirtual(T1.class, "m1", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++ assertFailure(IAE, new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findStatic(T1.class, "m2", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++
++ assertSuccess(new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findVirtual(T2.class, "m1", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++ assertSuccess(new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findVirtual(T3.class, "m1", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++
++ assertSuccess(new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findStatic(T2.class, "m2", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++ assertSuccess(new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.findStatic(T3.class, "m2", MethodType.methodType(void.class));
++ return null;
++ }
++ }
++ );
++
++ assertFailure(IAE, new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.unreflect(T1.class.getDeclaredMethod("m1"));
++ return null;
++ }
++ }
++ );
++ assertFailure(IAE, new Callable<Integer>() {
++ public Integer call() throws Exception {
++ LOOKUP.unreflect(T1.class.getDeclaredMethod("m2"));
++ return null;
++ }
++ }
++ );
++
++ System.out.println("TEST PASSED");
++ }
++
++ public static void assertFailure(Class<? extends Throwable> expectedError, Callable r) {
++ try {
++ r.call();
++ } catch(Throwable e) {
++ if (expectedError.isAssignableFrom(e.getClass())) {
++ return; // expected error
++ } else {
++ throw new Error("Unexpected error type: "+e.getClass()+"; expected type: "+expectedError, e);
++ }
++ }
++ throw new Error("No error");
++ }
++
++ public static void assertSuccess(Callable r) {
++ try {
++ r.call();
++ } catch(Throwable e) {
++ throw new Error("Unexpected error", e);
++ }
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/java/lang/invoke/ProtectedMemberDifferentPackage/p2/T3.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,32 @@
++/*
++ * 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.
++ *
++ */
++package p2;
++
++import p1.T2;
++
++import java.lang.invoke.MethodHandles;
++
++public class T3 extends T2 {
++ public static MethodHandles.Lookup lookup() { return MethodHandles.lookup(); }
++}
+--- ./jdk/test/java/nio/channels/Selector/ByteServer.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/nio/channels/Selector/ByteServer.java Wed Apr 16 12:37:49 2014 +0400
+@@ -22,52 +22,54 @@
+ */
+
+ /**
+- *
+- * Utility class for tests. A simple server, which waits for a connection,
+- * writes out n bytes and waits.
++ * Utility class for tests. A simple "in-thread" server to accept connections
++ * and write bytes.
+ * @author kladko
+ */
+
+ import java.net.Socket;
+ import java.net.ServerSocket;
++import java.net.SocketAddress;
++import java.net.InetSocketAddress;
++import java.io.IOException;
++import java.io.Closeable;
+
+-public class ByteServer {
++public class ByteServer implements Closeable {
+
+- public static final String LOCALHOST = "localhost";
+- private int bytecount;
+- private Socket socket;
+- private ServerSocket serversocket;
+- private Thread serverthread;
+- volatile Exception savedException;
++ private final ServerSocket ss;
++ private Socket s;
+
+- public ByteServer(int bytecount) throws Exception{
+- this.bytecount = bytecount;
+- serversocket = new ServerSocket(0);
++ ByteServer() throws IOException {
++ this.ss = new ServerSocket(0);
+ }
+
+- public int port() {
+- return serversocket.getLocalPort();
++ SocketAddress address() {
++ return new InetSocketAddress(ss.getInetAddress(), ss.getLocalPort());
+ }
+
+- public void start() {
+- serverthread = new Thread() {
+- public void run() {
+- try {
+- socket = serversocket.accept();
+- socket.getOutputStream().write(new byte[bytecount]);
+- socket.getOutputStream().flush();
+- } catch (Exception e) {
+- System.err.println("Exception in ByteServer: " + e);
+- System.exit(1);
+- }
+- }
+- };
+- serverthread.start();
++ void acceptConnection() throws IOException {
++ if (s != null)
++ throw new IllegalStateException("already connected");
++ this.s = ss.accept();
+ }
+
+- public void exit() throws Exception {
+- serverthread.join();
+- socket.close();
+- serversocket.close();
++ void closeConnection() throws IOException {
++ Socket s = this.s;
++ if (s != null) {
++ this.s = null;
++ s.close();
++ }
++ }
++
++ void write(int count) throws IOException {
++ if (s == null)
++ throw new IllegalStateException("no connection");
++ s.getOutputStream().write(new byte[count]);
++ }
++
++ public void close() throws IOException {
++ if (s != null)
++ s.close();
++ ss.close();
+ }
+ }
+--- ./jdk/test/java/nio/channels/Selector/ReadAfterConnect.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/nio/channels/Selector/ReadAfterConnect.java Wed Apr 16 12:37:49 2014 +0400
+@@ -27,27 +27,25 @@
+ * @author kladko
+ */
+
+-import java.net.*;
+-import java.nio.*;
+-import java.nio.channels.*;
++import java.nio.channels.Selector;
++import java.nio.channels.SelectionKey;
++import java.nio.channels.SocketChannel;
+
+ public class ReadAfterConnect {
++ public static void main(String[] argv) throws Exception {
++ try (ByteServer server = new ByteServer();
++ SocketChannel sc = SocketChannel.open(server.address())) {
+
+- public static void main(String[] argv) throws Exception {
+- ByteServer server = new ByteServer(0); // server: accept connection and do nothing
+- server.start();
+- InetSocketAddress isa = new InetSocketAddress(
+- InetAddress.getByName(ByteServer.LOCALHOST), server.port());
+- Selector sel = Selector.open();
+- SocketChannel sc = SocketChannel.open();
+- sc.connect(isa);
+- sc.configureBlocking(false);
+- sc.register(sel, SelectionKey.OP_READ);
+- // Previously channel would get selected here, although there is nothing to read
+- if (sel.selectNow() != 0)
+- throw new Exception("Select returned nonzero value");
+- sc.close();
+- server.exit();
++ server.acceptConnection();
++
++ try (Selector sel = Selector.open()) {
++ sc.configureBlocking(false);
++ sc.register(sel, SelectionKey.OP_READ);
++ // Previously channel would get selected here, although there is nothing to read
++ if (sel.selectNow() != 0)
++ throw new Exception("Select returned nonzero value");
++ }
++ }
+ }
+
+ }
+--- ./jdk/test/java/nio/channels/Selector/SelectAfterRead.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/nio/channels/Selector/SelectAfterRead.java Wed Apr 16 12:37:49 2014 +0400
+@@ -28,60 +28,62 @@
+ * @author kladko
+ */
+
+-import java.net.*;
+-import java.nio.*;
+-import java.nio.channels.*;
++import java.nio.ByteBuffer;
++import java.nio.channels.Selector;
++import java.nio.channels.SelectionKey;
++import java.nio.channels.SocketChannel;
+
+ public class SelectAfterRead {
+
+- final static int TIMEOUT = 1000;
++ private static final int TIMEOUT = 1000;
+
+ public static void main(String[] argv) throws Exception {
+- InetAddress lh = InetAddress.getByName(ByteServer.LOCALHOST);
+
+ // server: accept connection and write one byte
+- ByteServer server = new ByteServer(1);
+- server.start();
+- Selector sel = Selector.open();
+- SocketChannel sc = SocketChannel.open();
+- sc.connect(new InetSocketAddress(lh, server.port()));
+- sc.read(ByteBuffer.allocate(1));
+- sc.configureBlocking(false);
+- sc.register(sel, SelectionKey.OP_READ);
+- // previously on Windows select would select channel here, although there was
+- // nothing to read
+- if (sel.selectNow() != 0)
+- throw new Exception("Select returned nonzero value");
+- sc.close();
+- sel.close();
+- server.exit();
++ try (ByteServer server = new ByteServer();
++ SocketChannel sc = SocketChannel.open(server.address())) {
++
++ server.acceptConnection();
++ server.write(1);
++
++ try (Selector sel = Selector.open()) {
++ sc.read(ByteBuffer.allocate(1));
++ sc.configureBlocking(false);
++ sc.register(sel, SelectionKey.OP_READ);
++ // previously on Windows select would select channel here, although there was
++ // nothing to read
++ if (sel.selectNow() != 0)
++ throw new Exception("Select returned nonzero value");
++ }
++ }
+
+ // Now we will test a two reads combination
+ // server: accept connection and write two bytes
+- server = new ByteServer(2);
+- server.start();
+- sc = SocketChannel.open();
+- sc.connect(new InetSocketAddress(lh, server.port()));
+- sc.configureBlocking(false);
+- sel = Selector.open();
+- sc.register(sel, SelectionKey.OP_READ);
+- if (sel.select(TIMEOUT) != 1)
+- throw new Exception("One selected key expected");
+- sel.selectedKeys().clear();
+- // previously on Windows a channel would get selected only once
+- if (sel.selectNow() != 1)
+- throw new Exception("One selected key expected");
+- // Previously on Windows two consequent reads would cause select()
+- // to select a channel, although there was nothing remaining to
+- // read in the channel
+- if (sc.read(ByteBuffer.allocate(1)) != 1)
+- throw new Exception("One byte expected");
+- if (sc.read(ByteBuffer.allocate(1)) != 1)
+- throw new Exception("One byte expected");
+- if (sel.selectNow() != 0)
+- throw new Exception("Select returned nonzero value");
+- sc.close();
+- sel.close();
+- server.exit();
++ try (ByteServer server = new ByteServer();
++ SocketChannel sc = SocketChannel.open(server.address())) {
++
++ server.acceptConnection();
++ server.write(2);
++
++ try (Selector sel = Selector.open()) {
++ sc.configureBlocking(false);
++ sc.register(sel, SelectionKey.OP_READ);
++ if (sel.select(TIMEOUT) != 1)
++ throw new Exception("One selected key expected");
++ sel.selectedKeys().clear();
++ // previously on Windows a channel would get selected only once
++ if (sel.selectNow() != 1)
++ throw new Exception("One selected key expected");
++ // Previously on Windows two consequent reads would cause select()
++ // to select a channel, although there was nothing remaining to
++ // read in the channel
++ if (sc.read(ByteBuffer.allocate(1)) != 1)
++ throw new Exception("One byte expected");
++ if (sc.read(ByteBuffer.allocate(1)) != 1)
++ throw new Exception("One byte expected");
++ if (sel.selectNow() != 0)
++ throw new Exception("Select returned nonzero value");
++ }
++ }
+ }
+ }
+--- ./jdk/test/java/nio/channels/Selector/SelectWrite.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/java/nio/channels/Selector/SelectWrite.java Wed Apr 16 12:37:49 2014 +0400
+@@ -22,36 +22,33 @@
+ */
+
+ /* @test
+- @bug 4645302
+- @summary Socket with OP_WRITE would get selected only once
+- @author kladko
++ * @bug 4645302
++ * @summary Socket with OP_WRITE would get selected only once
++ * @author kladko
+ */
+
+-import java.net.*;
+-import java.nio.*;
+-import java.nio.channels.*;
+-
++import java.nio.channels.Selector;
++import java.nio.channels.SelectionKey;
++import java.nio.channels.SocketChannel;
+
+ public class SelectWrite {
+
+ public static void main(String[] argv) throws Exception {
+- ByteServer server = new ByteServer(0);
+- // server: accept connection and do nothing
+- server.start();
+- InetSocketAddress isa = new InetSocketAddress(
+- InetAddress.getByName(ByteServer.LOCALHOST), server.port());
+- Selector sel = Selector.open();
+- SocketChannel sc = SocketChannel.open();
+- sc.connect(isa);
+- sc.configureBlocking(false);
+- sc.register(sel, SelectionKey.OP_WRITE);
+- sel.select();
+- sel.selectedKeys().clear();
+- if (sel.select() == 0) {
+- throw new Exception("Select returned zero");
++ try (ByteServer server = new ByteServer();
++ SocketChannel sc = SocketChannel.open(server.address())) {
++
++ server.acceptConnection();
++
++ try (Selector sel = Selector.open()) {
++ sc.configureBlocking(false);
++ sc.register(sel, SelectionKey.OP_WRITE);
++ sel.select();
++ sel.selectedKeys().clear();
++ if (sel.select() == 0) {
++ throw new Exception("Select returned zero");
++ }
++ }
+ }
+- sc.close();
+- sel.close();
+ }
+
+ }
+--- ./jdk/test/javax/management/remote/mandatory/util/CacheMapTest.java Wed May 07 19:26:47 2014 -0700
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,110 +0,0 @@
+-/*
+- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+- * 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 7654321
+- * @summary Tests the CacheMap class.
+- * @author Eamonn McManus
+- * @run clean CacheMapTest
+- * @run build CacheMapTest
+- * @run main CacheMapTest
+- */
+-
+-import java.util.Iterator;
+-import java.util.Map;
+-
+-import com.sun.jmx.remote.util.CacheMap;
+-
+-public class CacheMapTest {
+- public static void main(String[] args) {
+- try {
+- boolean ok = test(5) && test(100);
+- if (ok) {
+- System.out.println("Test completed");
+- return;
+- } else {
+- System.out.println("Test failed!");
+- System.exit(1);
+- }
+- } catch (Exception e) {
+- System.err.println("Unexpected exception: " + e);
+- e.printStackTrace();
+- System.exit(1);
+- }
+- }
+-
+- private static boolean test(int cacheSize) throws Exception {
+- System.out.println("CacheMap test with cache size " + cacheSize);
+- CacheMap map = new CacheMap(cacheSize);
+- int size = 0;
+- int maxIterations = cacheSize * 10;
+- while (map.size() == size && size < maxIterations) {
+- Integer key = new Integer(size);
+- Object x = map.put(key, "x");
+- if (x != null) {
+- System.out.println("Map already had entry " + key + "!");
+- return false;
+- }
+- x = map.get(key);
+- if (!"x".equals(x)) {
+- System.out.println("Got back surprising value: " + x);
+- return false;
+- }
+- size++;
+- }
+- System.out.println("Map size is " + map.size() + " after inserting " +
+- size + " elements");
+- do {
+- System.gc();
+- Thread.sleep(1);
+- System.out.println("Map size is " + map.size() + " after GC");
+- } while (map.size() > cacheSize);
+- if (map.size() < cacheSize) {
+- System.out.println("Map shrank to less than cache size: " +
+- map.size() + " (surprising but not wrong)");
+- } else
+- System.out.println("Map shrank to cache size as expected");
+- int lowest = size - cacheSize;
+- // lowest value that can still be in cache if LRU is respected
+- for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
+- Map.Entry entry = (Map.Entry) it.next();
+- Integer x = (Integer) entry.getKey();
+- int xx = x.intValue();
+- if (xx < lowest || xx >= size) {
+- System.out.println("Old value remained (" + x + "), " +
+- "expected none earlier than " + lowest);
+- return false;
+- }
+- Object xxx = entry.getValue();
+- if (!"x".equals(xxx)) {
+- System.out.println("Got back surprising value: " + xxx);
+- return false;
+- }
+- }
+- if (map.size() > 0)
+- System.out.println("Remaining elements are the most recent ones");
+- System.out.println("Test passed");
+- return true;
+- }
+-}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/AssertsTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,237 @@
++/*
++ * 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 static jdk.testlibrary.Asserts.*;
++
++/* @test
++ * @summary Tests the different assertions in the Assert class
++ * @library /testlibrary
++ */
++public class AssertsTest {
++ private static class Foo implements Comparable<Foo> {
++ final int id;
++ public Foo(int id) {
++ this.id = id;
++ }
++
++ public int compareTo(Foo f) {
++ return new Integer(id).compareTo(new Integer(f.id));
++ }
++ }
++
++ public static void main(String[] args) throws Exception {
++ testLessThan();
++ testLessThanOrEqual();
++ testEquals();
++ testGreaterThanOrEqual();
++ testGreaterThan();
++ testNotEquals();
++ testNull();
++ testNotNull();
++ testTrue();
++ testFalse();
++ }
++
++ private static void testLessThan() throws Exception {
++ expectPass(Assertion.LT, 1, 2);
++
++ expectFail(Assertion.LT, 2, 2);
++ expectFail(Assertion.LT, 2, 1);
++ expectFail(Assertion.LT, null, 2);
++ expectFail(Assertion.LT, 2, null);
++ }
++
++ private static void testLessThanOrEqual() throws Exception {
++ expectPass(Assertion.LTE, 1, 2);
++ expectPass(Assertion.LTE, 2, 2);
++
++ expectFail(Assertion.LTE, 3, 2);
++ expectFail(Assertion.LTE, null, 2);
++ expectFail(Assertion.LTE, 2, null);
++ }
++
++ private static void testEquals() throws Exception {
++ expectPass(Assertion.EQ, 1, 1);
++ expectPass(Assertion.EQ, null, null);
++
++ Foo f1 = new Foo(1);
++ expectPass(Assertion.EQ, f1, f1);
++
++ Foo f2 = new Foo(1);
++ expectFail(Assertion.EQ, f1, f2);
++ expectFail(Assertion.LTE, null, 2);
++ expectFail(Assertion.LTE, 2, null);
++ }
++
++ private static void testGreaterThanOrEqual() throws Exception {
++ expectPass(Assertion.GTE, 1, 1);
++ expectPass(Assertion.GTE, 2, 1);
++
++ expectFail(Assertion.GTE, 1, 2);
++ expectFail(Assertion.GTE, null, 2);
++ expectFail(Assertion.GTE, 2, null);
++ }
++
++ private static void testGreaterThan() throws Exception {
++ expectPass(Assertion.GT, 2, 1);
++
++ expectFail(Assertion.GT, 1, 1);
++ expectFail(Assertion.GT, 1, 2);
++ expectFail(Assertion.GT, null, 2);
++ expectFail(Assertion.GT, 2, null);
++ }
++
++ private static void testNotEquals() throws Exception {
++ expectPass(Assertion.NE, null, 1);
++ expectPass(Assertion.NE, 1, null);
++
++ Foo f1 = new Foo(1);
++ Foo f2 = new Foo(1);
++ expectPass(Assertion.NE, f1, f2);
++
++ expectFail(Assertion.NE, null, null);
++ expectFail(Assertion.NE, f1, f1);
++ expectFail(Assertion.NE, 1, 1);
++ }
++
++ private static void testNull() throws Exception {
++ expectPass(Assertion.NULL, null);
++
++ expectFail(Assertion.NULL, 1);
++ }
++
++ private static void testNotNull() throws Exception {
++ expectPass(Assertion.NOTNULL, 1);
++
++ expectFail(Assertion.NOTNULL, null);
++ }
++
++ private static void testTrue() throws Exception {
++ expectPass(Assertion.TRUE, true);
++
++ expectFail(Assertion.TRUE, false);
++ }
++
++ private static void testFalse() throws Exception {
++ expectPass(Assertion.FALSE, false);
++
++ expectFail(Assertion.FALSE, true);
++ }
++
++ private static <T extends Comparable<T>> void expectPass(Assertion assertion, T ... args)
++ throws Exception {
++ Assertion.run(assertion, args);
++ }
++
++ private static <T extends Comparable<T>> void expectFail(Assertion assertion, T ... args)
++ throws Exception {
++ try {
++ Assertion.run(assertion, args);
++ } catch (RuntimeException e) {
++ return;
++ }
++ throw new Exception("Expected " + Assertion.format(assertion, (Object[]) args) +
++ " to throw a RuntimeException");
++ }
++
++}
++
++enum Assertion {
++ LT, LTE, EQ, GTE, GT, NE, NULL, NOTNULL, FALSE, TRUE;
++
++ public static <T extends Comparable<T>> void run(Assertion assertion, T ... args) {
++ String msg = "Expected " + format(assertion, args) + " to pass";
++ switch (assertion) {
++ case LT:
++ assertLessThan(args[0], args[1], msg);
++ break;
++ case LTE:
++ assertLessThanOrEqual(args[0], args[1], msg);
++ break;
++ case EQ:
++ assertEquals(args[0], args[1], msg);
++ break;
++ case GTE:
++ assertGreaterThanOrEqual(args[0], args[1], msg);
++ break;
++ case GT:
++ assertGreaterThan(args[0], args[1], msg);
++ break;
++ case NE:
++ assertNotEquals(args[0], args[1], msg);
++ break;
++ case NULL:
++ assertNull(args == null ? args : args[0], msg);
++ break;
++ case NOTNULL:
++ assertNotNull(args == null ? args : args[0], msg);
++ break;
++ case FALSE:
++ assertFalse((Boolean) args[0], msg);
++ break;
++ case TRUE:
++ assertTrue((Boolean) args[0], msg);
++ break;
++ default:
++ // do nothing
++ }
++ }
++
++ public static String format(Assertion assertion, Object ... args) {
++ switch (assertion) {
++ case LT:
++ return asString("assertLessThan", args);
++ case LTE:
++ return asString("assertLessThanOrEqual", args);
++ case EQ:
++ return asString("assertEquals", args);
++ case GTE:
++ return asString("assertGreaterThanOrEquals", args);
++ case GT:
++ return asString("assertGreaterThan", args);
++ case NE:
++ return asString("assertNotEquals", args);
++ case NULL:
++ return asString("assertNull", args);
++ case NOTNULL:
++ return asString("assertNotNull", args);
++ case FALSE:
++ return asString("assertFalse", args);
++ case TRUE:
++ return asString("assertTrue", args);
++ default:
++ return "";
++ }
++ }
++
++ private static String asString(String assertion, Object ... args) {
++ if (args == null) {
++ return String.format("%s(null)", assertion);
++ }
++ if (args.length == 1) {
++ return String.format("%s(%s)", assertion, args[0]);
++ } else {
++ return String.format("%s(%s, %s)", assertion, args[0], args[1]);
++ }
++ }
++}
+--- ./jdk/test/lib/testlibrary/ClassFileInstaller.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/lib/testlibrary/ClassFileInstaller.java Wed Apr 16 12:37:49 2014 +0400
+@@ -45,7 +45,10 @@
+
+ // Create the class file's package directory
+ Path p = Paths.get(pathName);
+- Files.createDirectories(p.getParent());
++ Path parent = p.getParent();
++ if (parent != null) {
++ Files.createDirectories(parent);
++ }
+ // Create the class file
+ Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/OutputAnalyzerReportingTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,122 @@
++/*
++ * 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
++ * @summary Test the OutputAnalyzer reporting functionality,
++ * such as printing additional diagnostic info
++ * (exit code, stdout, stderr, command line, etc.)
++ * @library /testlibrary
++ */
++
++import java.io.ByteArrayOutputStream;
++import java.io.PrintStream;
++
++import jdk.testlibrary.OutputAnalyzer;
++
++public class OutputAnalyzerReportingTest {
++
++ public static void main(String[] args) throws Exception {
++ // Create the output analyzer under test
++ String stdout = "aaaaaa";
++ String stderr = "bbbbbb";
++ OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
++
++ // Expected summary values should be the same for all cases,
++ // since the outputAnalyzer object is the same
++ String expectedExitValue = "-1";
++ String expectedSummary =
++ " stdout: [" + stdout + "];\n" +
++ " stderr: [" + stderr + "]\n" +
++ " exitValue = " + expectedExitValue + "\n";
++
++
++ DiagnosticSummaryTestRunner testRunner =
++ new DiagnosticSummaryTestRunner();
++
++ // should have exit value
++ testRunner.init(expectedSummary);
++ int unexpectedExitValue = 2;
++ try {
++ output.shouldHaveExitValue(unexpectedExitValue);
++ } catch (RuntimeException e) { }
++ testRunner.closeAndCheckResults();
++
++ // should not contain
++ testRunner.init(expectedSummary);
++ try {
++ output.shouldNotContain(stdout);
++ } catch (RuntimeException e) { }
++ testRunner.closeAndCheckResults();
++
++ // should contain
++ testRunner.init(expectedSummary);
++ try {
++ output.shouldContain("unexpected-stuff");
++ } catch (RuntimeException e) { }
++ testRunner.closeAndCheckResults();
++
++ // should not match
++ testRunner.init(expectedSummary);
++ try {
++ output.shouldNotMatch("[a]");
++ } catch (RuntimeException e) { }
++ testRunner.closeAndCheckResults();
++
++ // should match
++ testRunner.init(expectedSummary);
++ try {
++ output.shouldMatch("[qwerty]");
++ } catch (RuntimeException e) { }
++ testRunner.closeAndCheckResults();
++
++ }
++
++ private static class DiagnosticSummaryTestRunner {
++ private ByteArrayOutputStream byteStream =
++ new ByteArrayOutputStream(10000);
++
++ private String expectedSummary = "";
++ private PrintStream errStream;
++
++
++ public void init(String expectedSummary) {
++ this.expectedSummary = expectedSummary;
++ byteStream.reset();
++ errStream = new PrintStream(byteStream);
++ System.setErr(errStream);
++ }
++
++ public void closeAndCheckResults() {
++ // check results
++ errStream.close();
++ String stdErrStr = byteStream.toString();
++ if (!stdErrStr.contains(expectedSummary)) {
++ throw new RuntimeException("The output does not contain "
++ + "the diagnostic message, or the message is incorrect");
++ }
++ }
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Asserts.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,395 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++/**
++ * Asserts that can be used for verifying assumptions in tests.
++ *
++ * An assertion will throw a {@link RuntimeException} if the assertion isn't
++ * valid. All the asserts can be imported into a test by using a static
++ * import:
++ *
++ * <pre>
++ * {@code
++ * import static com.oracle.java.testlibrary.Asserts.*;
++ * }
++ *
++ * Always provide a message describing the assumption if the line number of the
++ * failing assertion isn't enough to understand why the assumption failed. For
++ * example, if the assertion is in a loop or in a method that is called
++ * multiple times, then the line number won't provide enough context to
++ * understand the failure.
++ * </pre>
++ */
++public class Asserts {
++
++ /**
++ * Shorthand for {@link #assertLessThan(T, T)}.
++ *
++ * @see #assertLessThan(T, T)
++ */
++ public static <T extends Comparable<T>> void assertLT(T lhs, T rhs) {
++ assertLessThan(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertLessThan(T, T, String)}.
++ *
++ * @see #assertLessThan(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertLT(T lhs, T rhs, String msg) {
++ assertLessThan(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertLessThan(T, T, String)} with a default message.
++ *
++ * @see #assertLessThan(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertLessThan(T lhs, T rhs) {
++ String msg = "Expected that " + format(lhs) + " < " + format(rhs);
++ assertLessThan(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is less than {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static <T extends Comparable<T>>void assertLessThan(T lhs, T rhs, String msg) {
++ assertTrue(compare(lhs, rhs, msg) < 0, msg);
++ }
++
++ /**
++ * Shorthand for {@link #assertLessThanOrEqual(T, T)}.
++ *
++ * @see #assertLessThanOrEqual(T, T)
++ */
++ public static <T extends Comparable<T>> void assertLTE(T lhs, T rhs) {
++ assertLessThanOrEqual(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertLessThanOrEqual(T, T, String)}.
++ *
++ * @see #assertLessThanOrEqual(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertLTE(T lhs, T rhs, String msg) {
++ assertLessThanOrEqual(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertLessThanOrEqual(T, T, String)} with a default message.
++ *
++ * @see #assertLessThanOrEqual(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertLessThanOrEqual(T lhs, T rhs) {
++ String msg = "Expected that " + format(lhs) + " <= " + format(rhs);
++ assertLessThanOrEqual(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is less than or equal to {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static <T extends Comparable<T>> void assertLessThanOrEqual(T lhs, T rhs, String msg) {
++ assertTrue(compare(lhs, rhs, msg) <= 0, msg);
++ }
++
++ /**
++ * Shorthand for {@link #assertEquals(T, T)}.
++ *
++ * @see #assertEquals(T, T)
++ */
++ public static void assertEQ(Object lhs, Object rhs) {
++ assertEquals(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertEquals(T, T, String)}.
++ *
++ * @see #assertEquals(T, T, String)
++ */
++ public static void assertEQ(Object lhs, Object rhs, String msg) {
++ assertEquals(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertEquals(T, T, String)} with a default message.
++ *
++ * @see #assertEquals(T, T, String)
++ */
++ public static void assertEquals(Object lhs, Object rhs) {
++ String msg = "Expected " + format(lhs) + " to equal " + format(rhs);
++ assertEquals(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is equal to {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertEquals(Object lhs, Object rhs, String msg) {
++ if (lhs == null) {
++ if (rhs != null) {
++ error(msg);
++ }
++ } else {
++ assertTrue(lhs.equals(rhs), msg);
++ }
++ }
++
++ /**
++ * Shorthand for {@link #assertGreaterThanOrEqual(T, T)}.
++ *
++ * @see #assertGreaterThanOrEqual(T, T)
++ */
++ public static <T extends Comparable<T>> void assertGTE(T lhs, T rhs) {
++ assertGreaterThanOrEqual(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertGreaterThanOrEqual(T, T, String)}.
++ *
++ * @see #assertGreaterThanOrEqual(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertGTE(T lhs, T rhs, String msg) {
++ assertGreaterThanOrEqual(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertGreaterThanOrEqual(T, T, String)} with a default message.
++ *
++ * @see #assertGreaterThanOrEqual(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertGreaterThanOrEqual(T lhs, T rhs) {
++ String msg = "Expected that " + format(lhs) + " >= " + format(rhs);
++ assertGreaterThanOrEqual(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is greater than or equal to {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static <T extends Comparable<T>> void assertGreaterThanOrEqual(T lhs, T rhs, String msg) {
++ assertTrue(compare(lhs, rhs, msg) >= 0, msg);
++ }
++
++ /**
++ * Shorthand for {@link #assertGreaterThan(T, T)}.
++ *
++ * @see #assertGreaterThan(T, T)
++ */
++ public static <T extends Comparable<T>> void assertGT(T lhs, T rhs) {
++ assertGreaterThan(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertGreaterThan(T, T, String)}.
++ *
++ * @see #assertGreaterThan(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertGT(T lhs, T rhs, String msg) {
++ assertGreaterThan(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertGreaterThan(T, T, String)} with a default message.
++ *
++ * @see #assertGreaterThan(T, T, String)
++ */
++ public static <T extends Comparable<T>> void assertGreaterThan(T lhs, T rhs) {
++ String msg = "Expected that " + format(lhs) + " > " + format(rhs);
++ assertGreaterThan(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is greater than {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static <T extends Comparable<T>> void assertGreaterThan(T lhs, T rhs, String msg) {
++ assertTrue(compare(lhs, rhs, msg) > 0, msg);
++ }
++
++ /**
++ * Shorthand for {@link #assertNotEquals(T, T)}.
++ *
++ * @see #assertNotEquals(T, T)
++ */
++ public static void assertNE(Object lhs, Object rhs) {
++ assertNotEquals(lhs, rhs);
++ }
++
++ /**
++ * Shorthand for {@link #assertNotEquals(T, T, String)}.
++ *
++ * @see #assertNotEquals(T, T, String)
++ */
++ public static void assertNE(Object lhs, Object rhs, String msg) {
++ assertNotEquals(lhs, rhs, msg);
++ }
++
++ /**
++ * Calls {@link #assertNotEquals(T, T, String)} with a default message.
++ *
++ * @see #assertNotEquals(T, T, String)
++ */
++ public static void assertNotEquals(Object lhs, Object rhs) {
++ String msg = "Expected " + format(lhs) + " to not equal " + format(rhs);
++ assertNotEquals(lhs, rhs, msg);
++ }
++
++ /**
++ * Asserts that {@code lhs} is not equal to {@code rhs}.
++ *
++ * @param lhs The left hand side of the comparison.
++ * @param rhs The right hand side of the comparison.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertNotEquals(Object lhs, Object rhs, String msg) {
++ if (lhs == null) {
++ if (rhs == null) {
++ error(msg);
++ }
++ } else {
++ assertFalse(lhs.equals(rhs), msg);
++ }
++ }
++
++ /**
++ * Calls {@link #assertNull(Object, String)} with a default message.
++ *
++ * @see #assertNull(Object, String)
++ */
++ public static void assertNull(Object o) {
++ assertNull(o, "Expected " + format(o) + " to be null");
++ }
++
++ /**
++ * Asserts that {@code o} is null.
++ *
++ * @param o The reference assumed to be null.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertNull(Object o, String msg) {
++ assertEquals(o, null, msg);
++ }
++
++ /**
++ * Calls {@link #assertNotNull(Object, String)} with a default message.
++ *
++ * @see #assertNotNull(Object, String)
++ */
++ public static void assertNotNull(Object o) {
++ assertNotNull(o, "Expected non null reference");
++ }
++
++ /**
++ * Asserts that {@code o} is <i>not</i> null.
++ *
++ * @param o The reference assumed <i>not</i> to be null,
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertNotNull(Object o, String msg) {
++ assertNotEquals(o, null, msg);
++ }
++
++ /**
++ * Calls {@link #assertFalse(boolean, String)} with a default message.
++ *
++ * @see #assertFalse(boolean, String)
++ */
++ public static void assertFalse(boolean value) {
++ assertFalse(value, "Expected value to be false");
++ }
++
++ /**
++ * Asserts that {@code value} is {@code false}.
++ *
++ * @param value The value assumed to be false.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertFalse(boolean value, String msg) {
++ assertTrue(!value, msg);
++ }
++
++ /**
++ * Calls {@link #assertTrue(boolean, String)} with a default message.
++ *
++ * @see #assertTrue(boolean, String)
++ */
++ public static void assertTrue(boolean value) {
++ assertTrue(value, "Expected value to be true");
++ }
++
++ /**
++ * Asserts that {@code value} is {@code true}.
++ *
++ * @param value The value assumed to be true.
++ * @param msg A description of the assumption.
++ * @throws RuntimeException if the assertion isn't valid.
++ */
++ public static void assertTrue(boolean value, String msg) {
++ if (!value) {
++ error(msg);
++ }
++ }
++
++ private static <T extends Comparable<T>> int compare(T lhs, T rhs, String msg) {
++ assertNotNull(lhs, msg);
++ assertNotNull(rhs, msg);
++ return lhs.compareTo(rhs);
++ }
++
++ private static String format(Object o) {
++ return o == null? "null" : o.toString();
++ }
++
++ private static void error(String msg) {
++ throw new RuntimeException(msg);
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/InputArguments.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,88 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import java.lang.management.RuntimeMXBean;
++import java.lang.management.ManagementFactory;
++import java.util.List;
++
++/**
++ * This class provides access to the input arguments to the VM.
++ */
++public class InputArguments {
++ private static final List<String> args;
++
++ static {
++ RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
++ args = runtimeMxBean.getInputArguments();
++ }
++
++ /**
++ * Returns true if {@code arg} is an input argument to the VM.
++ *
++ * This is useful for checking boolean flags such as -XX:+UseSerialGC or
++ * -XX:-UsePerfData.
++ *
++ * @param arg The name of the argument.
++ * @return {@code true} if the given argument is an input argument,
++ * otherwise {@code false}.
++ */
++ public static boolean contains(String arg) {
++ return args.contains(arg);
++ }
++
++ /**
++ * Returns true if {@code prefix} is the start of an input argument to the
++ * VM.
++ *
++ * This is useful for checking if flags describing a quantity, such as
++ * -XX:+MaxMetaspaceSize=100m, is set without having to know the quantity.
++ * To check if the flag -XX:MaxMetaspaceSize is set, use
++ * {@code InputArguments.containsPrefix("-XX:MaxMetaspaceSize")}.
++ *
++ * @param prefix The start of the argument.
++ * @return {@code true} if the given argument is the start of an input
++ * argument, otherwise {@code false}.
++ */
++ public static boolean containsPrefix(String prefix) {
++ for (String arg : args) {
++ if (arg.startsWith(prefix)) {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ /**
++ * Get the string containing input arguments passed to the VM
++ */
++ public static String getInputArguments() {
++ StringBuilder result = new StringBuilder();
++ for (String arg : args)
++ result.append(arg).append(' ');
++
++ return result.toString();
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/JDKToolFinder.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,106 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import java.io.FileNotFoundException;
++import java.nio.file.Path;
++import java.nio.file.Paths;
++
++public final class JDKToolFinder {
++
++ private JDKToolFinder() {
++ }
++
++ /**
++ * Returns the full path to an executable in jdk/bin based on System
++ * property {@code test.jdk} or {@code compile.jdk} (both are set by the jtreg test suite)
++ *
++ * @return Full path to an executable in jdk/bin
++ */
++ public static String getJDKTool(String tool) {
++
++ // First try to find the executable in test.jdk
++ try {
++ return getTool(tool, "test.jdk");
++ } catch (FileNotFoundException e) {
++
++ }
++
++ // Now see if it's available in compile.jdk
++ try {
++ return getTool(tool, "compile.jdk");
++ } catch (FileNotFoundException e) {
++ throw new RuntimeException("Failed to find " + tool +
++ ", looked in test.jdk (" + System.getProperty("test.jdk") +
++ ") and compile.jdk (" + System.getProperty("compile.jdk") + ")");
++ }
++ }
++
++ /**
++ * Returns the full path to an executable in jdk/bin based on System
++ * property {@code compile.jdk}
++ *
++ * @return Full path to an executable in jdk/bin
++ */
++ public static String getCompileJDKTool(String tool) {
++ try {
++ return getTool(tool, "compile.jdk");
++ } catch (FileNotFoundException e) {
++ throw new RuntimeException(e);
++ }
++ }
++
++ /**
++ * Returns the full path to an executable in jdk/bin based on System
++ * property {@code test.jdk}
++ *
++ * @return Full path to an executable in jdk/bin
++ */
++ public static String getTestJDKTool(String tool) {
++ try {
++ return getTool(tool, "test.jdk");
++ } catch (FileNotFoundException e) {
++ throw new RuntimeException(e);
++ }
++ }
++
++ private static String getTool(String tool, String property) throws FileNotFoundException {
++ String jdkPath = System.getProperty(property);
++
++ if (jdkPath == null) {
++ throw new RuntimeException(
++ "System property '" + property + "' not set. This property is normally set by jtreg. "
++ + "When running test separately, set this property using '-D" + property + "=/path/to/jdk'.");
++ }
++
++ Path toolName = Paths.get("bin", tool + (Platform.isWindows() ? ".exe" : ""));
++
++ Path jdkTool = Paths.get(jdkPath, toolName.toString());
++ if (!jdkTool.toFile().exists()) {
++ throw new FileNotFoundException("Could not find file " + jdkTool.toAbsolutePath());
++ }
++
++ return jdkTool.toAbsolutePath().toString();
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/JDKToolLauncher.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,134 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import java.util.ArrayList;
++import java.util.Arrays;
++import java.util.List;
++
++/**
++ * A utility for constructing command lines for starting JDK tool processes.
++ *
++ * The JDKToolLauncher can in particular be combined with a
++ * java.lang.ProcessBuilder to easily run a JDK tool. For example, the following
++ * code run {@code jmap -heap} against a process with GC logging turned on for
++ * the {@code jmap} process:
++ *
++ * <pre>
++ * {@code
++ * JDKToolLauncher jmap = JDKToolLauncher.create("jmap")
++ * .addVMArg("-XX:+PrintGC");
++ * .addVMArg("-XX:+PrintGCDetails")
++ * .addToolArg("-heap")
++ * .addToolArg(pid);
++ * ProcessBuilder pb = new ProcessBuilder(jmap.getCommand());
++ * Process p = pb.start();
++ * }
++ * </pre>
++ */
++public class JDKToolLauncher {
++ private final String executable;
++ private final List<String> vmArgs = new ArrayList<String>();
++ private final List<String> toolArgs = new ArrayList<String>();
++
++ private JDKToolLauncher(String tool, boolean useCompilerJDK) {
++ if (useCompilerJDK) {
++ executable = JDKToolFinder.getJDKTool(tool);
++ } else {
++ executable = JDKToolFinder.getTestJDKTool(tool);
++ }
++ vmArgs.addAll(Arrays.asList(ProcessTools.getPlatformSpecificVMArgs()));
++ }
++
++ /**
++ * Creates a new JDKToolLauncher for the specified tool. Using tools path
++ * from the compiler JDK.
++ *
++ * @param tool
++ * The name of the tool
++ * @return A new JDKToolLauncher
++ */
++ public static JDKToolLauncher create(String tool) {
++ return new JDKToolLauncher(tool, true);
++ }
++
++ /**
++ * Creates a new JDKToolLauncher for the specified tool in the Tested JDK.
++ *
++ * @param tool
++ * The name of the tool
++ *
++ * @return A new JDKToolLauncher
++ */
++ public static JDKToolLauncher createUsingTestJDK(String tool) {
++ return new JDKToolLauncher(tool, false);
++ }
++
++ /**
++ * Adds an argument to the JVM running the tool.
++ *
++ * The JVM arguments are passed to the underlying JVM running the tool.
++ * Arguments will automatically be prepended with "-J".
++ *
++ * Any platform specific arguments required for running the tool are
++ * automatically added.
++ *
++ *
++ * @param arg
++ * The argument to VM running the tool
++ * @return The JDKToolLauncher instance
++ */
++ public JDKToolLauncher addVMArg(String arg) {
++ vmArgs.add(arg);
++ return this;
++ }
++
++ /**
++ * Adds an argument to the tool.
++ *
++ * @param arg
++ * The argument to the tool
++ * @return The JDKToolLauncher instance
++ */
++ public JDKToolLauncher addToolArg(String arg) {
++ toolArgs.add(arg);
++ return this;
++ }
++
++ /**
++ * Returns the command that can be used for running the tool.
++ *
++ * @return An array whose elements are the arguments of the command.
++ */
++ public String[] getCommand() {
++ List<String> command = new ArrayList<String>();
++ command.add(executable);
++ // Add -J in front of all vmArgs
++ for (String arg : vmArgs) {
++ command.add("-J" + arg);
++ }
++ command.addAll(toolArgs);
++ return command.toArray(new String[command.size()]);
++ }
++}
+--- ./jdk/test/lib/testlibrary/jdk/testlibrary/JcmdBase.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/JcmdBase.java Wed Apr 16 12:37:49 2014 +0400
+@@ -23,8 +23,11 @@
+
+ package jdk.testlibrary;
+
+-import java.util.ArrayList;
++import java.util.Arrays;
+
++/**
++ * Super class for tests which need to attach jcmd to the current process.
++ */
+ public class JcmdBase {
+
+ private static ProcessBuilder processBuilder = new ProcessBuilder();
+@@ -32,46 +35,24 @@
+ /**
+ * Attach jcmd to the current process
+ *
+- * @param commandArgs
+- * jcmd command line parameters, e.g. JFR.start
++ * @param toolArgs
++ * jcmd command line parameters, e.g. VM.flags
+ * @return jcmd output
+ * @throws Exception
+ */
+- public final static OutputAnalyzer jcmd(String... commandArgs)
++ public final static OutputAnalyzer jcmd(String... toolArgs)
+ throws Exception {
+- ArrayList<String> cmd = new ArrayList<String>();
+- String cmdString = "";
+-
+- // jcmd from the jdk to be tested
+- String jcmdPath = JdkFinder.getTool("jcmd", false);
+- cmd.add(jcmdPath);
+- cmdString += jcmdPath;
+-
+- String pid = Integer.toString(ProcessTools.getProcessId());
+- cmd.add(pid);
+- cmdString += " " + pid;
+-
+- for (int i = 0; i < commandArgs.length; i++) {
+- cmd.add(commandArgs[i]);
+- cmdString += " " + commandArgs[i];
++ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jcmd");
++ launcher.addToolArg(Integer.toString(ProcessTools.getProcessId()));
++ for (String toolArg : toolArgs) {
++ launcher.addToolArg(toolArg);
+ }
+-
+- // Log command line for debugging purpose
+- System.out.println("Command line:");
+- System.out.println(cmdString);
+-
+- processBuilder.command(cmd);
++ processBuilder.command(launcher.getCommand());
++ System.out.println(Arrays.toString(processBuilder.command().toArray()).replace(",", ""));
+ OutputAnalyzer output = new OutputAnalyzer(processBuilder.start());
+-
+- // Log output for debugging purpose
+- System.out.println("Command output:");
+ System.out.println(output.getOutput());
+
+- if (output.getExitValue() != 0) {
+- throw new Exception(processBuilder.command()
+- + " resulted in exit value " + output.getExitValue()
+- + " , expected to get 0");
+- }
++ output.shouldHaveExitValue(0);
+
+ return output;
+ }
+--- ./jdk/test/lib/testlibrary/jdk/testlibrary/JdkFinder.java Wed May 07 19:26:47 2014 -0700
++++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+@@ -1,78 +0,0 @@
+-/*
+- * 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.
+- */
+-
+-package jdk.testlibrary;
+-
+-import java.io.File;
+-
+-public final class JdkFinder {
+-
+- private JdkFinder() {
+- }
+-
+- private static String getExecutable(String executable, String property) {
+- String binPath = System.getProperty(property);
+- if (binPath == null) {
+- throw new RuntimeException(
+- "System property '" + property + "' not set");
+- }
+-
+- binPath += File.separatorChar + "bin" + File.separatorChar + executable;
+-
+- return binPath;
+- }
+-
+- /**
+- * Returns the full path to a java launcher in jdk/bin based on system
+- * property.
+- *
+- * @param stableJdk
+- * see {@link #getTool(String, boolean)}
+- * @return Full path to a java launcher in jdk/bin.
+- */
+- public static String getJavaLauncher(boolean stableJdk) {
+- return getTool("java", stableJdk);
+- }
+-
+- /**
+- * Returns the full path to an executable in jdk/bin based on system
+- * property. Depending on value of {@code stableJdk} the method will look for
+- * either 'compile.jdk' or 'test.jdk' system properties.
+- * 'test.jdk' is normally set by jtreg. When running test separately,
+- * set this property using '-Dtest.jdk=/path/to/jdk'.
+- *
+- * @param stableJdk
+- * If {@code true} the {@code tool} will be retrieved
+- * from the compile (stable) JDK.
+- * If {@code false} the {@code tool} will be retrieved
+- * from the test JDK.
+- * @return Full path to an executable in jdk/bin.
+- */
+- public static String getTool(String tool, boolean stableJdk) {
+- if (stableJdk) {
+- return getExecutable(tool, "compile.jdk");
+- } else {
+- return getExecutable(tool, "test.jdk");
+- }
+- }
+-}
+--- ./jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java Wed Apr 16 12:37:49 2014 +0400
+@@ -27,6 +27,9 @@
+ import java.util.regex.Matcher;
+ import java.util.regex.Pattern;
+
++/**
++ * Utility class for verifying output and exit value from a {@code Process}.
++ */
+ public final class OutputAnalyzer {
+
+ private final String stdout;
+@@ -85,9 +88,9 @@
+ public void shouldContain(String expectedString) {
+ if (!stdout.contains(expectedString)
+ && !stderr.contains(expectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + expectedString
+- + "' missing from stdout/stderr: [" + stdout + stderr
+- + "]\n");
++ + "' missing from stdout/stderr \n");
+ }
+ }
+
+@@ -101,8 +104,9 @@
+ */
+ public void stdoutShouldContain(String expectedString) {
+ if (!stdout.contains(expectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + expectedString
+- + "' missing from stdout: [" + stdout + "]\n");
++ + "' missing from stdout \n");
+ }
+ }
+
+@@ -116,8 +120,9 @@
+ */
+ public void stderrShouldContain(String expectedString) {
+ if (!stderr.contains(expectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + expectedString
+- + "' missing from stderr: [" + stderr + "]\n");
++ + "' missing from stderr \n");
+ }
+ }
+
+@@ -132,12 +137,14 @@
+ */
+ public void shouldNotContain(String notExpectedString) {
+ if (stdout.contains(notExpectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + notExpectedString
+- + "' found in stdout: [" + stdout + "]\n");
++ + "' found in stdout \n");
+ }
+ if (stderr.contains(notExpectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + notExpectedString
+- + "' found in stderr: [" + stderr + "]\n");
++ + "' found in stderr \n");
+ }
+ }
+
+@@ -152,8 +159,9 @@
+ */
+ public void stdoutShouldNotContain(String notExpectedString) {
+ if (stdout.contains(notExpectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + notExpectedString
+- + "' found in stdout: [" + stdout + "]\n");
++ + "' found in stdout \n");
+ }
+ }
+
+@@ -168,55 +176,63 @@
+ */
+ public void stderrShouldNotContain(String notExpectedString) {
+ if (stderr.contains(notExpectedString)) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + notExpectedString
+- + "' found in stderr: [" + stderr + "]\n");
++ + "' found in stderr \n");
+ }
+ }
+
+ /**
+- * Verify that the stdout and stderr contents of output buffer matches
+- * the pattern
++ * Verify that the stdout and stderr contents of output buffer matches the
++ * pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was not found
++ * @throws RuntimeException
++ * If the pattern was not found
+ */
+ public void shouldMatch(String pattern) {
+- Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+- Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
++ Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE)
++ .matcher(stdout);
++ Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE)
++ .matcher(stderr);
+ if (!stdoutMatcher.find() && !stderrMatcher.find()) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + pattern
+- + "' missing from stdout/stderr: [" + stdout + stderr
+- + "]\n");
++ + "' missing from stdout/stderr \n");
+ }
+ }
+
+ /**
+- * Verify that the stdout contents of output buffer matches the
+- * pattern
++ * Verify that the stdout contents of output buffer matches the pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was not found
++ * @throws RuntimeException
++ * If the pattern was not found
+ */
+ public void stdoutShouldMatch(String pattern) {
+- Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
++ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(
++ stdout);
+ if (!matcher.find()) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + pattern
+- + "' missing from stdout: [" + stdout + "]\n");
++ + "' missing from stdout \n");
+ }
+ }
+
+ /**
+- * Verify that the stderr contents of output buffer matches the
+- * pattern
++ * Verify that the stderr contents of output buffer matches the pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was not found
++ * @throws RuntimeException
++ * If the pattern was not found
+ */
+ public void stderrShouldMatch(String pattern) {
+- Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
++ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(
++ stderr);
+ if (!matcher.find()) {
++ reportDiagnosticSummary();
+ throw new RuntimeException("'" + pattern
+- + "' missing from stderr: [" + stderr + "]\n");
++ + "' missing from stderr \n");
+ }
+ }
+
+@@ -225,18 +241,22 @@
+ * match the pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was found
++ * @throws RuntimeException
++ * If the pattern was found
+ */
+ public void shouldNotMatch(String pattern) {
+- Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
++ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(
++ stdout);
+ if (matcher.find()) {
+- throw new RuntimeException("'" + pattern
+- + "' found in stdout: [" + stdout + "]\n");
++ reportDiagnosticSummary();
++ throw new RuntimeException("'" + pattern + "' found in stdout: '"
++ + matcher.group() + "' \n");
+ }
+ matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ if (matcher.find()) {
+- throw new RuntimeException("'" + pattern
+- + "' found in stderr: [" + stderr + "]\n");
++ reportDiagnosticSummary();
++ throw new RuntimeException("'" + pattern + "' found in stderr: '"
++ + matcher.group() + "' \n");
+ }
+ }
+
+@@ -245,13 +265,15 @@
+ * pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was found
++ * @throws RuntimeException
++ * If the pattern was found
+ */
+ public void stdoutShouldNotMatch(String pattern) {
+- Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
++ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(
++ stdout);
+ if (matcher.find()) {
+- throw new RuntimeException("'" + pattern
+- + "' found in stdout: [" + stdout + "]\n");
++ reportDiagnosticSummary();
++ throw new RuntimeException("'" + pattern + "' found in stdout \n");
+ }
+ }
+
+@@ -260,18 +282,56 @@
+ * pattern
+ *
+ * @param pattern
+- * @throws RuntimeException If the pattern was found
++ * @throws RuntimeException
++ * If the pattern was found
+ */
+ public void stderrShouldNotMatch(String pattern) {
+- Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
++ Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(
++ stderr);
+ if (matcher.find()) {
+- throw new RuntimeException("'" + pattern
+- + "' found in stderr: [" + stderr + "]\n");
++ reportDiagnosticSummary();
++ throw new RuntimeException("'" + pattern + "' found in stderr \n");
+ }
+ }
+
+ /**
+- * Verifiy the exit value of the process
++ * Get the captured group of the first string matching the pattern. stderr
++ * is searched before stdout.
++ *
++ * @param pattern
++ * The multi-line pattern to match
++ * @param group
++ * The group to capture
++ * @return The matched string or null if no match was found
++ */
++ public String firstMatch(String pattern, int group) {
++ Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE)
++ .matcher(stderr);
++ Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE)
++ .matcher(stdout);
++ if (stderrMatcher.find()) {
++ return stderrMatcher.group(group);
++ }
++ if (stdoutMatcher.find()) {
++ return stdoutMatcher.group(group);
++ }
++ return null;
++ }
++
++ /**
++ * Get the first string matching the pattern. stderr is searched before
++ * stdout.
++ *
++ * @param pattern
++ * The multi-line pattern to match
++ * @return The matched string or null if no match was found
++ */
++ public String firstMatch(String pattern) {
++ return firstMatch(pattern, 0);
++ }
++
++ /**
++ * Verify the exit value of the process
+ *
+ * @param expectedExitValue
+ * Expected exit value from process
+@@ -281,12 +341,25 @@
+ */
+ public void shouldHaveExitValue(int expectedExitValue) {
+ if (getExitValue() != expectedExitValue) {
+- throw new RuntimeException("Exit value " + getExitValue()
+- + " , expected to get " + expectedExitValue);
++ reportDiagnosticSummary();
++ throw new RuntimeException("Expected to get exit value of ["
++ + expectedExitValue + "]\n");
+ }
+ }
+
+ /**
++ * Report summary that will help to diagnose the problem Currently includes:
++ * - standard input produced by the process under test - standard output -
++ * exit code Note: the command line is printed by the ProcessTools
++ */
++ private void reportDiagnosticSummary() {
++ String msg = " stdout: [" + stdout + "];\n" + " stderr: [" + stderr
++ + "]\n" + " exitValue = " + getExitValue() + "\n";
++
++ System.err.println(msg);
++ }
++
++ /**
+ * Get the contents of the output buffer (stdout and stderr)
+ *
+ * @return Content of the output buffer
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,103 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++public class Platform {
++ private static final String osName = System.getProperty("os.name");
++ private static final String dataModel = System.getProperty("sun.arch.data.model");
++ private static final String vmVersion = System.getProperty("java.vm.version");
++ private static final String osArch = System.getProperty("os.arch");
++
++ public static boolean is32bit() {
++ return dataModel.equals("32");
++ }
++
++ public static boolean is64bit() {
++ return dataModel.equals("64");
++ }
++
++ public static boolean isSolaris() {
++ return isOs("sunos");
++ }
++
++ public static boolean isWindows() {
++ return isOs("win");
++ }
++
++ public static boolean isOSX() {
++ return isOs("mac");
++ }
++
++ public static boolean isLinux() {
++ return isOs("linux");
++ }
++
++ private static boolean isOs(String osname) {
++ return osName.toLowerCase().startsWith(osname.toLowerCase());
++ }
++
++ public static String getOsName() {
++ return osName;
++ }
++
++ public static boolean isDebugBuild() {
++ return vmVersion.toLowerCase().contains("debug");
++ }
++
++ public static String getVMVersion() {
++ return vmVersion;
++ }
++
++ // Returns true for sparc and sparcv9.
++ public static boolean isSparc() {
++ return isArch("sparc");
++ }
++
++ public static boolean isARM() {
++ return isArch("arm");
++ }
++
++ public static boolean isPPC() {
++ return isArch("ppc");
++ }
++
++ public static boolean isX86() {
++ // On Linux it's 'i386', Windows 'x86'
++ return (isArch("i386") || isArch("x86"));
++ }
++
++ public static boolean isX64() {
++ // On OSX it's 'x86_64' and on other (Linux, Windows and Solaris) platforms it's 'amd64'
++ return (isArch("amd64") || isArch("x86_64"));
++ }
++
++ private static boolean isArch(String archname) {
++ return osArch.toLowerCase().startsWith(archname.toLowerCase());
++ }
++
++ public static String getOsArch() {
++ return osArch;
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/ProcessThread.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,143 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import static jdk.testlibrary.Asserts.assertNotEquals;
++import static jdk.testlibrary.Asserts.assertTrue;
++
++import java.util.List;
++import java.util.concurrent.CountDownLatch;
++
++/**
++ * The helper class for starting and stopping {@link Process} in a separate thread.
++ */
++public class ProcessThread extends TestThread {
++
++ /**
++ * Creates a new {@code ProcessThread} object.
++ *
++ * @param threadName The name of thread
++ * @param cmd The string array of program and its arguments to pass to {@link ProcessBuilder}
++ */
++ public ProcessThread(String threadName, String... cmd) {
++ super(new ProcessRunnable(new ProcessBuilder(cmd)), threadName);
++ }
++
++ /**
++ * Creates a new {@code ProcessThread} object.
++ *
++ * @param threadName The name of thread.
++ * @param pb The ProcessBuilder to execute.
++ */
++ public ProcessThread(String threadName, ProcessBuilder pb) {
++ super(new ProcessRunnable(pb), threadName);
++ }
++
++ /**
++ * Stops {@link Process} started by {@code ProcessRunnable}.
++ *
++ * @throws InterruptedException
++ */
++ public void stopProcess() throws InterruptedException {
++ ((ProcessRunnable) getRunnable()).stopProcess();
++ }
++
++ /**
++ * @return The process output, or null if the process has not yet completed.
++ */
++ public OutputAnalyzer getOutput() {
++ return ((ProcessRunnable) getRunnable()).getOutput();
++ }
++
++ /**
++ * {@link Runnable} interface for starting and stopping {@link Process}.
++ */
++ static class ProcessRunnable extends XRun {
++
++ private final ProcessBuilder processBuilder;
++ private final CountDownLatch latch;
++ private volatile Process process;
++ private volatile OutputAnalyzer output;
++
++ /**
++ * Creates a new {@code ProcessRunnable} object.
++ *
++ * @param pb The {@link ProcessBuilder} to run.
++ */
++ public ProcessRunnable(ProcessBuilder pb) {
++ super();
++ this.processBuilder = pb;
++ this.latch = new CountDownLatch(1);
++ }
++
++ /**
++ * Starts the process in {@code ProcessThread}.
++ * All exceptions which occurs here will be caught and stored in {@code ProcessThread}.
++ *
++ * see {@link XRun}
++ */
++ @Override
++ public void xrun() throws Throwable {
++ this.process = processBuilder.start();
++ // Release when process is started
++ latch.countDown();
++
++ // Will block...
++ try {
++ output = new OutputAnalyzer(this.process);
++ } catch (Throwable t) {
++ String name = Thread.currentThread().getName();
++ System.out.println(String.format("ProcessThread[%s] failed: %s", name, t.toString()));
++ throw t;
++ } finally {
++ String logMsg = ProcessTools.getProcessLog(processBuilder, output);
++ System.out.println(logMsg);
++ }
++ }
++
++ /**
++ * Stops the process.
++ *
++ * @throws InterruptedException
++ */
++ public void stopProcess() throws InterruptedException {
++ // Wait until process is started
++ latch.await();
++ if (this.process != null) {
++ System.out.println("ProcessThread.stopProcess() will kill process");
++ this.process.destroy();
++ }
++ }
++
++ /**
++ * Returns the OutputAnalyzer with stdout/stderr from the process.
++ * @return The process output, or null if process not completed.
++ * @throws InterruptedException
++ */
++ public OutputAnalyzer getOutput() {
++ return output;
++ }
++ }
++
++}
+--- ./jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Wed Apr 16 12:37:49 2014 +0400
+@@ -25,24 +25,107 @@
+
+ import java.io.ByteArrayOutputStream;
+ import java.io.IOException;
++import java.io.PrintStream;
+ import java.lang.management.ManagementFactory;
+ import java.lang.management.RuntimeMXBean;
+ import java.lang.reflect.Field;
+ import java.lang.reflect.Method;
+ import java.util.ArrayList;
+ import java.util.Collections;
++import java.util.Map;
++import java.util.concurrent.ExecutionException;
++import java.util.concurrent.Future;
++import java.util.concurrent.Phaser;
++import java.util.concurrent.TimeUnit;
++import java.util.concurrent.TimeoutException;
+
+ import sun.management.VMManagement;
+
+ public final class ProcessTools {
++ private static final class LineForwarder extends StreamPumper.LinePump {
++ private final PrintStream ps;
++ private final String prefix;
++ LineForwarder(String prefix, PrintStream os) {
++ this.ps = os;
++ this.prefix = prefix;
++ }
++ @Override
++ protected void processLine(String line) {
++ ps.println("[" + prefix + "] " + line);
++ }
++ }
+
+ private ProcessTools() {
+ }
+
+ /**
++ * <p>Starts a process from its builder.</p>
++ * <span>The default redirects of STDOUT and STDERR are started</span>
++ * @param name The process name
++ * @param processBuilder The process builder
++ * @return Returns the initialized process
++ * @throws IOException
++ */
++ public static Process startProcess(String name,
++ ProcessBuilder processBuilder)
++ throws IOException {
++ Process p = null;
++ try {
++ p = startProcess(name, processBuilder, -1, TimeUnit.NANOSECONDS);
++ } catch (InterruptedException | TimeoutException e) {
++ // can't ever happen
++ }
++ return p;
++ }
++
++ /**
++ * <p>Starts a process from its builder.</p>
++ * <span>The default redirects of STDOUT and STDERR are started</span>
++ * @param name The process name
++ * @param processBuilder The process builder
++ * @param timeout The timeout for the warmup waiting
++ * @param unit The timeout {@linkplain TimeUnit}
++ * @return Returns the initialized {@linkplain Process}
++ * @throws IOException
++ * @throws InterruptedException
++ * @throws TimeoutException
++ */
++ public static Process startProcess(String name,
++ ProcessBuilder processBuilder,
++ long timeout,
++ TimeUnit unit)
++ throws IOException, InterruptedException, TimeoutException {
++ Process p = processBuilder.start();
++ StreamPumper stdout = new StreamPumper(p.getInputStream());
++ StreamPumper stderr = new StreamPumper(p.getErrorStream());
++
++ stdout.addPump(new LineForwarder(name, System.out));
++ stderr.addPump(new LineForwarder(name, System.err));
++ final Phaser phs = new Phaser(1);
++ Future<Void> stdoutTask = stdout.process();
++ Future<Void> stderrTask = stderr.process();
++
++ try {
++ if (timeout > -1) {
++ phs.awaitAdvanceInterruptibly(0, timeout, unit);
++ }
++ } catch (TimeoutException | InterruptedException e) {
++ System.err.println("Failed to start a process (thread dump follows)");
++ for(Map.Entry<Thread, StackTraceElement[]> s : Thread.getAllStackTraces().entrySet()) {
++ printStack(s.getKey(), s.getValue());
++ }
++ stdoutTask.cancel(true);
++ stderrTask.cancel(true);
++ throw e;
++ }
++
++ return p;
++ }
++
++ /**
+ * Pumps stdout and stderr from running the process into a String.
+ *
+- * @param processHandler
++ * @param processBuilder
+ * ProcessHandler to run.
+ * @return Output from process.
+ * @throws IOException
+@@ -69,22 +152,19 @@
+ stdoutBuffer);
+ StreamPumper errPumper = new StreamPumper(process.getErrorStream(),
+ stderrBuffer);
+- Thread outPumperThread = new Thread(outPumper);
+- Thread errPumperThread = new Thread(errPumper);
+
+- outPumperThread.setDaemon(true);
+- errPumperThread.setDaemon(true);
+-
+- outPumperThread.start();
+- errPumperThread.start();
++ Future<Void> outTask = outPumper.process();
++ Future<Void> errTask = errPumper.process();
+
+ try {
+ process.waitFor();
+- outPumperThread.join();
+- errPumperThread.join();
++ outTask.get();
++ errTask.get();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return null;
++ } catch (ExecutionException e) {
++ throw new IOException(e);
+ }
+
+ return new OutputBuffer(stdoutBuffer.toString(),
+@@ -137,15 +217,106 @@
+ */
+ public static ProcessBuilder createJavaProcessBuilder(String... command)
+ throws Exception {
+- String javapath = JdkFinder.getJavaLauncher(false);
++ String javapath = JDKToolFinder.getJDKTool("java");
+
+ ArrayList<String> args = new ArrayList<>();
+ args.add(javapath);
+ Collections.addAll(args, getPlatformSpecificVMArgs());
+ Collections.addAll(args, command);
+
++ // Reporting
++ StringBuilder cmdLine = new StringBuilder();
++ for (String cmd : args)
++ cmdLine.append(cmd).append(' ');
++ System.out.println("Command line: [" + cmdLine.toString() + "]");
++
+ return new ProcessBuilder(args.toArray(new String[args.size()]));
+-
+ }
+
++ private static void printStack(Thread t, StackTraceElement[] stack) {
++ System.out.println("\t" + t +
++ " stack: (length = " + stack.length + ")");
++ if (t != null) {
++ for (StackTraceElement stack1 : stack) {
++ System.out.println("\t" + stack1);
++ }
++ System.out.println();
++ }
++ }
++
++ /**
++ * Executes a test jvm process, waits for it to finish and returns the process output.
++ * The default jvm options from jtreg, test.vm.opts and test.java.opts, are added.
++ * The java from the test.jdk is used to execute the command.
++ *
++ * The command line will be like:
++ * {test.jdk}/bin/java {test.vm.opts} {test.java.opts} cmds
++ *
++ * @param cmds User specifed arguments.
++ * @return The output from the process.
++ */
++ public static OutputAnalyzer executeTestJvm(String... cmds) throws Throwable {
++ ProcessBuilder pb = createJavaProcessBuilder(Utils.addTestJavaOpts(cmds));
++ return executeProcess(pb);
++ }
++
++ /**
++ * Executes a process, waits for it to finish and returns the process output.
++ * @param pb The ProcessBuilder to execute.
++ * @return The output from the process.
++ */
++ public static OutputAnalyzer executeProcess(ProcessBuilder pb) throws Throwable {
++ OutputAnalyzer output = null;
++ try {
++ output = new OutputAnalyzer(pb.start());
++ return output;
++ } catch (Throwable t) {
++ System.out.println("executeProcess() failed: " + t);
++ throw t;
++ } finally {
++ System.out.println(getProcessLog(pb, output));
++ }
++ }
++
++ /**
++ * Executes a process, waits for it to finish and returns the process output.
++ * @param cmds The command line to execute.
++ * @return The output from the process.
++ */
++ public static OutputAnalyzer executeProcess(String... cmds) throws Throwable {
++ return executeProcess(new ProcessBuilder(cmds));
++ }
++
++ /**
++ * Used to log command line, stdout, stderr and exit code from an executed process.
++ * @param pb The executed process.
++ * @param output The output from the process.
++ */
++ public static String getProcessLog(ProcessBuilder pb, OutputAnalyzer output) {
++ String stderr = output == null ? "null" : output.getStderr();
++ String stdout = output == null ? "null" : output.getStdout();
++ String exitValue = output == null ? "null": Integer.toString(output.getExitValue());
++ StringBuilder logMsg = new StringBuilder();
++ final String nl = System.getProperty("line.separator");
++ logMsg.append("--- ProcessLog ---" + nl);
++ logMsg.append("cmd: " + getCommandLine(pb) + nl);
++ logMsg.append("exitvalue: " + exitValue + nl);
++ logMsg.append("stderr: " + stderr + nl);
++ logMsg.append("stdout: " + stdout + nl);
++ return logMsg.toString();
++ }
++
++ /**
++ * @return The full command line for the ProcessBuilder.
++ */
++ public static String getCommandLine(ProcessBuilder pb) {
++ if (pb == null) {
++ return "null";
++ }
++ StringBuilder cmd = new StringBuilder();
++ for (String s : pb.command()) {
++ cmd.append(s).append(" ");
++ }
++ return cmd.toString().trim();
++ }
+ }
+--- ./jdk/test/lib/testlibrary/jdk/testlibrary/StreamPumper.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/StreamPumper.java Wed Apr 16 12:37:49 2014 +0400
+@@ -23,16 +23,65 @@
+
+ package jdk.testlibrary;
+
++import java.io.BufferedInputStream;
++import java.io.ByteArrayOutputStream;
+ import java.io.OutputStream;
+ import java.io.InputStream;
+ import java.io.IOException;
++import java.util.HashSet;
++import java.util.Set;
++import java.util.concurrent.Future;
++import java.util.concurrent.FutureTask;
++import java.util.concurrent.atomic.AtomicBoolean;
+
+ public final class StreamPumper implements Runnable {
+
+ private static final int BUF_SIZE = 256;
+
+- private final OutputStream out;
++ /**
++ * Pump will be called by the StreamPumper to process the incoming data
++ */
++ abstract public static class Pump {
++ abstract void register(StreamPumper d);
++ }
++
++ /**
++ * OutputStream -> Pump adapter
++ */
++ final public static class StreamPump extends Pump {
++ private final OutputStream out;
++ public StreamPump(OutputStream out) {
++ this.out = out;
++ }
++
++ @Override
++ void register(StreamPumper sp) {
++ sp.addOutputStream(out);
++ }
++ }
++
++ /**
++ * Used to process the incoming data line-by-line
++ */
++ abstract public static class LinePump extends Pump {
++ @Override
++ final void register(StreamPumper sp) {
++ sp.addLineProcessor(this);
++ }
++
++ abstract protected void processLine(String line);
++ }
++
+ private final InputStream in;
++ private final Set<OutputStream> outStreams = new HashSet<>();
++ private final Set<LinePump> linePumps = new HashSet<>();
++
++ private final AtomicBoolean processing = new AtomicBoolean(false);
++ private final FutureTask<Void> processingTask = new FutureTask(this, null);
++
++ public StreamPumper(InputStream in) {
++ this.in = in;
++ }
+
+ /**
+ * Create a StreamPumper that reads from in and writes to out.
+@@ -43,8 +92,8 @@
+ * The stream to write to.
+ */
+ public StreamPumper(InputStream in, OutputStream out) {
+- this.in = in;
+- this.out = out;
++ this(in);
++ this.addOutputStream(out);
+ }
+
+ /**
+@@ -54,25 +103,97 @@
+ */
+ @Override
+ public void run() {
+- int length;
+- InputStream localIn = in;
+- OutputStream localOut = out;
+- byte[] buffer = new byte[BUF_SIZE];
++ try (BufferedInputStream is = new BufferedInputStream(in)) {
++ ByteArrayOutputStream lineBos = new ByteArrayOutputStream();
++ byte[] buf = new byte[BUF_SIZE];
++ int len = 0;
++ int linelen = 0;
+
+- try {
+- while ((length = localIn.read(buffer)) > 0 && !Thread.interrupted()) {
+- localOut.write(buffer, 0, length);
++ while ((len = is.read(buf)) > 0 && !Thread.interrupted()) {
++ for(OutputStream out : outStreams) {
++ out.write(buf, 0, len);
++ }
++ if (!linePumps.isEmpty()) {
++ int i = 0;
++ int lastcrlf = -1;
++ while (i < len) {
++ if (buf[i] == '\n' || buf[i] == '\r') {
++ int bufLinelen = i - lastcrlf - 1;
++ if (bufLinelen > 0) {
++ lineBos.write(buf, lastcrlf + 1, bufLinelen);
++ }
++ linelen += bufLinelen;
++
++ if (linelen > 0) {
++ lineBos.flush();
++ final String line = lineBos.toString();
++ for (LinePump lp : linePumps) {
++ lp.processLine(line);
++ };
++ lineBos.reset();
++ linelen = 0;
++ }
++ lastcrlf = i;
++ }
++
++ i++;
++ }
++ if (lastcrlf == -1) {
++ lineBos.write(buf, 0, len);
++ linelen += len;
++ } else if (lastcrlf < len - 1) {
++ lineBos.write(buf, lastcrlf + 1, len - lastcrlf - 1);
++ linelen += len - lastcrlf - 1;
++ }
++ }
+ }
++
+ } catch (IOException e) {
+- // Just abort if something like this happens.
+ e.printStackTrace();
+ } finally {
++ for(OutputStream out : outStreams) {
++ try {
++ out.flush();
++ } catch (IOException e) {}
++ }
+ try {
+- localOut.flush();
+ in.close();
+- } catch (IOException e) {
+- e.printStackTrace();
+- }
++ } catch (IOException e) {}
+ }
+ }
++
++ final void addOutputStream(OutputStream out) {
++ outStreams.add(out);
++ }
++
++ final void addLineProcessor(LinePump lp) {
++ linePumps.add(lp);
++ }
++
++ final public StreamPumper addPump(Pump ... pump) {
++ if (processing.get()) {
++ throw new IllegalStateException("Can not modify pumper while " +
++ "processing is in progress");
++ }
++ for(Pump p : pump) {
++ p.register(this);
++ }
++ return this;
++ }
++
++ final public Future<Void> process() {
++ if (!processing.compareAndSet(false, true)) {
++ throw new IllegalStateException("Can not re-run the processing");
++ }
++ Thread t = new Thread(new Runnable() {
++ @Override
++ public void run() {
++ processingTask.run();
++ }
++ });
++ t.setDaemon(true);
++ t.start();
++
++ return processingTask;
++ }
+ }
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/TestThread.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,249 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import java.lang.management.ManagementFactory;
++import java.lang.management.ThreadInfo;
++import java.lang.management.ThreadMXBean;
++import java.util.concurrent.TimeoutException;
++
++/**
++ * Thread which catches exceptions thrown during the execution
++ * and stores them for later analysis.
++ *
++ * <pre>
++ * {@code
++ * TestThread thread = new TestThread(new XRun() {
++ * public void run() {
++ * // do something
++ * }
++ * });
++ * thread.start();
++ * // do something
++ * Throwable uncaught = thread.getUncaught();
++ * }
++ * </pre>
++ */
++public class TestThread extends Thread {
++
++ private final Runnable runnable;
++ private volatile Throwable uncaught;
++
++ /**
++ * Returns {@link Runnable} the thread has been created with.
++ *
++ * @return The object whose {@code run} method is called
++ */
++ public Runnable getRunnable() {
++ return runnable;
++ }
++
++ /**
++ * Creates a new {@code TestThread} object.
++ *
++ * @param target The object whose {@code run} method is called
++ * @param name The thread name
++ */
++ public TestThread(Runnable target, String name) {
++ super(target, name);
++ this.runnable = target;
++ }
++
++ /**
++ * Creates a new {@code TestThread} object.
++ *
++ * @param target The object whose {@code run} method is called
++ */
++ public TestThread(Runnable target) {
++ super(target);
++ this.runnable = target;
++ }
++
++ /**
++ * Creates a new {@code TestThread} object.
++ *
++ * @param group The thread group
++ * @param target The object whose {@code run} method is called
++ * @param name The thread name
++ * @param stackSize Stack size
++ */
++ public TestThread(ThreadGroup group, Runnable target, String name,
++ long stackSize) {
++ super(group, target, name, stackSize);
++ this.runnable = target;
++ }
++
++ /**
++ * Creates a new {@code TestThread} object.
++ *
++ * @param group The thread group
++ * @param target The object whose {@code run} method is called
++ * @param name The thread name
++ */
++ public TestThread(ThreadGroup group, Runnable target, String name) {
++ super(group, target, name);
++ this.runnable = target;
++ }
++
++ /**
++ * Creates a new {@code TestThread} object.
++ *
++ * @param group The thread group
++ * @param target The object whose {@code run} method is called
++ */
++ public TestThread(ThreadGroup group, Runnable target) {
++ super(group, target);
++ this.runnable = target;
++ }
++
++ /**
++ * The thread executor.
++ */
++ @Override
++ public void run() {
++ try {
++ super.run();
++ } catch (Throwable t) {
++ uncaught = t;
++ }
++ }
++
++ /**
++ * Returns exception caught during the execution.
++ *
++ * @return {@link Throwable}
++ */
++ public Throwable getUncaught() {
++ return uncaught;
++ }
++
++ /**
++ * Waits for {@link TestThread} to die
++ * and throws exception caught during the execution.
++ *
++ * @throws InterruptedException
++ * @throws Throwable
++ */
++ public void joinAndThrow() throws InterruptedException, Throwable {
++ join();
++ if (uncaught != null) {
++ throw uncaught;
++ }
++ }
++
++ /**
++ * Waits during {@code timeout} for {@link TestThread} to die
++ * and throws exception caught during the execution.
++ *
++ * @param timeout The time to wait in milliseconds
++ * @throws InterruptedException
++ * @throws Throwable
++ */
++ public void joinAndThrow(long timeout) throws InterruptedException,
++ Throwable {
++ join(timeout);
++ if (isAlive()) {
++ throw new TimeoutException();
++ }
++ if (uncaught != null) {
++ throw uncaught;
++ }
++ }
++
++ /**
++ * Waits for {@link TestThread} to die
++ * and returns exception caught during the execution.
++ *
++ * @return Exception caught during the execution
++ * @throws InterruptedException
++ */
++ public Throwable joinAndReturn() throws InterruptedException {
++ join();
++ if (uncaught != null) {
++ return uncaught;
++ }
++ return null;
++ }
++
++ /**
++ * Waits during {@code timeout} for {@link TestThread} to die
++ * and returns exception caught during the execution.
++ *
++ * @param timeout The time to wait in milliseconds
++ * @return Exception caught during the execution
++ * @throws InterruptedException
++ */
++ public Throwable joinAndReturn(long timeout) throws InterruptedException {
++ join(timeout);
++ if (isAlive()) {
++ return new TimeoutException();
++ }
++ if (uncaught != null) {
++ return uncaught;
++ }
++ return null;
++ }
++
++ /**
++ * Waits until {@link TestThread} is in the certain {@link State}
++ * and blocking on {@code object}.
++ *
++ * @param state The thread state
++ * @param object The object to block on
++ */
++ public void waitUntilBlockingOnObject(Thread.State state, Object object) {
++ String want = object == null ? null : object.getClass().getName() + '@'
++ + Integer.toHexString(System.identityHashCode(object));
++ ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
++ while (isAlive()) {
++ ThreadInfo ti = tmx.getThreadInfo(getId());
++ if (ti.getThreadState() == state
++ && (want == null || want.equals(ti.getLockName()))) {
++ return;
++ }
++ try {
++ Thread.sleep(1);
++ } catch (InterruptedException e) {
++ }
++ }
++ }
++
++ /**
++ * Waits until {@link TestThread} is in native.
++ */
++ public void waitUntilInNative() {
++ ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
++ while (isAlive()) {
++ ThreadInfo ti = tmx.getThreadInfo(getId());
++ if (ti.isInNative()) {
++ return;
++ }
++ try {
++ Thread.sleep(1);
++ } catch (InterruptedException e) {
++ }
++ }
++ }
++
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,232 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++import static jdk.testlibrary.Asserts.assertTrue;
++
++import java.io.IOException;
++import java.net.InetAddress;
++import java.net.ServerSocket;
++import java.net.UnknownHostException;
++import java.util.ArrayList;
++import java.util.List;
++import java.util.Arrays;
++import java.util.Collections;
++import java.util.regex.Pattern;
++import java.util.regex.Matcher;
++
++/**
++ * Common library for various test helper functions.
++ */
++public final class Utils {
++
++ /**
++ * Returns the sequence used by operating system to separate lines.
++ */
++ public static final String NEW_LINE = System.getProperty("line.separator");
++
++ /**
++ * Returns the value of 'test.vm.opts'system property.
++ */
++ public static final String VM_OPTIONS = System.getProperty("test.vm.opts", "").trim();
++
++ /**
++ * Returns the value of 'test.java.opts'system property.
++ */
++ public static final String JAVA_OPTIONS = System.getProperty("test.java.opts", "").trim();
++
++
++ private Utils() {
++ // Private constructor to prevent class instantiation
++ }
++
++ /**
++ * Returns the list of VM options.
++ *
++ * @return List of VM options
++ */
++ public static List<String> getVmOptions() {
++ return Arrays.asList(safeSplitString(VM_OPTIONS));
++ }
++
++ /**
++ * Returns the list of VM options with -J prefix.
++ *
++ * @return The list of VM options with -J prefix
++ */
++ public static List<String> getForwardVmOptions() {
++ String[] opts = safeSplitString(VM_OPTIONS);
++ for (int i = 0; i < opts.length; i++) {
++ opts[i] = "-J" + opts[i];
++ }
++ return Arrays.asList(opts);
++ }
++
++ /**
++ * Returns the default JTReg arguments for a jvm running a test.
++ * This is the combination of JTReg arguments test.vm.opts and test.java.opts.
++ * @return An array of options, or an empty array if no opptions.
++ */
++ public static String[] getTestJavaOpts() {
++ List<String> opts = new ArrayList<String>();
++ Collections.addAll(opts, safeSplitString(VM_OPTIONS));
++ Collections.addAll(opts, safeSplitString(JAVA_OPTIONS));
++ return opts.toArray(new String[0]);
++ }
++
++ /**
++ * Combines given arguments with default JTReg arguments for a jvm running a test.
++ * This is the combination of JTReg arguments test.vm.opts and test.java.opts
++ * @return The combination of JTReg test java options and user args.
++ */
++ public static String[] addTestJavaOpts(String... userArgs) {
++ List<String> opts = new ArrayList<String>();
++ Collections.addAll(opts, getTestJavaOpts());
++ Collections.addAll(opts, userArgs);
++ return opts.toArray(new String[0]);
++ }
++
++ /**
++ * Splits a string by white space.
++ * Works like String.split(), but returns an empty array
++ * if the string is null or empty.
++ */
++ private static String[] safeSplitString(String s) {
++ if (s == null || s.trim().isEmpty()) {
++ return new String[] {};
++ }
++ return s.trim().split("\\s+");
++ }
++
++ /**
++ * @return The full command line for the ProcessBuilder.
++ */
++ public static String getCommandLine(ProcessBuilder pb) {
++ StringBuilder cmd = new StringBuilder();
++ for (String s : pb.command()) {
++ cmd.append(s).append(" ");
++ }
++ return cmd.toString();
++ }
++
++ /**
++ * Returns the free port on the local host.
++ * The function will spin until a valid port number is found.
++ *
++ * @return The port number
++ * @throws InterruptedException if any thread has interrupted the current thread
++ * @throws IOException if an I/O error occurs when opening the socket
++ */
++ public static int getFreePort() throws InterruptedException, IOException {
++ int port = -1;
++
++ while (port <= 0) {
++ Thread.sleep(100);
++
++ ServerSocket serverSocket = null;
++ try {
++ serverSocket = new ServerSocket(0);
++ port = serverSocket.getLocalPort();
++ } finally {
++ serverSocket.close();
++ }
++ }
++
++ return port;
++ }
++
++ /**
++ * Returns the name of the local host.
++ *
++ * @return The host name
++ * @throws UnknownHostException if IP address of a host could not be determined
++ */
++ public static String getHostname() throws UnknownHostException {
++ InetAddress inetAddress = InetAddress.getLocalHost();
++ String hostName = inetAddress.getHostName();
++
++ assertTrue((hostName != null && !hostName.isEmpty()),
++ "Cannot get hostname");
++
++ return hostName;
++ }
++
++ /**
++ * Uses "jcmd -l" to search for a jvm pid. This function will wait
++ * forever (until jtreg timeout) for the pid to be found.
++ * @param key Regular expression to search for
++ * @return The found pid.
++ */
++ public static int waitForJvmPid(String key) throws Throwable {
++ final long iterationSleepMillis = 250;
++ System.out.println("waitForJvmPid: Waiting for key '" + key + "'");
++ System.out.flush();
++ while (true) {
++ int pid = tryFindJvmPid(key);
++ if (pid >= 0) {
++ return pid;
++ }
++ Thread.sleep(iterationSleepMillis);
++ }
++ }
++
++ /**
++ * Searches for a jvm pid in the output from "jcmd -l".
++ *
++ * Example output from jcmd is:
++ * 12498 sun.tools.jcmd.JCmd -l
++ * 12254 /tmp/jdk8/tl/jdk/JTwork/classes/com/sun/tools/attach/Application.jar
++ *
++ * @param key A regular expression to search for.
++ * @return The found pid, or -1 if Enot found.
++ * @throws Exception If multiple matching jvms are found.
++ */
++ public static int tryFindJvmPid(String key) throws Throwable {
++ ProcessBuilder pb = null;
++ OutputAnalyzer output = null;
++ try {
++ JDKToolLauncher jcmdLauncher = JDKToolLauncher.create("jcmd");
++ jcmdLauncher.addToolArg("-l");
++ output = ProcessTools.executeProcess(jcmdLauncher.getCommand());
++ output.shouldHaveExitValue(0);
++
++ // Search for a line starting with numbers (pid), follwed by the key.
++ Pattern pattern = Pattern.compile("([0-9]+)\\s.*(" + key + ").*\\r?\\n");
++ Matcher matcher = pattern.matcher(output.getStdout());
++
++ int pid = -1;
++ if (matcher.find()) {
++ pid = Integer.parseInt(matcher.group(1));
++ System.out.println("findJvmPid.pid: " + pid);
++ if (matcher.find()) {
++ throw new Exception("Found multiple JVM pids for key: " + key);
++ }
++ }
++ return pid;
++ } catch (Throwable t) {
++ System.out.println(String.format("Utils.findJvmPid(%s) failed: %s", key, t));
++ throw t;
++ }
++ }
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/lib/testlibrary/jdk/testlibrary/XRun.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,56 @@
++/*
++ * 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.
++ */
++
++package jdk.testlibrary;
++
++/**
++ * This type serves no other purpose than to simply allow automatically running
++ * something in a thread, and have all exceptions propagated to
++ * RuntimeExceptions, which are thrown up to thread, which in turn should
++ * probably be a {@link TestThread} to they are stored.
++ */
++public abstract class XRun implements Runnable {
++
++ /**
++ * Invokes {@code xrun()} and throws all exceptions caught in it
++ * up to the thread.
++ */
++ public final void run() {
++ try {
++ xrun();
++ } catch (Error e) {
++ throw e;
++ } catch (RuntimeException e) {
++ throw e;
++ } catch (Throwable e) {
++ throw new RuntimeException(e);
++ }
++ }
++
++ /**
++ * Override this method to implement what to run in the thread.
++ *
++ * @throws Throwable
++ */
++ protected abstract void xrun() throws Throwable;
++}
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ ./jdk/test/sun/awt/image/bug8038000.java Wed Apr 16 12:37:49 2014 +0400
+@@ -0,0 +1,153 @@
++/*
++ * 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 8038000
++ *
++ * @summary Verifies that we could create different type of Rasters with height 1
++ * and strideline which exceeds raster width.
++ * Also checks that a set of RasterOp work correctly with such kind of Rasters.
++ *
++ * @run main bug8038000
++ */
++
++import java.awt.*;
++import java.awt.color.ColorSpace;
++import java.awt.geom.AffineTransform;
++import java.awt.image.*;
++import java.util.Arrays;
++
++public class bug8038000 {
++
++ public static void main(String[] args) throws Exception {
++ new bug8038000().checkOps();
++
++ // No exceptions - Passed
++ }
++
++ private void checkOps() throws Exception {
++
++ RasterOp[] ops = new RasterOp[] {
++ new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_sRGB),
++ ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), null),
++ new AffineTransformOp(AffineTransform.getScaleInstance(1, 1.1), null)
++ };
++
++
++ for (RasterOp op: ops) {
++ // Banded rasters
++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_BYTE, 10, 1, 10,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null),
++ Raster.createBandedRaster(DataBuffer.TYPE_BYTE, 10, 1, 1001,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op);
++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_USHORT, 10, 1, 10,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null),
++ Raster.createBandedRaster(DataBuffer.TYPE_USHORT, 10, 1, 1001,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op);
++ checkOp(Raster.createBandedRaster(DataBuffer.TYPE_INT, 10, 1, 10,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null),
++ Raster.createBandedRaster(DataBuffer.TYPE_INT, 10, 1, 1001,
++ new int[] {0, 1, 2}, new int[]{2,1,0}, null), op);
++
++ // Interleaved rasters
++ checkOp(Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,
++ 10, 1, 30, 3, new int[]{0, 1, 2}, null),
++ Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,
++ 10, 1, 1001, 3, new int[]{0, 1, 2}, null),
++ op);
++
++ checkOp(Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT,
++ 10, 1, 30, 3, new int[]{0, 1, 2}, null),
++ Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT,
++ 10, 1, 1001, 3, new int[]{0, 1, 2}, null),
++ op);
++
++ // Packed rasters
++ checkOp(Raster.createPackedRaster(new DataBufferByte(10), 10, 1, 10,
++ new int[] {0x01, 0x02, 0x04}, null),
++ Raster.createPackedRaster(new DataBufferByte(10), 10, 1, 2000,
++ new int[] {0x01, 0x02, 0x04}, null),
++ op);
++ checkOp(Raster.createPackedRaster(new DataBufferInt(10), 10, 1, 10,
++ new int[] {0xff0000, 0x00ff00, 0x0000ff}, null),
++ Raster.createPackedRaster(new DataBufferInt(10), 10, 1, 20,
++ new int[] {0xff0000, 0x00ff00, 0x0000ff}, null),
++ op);
++
++ }
++ }
++
++ /**
++ * Takes two identical rasters (identical with the exception of scanline stride)
++ * fills their pixels with identical data, applies the RasterOp to both rasters
++ * and checks that the result is the same
++ */
++ private void checkOp(WritableRaster wr1, WritableRaster wr2, RasterOp op) {
++ System.out.println("Checking " + op + " with rasters: \n " + wr1 +
++ "\n " + wr2);
++ try {
++ WritableRaster r1 = op.filter(fillRaster(wr1), null);
++ WritableRaster r2 = op.filter(fillRaster(wr2), null);
++ compareRasters(r1, r2);
++ } catch (ImagingOpException e) {
++ System.out.println(" Skip: Op is not supported: " + e);
++ }
++ }
++
++ private WritableRaster fillRaster(WritableRaster wr) {
++ int c = 0;
++ for(int x = wr.getMinX(); x < wr.getMinX() + wr.getWidth(); x++) {
++ for(int y = wr.getMinY(); y < wr.getMinY() + wr.getHeight(); y++) {
++ for (int b = 0; b < wr.getNumBands(); b++) {
++ wr.setSample(x, y, b, c++);
++ }
++ }
++ }
++ return wr;
++ }
++
++ private void compareRasters(Raster r1, Raster r2) {
++ Rectangle bounds = r1.getBounds();
++ if (!bounds.equals(r2.getBounds())) {
++ throw new RuntimeException("Bounds differ.");
++ }
++
++ if (r1.getNumBands() != r2.getNumBands()) {
++ throw new RuntimeException("Bands differ.");
++ }
++
++ int[] b1 = new int[r1.getNumBands()];
++ int[] b2 = new int[r1.getNumBands()];
++
++ for (int x = (int) bounds.getX(); x < bounds.getMaxX(); x++) {
++ for (int y = (int) bounds.getY(); y < bounds.getMaxY(); y++) {
++ r1.getPixel(x,y, b1);
++ r2.getPixel(x,y, b2);
++ if (!Arrays.equals(b1, b2)) {
++ throw new RuntimeException("Pixels differ.");
++ }
++ }
++ }
++ }
++}
+--- ./jdk/test/sun/security/pkcs11/fips/CipherTest.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/sun/security/pkcs11/fips/CipherTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -458,8 +458,21 @@
+ return false;
+ }
+
++ // No ECDH-capable certificate in key store. May restructure
++ // this in the future.
++ if (cipherSuite.contains("ECDHE_ECDSA") ||
++ cipherSuite.contains("ECDH_ECDSA") ||
++ cipherSuite.contains("ECDH_RSA")) {
++ System.out.println("Skipping unsupported test for " +
++ cipherSuite + " of " + protocol);
++ return false;
++ }
++
+ // skip SSLv2Hello protocol
+- if (protocol.equals("SSLv2Hello")) {
++ //
++ // skip TLSv1.2 protocol, we have not implement "SunTls12Prf" and
++ // SunTls12RsaPremasterSecret in SunPKCS11 provider
++ if (protocol.equals("SSLv2Hello") || protocol.equals("TLSv1.2")) {
+ System.out.println("Skipping unsupported test for " +
+ cipherSuite + " of " + protocol);
+ return false;
+--- ./jdk/test/sun/security/pkcs11/fips/ClientJSSEServerJSSE.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/sun/security/pkcs11/fips/ClientJSSEServerJSSE.java Wed Apr 16 12:37:49 2014 +0400
+@@ -23,7 +23,7 @@
+
+ /*
+ * @test
+- * @bug 6313675 6323647
++ * @bug 6313675 6323647 8028192
+ * @summary Verify that all ciphersuites work in FIPS mode
+ * @library ..
+ * @ignore JSSE supported cipher suites are changed with CR 6916074,
+@@ -44,9 +44,13 @@
+ return;
+ }
+
+- if ("sparc".equals(System.getProperty("os.arch")) == false) {
+- // we have not updated other platforms with the proper NSS libraries yet
+- System.out.println("Test currently works only on solaris-sparc, skipping");
++ String arch = System.getProperty("os.arch");
++ if (!("sparc".equals(arch) || "sparcv9".equals(arch))) {
++ // we have not updated other platforms with the proper NSS
++ // libraries yet
++ System.out.println(
++ "Test currently works only on solaris-sparc " +
++ "and solaris-sparcv9. Skipping on " + arch);
+ return;
+ }
+
+--- ./jdk/test/sun/security/pkcs11/tls/TestPremaster.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/sun/security/pkcs11/tls/TestPremaster.java Wed Apr 16 12:37:49 2014 +0400
+@@ -34,6 +34,7 @@
+
+ import javax.crypto.KeyGenerator;
+ import javax.crypto.SecretKey;
++import java.util.Formatter;
+
+ import sun.security.internal.spec.TlsRsaPremasterSecretParameterSpec;
+
+@@ -59,27 +60,51 @@
+ System.out.println("OK: " + e);
+ }
+
+- test(kg, 3, 0);
+- test(kg, 3, 1);
+- test(kg, 3, 2);
+- test(kg, 4, 0);
++ int[] protocolVersions = {0x0300, 0x0301, 0x0302, 0x0400};
++ for (int clientVersion : protocolVersions) {
++ for (int serverVersion : protocolVersions) {
++ test(kg, clientVersion, serverVersion);
++ if (serverVersion >= clientVersion) {
++ break;
++ }
++ }
++ }
+
+ System.out.println("Done.");
+ }
+
+- private static void test(KeyGenerator kg, int major, int minor)
+- throws Exception {
++ private static void test(KeyGenerator kg,
++ int clientVersion, int serverVersion) throws Exception {
+
+- kg.init(new TlsRsaPremasterSecretParameterSpec(major, minor));
++ System.out.printf(
++ "Testing RSA pre-master secret key generation between " +
++ "client (0x%04X) and server(0x%04X)%n",
++ clientVersion, serverVersion);
++ kg.init(new TlsRsaPremasterSecretParameterSpec(
++ clientVersion, serverVersion));
+ SecretKey key = kg.generateKey();
+ byte[] encoded = key.getEncoded();
+- if (encoded.length != 48) {
+- throw new Exception("length: " + encoded.length);
+- }
+- if ((encoded[0] != major) || (encoded[1] != minor)) {
+- throw new Exception("version mismatch: " + encoded[0] +
+- "." + encoded[1]);
+- }
+- System.out.println("OK: " + major + "." + minor);
++ if (encoded != null) { // raw key material may be not extractable
++ if (encoded.length != 48) {
++ throw new Exception("length: " + encoded.length);
++ }
++ int v = versionOf(encoded[0], encoded[1]);
++ if (clientVersion != v) {
++ if (serverVersion != v || clientVersion >= 0x0302) {
++ throw new Exception(String.format(
++ "version mismatch: (0x%04X) rather than (0x%04X) " +
++ "is used in pre-master secret", v, clientVersion));
++ }
++ System.out.printf("Use compatible version (0x%04X)%n", v);
++ }
++ System.out.println("Passed, version matches!");
++ } else {
++ System.out.println("Raw key material is not extractable");
++ }
+ }
++
++ private static int versionOf(int major, int minor) {
++ return ((major & 0xFF) << 8) | (minor & 0xFF);
++ }
++
+ }
+--- ./jdk/test/sun/text/resources/LocaleData Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/sun/text/resources/LocaleData Wed Apr 16 12:37:49 2014 +0400
+@@ -11,7 +11,7 @@
+ # bug #4052679
+ LocaleNames/fr/fr=fran\u00e7ais
+
+-# bug #4055602, 4290801
++# bug #4055602, 4290801, 8013836
+ CurrencyNames/pt_BR/BRL=R$
+ FormatData/pt_BR/NumberPatterns/0=#,##0.###;-#,##0.###
+ # FormatData/pt_BR/NumberPatterns/1=R$ #,##0.##;-R$ #,##0.## # Changed; see bug 4122840
+@@ -37,7 +37,7 @@
+ FormatData/pt_BR/DayNames/0=Domingo
+ FormatData/pt_BR/DayNames/1=Segunda-feira
+ FormatData/pt_BR/DayNames/2=Ter\u00e7a-feira
+-CalendarData/pt_BR/firstDayOfWeek=2
++CalendarData/pt_BR/firstDayOfWeek=1
+ CalendarData/pt_BR/minimalDaysInFirstWeek=1
+ FormatData/pt_BR/MonthNames/0=Janeiro
+ FormatData/pt_BR/MonthNames/1=Fevereiro
+--- ./jdk/test/sun/text/resources/LocaleDataTest.java Wed May 07 19:26:47 2014 -0700
++++ ./jdk/test/sun/text/resources/LocaleDataTest.java Wed Apr 16 12:37:49 2014 +0400
+@@ -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
+@@ -34,7 +34,7 @@
+ * 6509039 6609737 6610748 6645271 6507067 6873931 6450945 6645268 6646611
+ * 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787
+ * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7189611
+- * 7171028
++ * 7171028 8013836
+ * @summary Verify locale data
+ *
+ */
+--- ./langtools/.hgtags Wed May 07 19:27:09 2014 -0700
++++ ./langtools/.hgtags Wed Jun 25 09:05:13 2014 -0700
+@@ -408,6 +408,7 @@
+ 2a9f5c00ba46f895bc9d16a584bf7d80c1822268 jdk7u55-b02
+ 0479d260ac835eb3f0c7f3d7d15be0599b92a20a jdk7u55-b03
+ a244cc40ae0b29028ff8503ee516cb5f9e3db6e3 jdk7u55-b04
++25d63d986653d81522b01bbd2664083ae5fdc243 jdk7u65-b00
+ 25d63d986653d81522b01bbd2664083ae5fdc243 jdk7u55-b05
+ 76eeeaace70d38795eef5215f758493421cee0ac jdk7u55-b06
+ 08f7914d6aa947e73269b4e60110ed12573ffa28 jdk7u55-b07
+@@ -420,6 +421,11 @@
+ 96d55b4d88fea1d9f8227e70003210a6c10a1dba jdk7u55-b30
+ c1964a222000b4884b992fdbaf8f62a45fb893c9 jdk7u55-b14
+ 4f6115ba266e5489b5e1968a28304f82be1f5641 jdk7u55-b31
++ec8793f5aa4fb0aff4aa2f02f458fa6720f3ec6f jdk7u55-b32
++13fed9e9f022e4a7f914c8410cbaa6f6564d4efd jdk7u55-b33
++d9e4f2bb3d75d15dac2c37c6ef9f64ee49ea1728 jdk7u55-b34
++c5cfebcc373607c78d577fad2146821fafc46868 jdk7u55-b35
++284494d407006c826bc434a79cab37b17e1849e3 jdk7u55-b36
+ 849b17bc6e9a08fa41e0ef631e51366a09842e64 jdk7u60-b00
+ b19e375d9829daf207b1bdc7f908a3e1d548462c jdk7u60-b01
+ 954e1616449af74f68aed57261cbeb62403377f1 jdk7u60-b02
+@@ -437,6 +443,28 @@
+ a8b9c1929e50a9f3ae9ae1a23c06fa73a57afce3 jdk7u60-b14
+ 7568ebdada118da1d1a6addcf6316ffda21801fd jdk7u60-b15
+ 057caf9e0774e7c530c5710127f70c8d5f46deab jdk7u60-b16
++b7cc00c573c294b144317d44803758a291b3deda jdk7u60-b17
+ b7cc00c573c294b144317d44803758a291b3deda jdk7u60-b18
+-b7cc00c573c294b144317d44803758a291b3deda jdk7u60-b17
++7effcbb8d1fd7ced194a294e29eea28bf552ac34 jdk7u65-b01
+ 40aa95c8477aa0a3f090859570f5536afc9026b7 jdk7u60-b19
++b578e801c5f0e41be96d58e213b32f5c0c9278e8 jdk7u60-b30
++c1c8f9d50b3e0d7d8af08be4270649a7572b68d4 jdk7u60-b31
++ab67af57536bf46e54b5b28462d34274aaa67025 jdk7u60-b32
++e7a68fd132f7a2f39ed72d804b4574a4cc3defb2 jdk7u60-b33
++75b8c65f4c148baa4084022035b22de47df9426b jdk7u65-b02
++16bb02dae837566f3c350c6313b09f6110dcba68 jdk7u65-b03
++91677116552f743f3589f3d2ba255fa1079c0c48 jdk7u65-b04
++8f585b94be8c83f89fc481cf010a129ef75cd31b jdk7u65-b05
++c3a8556785e89b7868fc4ece666120dbf8c5c7a7 jdk7u65-b06
++1978b6434c4f717ba1bd715f016ab99dff879857 jdk7u65-b07
++684f0285b699d304d1efff487b550ff2e1679e98 jdk7u65-b08
++2715f752385349274b43a1efaab5733bafc40557 jdk7u65-b09
++98cac38ef1302939a37b85c0208a7969ba4cd8ad jdk7u65-b10
++4c40603840a8ffbf5e30049b52ff336a9aca04c1 jdk7u65-b11
++36b01ef633b2e70836b5914aa6924e81ff4d41ec jdk7u65-b12
++5ba8a1ef0f82d341ede3ec2fdac7e012e42594c4 jdk7u65-b13
++52769f410515f6a7fa66a93b24a1327fa6b6174a jdk7u65-b14
++7f2891e4c6fcd9c0e31f50189a50c8de189d774f jdk7u65-b15
++dea7e67840b68ae6752b37e69e242dae2765b878 jdk7u65-b16
++15a051dfadb6a7d014f0d2739ccf0a63ade56313 jdk7u65-b17
++576e2fd21368ba67f1f19d3180f78bc440b795a1 jdk7u65-b30