diff options
Diffstat (limited to 'java/openjdk7/files/patch-7u65-b31')
-rw-r--r-- | java/openjdk7/files/patch-7u65-b31 | 13021 |
1 files changed, 0 insertions, 13021 deletions
diff --git a/java/openjdk7/files/patch-7u65-b31 b/java/openjdk7/files/patch-7u65-b31 deleted file mode 100644 index 9070530..0000000 --- a/java/openjdk7/files/patch-7u65-b31 +++ /dev/null @@ -1,13021 +0,0 @@ ---- ./.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 "<init>") - * @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 |