af02cae5b9
. Adopt a patchset strategy similar to the openjdk8 port, which keeps the patch files smaller and makes the BSD differences clearer.
13021 lines
529 KiB
Text
13021 lines
529 KiB
Text
--- ./.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
|