Merge
diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index c2f16ca..7c7ef2a 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -821,9 +821,17 @@
3b37f1a6ba6b98a8aa9b0b43e96b374a22a21b99 jdk8u162-b11
173b2b978c05e59aa471e82be9013955ebd6b4de jdk8u162-b12
a127ef57877d806f0840ccd6e7a2be337692fe6e jdk8u162-b31
+2c309abde14fbef07fe07304f493f770da0f5564 jdk8u162-b32
+f8f11c61855441c2d2ec1f87ba76e379fb371cd5 jdk8u162-b33
+a916a62cdb9cbdd7fd6ef5fa2e69092454f4fbab jdk8u162-b34
+6b0ed08eb07843e581354b94c2b48bf0bac59161 jdk8u162-b35
+539957b71bf6f416e16f9509c385eeca0a4e796b jdk8u162-b36
+aa85fe4a8d6932cdf0c2db76ee5183c14e6febbb jdk8u162-b37
+2b939db00d3b3403aa2c755d22a35e358d491a6a jdk8u162-b38
d66f57333c7fcc735f87eb0903ffdc0aaf899b32 jdk8u171-b00
6e7e84f6107b55b5cb98f5ac5e3bffa3e4b8892f jdk8u171-b01
28f638905f78913e5b6dc89dd88e37223984a105 jdk8u171-b02
+f2d13f7195163a34af334e0613c953ddec40e115 jdk8u181-b00
f2d13f7195163a34af334e0613c953ddec40e115 jdk8u171-b03
86b50f26a9d10245a7df1b4e0ef1189f1dfd1b25 jdk8u171-b04
0efc15ed66b0c26b9434427f7db59d99b2669dc2 jdk8u171-b05
@@ -838,9 +846,44 @@
315185c9100a22c0f881de8014623dd352eaf6f5 jdk8u172-b02
7204958a8c003cc1c79d520d9e7a5c0157e783b3 jdk8u172-b03
a80949c226a2d13ad5d8dd63b200a999538fa2c2 jdk8u172-b04
+f2d13f7195163a34af334e0613c953ddec40e115 jdk8u181-b00
+dda7b81e20a3bb3ea6877d93dd6145381b52b6e4 jdk8u191-b00
c6ca716659af42fa850dc3fdf0f5d0ae2d6951af jdk8u172-b05
7a95a1d55d534d0bb8ea398e1eaf85721766a63c jdk8u172-b06
c3d51ddc22653f63cd6c06e5f2c5b1e7192194e6 jdk8u172-b07
20086fb0be29b3e82a3841d3c1829f1437976f27 jdk8u172-b08
9361e8414bf1b1bbba36ecf4b81687ae254c1e63 jdk8u172-b09
ff9f47b14b8a0302a90ad9a4d793073205de52e2 jdk8u172-b10
+4d038b84d11353246e218d8f8dcd04637e09ee6d jdk8u172-b11
+031aebc4b792ba53dbc384f68bca53c839e8c397 jdk8u181-b01
+a0101c7abbb958c25082a6781e54ce7799178b3e jdk8u181-b02
+71a97231f84e45bc8139dc709807204f3f8bfd8f jdk8u181-b03
+573414d6be0c77e09b4f50553f5d833c6fd7bf0d jdk8u172-b31
+ea4cf13643e9816fa7a65ff71879b8a857338910 jdk8u172-b32
+f4698fa3bdce5852b30efaddb22b904f27ce5d41 jdk8u172-b33
+c4b95b1dd0c7841a2e51114f2c469896c8b95700 jdk8u172-b34
+da93fac3ac5f62f74f71c8eecb0619ddb815c8a3 jdk8u172-b35
+22943cc23d71510d79562c95570eb797c5e198ca jdk8u172-b36
+25b4e9a6bf41f0b614bfb90c71130aeb6ddada3e jdk8u172-b37
+031aebc4b792ba53dbc384f68bca53c839e8c397 jdk8u181-b01
+a0101c7abbb958c25082a6781e54ce7799178b3e jdk8u181-b02
+71a97231f84e45bc8139dc709807204f3f8bfd8f jdk8u181-b03
+0e936c8f9a27e7841934bcc729b7a371ab701fa1 jdk8u181-b04
+a3d84a257447e53c136d06a2da427cb9b5699cb6 jdk8u181-b05
+685d529a725cd5f820d532e1b8f890707310833e jdk8u181-b06
+d463bfda7eda282250baa0e46d2359db9442c5d0 jdk8u181-b07
+50e970e3575e364bd1f6260685ee280162fbb04e jdk8u181-b08
+e92c9d021a1261d713f5a5bdb4cb65d66129d9a5 jdk8u181-b09
+750c73f24a38dc0e65d8572576a0d21032c7c4ef jdk8u181-b10
+e19e26e852d6250739f4ce4de92d4a5bcdd56926 jdk8u181-b11
+760af13b89232fe5387667f3848be95cfead953e jdk8u181-b12
+ead7f893fb2c4a919820497f39a51fa640f4753e jdk8u181-b13
+c87c3a9a789e8bad94fb39bc3c2c7c4a532f7330 jdk8u191-b01
+d6007fa4ffae140f4c4ad551a1ee290a0704a094 jdk8u191-b02
+99395ddbb670d9621c9755afa330c579a57dfd9b jdk8u191-b03
+25e7fdd40996864b76cce08ba688f6e8281097a6 jdk8u191-b04
+9eb563f6079523a5e99d44e2d9fe5158d7474186 jdk8u191-b05
+a8e49c4cae5e46b748ac9ddbc0befc87fea2a7d1 jdk8u191-b06
+2b457fbca0fc5bdf8e19cc0435fb989edcc15b36 jdk8u191-b07
+e5404b63db4a10aae7fa4a5639af5e08518c31e7 jdk8u191-b08
+4c2d3b4689ab5d92c42a4d1e1fa79db16de7bf06 jdk8u191-b09
diff --git a/THIRD_PARTY_README b/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/THIRD_PARTY_README
+++ b/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index a29a784..50fe868 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -3776,7 +3776,7 @@
#
-# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -3912,7 +3912,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1521483882
+DATE_WHEN_GENERATED=1523388104
###############################################################################
#
@@ -30178,9 +30178,10 @@
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
fi
if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ # And since we now know that the linker is gnu, then add:
+ # -z defs, to forbid undefined symbols in object files
+ # -z noexecstack, to mark stack regions as non-executable
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs -Xlinker -z -Xlinker noexecstack"
if test "x$DEBUG_LEVEL" = "xrelease"; then
# When building release libraries, tell the linker optimize them.
# Should this be supplied to the OSS linker as well?
diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4
index 1af8fa3..f8f32a3 100644
--- a/common/autoconf/toolchain.m4
+++ b/common/autoconf/toolchain.m4
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -1211,9 +1211,10 @@
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
fi
if test "x$OPENJDK_TARGET_OS" = xlinux; then
- # And since we now know that the linker is gnu, then add -z defs, to forbid
- # undefined symbols in object files.
- LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
+ # And since we now know that the linker is gnu, then add:
+ # -z defs, to forbid undefined symbols in object files
+ # -z noexecstack, to mark stack regions as non-executable
+ LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs -Xlinker -z -Xlinker noexecstack"
if test "x$DEBUG_LEVEL" = "xrelease"; then
# When building release libraries, tell the linker optimize them.
# Should this be supplied to the OSS linker as well?
diff --git a/corba/.hgtags b/corba/.hgtags
index da80ce6..1b3896fa 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -865,12 +865,24 @@
6029daad75bf459b330fc79ebf208dc35dc682d5 jdk8u162-b11
ace99846c1fd92e8bec4cbe912ec3fc8a74fbf0c jdk8u162-b12
acbd335f56f1a09fd8f80c2663367f90cdb00c46 jdk8u162-b31
+4e733c1a0f810652289e1cfff790852178b07933 jdk8u162-b32
+471aa01d563f5d1230467fdad93af97173df28e2 jdk8u162-b33
+b934285b2aa620d01129164c3b0c1a68a67c2470 jdk8u162-b34
bb767c7211eace9df83649ba937d2ce507223e4d jdk8u171-b00
9895f9c0845cf5f8dd7be62bf2a1a73a3868f799 jdk8u171-b01
28be709707f8b275aeaa2ed41338678620e3ef5f jdk8u171-b02
d534205fffcf950a11ed37103f5a0c23fe14ee49 jdk8u171-b03
0baf88a7b3880bbefdbb221e67a6ce96b0552033 jdk8u171-b04
0c6a772d60b94de90907f2f6d4683ceac8aba54b jdk8u171-b05
+72dbc8d63308f5b04b9fd3e06d139d673f992212 jdk8u172-b00
+fbb7c1e76e59aabb85a70c81301f47b980f83225 jdk8u172-b01
+56874ff37e89559692d1314d48cbab574544b677 jdk8u172-b02
+65a52284d8a3a5b1e6de1e8c86eec6683cef346e jdk8u172-b03
+c3942af7d2fa3c13cf43c49399d36843dd21731f jdk8u172-b04
+d534205fffcf950a11ed37103f5a0c23fe14ee49 jdk8u181-b00
+d534205fffcf950a11ed37103f5a0c23fe14ee49 jdk8u171-b03
+0baf88a7b3880bbefdbb221e67a6ce96b0552033 jdk8u171-b04
+0c6a772d60b94de90907f2f6d4683ceac8aba54b jdk8u171-b05
3bca003f024c7bb6774499ff2ede57d300c18c79 jdk8u171-b06
b90a8fc589afa4ac20a4d1e4f819058a5730af9f jdk8u171-b07
f7f59d87e97dd1e3a7ff4ebc5ed843b2ed5f2361 jdk8u171-b08
@@ -888,3 +900,67 @@
bf262dc4ed05a905b3292bb5f2e765a9c930681c jdk8u172-b08
e9aaa28b626de73ffcef047992a1658f11262984 jdk8u172-b09
f39115b612ab6641f4d1f0bea5b70eed8bd34b19 jdk8u172-b10
+6841ddd69c3033b2f6c2cbd3a3410b11e8935ec6 jdk8u172-b11
+fc535a921338dcfafbe2302994332d7431df0b78 jdk8u181-b01
+4db300c6845e901556cb1c9c5b5d37293c267a3e jdk8u181-b02
+b01c5b98eafe388dea087807091e2c10401afd03 jdk8u181-b03
+3b2e4c266187bbcb0d32c2339eef5d5978cba0c3 jdk8u191-b00
+13c1af9669c26044981325eb1e2d239e74346b35 jdk8u172-b05
+174a1670d10d725f98bcf8effb76cbd81150e20c jdk8u162-b35
+12809d32e614e10a57e67ffe9b8a2d89f58dc4ef jdk8u162-b36
+bd6e2c17292122235cf2c3bcc4b634b393f67d0b jdk8u162-b37
+b550fa84ffc9452a9fdab2bb37e4d33cd9dd4095 jdk8u162-b38
+bb767c7211eace9df83649ba937d2ce507223e4d jdk8u171-b00
+9895f9c0845cf5f8dd7be62bf2a1a73a3868f799 jdk8u171-b01
+28be709707f8b275aeaa2ed41338678620e3ef5f jdk8u171-b02
+d534205fffcf950a11ed37103f5a0c23fe14ee49 jdk8u181-b00
+d534205fffcf950a11ed37103f5a0c23fe14ee49 jdk8u171-b03
+0baf88a7b3880bbefdbb221e67a6ce96b0552033 jdk8u171-b04
+0c6a772d60b94de90907f2f6d4683ceac8aba54b jdk8u171-b05
+3bca003f024c7bb6774499ff2ede57d300c18c79 jdk8u171-b06
+b90a8fc589afa4ac20a4d1e4f819058a5730af9f jdk8u171-b07
+f7f59d87e97dd1e3a7ff4ebc5ed843b2ed5f2361 jdk8u171-b08
+b3563151fe42c6b997279fc24f8329c4c03add96 jdk8u171-b09
+6a9efc03746028c30c3133d57030a388e752dd99 jdk8u171-b10
+fd5e2fc0b714d3f18c4c02e67ac093ee0cc2341a jdk8u171-b11
+72dbc8d63308f5b04b9fd3e06d139d673f992212 jdk8u172-b00
+fbb7c1e76e59aabb85a70c81301f47b980f83225 jdk8u172-b01
+56874ff37e89559692d1314d48cbab574544b677 jdk8u172-b02
+65a52284d8a3a5b1e6de1e8c86eec6683cef346e jdk8u172-b03
+c3942af7d2fa3c13cf43c49399d36843dd21731f jdk8u172-b04
+13c1af9669c26044981325eb1e2d239e74346b35 jdk8u172-b05
+ad4a16f06c355b7e9f13fa2dfab7d22ac9726b3d jdk8u172-b06
+bd2328706d14d6d17fac585645c886f94591bb28 jdk8u172-b07
+bf262dc4ed05a905b3292bb5f2e765a9c930681c jdk8u172-b08
+e9aaa28b626de73ffcef047992a1658f11262984 jdk8u172-b09
+f39115b612ab6641f4d1f0bea5b70eed8bd34b19 jdk8u172-b10
+6841ddd69c3033b2f6c2cbd3a3410b11e8935ec6 jdk8u172-b11
+4d3922c97c57924eede468fe8ec8804575350ca9 jdk8u172-b31
+cd9edd016abefcb8e4c638d2efdc788cfadc8ad2 jdk8u172-b32
+cdc0378172bb5b17a86823897b5a4b1225e2fe14 jdk8u172-b33
+f0cc81483800481ec88d3fd4c45e3104978c077f jdk8u172-b34
+c105eac8160cf2a3df960b840018452a3f47b86b jdk8u172-b35
+bd3a6d452f004cf7ac9a88be7deb665c24ce05a4 jdk8u172-b36
+7d1748edfb5aa89aec28eb5d2ed5abc40c6d87c3 jdk8u172-b37
+fc535a921338dcfafbe2302994332d7431df0b78 jdk8u181-b01
+4db300c6845e901556cb1c9c5b5d37293c267a3e jdk8u181-b02
+b01c5b98eafe388dea087807091e2c10401afd03 jdk8u181-b03
+58b732c27927be1f349269b5a99c6b112d06700a jdk8u181-b04
+0f5c5fdbcf1b2fd742d871b9049ee6566345005a jdk8u181-b05
+e411c05d28b610f8288b0db1d8f62c1c44d2b4d9 jdk8u181-b06
+1b08f79e5e388c8caa451ce13a5594f6fc8911ac jdk8u181-b07
+d7ad68db65467ef7a23c7e0c2bee9c0586586a68 jdk8u181-b08
+540d7417152cb698cb1582c6a12ab02a0130d1ed jdk8u181-b09
+e6aa16bb85d17abb0b7750589995efae54a9a162 jdk8u181-b10
+528a472b73184dd5ab6769dbd19177e2dea74e96 jdk8u181-b11
+1fac8d007debb6d610ad70930a6b1b5a2a116957 jdk8u181-b12
+a4d1d2b0da63d6d17579fa4cd9ef45850345d59c jdk8u181-b13
+513805c9270bd834cfe659ae2b9b737579779578 jdk8u191-b01
+ce3b35fca864a0249a5a85a25c331d1230253f3b jdk8u191-b02
+b51969df1b6fabae859bb18555e750d8afb96246 jdk8u191-b03
+7506d3bab4c4256127e965f6412d86f1b010b35a jdk8u191-b04
+0cb04d207ceb65c34b9855ae7549a8de1af4910a jdk8u191-b05
+a2069d605514f2d4f619bc8c37e8a0be901c2db3 jdk8u191-b06
+76c097c27422be5473606da19a0586aefb4b1426 jdk8u191-b07
+9c9ac98b01115a6cf0eda2da0178dbb464bc07d9 jdk8u191-b08
+c83fd870e7c0643926a744ad4402b9fcb9d02ca2 jdk8u191-b09
diff --git a/corba/THIRD_PARTY_README b/corba/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/corba/THIRD_PARTY_README
+++ b/corba/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index ac9db37e..4e1528bd 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -1131,9 +1131,17 @@
39e2895b795aded8b584626fb019d35f12e9d1e7 jdk8u162-b11
69aec2ca5d905dde1d0f29a89076d02a531808a3 jdk8u162-b12
caac74fe3cfa9a8c859c28c97d1046a58252af27 jdk8u162-b31
+c9b7abadf150328d2187de05b9e8a9cba2486e47 jdk8u162-b32
+e8041f2ec96eb6a41307732e6cf6ed90901438ae jdk8u162-b33
+bf2e8b1e8e8e6bc1f9b9475de54ba0329a6b24b1 jdk8u162-b34
+9b3f207379cf6ecfb8603640269e31ff4e064294 jdk8u162-b35
+d2ebd6530396b0afc700cd1a8eaf1f7a7f9fce8d jdk8u162-b36
+700ad8745f3fdc5ba3702616fc5ed6a6248dfa78 jdk8u162-b37
+405800ccc4c7b81475b01392f2145cc3675d1f86 jdk8u162-b38
a17bab9405474602b18cd62e060a09b17d6413ac jdk8u171-b00
ebfd57cc21e6b7f0c22b17c666b6b28c9340e207 jdk8u171-b01
1acd7c1b80241def8fac90f70b0df16356adad47 jdk8u171-b02
+5587cde50bbc2aa031aefb47eaa36b041f5e7c4b jdk8u181-b00
5587cde50bbc2aa031aefb47eaa36b041f5e7c4b jdk8u171-b03
99ef466523302cfbd00496cf6575a00c8637b884 jdk8u171-b04
08326a76b14888908523cf2bb1105de63b43544d jdk8u171-b05
@@ -1148,9 +1156,44 @@
653d9e0cd3f4023675c9eece7f0d563287f1d34f jdk8u172-b02
771d9e1fbe1ae2ec4d5d937ebcbfd18e9c800098 jdk8u172-b03
efd7a4e211e8fddf52053d4b033d8d307f356bc3 jdk8u172-b04
+5587cde50bbc2aa031aefb47eaa36b041f5e7c4b jdk8u181-b00
+8f3131e04030eb35434a27c1a0866fc3651af6d5 jdk8u191-b00
4235fb1dceebde1192498ef388a32e56b1ed5a46 jdk8u172-b05
68b234d5df6f01f3c677a114ecd6878c25f23f3c jdk8u172-b06
a311a45523b19d59f77e76b0441a2085bb5355c8 jdk8u172-b07
5c1f180db1650f0f33e6005c1366f0d68242f1ad jdk8u172-b08
aafd1bb21e2636ba982d3eae162f5c635a1df03a jdk8u172-b09
dcd3ace969fcde4eedaddba629647656289d4264 jdk8u172-b10
+083a9d6562100353708e4b73656282b21a78f714 jdk8u172-b11
+6e2be123a2e1c7671086c767e79ffe8ad5d4f9ca jdk8u181-b01
+1d0b6fcff115a57ca02081da84589630ba282789 jdk8u181-b02
+1127faef22f14d56cdd6c0c8bded598f492c2611 jdk8u181-b03
+d5a33d109309138a1e9bed43d2a2bda04356dbac jdk8u172-b31
+b62c44a689e4d339b1129bffceee94119c84b1b2 jdk8u172-b32
+e8745ad08d55bb56b2ac5a70ec0a972c38fa6ca2 jdk8u172-b33
+74350ee9c013a39acb6af32049599a26e6dc3911 jdk8u172-b34
+0d1b5f9b3ab040eb9023cde206cd67d4b5a54535 jdk8u172-b35
+1e7855b1ecd3d069bcaaf35259d35f79a7c66987 jdk8u172-b36
+6a9482b43d79e3e017f58a23ec4574dd696e04db jdk8u172-b37
+6e2be123a2e1c7671086c767e79ffe8ad5d4f9ca jdk8u181-b01
+1d0b6fcff115a57ca02081da84589630ba282789 jdk8u181-b02
+1127faef22f14d56cdd6c0c8bded598f492c2611 jdk8u181-b03
+c53e56e8904926f4efdde8a0483109ed3c60c064 jdk8u181-b04
+cea033df30750958ffc999d647ee43587d4a06b2 jdk8u181-b05
+2198f5b865507118b644830293dc9f0ec3b4439e jdk8u181-b06
+892e637195c74dc83ee2c22c93125f0209216007 jdk8u181-b07
+9ffa7549c389c6361e643f69ddf6a3e76118de13 jdk8u181-b08
+b46904cf3eaf0ca150aee9f0d8bdf85e2691e74f jdk8u181-b09
+08b5e1f3d022fbe122b11b6f45f62b5a4ce92ed9 jdk8u181-b10
+e4f39d283b55faf6074308797615298bd1a45a66 jdk8u181-b11
+464ed8cea5d6cdbfacc9be7035297af88f57f708 jdk8u181-b12
+eed8e846c982d7474dd07fc873ba02f83ad1f847 jdk8u181-b13
+21a3fffc43418f4d75c2091bf03478330b8a9a98 jdk8u191-b01
+5aa3d728164a674d08ad847811be6bdd853e9bf8 jdk8u191-b02
+dd79b482625361458b2b34e7d669ee982eee06a4 jdk8u191-b03
+541c205d7fd15ab840f48aaeeaea3f63209d1687 jdk8u191-b04
+14c62eae2f8f56f571abfc8435055bb6094c8440 jdk8u191-b05
+6cfec782c42c25f772bfd51a8b47e6926aa8f69f jdk8u191-b06
+96be5f6ab83349c971edd9aeb35cafce267d3bf8 jdk8u191-b07
+113b4a1676db205922668f5b9c69b3dce22a095e jdk8u191-b08
+a339c1437badce44c7137da58d817159c9c80e4f jdk8u191-b09
diff --git a/hotspot/THIRD_PARTY_README b/hotspot/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/hotspot/THIRD_PARTY_README
+++ b/hotspot/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/hotspot/agent/src/os/linux/Makefile b/hotspot/agent/src/os/linux/Makefile
index dfbb0b9..dc4850e 100644
--- a/hotspot/agent/src/os/linux/Makefile
+++ b/hotspot/agent/src/os/linux/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -76,6 +76,9 @@
endif
LFLAGS_LIBSA += $(LDFLAGS_HASH_STYLE)
+LDFLAGS_NO_EXEC_STACK="-Wl,-z,noexecstack"
+LFLAGS_LIBSA += $(LDFLAGS_NO_EXEC_STACK)
+
$(LIBSA): $(ARCH) $(OBJS) mapfile
$(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
diff --git a/hotspot/make/linux/makefiles/gcc.make b/hotspot/make/linux/makefiles/gcc.make
index 272afce..a4b8a9b 100644
--- a/hotspot/make/linux/makefiles/gcc.make
+++ b/hotspot/make/linux/makefiles/gcc.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -303,6 +303,8 @@
LFLAGS += $(LDFLAGS_HASH_STYLE)
+LDFLAGS_NO_EXEC_STACK="-Wl,-z,noexecstack"
+
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
MAPFLAG = -Xlinker --version-script=FILENAME
@@ -329,50 +331,20 @@
ifeq ($(DEBUG_BINARIES), true)
CFLAGS += -g
else
- # Use the stabs format for debugging information (this is the default
- # on gcc-2.91). It's good enough, has all the information about line
- # numbers and local variables, and libjvm.so is only about 16M.
- # Change this back to "-g" if you want the most expressive format.
- # (warning: that could easily inflate libjvm.so to 150M!)
- # Note: The Itanium gcc compiler crashes when using -gstabs.
- DEBUG_CFLAGS/ia64 = -g
- DEBUG_CFLAGS/amd64 = -g
- DEBUG_CFLAGS/ppc64 = -g
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
- ifeq ($(USE_CLANG), true)
- # Clang doesn't understand -gstabs
- DEBUG_CFLAGS/$(BUILDARCH) = -g
- else
- DEBUG_CFLAGS/$(BUILDARCH) = -gstabs
- endif
+ DEBUG_CFLAGS += -g
endif
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
- FASTDEBUG_CFLAGS/ia64 = -g
- FASTDEBUG_CFLAGS/amd64 = -g
- FASTDEBUG_CFLAGS/ppc64 = -g
FASTDEBUG_CFLAGS += $(FASTDEBUG_CFLAGS/$(BUILDARCH))
ifeq ($(FASTDEBUG_CFLAGS/$(BUILDARCH)),)
- ifeq ($(USE_CLANG), true)
- # Clang doesn't understand -gstabs
- FASTDEBUG_CFLAGS/$(BUILDARCH) = -g
- else
- FASTDEBUG_CFLAGS/$(BUILDARCH) = -gstabs
- endif
+ FASTDEBUG_CFLAGS/$(BUILDARCH) = -g
endif
- OPT_CFLAGS/ia64 = -g
- OPT_CFLAGS/amd64 = -g
- OPT_CFLAGS/ppc64 = -g
OPT_CFLAGS += $(OPT_CFLAGS/$(BUILDARCH))
ifeq ($(OPT_CFLAGS/$(BUILDARCH)),)
- ifeq ($(USE_CLANG), true)
- # Clang doesn't understand -gstabs
- OPT_CFLAGS/$(BUILDARCH) = -g
- else
- OPT_CFLAGS/$(BUILDARCH) = -gstabs
- endif
+ OPT_CFLAGS/$(BUILDARCH) = -g
endif
endif
endif
diff --git a/hotspot/make/linux/makefiles/jsig.make b/hotspot/make/linux/makefiles/jsig.make
index 6e13959..5831bbc 100644
--- a/hotspot/make/linux/makefiles/jsig.make
+++ b/hotspot/make/linux/makefiles/jsig.make
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
# cause problems with interposing. See CR: 6466665
# LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE))
-LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE)
+LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE) $(LDFLAGS_NO_EXEC_STACK)
# DEBUG_BINARIES overrides everything, use full -g debug information
ifeq ($(DEBUG_BINARIES), true)
diff --git a/hotspot/src/cpu/zero/vm/entry_zero.hpp b/hotspot/src/cpu/zero/vm/entry_zero.hpp
index 20f5d33..73987f0 100644
--- a/hotspot/src/cpu/zero/vm/entry_zero.hpp
+++ b/hotspot/src/cpu/zero/vm/entry_zero.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -26,6 +26,8 @@
#ifndef CPU_ZERO_VM_ENTRY_ZERO_HPP
#define CPU_ZERO_VM_ENTRY_ZERO_HPP
+#include "interpreter/cppInterpreter.hpp"
+
class ZeroEntry {
public:
ZeroEntry() {
diff --git a/hotspot/src/cpu/zero/vm/nativeInst_zero.cpp b/hotspot/src/cpu/zero/vm/nativeInst_zero.cpp
index 98a2121..bd9a703 100644
--- a/hotspot/src/cpu/zero/vm/nativeInst_zero.cpp
+++ b/hotspot/src/cpu/zero/vm/nativeInst_zero.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright 2008 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -25,6 +25,8 @@
#include "precompiled.hpp"
#include "assembler_zero.inline.hpp"
+#include "entry_zero.hpp"
+#include "interpreter/cppInterpreter.hpp"
#include "memory/resourceArea.hpp"
#include "nativeInst_zero.hpp"
#include "oops/oop.inline.hpp"
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 4cd28b8..4304188 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -4008,6 +4008,16 @@
};
int os::active_processor_count() {
+ // User has overridden the number of active processors
+ if (ActiveProcessorCount > 0) {
+ if (PrintActiveCpus) {
+ tty->print_cr("active_processor_count: "
+ "active processor count set by user : %d",
+ ActiveProcessorCount);
+ }
+ return ActiveProcessorCount;
+ }
+
int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
return online_cpus;
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index fb811915..3f49e99 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -3765,6 +3765,16 @@
};
int os::active_processor_count() {
+ // User has overridden the number of active processors
+ if (ActiveProcessorCount > 0) {
+ if (PrintActiveCpus) {
+ tty->print_cr("active_processor_count: "
+ "active processor count set by user : %d",
+ ActiveProcessorCount);
+ }
+ return ActiveProcessorCount;
+ }
+
return _processor_count;
}
diff --git a/hotspot/src/os/linux/vm/globals_linux.hpp b/hotspot/src/os/linux/vm/globals_linux.hpp
index 32d4619..f98bde4 100644
--- a/hotspot/src/os/linux/vm/globals_linux.hpp
+++ b/hotspot/src/os/linux/vm/globals_linux.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -49,8 +49,13 @@
product(bool, UseSHM, false, \
"Use SYSV shared memory for large pages") \
\
- diagnostic(bool, PrintActiveCpus, false, \
- "Print the number of CPUs detected in os::active_processor_count")
+ product(bool, UseContainerSupport, true, \
+ "Enable detection and runtime container configuration support") \
+ \
+ product(bool, PreferContainerQuotaForCPUCount, true, \
+ "Calculate the container CPU availability based on the value" \
+ " of quotas (if set), when true. Otherwise, use the CPU" \
+ " shares value, provided it is less than quota.")
//
// Defines Linux-specific default values. The flags are available on all
diff --git a/hotspot/src/os/linux/vm/osContainer_linux.cpp b/hotspot/src/os/linux/vm/osContainer_linux.cpp
new file mode 100644
index 0000000..55a2981
--- /dev/null
+++ b/hotspot/src/os/linux/vm/osContainer_linux.cpp
@@ -0,0 +1,680 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.
+ *
+ */
+
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+#include "utilities/globalDefinitions.hpp"
+#include "memory/allocation.hpp"
+#include "runtime/os.hpp"
+#include "osContainer_linux.hpp"
+
+#define PER_CPU_SHARES 1024
+
+bool OSContainer::_is_initialized = false;
+bool OSContainer::_is_containerized = false;
+julong _unlimited_memory;
+
+class CgroupSubsystem: CHeapObj<mtInternal> {
+ friend class OSContainer;
+
+ private:
+ /* mountinfo contents */
+ char *_root;
+ char *_mount_point;
+
+ /* Constructed subsystem directory */
+ char *_path;
+
+ public:
+ CgroupSubsystem(char *root, char *mountpoint) {
+ _root = os::strdup(root);
+ _mount_point = os::strdup(mountpoint);
+ _path = NULL;
+ }
+
+ /*
+ * Set directory to subsystem specific files based
+ * on the contents of the mountinfo and cgroup files.
+ */
+ void set_subsystem_path(char *cgroup_path) {
+ char buf[MAXPATHLEN+1];
+ if (_root != NULL && cgroup_path != NULL) {
+ if (strcmp(_root, "/") == 0) {
+ int buflen;
+ strncpy(buf, _mount_point, MAXPATHLEN);
+ buf[MAXPATHLEN-1] = '\0';
+ if (strcmp(cgroup_path,"/") != 0) {
+ buflen = strlen(buf);
+ if ((buflen + strlen(cgroup_path)) > (MAXPATHLEN-1)) {
+ return;
+ }
+ strncat(buf, cgroup_path, MAXPATHLEN-buflen);
+ buf[MAXPATHLEN-1] = '\0';
+ }
+ _path = os::strdup(buf);
+ } else {
+ if (strcmp(_root, cgroup_path) == 0) {
+ strncpy(buf, _mount_point, MAXPATHLEN);
+ buf[MAXPATHLEN-1] = '\0';
+ _path = os::strdup(buf);
+ } else {
+ char *p = strstr(_root, cgroup_path);
+ if (p != NULL && p == _root) {
+ if (strlen(cgroup_path) > strlen(_root)) {
+ int buflen;
+ strncpy(buf, _mount_point, MAXPATHLEN);
+ buf[MAXPATHLEN-1] = '\0';
+ buflen = strlen(buf);
+ if ((buflen + strlen(cgroup_path)) > (MAXPATHLEN-1)) {
+ return;
+ }
+ strncat(buf, cgroup_path + strlen(_root), MAXPATHLEN-buflen);
+ buf[MAXPATHLEN-1] = '\0';
+ _path = os::strdup(buf);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ char *subsystem_path() { return _path; }
+};
+
+CgroupSubsystem* memory = NULL;
+CgroupSubsystem* cpuset = NULL;
+CgroupSubsystem* cpu = NULL;
+CgroupSubsystem* cpuacct = NULL;
+
+typedef char * cptr;
+
+PRAGMA_DIAG_PUSH
+PRAGMA_FORMAT_NONLITERAL_IGNORED
+template <typename T> int subsystem_file_contents(CgroupSubsystem* c,
+ const char *filename,
+ const char *scan_fmt,
+ T returnval) {
+ FILE *fp = NULL;
+ char *p;
+ char file[MAXPATHLEN+1];
+ char buf[MAXPATHLEN+1];
+
+ if (c == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("subsystem_file_contents: CgroupSubsytem* is NULL");
+ }
+ return OSCONTAINER_ERROR;
+ }
+ if (c->subsystem_path() == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("subsystem_file_contents: subsystem path is NULL");
+ }
+ return OSCONTAINER_ERROR;
+ }
+
+ strncpy(file, c->subsystem_path(), MAXPATHLEN);
+ file[MAXPATHLEN-1] = '\0';
+ int filelen = strlen(file);
+ if ((filelen + strlen(filename)) > (MAXPATHLEN-1)) {
+ if (PrintContainerInfo) {
+ tty->print_cr("File path too long %s, %s", file, filename);
+ }
+ return OSCONTAINER_ERROR;
+ }
+ strncat(file, filename, MAXPATHLEN-filelen);
+ if (PrintContainerInfo) {
+ tty->print_cr("Path to %s is %s", filename, file);
+ }
+ fp = fopen(file, "r");
+ if (fp != NULL) {
+ p = fgets(buf, MAXPATHLEN, fp);
+ if (p != NULL) {
+ int matched = sscanf(p, scan_fmt, returnval);
+ if (matched == 1) {
+ fclose(fp);
+ return 0;
+ } else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Type %s not found in file %s", scan_fmt, file);
+ }
+ }
+ } else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Empty file %s", file);
+ }
+ }
+ } else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Open of file %s failed, %s", file, strerror(errno));
+ }
+ }
+ if (fp != NULL)
+ fclose(fp);
+ return OSCONTAINER_ERROR;
+}
+PRAGMA_DIAG_POP
+
+#define GET_CONTAINER_INFO(return_type, subsystem, filename, \
+ logstring, scan_fmt, variable) \
+ return_type variable; \
+{ \
+ int err; \
+ err = subsystem_file_contents(subsystem, \
+ filename, \
+ scan_fmt, \
+ &variable); \
+ if (err != 0) \
+ return (return_type) OSCONTAINER_ERROR; \
+ \
+ if (PrintContainerInfo) \
+ tty->print_cr(logstring, variable); \
+}
+
+#define GET_CONTAINER_INFO_CPTR(return_type, subsystem, filename, \
+ logstring, scan_fmt, variable, bufsize) \
+ char variable[bufsize]; \
+{ \
+ int err; \
+ err = subsystem_file_contents(subsystem, \
+ filename, \
+ scan_fmt, \
+ variable); \
+ if (err != 0) \
+ return (return_type) NULL; \
+ \
+ if (PrintContainerInfo) \
+ tty->print_cr(logstring, variable); \
+}
+
+/* init
+ *
+ * Initialize the container support and determine if
+ * we are running under cgroup control.
+ */
+void OSContainer::init() {
+ int mountid;
+ int parentid;
+ int major;
+ int minor;
+ FILE *mntinfo = NULL;
+ FILE *cgroup = NULL;
+ char buf[MAXPATHLEN+1];
+ char tmproot[MAXPATHLEN+1];
+ char tmpmount[MAXPATHLEN+1];
+ char tmpbase[MAXPATHLEN+1];
+ char *p;
+ jlong mem_limit;
+
+ assert(!_is_initialized, "Initializing OSContainer more than once");
+
+ _is_initialized = true;
+ _is_containerized = false;
+
+ _unlimited_memory = (LONG_MAX / os::vm_page_size()) * os::vm_page_size();
+
+ if (PrintContainerInfo) {
+ tty->print_cr("OSContainer::init: Initializing Container Support");
+ }
+ if (!UseContainerSupport) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Container Support not enabled");
+ }
+ return;
+ }
+
+ /*
+ * Find the cgroup mount point for memory and cpuset
+ * by reading /proc/self/mountinfo
+ *
+ * Example for docker:
+ * 219 214 0:29 /docker/7208cebd00fa5f2e342b1094f7bed87fa25661471a4637118e65f1c995be8a34 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory
+ *
+ * Example for host:
+ * 34 28 0:29 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,memory
+ */
+ mntinfo = fopen("/proc/self/mountinfo", "r");
+ if (mntinfo == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Can't open /proc/self/mountinfo, %s",
+ strerror(errno));
+ }
+ return;
+ }
+
+ while ( (p = fgets(buf, MAXPATHLEN, mntinfo)) != NULL) {
+ // Look for the filesystem type and see if it's cgroup
+ char fstype[MAXPATHLEN+1];
+ fstype[0] = '\0';
+ char *s = strstr(p, " - ");
+ if (s != NULL &&
+ sscanf(s, " - %s", fstype) == 1 &&
+ strcmp(fstype, "cgroup") == 0) {
+
+ if (strstr(p, "memory") != NULL) {
+ int matched = sscanf(p, "%d %d %d:%d %s %s",
+ &mountid,
+ &parentid,
+ &major,
+ &minor,
+ tmproot,
+ tmpmount);
+ if (matched == 6) {
+ memory = new CgroupSubsystem(tmproot, tmpmount);
+ }
+ else
+ if (PrintContainerInfo) {
+ tty->print_cr("Incompatible str containing cgroup and memory: %s", p);
+ }
+ } else if (strstr(p, "cpuset") != NULL) {
+ int matched = sscanf(p, "%d %d %d:%d %s %s",
+ &mountid,
+ &parentid,
+ &major,
+ &minor,
+ tmproot,
+ tmpmount);
+ if (matched == 6) {
+ cpuset = new CgroupSubsystem(tmproot, tmpmount);
+ }
+ else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Incompatible str containing cgroup and cpuset: %s", p);
+ }
+ }
+ } else if (strstr(p, "cpu,cpuacct") != NULL || strstr(p, "cpuacct,cpu") != NULL) {
+ int matched = sscanf(p, "%d %d %d:%d %s %s",
+ &mountid,
+ &parentid,
+ &major,
+ &minor,
+ tmproot,
+ tmpmount);
+ if (matched == 6) {
+ cpu = new CgroupSubsystem(tmproot, tmpmount);
+ cpuacct = new CgroupSubsystem(tmproot, tmpmount);
+ }
+ else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Incompatible str containing cgroup and cpu,cpuacct: %s", p);
+ }
+ }
+ } else if (strstr(p, "cpuacct") != NULL) {
+ int matched = sscanf(p, "%d %d %d:%d %s %s",
+ &mountid,
+ &parentid,
+ &major,
+ &minor,
+ tmproot,
+ tmpmount);
+ if (matched == 6) {
+ cpuacct = new CgroupSubsystem(tmproot, tmpmount);
+ }
+ else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Incompatible str containing cgroup and cpuacct: %s", p);
+ }
+ }
+ } else if (strstr(p, "cpu") != NULL) {
+ int matched = sscanf(p, "%d %d %d:%d %s %s",
+ &mountid,
+ &parentid,
+ &major,
+ &minor,
+ tmproot,
+ tmpmount);
+ if (matched == 6) {
+ cpu = new CgroupSubsystem(tmproot, tmpmount);
+ }
+ else {
+ if (PrintContainerInfo) {
+ tty->print_cr("Incompatible str containing cgroup and cpu: %s", p);
+ }
+ }
+ }
+ }
+ }
+
+ fclose(mntinfo);
+
+ if (memory == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Required cgroup memory subsystem not found");
+ }
+ return;
+ }
+ if (cpuset == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Required cgroup cpuset subsystem not found");
+ }
+ return;
+ }
+ if (cpu == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Required cgroup cpu subsystem not found");
+ }
+ return;
+ }
+ if (cpuacct == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Required cgroup cpuacct subsystem not found");
+ }
+ return;
+ }
+
+ /*
+ * Read /proc/self/cgroup and map host mount point to
+ * local one via /proc/self/mountinfo content above
+ *
+ * Docker example:
+ * 5:memory:/docker/6558aed8fc662b194323ceab5b964f69cf36b3e8af877a14b80256e93aecb044
+ *
+ * Host example:
+ * 5:memory:/user.slice
+ *
+ * Construct a path to the process specific memory and cpuset
+ * cgroup directory.
+ *
+ * For a container running under Docker from memory example above
+ * the paths would be:
+ *
+ * /sys/fs/cgroup/memory
+ *
+ * For a Host from memory example above the path would be:
+ *
+ * /sys/fs/cgroup/memory/user.slice
+ *
+ */
+ cgroup = fopen("/proc/self/cgroup", "r");
+ if (cgroup == NULL) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Can't open /proc/self/cgroup, %s",
+ strerror(errno));
+ }
+ return;
+ }
+
+ while ( (p = fgets(buf, MAXPATHLEN, cgroup)) != NULL) {
+ int cgno;
+ int matched;
+ char *controller;
+ char *base;
+
+ /* Skip cgroup number */
+ strsep(&p, ":");
+ /* Get controller and base */
+ controller = strsep(&p, ":");
+ base = strsep(&p, "\n");
+
+ if (controller != NULL) {
+ if (strstr(controller, "memory") != NULL) {
+ memory->set_subsystem_path(base);
+ } else if (strstr(controller, "cpuset") != NULL) {
+ cpuset->set_subsystem_path(base);
+ } else if (strstr(controller, "cpu,cpuacct") != NULL || strstr(controller, "cpuacct,cpu") != NULL) {
+ cpu->set_subsystem_path(base);
+ cpuacct->set_subsystem_path(base);
+ } else if (strstr(controller, "cpuacct") != NULL) {
+ cpuacct->set_subsystem_path(base);
+ } else if (strstr(controller, "cpu") != NULL) {
+ cpu->set_subsystem_path(base);
+ }
+ }
+ }
+
+ fclose(cgroup);
+
+ // We need to update the amount of physical memory now that
+ // command line arguments have been processed.
+ if ((mem_limit = memory_limit_in_bytes()) > 0) {
+ os::Linux::set_physical_memory(mem_limit);
+ }
+
+ _is_containerized = true;
+
+}
+
+const char * OSContainer::container_type() {
+ if (is_containerized()) {
+ return "cgroupv1";
+ } else {
+ return NULL;
+ }
+}
+
+
+/* memory_limit_in_bytes
+ *
+ * Return the limit of available memory for this process.
+ *
+ * return:
+ * memory limit in bytes or
+ * -1 for unlimited
+ * OSCONTAINER_ERROR for not supported
+ */
+jlong OSContainer::memory_limit_in_bytes() {
+ GET_CONTAINER_INFO(julong, memory, "/memory.limit_in_bytes",
+ "Memory Limit is: " JULONG_FORMAT, JULONG_FORMAT, memlimit);
+
+ if (memlimit >= _unlimited_memory) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Memory Limit is: Unlimited");
+ }
+ return (jlong)-1;
+ }
+ else {
+ return (jlong)memlimit;
+ }
+}
+
+jlong OSContainer::memory_and_swap_limit_in_bytes() {
+ GET_CONTAINER_INFO(julong, memory, "/memory.memsw.limit_in_bytes",
+ "Memory and Swap Limit is: " JULONG_FORMAT, JULONG_FORMAT, memswlimit);
+ if (memswlimit >= _unlimited_memory) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Memory and Swap Limit is: Unlimited");
+ }
+ return (jlong)-1;
+ } else {
+ return (jlong)memswlimit;
+ }
+}
+
+jlong OSContainer::memory_soft_limit_in_bytes() {
+ GET_CONTAINER_INFO(julong, memory, "/memory.soft_limit_in_bytes",
+ "Memory Soft Limit is: " JULONG_FORMAT, JULONG_FORMAT, memsoftlimit);
+ if (memsoftlimit >= _unlimited_memory) {
+ if (PrintContainerInfo) {
+ tty->print_cr("Memory Soft Limit is: Unlimited");
+ }
+ return (jlong)-1;
+ } else {
+ return (jlong)memsoftlimit;
+ }
+}
+
+/* memory_usage_in_bytes
+ *
+ * Return the amount of used memory for this process.
+ *
+ * return:
+ * memory usage in bytes or
+ * -1 for unlimited
+ * OSCONTAINER_ERROR for not supported
+ */
+jlong OSContainer::memory_usage_in_bytes() {
+ GET_CONTAINER_INFO(jlong, memory, "/memory.usage_in_bytes",
+ "Memory Usage is: " JLONG_FORMAT, JLONG_FORMAT, memusage);
+ return memusage;
+}
+
+/* memory_max_usage_in_bytes
+ *
+ * Return the maximum amount of used memory for this process.
+ *
+ * return:
+ * max memory usage in bytes or
+ * OSCONTAINER_ERROR for not supported
+ */
+jlong OSContainer::memory_max_usage_in_bytes() {
+ GET_CONTAINER_INFO(jlong, memory, "/memory.max_usage_in_bytes",
+ "Maximum Memory Usage is: " JLONG_FORMAT, JLONG_FORMAT, memmaxusage);
+ return memmaxusage;
+}
+
+/* active_processor_count
+ *
+ * Calculate an appropriate number of active processors for the
+ * VM to use based on these three inputs.
+ *
+ * cpu affinity
+ * cgroup cpu quota & cpu period
+ * cgroup cpu shares
+ *
+ * Algorithm:
+ *
+ * Determine the number of available CPUs from sched_getaffinity
+ *
+ * If user specified a quota (quota != -1), calculate the number of
+ * required CPUs by dividing quota by period.
+ *
+ * If shares are in effect (shares != -1), calculate the number
+ * of CPUs required for the shares by dividing the share value
+ * by PER_CPU_SHARES.
+ *
+ * All results of division are rounded up to the next whole number.
+ *
+ * If neither shares or quotas have been specified, return the
+ * number of active processors in the system.
+ *
+ * If both shares and quotas have been specified, the results are
+ * based on the flag PreferContainerQuotaForCPUCount. If true,
+ * return the quota value. If false return the smallest value
+ * between shares or quotas.
+ *
+ * If shares and/or quotas have been specified, the resulting number
+ * returned will never exceed the number of active processors.
+ *
+ * return:
+ * number of CPUs
+ */
+int OSContainer::active_processor_count() {
+ int quota_count = 0, share_count = 0;
+ int cpu_count, limit_count;
+ int result;
+
+ cpu_count = limit_count = os::Linux::active_processor_count();
+ int quota = cpu_quota();
+ int period = cpu_period();
+ int share = cpu_shares();
+
+ if (quota > -1 && period > 0) {
+ quota_count = ceilf((float)quota / (float)period);
+ if (PrintContainerInfo) {
+ tty->print_cr("CPU Quota count based on quota/period: %d", quota_count);
+ }
+ }
+ if (share > -1) {
+ share_count = ceilf((float)share / (float)PER_CPU_SHARES);
+ if (PrintContainerInfo) {
+ tty->print_cr("CPU Share count based on shares: %d", share_count);
+ }
+ }
+
+ // If both shares and quotas are setup results depend
+ // on flag PreferContainerQuotaForCPUCount.
+ // If true, limit CPU count to quota
+ // If false, use minimum of shares and quotas
+ if (quota_count !=0 && share_count != 0) {
+ if (PreferContainerQuotaForCPUCount) {
+ limit_count = quota_count;
+ } else {
+ limit_count = MIN2(quota_count, share_count);
+ }
+ } else if (quota_count != 0) {
+ limit_count = quota_count;
+ } else if (share_count != 0) {
+ limit_count = share_count;
+ }
+
+ result = MIN2(cpu_count, limit_count);
+ if (PrintContainerInfo) {
+ tty->print_cr("OSContainer::active_processor_count: %d", result);
+ }
+ return result;
+}
+
+char * OSContainer::cpu_cpuset_cpus() {
+ GET_CONTAINER_INFO_CPTR(cptr, cpuset, "/cpuset.cpus",
+ "cpuset.cpus is: %s", "%1023s", cpus, 1024);
+ return os::strdup(cpus);
+}
+
+char * OSContainer::cpu_cpuset_memory_nodes() {
+ GET_CONTAINER_INFO_CPTR(cptr, cpuset, "/cpuset.mems",
+ "cpuset.mems is: %s", "%1023s", mems, 1024);
+ return os::strdup(mems);
+}
+
+/* cpu_quota
+ *
+ * Return the number of milliseconds per period
+ * process is guaranteed to run.
+ *
+ * return:
+ * quota time in milliseconds
+ * -1 for no quota
+ * OSCONTAINER_ERROR for not supported
+ */
+int OSContainer::cpu_quota() {
+ GET_CONTAINER_INFO(int, cpu, "/cpu.cfs_quota_us",
+ "CPU Quota is: %d", "%d", quota);
+ return quota;
+}
+
+int OSContainer::cpu_period() {
+ GET_CONTAINER_INFO(int, cpu, "/cpu.cfs_period_us",
+ "CPU Period is: %d", "%d", period);
+ return period;
+}
+
+/* cpu_shares
+ *
+ * Return the amount of cpu shares available to the process
+ *
+ * return:
+ * Share number (typically a number relative to 1024)
+ * (2048 typically expresses 2 CPUs worth of processing)
+ * -1 for no share setup
+ * OSCONTAINER_ERROR for not supported
+ */
+int OSContainer::cpu_shares() {
+ GET_CONTAINER_INFO(int, cpu, "/cpu.shares",
+ "CPU Shares is: %d", "%d", shares);
+ // Convert 1024 to no shares setup
+ if (shares == 1024) return -1;
+
+ return shares;
+}
+
diff --git a/hotspot/src/os/linux/vm/osContainer_linux.hpp b/hotspot/src/os/linux/vm/osContainer_linux.hpp
new file mode 100644
index 0000000..3edeab7
--- /dev/null
+++ b/hotspot/src/os/linux/vm/osContainer_linux.hpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.
+ *
+ */
+
+#ifndef OS_LINUX_VM_OSCONTAINER_LINUX_HPP
+#define OS_LINUX_VM_OSCONTAINER_LINUX_HPP
+
+#include "utilities/globalDefinitions.hpp"
+#include "utilities/macros.hpp"
+#include "memory/allocation.hpp"
+
+#define OSCONTAINER_ERROR (-2)
+
+class OSContainer: AllStatic {
+
+ private:
+ static bool _is_initialized;
+ static bool _is_containerized;
+
+ public:
+ static void init();
+ static inline bool is_containerized();
+ static const char * container_type();
+
+ static jlong memory_limit_in_bytes();
+ static jlong memory_and_swap_limit_in_bytes();
+ static jlong memory_soft_limit_in_bytes();
+ static jlong memory_usage_in_bytes();
+ static jlong memory_max_usage_in_bytes();
+
+ static int active_processor_count();
+
+ static char * cpu_cpuset_cpus();
+ static char * cpu_cpuset_memory_nodes();
+
+ static int cpu_quota();
+ static int cpu_period();
+
+ static int cpu_shares();
+
+};
+
+inline bool OSContainer::is_containerized() {
+ assert(_is_initialized, "OSContainer not initialized");
+ return _is_containerized;
+}
+
+#endif // OS_LINUX_VM_OSCONTAINER_LINUX_HPP
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index 044a70a..cbae3c8 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -37,6 +37,7 @@
#include "mutex_linux.inline.hpp"
#include "oops/oop.inline.hpp"
#include "os_share_linux.hpp"
+#include "osContainer_linux.hpp"
#include "prims/jniFastGetField.hpp"
#include "prims/jvm.h"
#include "prims/jvm_misc.hpp"
@@ -179,13 +180,62 @@
julong os::Linux::available_memory() {
// values in struct sysinfo are "unsigned long"
struct sysinfo si;
- sysinfo(&si);
+ julong avail_mem;
- return (julong)si.freeram * si.mem_unit;
+ if (OSContainer::is_containerized()) {
+ jlong mem_limit, mem_usage;
+ if ((mem_limit = OSContainer::memory_limit_in_bytes()) < 1) {
+ if (PrintContainerInfo) {
+ tty->print_cr("container memory limit %s: " JLONG_FORMAT ", using host value",
+ mem_limit == OSCONTAINER_ERROR ? "failed" : "unlimited", mem_limit);
+ }
+ }
+
+ if (mem_limit > 0 && (mem_usage = OSContainer::memory_usage_in_bytes()) < 1) {
+ if (PrintContainerInfo) {
+ tty->print_cr("container memory usage failed: " JLONG_FORMAT ", using host value", mem_usage);
+ }
+ }
+
+ if (mem_limit > 0 && mem_usage > 0 ) {
+ avail_mem = mem_limit > mem_usage ? (julong)mem_limit - (julong)mem_usage : 0;
+ if (PrintContainerInfo) {
+ tty->print_cr("available container memory: " JULONG_FORMAT, avail_mem);
+ }
+ return avail_mem;
+ }
+ }
+
+ sysinfo(&si);
+ avail_mem = (julong)si.freeram * si.mem_unit;
+ if (Verbose) {
+ tty->print_cr("available memory: " JULONG_FORMAT, avail_mem);
+ }
+ return avail_mem;
}
julong os::physical_memory() {
- return Linux::physical_memory();
+ jlong phys_mem = 0;
+ if (OSContainer::is_containerized()) {
+ jlong mem_limit;
+ if ((mem_limit = OSContainer::memory_limit_in_bytes()) > 0) {
+ if (PrintContainerInfo) {
+ tty->print_cr("total container memory: " JLONG_FORMAT, mem_limit);
+ }
+ return mem_limit;
+ }
+
+ if (PrintContainerInfo) {
+ tty->print_cr("container memory limit %s: " JLONG_FORMAT ", using host value",
+ mem_limit == OSCONTAINER_ERROR ? "failed" : "unlimited", mem_limit);
+ }
+ }
+
+ phys_mem = Linux::physical_memory();
+ if (Verbose) {
+ tty->print_cr("total system memory: " JLONG_FORMAT, phys_mem);
+ }
+ return phys_mem;
}
////////////////////////////////////////////////////////////////////////////////
@@ -2114,6 +2164,8 @@
os::Posix::print_load_average(st);
os::Linux::print_full_memory_info(st);
+
+ os::Linux::print_container_info(st);
}
// Try to identify popular distros.
@@ -2179,6 +2231,57 @@
st->cr();
}
+void os::Linux::print_container_info(outputStream* st) {
+if (!OSContainer::is_containerized()) {
+ return;
+ }
+
+ st->print("container (cgroup) information:\n");
+
+ const char *p_ct = OSContainer::container_type();
+ st->print("container_type: %s\n", p_ct != NULL ? p_ct : "failed");
+
+ char *p = OSContainer::cpu_cpuset_cpus();
+ st->print("cpu_cpuset_cpus: %s\n", p != NULL ? p : "failed");
+ free(p);
+
+ p = OSContainer::cpu_cpuset_memory_nodes();
+ st->print("cpu_memory_nodes: %s\n", p != NULL ? p : "failed");
+ free(p);
+
+ int i = OSContainer::active_processor_count();
+ if (i > 0) {
+ st->print("active_processor_count: %d\n", i);
+ } else {
+ st->print("active_processor_count: failed\n");
+ }
+
+ i = OSContainer::cpu_quota();
+ st->print("cpu_quota: %d\n", i);
+
+ i = OSContainer::cpu_period();
+ st->print("cpu_period: %d\n", i);
+
+ i = OSContainer::cpu_shares();
+ st->print("cpu_shares: %d\n", i);
+
+ jlong j = OSContainer::memory_limit_in_bytes();
+ st->print("memory_limit_in_bytes: " JLONG_FORMAT "\n", j);
+
+ j = OSContainer::memory_and_swap_limit_in_bytes();
+ st->print("memory_and_swap_limit_in_bytes: " JLONG_FORMAT "\n", j);
+
+ j = OSContainer::memory_soft_limit_in_bytes();
+ st->print("memory_soft_limit_in_bytes: " JLONG_FORMAT "\n", j);
+
+ j = OSContainer::OSContainer::memory_usage_in_bytes();
+ st->print("memory_usage_in_bytes: " JLONG_FORMAT "\n", j);
+
+ j = OSContainer::OSContainer::memory_max_usage_in_bytes();
+ st->print("memory_max_usage_in_bytes: " JLONG_FORMAT "\n", j);
+ st->cr();
+}
+
void os::print_memory_info(outputStream* st) {
st->print("Memory:");
@@ -4951,6 +5054,10 @@
}
}
+void os::pd_init_container_support() {
+ OSContainer::init();
+}
+
// this is called _after_ the global arguments have been parsed
jint os::init_2(void)
{
@@ -5131,7 +5238,7 @@
// sched_getaffinity gives an accurate answer as it accounts for cpusets.
// If anything goes wrong we fallback to returning the number of online
// processors - which can be greater than the number available to the process.
-int os::active_processor_count() {
+int os::Linux::active_processor_count() {
cpu_set_t cpus; // can represent at most 1024 (CPU_SETSIZE) processors
int cpus_size = sizeof(cpu_set_t);
int cpu_count = 0;
@@ -5149,10 +5256,48 @@
"which may exceed available processors", strerror(errno), cpu_count);
}
- assert(cpu_count > 0 && cpu_count <= processor_count(), "sanity check");
+ assert(cpu_count > 0 && cpu_count <= os::processor_count(), "sanity check");
return cpu_count;
}
+// Determine the active processor count from one of
+// three different sources:
+//
+// 1. User option -XX:ActiveProcessorCount
+// 2. kernel os calls (sched_getaffinity or sysconf(_SC_NPROCESSORS_ONLN)
+// 3. extracted from cgroup cpu subsystem (shares and quotas)
+//
+// Option 1, if specified, will always override.
+// If the cgroup subsystem is active and configured, we
+// will return the min of the cgroup and option 2 results.
+// This is required since tools, such as numactl, that
+// alter cpu affinity do not update cgroup subsystem
+// cpuset configuration files.
+int os::active_processor_count() {
+ // User has overridden the number of active processors
+ if (ActiveProcessorCount > 0) {
+ if (PrintActiveCpus) {
+ tty->print_cr("active_processor_count: "
+ "active processor count set by user : %d",
+ ActiveProcessorCount);
+ }
+ return ActiveProcessorCount;
+ }
+
+ int active_cpus;
+ if (OSContainer::is_containerized()) {
+ active_cpus = OSContainer::active_processor_count();
+ if (PrintActiveCpus) {
+ tty->print_cr("active_processor_count: determined by OSContainer: %d",
+ active_cpus);
+ }
+ } else {
+ active_cpus = os::Linux::active_processor_count();
+ }
+
+ return active_cpus;
+}
+
void os::set_native_thread_name(const char *name) {
// Not yet implemented.
return;
diff --git a/hotspot/src/os/linux/vm/os_linux.hpp b/hotspot/src/os/linux/vm/os_linux.hpp
index c56983c..8519263 100644
--- a/hotspot/src/os/linux/vm/os_linux.hpp
+++ b/hotspot/src/os/linux/vm/os_linux.hpp
@@ -35,6 +35,7 @@
class Linux {
friend class os;
+ friend class OSContainer;
friend class TestReserveMemorySpecial;
// For signal-chaining
@@ -79,6 +80,9 @@
static julong available_memory();
static julong physical_memory() { return _physical_memory; }
+ static void set_physical_memory(julong phys_mem) { _physical_memory = phys_mem; }
+ static int active_processor_count();
+
static void initialize_system_info();
static int commit_memory_impl(char* addr, size_t bytes, bool exec);
@@ -116,6 +120,7 @@
static bool release_memory_special_huge_tlbfs(char* base, size_t bytes);
static void print_full_memory_info(outputStream* st);
+ static void print_container_info(outputStream* st);
static void print_distro_info(outputStream* st);
static void print_libversion_info(outputStream* st);
@@ -285,8 +290,8 @@
static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; }
static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
- static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = *ptr; }
- static void set_numa_nodes_ptr(struct bitmask **ptr) { _numa_nodes_ptr = *ptr; }
+ static void set_numa_all_nodes_ptr(struct bitmask **ptr) { _numa_all_nodes_ptr = (ptr == NULL ? NULL : *ptr); }
+ static void set_numa_nodes_ptr(struct bitmask **ptr) { _numa_nodes_ptr = (ptr == NULL ? NULL : *ptr); }
static int sched_getcpu_syscall(void);
public:
static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
@@ -330,6 +335,18 @@
static bool isnode_in_existing_nodes(unsigned int n) {
if (_numa_bitmask_isbitset != NULL && _numa_nodes_ptr != NULL) {
return _numa_bitmask_isbitset(_numa_nodes_ptr, n);
+ } else if (_numa_bitmask_isbitset != NULL && _numa_all_nodes_ptr != NULL) {
+ // Not all libnuma API v2 implement numa_nodes_ptr, so it's not possible
+ // to trust the API version for checking its absence. On the other hand,
+ // numa_nodes_ptr found in libnuma 2.0.9 and above is the only way to get
+ // a complete view of all numa nodes in the system, hence numa_nodes_ptr
+ // is used to handle CPU and nodes on architectures (like PowerPC) where
+ // there can exist nodes with CPUs but no memory or vice-versa and the
+ // nodes may be non-contiguous. For most of the architectures, like
+ // x86_64, numa_node_ptr presents the same node set as found in
+ // numa_all_nodes_ptr so it's possible to use numa_all_nodes_ptr as a
+ // substitute.
+ return _numa_bitmask_isbitset(_numa_all_nodes_ptr, n);
} else
return 0;
}
diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp
index 2b4e33c..ccc2121 100644
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp
@@ -357,6 +357,16 @@
}
int os::active_processor_count() {
+ // User has overridden the number of active processors
+ if (ActiveProcessorCount > 0) {
+ if (Verbose) {
+ tty->print_cr("active_processor_count: "
+ "active processor count set by user : %d",
+ ActiveProcessorCount);
+ }
+ return ActiveProcessorCount;
+ }
+
int online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
pid_t pid = getpid();
psetid_t pset = PS_NONE;
diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp
index 44d89a2..5675f37 100644
--- a/hotspot/src/os/windows/vm/os_windows.cpp
+++ b/hotspot/src/os/windows/vm/os_windows.cpp
@@ -716,6 +716,16 @@
#endif
int os::active_processor_count() {
+ // User has overridden the number of active processors
+ if (ActiveProcessorCount > 0) {
+ if (PrintActiveCpus) {
+ tty->print_cr("active_processor_count: "
+ "active processor count set by user : %d",
+ ActiveProcessorCount);
+ }
+ return ActiveProcessorCount;
+ }
+
DWORD_PTR lpProcessAffinityMask = 0;
DWORD_PTR lpSystemAffinityMask = 0;
int proc_count = processor_count();
diff --git a/hotspot/src/share/vm/c1/c1_Runtime1.cpp b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
index f64c60e..5a614b6 100644
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -547,9 +547,8 @@
// normal bytecode execution.
thread->clear_exception_oop_and_pc();
- Handle original_exception(thread, exception());
-
- continuation = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, false, false);
+ bool recursive_exception = false;
+ continuation = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, false, false, recursive_exception);
// If an exception was thrown during exception dispatch, the exception oop may have changed
thread->set_exception_oop(exception());
thread->set_exception_pc(pc);
@@ -557,8 +556,9 @@
// the exception cache is used only by non-implicit exceptions
// Update the exception cache only when there didn't happen
// another exception during the computation of the compiled
- // exception handler.
- if (continuation != NULL && original_exception() == exception()) {
+ // exception handler. Checking for exception oop equality is not
+ // sufficient because some exceptions are pre-allocated and reused.
+ if (continuation != NULL && !recursive_exception) {
nm->add_handler_for_exception_and_pc(exception, pc, continuation);
}
}
diff --git a/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp b/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
index 4c9b4ef..ade3a86 100644
--- a/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
+++ b/hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
@@ -41,13 +41,13 @@
// Walk metadata on the stack and mark it so that redefinition doesn't delete
// it. Class unloading also walks the previous versions and might try to
// delete it, so this class is used by class unloading also.
-MetadataOnStackMark::MetadataOnStackMark(bool visit_code_cache) {
+MetadataOnStackMark::MetadataOnStackMark(bool has_redefined_a_class) {
assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
assert(_used_buffers == NULL, "sanity check");
NOT_PRODUCT(_is_active = true;)
Threads::metadata_do(Metadata::mark_on_stack);
- if (visit_code_cache) {
+ if (has_redefined_a_class) {
CodeCache::alive_nmethods_do(nmethod::mark_on_stack);
}
CompileBroker::mark_on_stack();
diff --git a/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp b/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp
index 9233c26..e0d5c76 100644
--- a/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp
+++ b/hotspot/src/share/vm/classfile/metadataOnStackMark.hpp
@@ -47,7 +47,7 @@
static void retire_buffer(MetadataOnStackBuffer* buffer);
public:
- MetadataOnStackMark(bool visit_code_cache);
+ MetadataOnStackMark(bool has_redefined_a_class);
~MetadataOnStackMark();
static void record(Metadata* m, Thread* thread);
diff --git a/hotspot/src/share/vm/code/codeBlob.cpp b/hotspot/src/share/vm/code/codeBlob.cpp
index ee0d17d..87ae60f 100644
--- a/hotspot/src/share/vm/code/codeBlob.cpp
+++ b/hotspot/src/share/vm/code/codeBlob.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -289,6 +289,28 @@
return blob;
}
+VtableBlob::VtableBlob(const char* name, int size) :
+ BufferBlob(name, size) {
+}
+
+VtableBlob* VtableBlob::create(const char* name, int buffer_size) {
+ ThreadInVMfromUnknown __tiv; // get to VM state in case we block on CodeCache_lock
+
+ VtableBlob* blob = NULL;
+ unsigned int size = sizeof(VtableBlob);
+ // align the size to CodeEntryAlignment
+ size = align_code_offset(size);
+ size += round_to(buffer_size, oopSize);
+ assert(name != NULL, "must provide a name");
+ {
+ MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ blob = new (size) VtableBlob(name, size);
+ }
+ // Track memory usage statistic after releasing CodeCache_lock
+ MemoryService::track_code_cache_memory_usage();
+
+ return blob;
+}
//----------------------------------------------------------------------------------------------------
// Implementation of MethodHandlesAdapterBlob
diff --git a/hotspot/src/share/vm/code/codeBlob.hpp b/hotspot/src/share/vm/code/codeBlob.hpp
index db270f1..4f83fac 100644
--- a/hotspot/src/share/vm/code/codeBlob.hpp
+++ b/hotspot/src/share/vm/code/codeBlob.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -101,6 +101,7 @@
virtual bool is_exception_stub() const { return false; }
virtual bool is_safepoint_stub() const { return false; }
virtual bool is_adapter_blob() const { return false; }
+ virtual bool is_vtable_blob() const { return false; }
virtual bool is_method_handles_adapter_blob() const { return false; }
virtual bool is_compiled_by_c2() const { return false; }
@@ -202,6 +203,7 @@
class BufferBlob: public CodeBlob {
friend class VMStructs;
friend class AdapterBlob;
+ friend class VtableBlob;
friend class MethodHandlesAdapterBlob;
private:
@@ -246,6 +248,18 @@
virtual bool is_adapter_blob() const { return true; }
};
+//---------------------------------------------------------------------------------------------------
+class VtableBlob: public BufferBlob {
+private:
+ VtableBlob(const char*, int);
+
+public:
+ // Creation
+ static VtableBlob* create(const char* name, int buffer_size);
+
+ // Typing
+ virtual bool is_vtable_blob() const { return true; }
+};
//----------------------------------------------------------------------------------------------------
// MethodHandlesAdapterBlob: used to hold MethodHandles adapters
diff --git a/hotspot/src/share/vm/code/codeCache.cpp b/hotspot/src/share/vm/code/codeCache.cpp
index c9059d7..9e5b7e9 100644
--- a/hotspot/src/share/vm/code/codeCache.cpp
+++ b/hotspot/src/share/vm/code/codeCache.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/arguments.hpp"
+#include "runtime/deoptimization.hpp"
#include "runtime/icache.hpp"
#include "runtime/java.hpp"
#include "runtime/mutexLocker.hpp"
diff --git a/hotspot/src/share/vm/code/compiledIC.cpp b/hotspot/src/share/vm/code/compiledIC.cpp
index 783fe9d..63821c0 100644
--- a/hotspot/src/share/vm/code/compiledIC.cpp
+++ b/hotspot/src/share/vm/code/compiledIC.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -232,7 +232,7 @@
assert(k->verify_itable_index(itable_index), "sanity check");
#endif //ASSERT
CompiledICHolder* holder = new CompiledICHolder(call_info->resolved_method()->method_holder(),
- call_info->resolved_klass()());
+ call_info->resolved_klass()(), false);
holder->claim();
InlineCacheBuffer::create_transition_stub(this, holder, entry);
} else {
@@ -270,7 +270,7 @@
assert(!is_optimized(), "an optimized call cannot be megamorphic");
// Cannot rely on cached_value. It is either an interface or a method.
- return VtableStubs::is_entry_point(ic_destination());
+ return VtableStubs::entry_point(ic_destination()) != NULL;
}
bool CompiledIC::is_call_to_compiled() const {
@@ -534,9 +534,11 @@
return true;
}
// itable stubs also use CompiledICHolder
- if (VtableStubs::is_entry_point(entry) && VtableStubs::stub_containing(entry)->is_itable_stub()) {
- return true;
+ if (cb != NULL && cb->is_vtable_blob()) {
+ VtableStub* s = VtableStubs::entry_point(entry);
+ return (s != NULL) && s->is_itable_stub();
}
+
return false;
}
diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp
index 6f5f527..fcaaa29 100644
--- a/hotspot/src/share/vm/code/nmethod.cpp
+++ b/hotspot/src/share/vm/code/nmethod.cpp
@@ -2172,7 +2172,7 @@
"metadata must be found in exactly one place");
if (r->metadata_is_immediate() && r->metadata_value() != NULL) {
Metadata* md = r->metadata_value();
- f(md);
+ if (md != _method) f(md);
}
} else if (iter.type() == relocInfo::virtual_call_type) {
// Check compiledIC holders associated with this nmethod
@@ -2198,7 +2198,7 @@
f(md);
}
- // Visit metadata not embedded in the other places.
+ // Call function Method*, not embedded in these other places.
if (_method != NULL) f(_method);
}
diff --git a/hotspot/src/share/vm/code/vtableStubs.cpp b/hotspot/src/share/vm/code/vtableStubs.cpp
index ac99da4..8424378 100644
--- a/hotspot/src/share/vm/code/vtableStubs.cpp
+++ b/hotspot/src/share/vm/code/vtableStubs.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,7 +60,7 @@
// There is a dependency on the name of the blob in src/share/vm/prims/jvmtiCodeBlobEvents.cpp
// If changing the name, update the other file accordingly.
- BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
+ VtableBlob* blob = VtableBlob::create("vtable chunks", bytes);
if (blob == NULL) {
return NULL;
}
@@ -167,17 +167,18 @@
_number_of_vtable_stubs++;
}
-
-bool VtableStubs::is_entry_point(address pc) {
+VtableStub* VtableStubs::entry_point(address pc) {
MutexLocker ml(VtableStubs_lock);
VtableStub* stub = (VtableStub*)(pc - VtableStub::entry_offset());
uint hash = VtableStubs::hash(stub->is_vtable_stub(), stub->index());
VtableStub* s;
for (s = _table[hash]; s != NULL && s != stub; s = s->next()) {}
- return s == stub;
+ if (s == stub) {
+ return s;
+ }
+ return NULL;
}
-
bool VtableStubs::contains(address pc) {
// simple solution for now - we may want to use
// a faster way if this function is called often
diff --git a/hotspot/src/share/vm/code/vtableStubs.hpp b/hotspot/src/share/vm/code/vtableStubs.hpp
index b3d4f2d..04f3e7e 100644
--- a/hotspot/src/share/vm/code/vtableStubs.hpp
+++ b/hotspot/src/share/vm/code/vtableStubs.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -126,7 +126,7 @@
public:
static address find_vtable_stub(int vtable_index) { return find_stub(true, vtable_index); }
static address find_itable_stub(int itable_index) { return find_stub(false, itable_index); }
- static bool is_entry_point(address pc); // is pc a vtable stub entry point?
+ static VtableStub* entry_point(address pc); // vtable stub entry point for a pc
static bool contains(address pc); // is pc within any stub?
static VtableStub* stub_containing(address pc); // stub containing pc or NULL
static int number_of_vtable_stubs() { return _number_of_vtable_stubs; }
diff --git a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp
index c27805e..b753027 100644
--- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp
+++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,6 +29,9 @@
// of the template interpreter generator.
#ifdef CC_INTERP
+#ifdef TARGET_ARCH_zero
+# include "entry_zero.hpp"
+#endif
class CppInterpreterGenerator: public AbstractInterpreterGenerator {
protected:
diff --git a/hotspot/src/share/vm/interpreter/interpreter.hpp b/hotspot/src/share/vm/interpreter/interpreter.hpp
index d3792f8..1f18ce1 100644
--- a/hotspot/src/share/vm/interpreter/interpreter.hpp
+++ b/hotspot/src/share/vm/interpreter/interpreter.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,11 +28,9 @@
#include "code/stubs.hpp"
#include "interpreter/cppInterpreter.hpp"
#include "interpreter/templateInterpreter.hpp"
-#ifdef ZERO
#ifdef TARGET_ARCH_zero
# include "entry_zero.hpp"
#endif
-#endif
// This file contains the platform-independent parts
// of the interpreter and the interpreter generator.
diff --git a/hotspot/src/share/vm/interpreter/linkResolver.cpp b/hotspot/src/share/vm/interpreter/linkResolver.cpp
index e7b6b8c..3a27bec 100644
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -779,37 +779,37 @@
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
}
- if (!check_access)
- // Access checking may be turned off when calling from within the VM.
- return;
+ // Access checking may be turned off when calling from within the VM.
+ if (check_access) {
- // check access
- check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
+ // check access
+ check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
- // check for errors
- if (is_static != fd.is_static()) {
- ResourceMark rm(THREAD);
- char msg[200];
- jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
+ // check for errors
+ if (is_static != fd.is_static()) {
+ ResourceMark rm(THREAD);
+ char msg[200];
+ jio_snprintf(msg, sizeof(msg), "Expected %s field %s.%s", is_static ? "static" : "non-static", resolved_klass()->external_name(), fd.name()->as_C_string());
+ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), msg);
+ }
+
+ // Final fields can only be accessed from its own class.
+ if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
+ THROW(vmSymbols::java_lang_IllegalAccessError());
+ }
+
+ // initialize resolved_klass if necessary
+ // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
+ // according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
+ //
+ // note 2: we don't want to force initialization if we are just checking
+ // if the field access is legal; e.g., during compilation
+ if (is_static && initialize_class) {
+ sel_klass->initialize(CHECK);
+ }
}
- // Final fields can only be accessed from its own class.
- if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
- THROW(vmSymbols::java_lang_IllegalAccessError());
- }
-
- // initialize resolved_klass if necessary
- // note 1: the klass which declared the field must be initialized (i.e, sel_klass)
- // according to the newest JVM spec (5.5, p.170) - was bug (gri 7/28/99)
- //
- // note 2: we don't want to force initialization if we are just checking
- // if the field access is legal; e.g., during compilation
- if (is_static && initialize_class) {
- sel_klass->initialize(CHECK);
- }
-
- if (sel_klass() != current_klass()) {
+ if (sel_klass() != current_klass() && !current_klass.is_null()) {
HandleMark hm(THREAD);
Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
diff --git a/hotspot/src/share/vm/oops/compiledICHolder.cpp b/hotspot/src/share/vm/oops/compiledICHolder.cpp
index f5af2d4..568f2fe 100644
--- a/hotspot/src/share/vm/oops/compiledICHolder.cpp
+++ b/hotspot/src/share/vm/oops/compiledICHolder.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,30 +24,12 @@
#include "precompiled.hpp"
#include "oops/compiledICHolder.hpp"
-#include "oops/klass.hpp"
-#include "oops/method.hpp"
#include "oops/oop.inline2.hpp"
volatile int CompiledICHolder::_live_count;
volatile int CompiledICHolder::_live_not_claimed_count;
-bool CompiledICHolder::is_loader_alive(BoolObjectClosure* is_alive) {
- if (_holder_metadata->is_method()) {
- if (!((Method*)_holder_metadata)->method_holder()->is_loader_alive(is_alive)) {
- return false;
- }
- } else if (_holder_metadata->is_klass()) {
- if (!((Klass*)_holder_metadata)->is_loader_alive(is_alive)) {
- return false;
- }
- }
- if (!_holder_klass->is_loader_alive(is_alive)) {
- return false;
- }
- return true;
-}
-
// Printing
void CompiledICHolder::print_on(outputStream* st) const {
diff --git a/hotspot/src/share/vm/oops/compiledICHolder.hpp b/hotspot/src/share/vm/oops/compiledICHolder.hpp
index 8e1f20e..63d3a87 100644
--- a/hotspot/src/share/vm/oops/compiledICHolder.hpp
+++ b/hotspot/src/share/vm/oops/compiledICHolder.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,8 @@
#define SHARE_VM_OOPS_COMPILEDICHOLDEROOP_HPP
#include "oops/oop.hpp"
+#include "oops/klass.hpp"
+#include "oops/method.hpp"
// A CompiledICHolder* is a helper object for the inline cache implementation.
// It holds:
@@ -48,11 +50,12 @@
Metadata* _holder_metadata;
Klass* _holder_klass; // to avoid name conflict with oopDesc::_klass
CompiledICHolder* _next;
+ bool _is_metadata_method;
public:
// Constructor
- CompiledICHolder(Metadata* metadata, Klass* klass)
- : _holder_metadata(metadata), _holder_klass(klass) {
+ CompiledICHolder(Metadata* metadata, Klass* klass, bool is_method = true)
+ : _holder_metadata(metadata), _holder_klass(klass), _is_metadata_method(is_method) {
#ifdef ASSERT
Atomic::inc(&_live_count);
Atomic::inc(&_live_not_claimed_count);
@@ -82,7 +85,16 @@
CompiledICHolder* next() { return _next; }
void set_next(CompiledICHolder* n) { _next = n; }
- bool is_loader_alive(BoolObjectClosure* is_alive);
+ inline bool is_loader_alive(BoolObjectClosure* is_alive) {
+ Klass* k = _is_metadata_method ? ((Method*)_holder_metadata)->method_holder() : (Klass*)_holder_metadata;
+ if (!k->is_loader_alive(is_alive)) {
+ return false;
+ }
+ if (!_holder_klass->is_loader_alive(is_alive)) {
+ return false;
+ }
+ return true;
+ }
// Verify
void verify_on(outputStream* st);
diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp
index b1c09f6..f8f531d 100644
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp
@@ -2582,16 +2582,6 @@
assert(breakpoints() == 0x0, "should have cleared breakpoints");
}
- // deallocate information about previous versions
- if (_previous_versions != NULL) {
- for (int i = _previous_versions->length() - 1; i >= 0; i--) {
- PreviousVersionNode * pv_node = _previous_versions->at(i);
- delete pv_node;
- }
- delete _previous_versions;
- _previous_versions = NULL;
- }
-
// deallocate the cached class file
if (_cached_class_file != NULL) {
os::free(_cached_class_file, mtClass);
@@ -3187,16 +3177,17 @@
st->print(BULLET"field type annotations: "); fields_type_annotations()->print_value_on(st); st->cr();
{
bool have_pv = false;
- PreviousVersionWalker pvw(Thread::current(), (InstanceKlass*)this);
- for (PreviousVersionNode * pv_node = pvw.next_previous_version();
- pv_node != NULL; pv_node = pvw.next_previous_version()) {
+ // previous versions are linked together through the InstanceKlass
+ for (InstanceKlass* pv_node = _previous_versions;
+ pv_node != NULL;
+ pv_node = pv_node->previous_versions()) {
if (!have_pv)
st->print(BULLET"previous version: ");
have_pv = true;
- pv_node->prev_constant_pool()->print_value_on(st);
+ pv_node->constants()->print_value_on(st);
}
if (have_pv) st->cr();
- } // pvw is cleaned up
+ }
if (generic_signature() != NULL) {
st->print(BULLET"generic signature: ");
@@ -3610,205 +3601,126 @@
// RedefineClasses() support for previous versions:
// Purge previous versions
-static void purge_previous_versions_internal(InstanceKlass* ik, int emcp_method_count) {
+void InstanceKlass::purge_previous_versions(InstanceKlass* ik) {
if (ik->previous_versions() != NULL) {
// This klass has previous versions so see what we can cleanup
// while it is safe to do so.
int deleted_count = 0; // leave debugging breadcrumbs
int live_count = 0;
- ClassLoaderData* loader_data = ik->class_loader_data() == NULL ?
- ClassLoaderData::the_null_class_loader_data() :
- ik->class_loader_data();
+ ClassLoaderData* loader_data = ik->class_loader_data();
+ assert(loader_data != NULL, "should never be null");
// RC_TRACE macro has an embedded ResourceMark
- RC_TRACE(0x00000200, ("purge: %s: previous version length=%d",
- ik->external_name(), ik->previous_versions()->length()));
+ RC_TRACE(0x00000200, ("purge: %s: previous versions", ik->external_name()));
- for (int i = ik->previous_versions()->length() - 1; i >= 0; i--) {
- // check the previous versions array
- PreviousVersionNode * pv_node = ik->previous_versions()->at(i);
- ConstantPool* cp_ref = pv_node->prev_constant_pool();
- assert(cp_ref != NULL, "cp ref was unexpectedly cleared");
+ // previous versions are linked together through the InstanceKlass
+ InstanceKlass* pv_node = ik->previous_versions();
+ InstanceKlass* last = ik;
+ int version = 0;
- ConstantPool* pvcp = cp_ref;
+ // check the previous versions list
+ for (; pv_node != NULL; ) {
+
+ ConstantPool* pvcp = pv_node->constants();
+ assert(pvcp != NULL, "cp ref was unexpectedly cleared");
+
+
if (!pvcp->on_stack()) {
// If the constant pool isn't on stack, none of the methods
- // are executing. Delete all the methods, the constant pool and
- // and this previous version node.
- GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
- if (method_refs != NULL) {
- for (int j = method_refs->length() - 1; j >= 0; j--) {
- Method* method = method_refs->at(j);
- assert(method != NULL, "method ref was unexpectedly cleared");
- method_refs->remove_at(j);
- // method will be freed with associated class.
- }
- }
- // Remove the constant pool
- delete pv_node;
- // Since we are traversing the array backwards, we don't have to
- // do anything special with the index.
- ik->previous_versions()->remove_at(i);
+ // are executing. Unlink this previous_version.
+ // The previous version InstanceKlass is on the ClassLoaderData deallocate list
+ // so will be deallocated during the next phase of class unloading.
+ pv_node = pv_node->previous_versions();
+ last->link_previous_versions(pv_node);
deleted_count++;
+ version++;
continue;
} else {
- RC_TRACE(0x00000200, ("purge: previous version @%d is alive", i));
+ RC_TRACE(0x00000200, ("purge: previous version " INTPTR_FORMAT " is alive",
+ pv_node));
assert(pvcp->pool_holder() != NULL, "Constant pool with no holder");
guarantee (!loader_data->is_unloading(), "unloaded classes can't be on the stack");
live_count++;
}
- // At least one method is live in this previous version, clean out
- // the others or mark them as obsolete.
- GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
+ // At least one method is live in this previous version so clean its MethodData.
+ // Reset dead EMCP methods not to get breakpoints.
+ // All methods are deallocated when all of the methods for this class are no
+ // longer running.
+ Array<Method*>* method_refs = pv_node->methods();
if (method_refs != NULL) {
RC_TRACE(0x00000200, ("purge: previous methods length=%d",
method_refs->length()));
- for (int j = method_refs->length() - 1; j >= 0; j--) {
+ for (int j = 0; j < method_refs->length(); j++) {
Method* method = method_refs->at(j);
- assert(method != NULL, "method ref was unexpectedly cleared");
- // Remove the emcp method if it's not executing
- // If it's been made obsolete by a redefinition of a non-emcp
- // method, mark it as obsolete but leave it to clean up later.
if (!method->on_stack()) {
- method_refs->remove_at(j);
- } else if (emcp_method_count == 0) {
- method->set_is_obsolete();
+ // no breakpoints for non-running methods
+ if (method->is_running_emcp()) {
+ method->set_running_emcp(false);
+ }
} else {
+ assert (method->is_obsolete() || method->is_running_emcp(),
+ "emcp method cannot run after emcp bit is cleared");
// RC_TRACE macro has an embedded ResourceMark
RC_TRACE(0x00000200,
("purge: %s(%s): prev method @%d in version @%d is alive",
method->name()->as_C_string(),
- method->signature()->as_C_string(), j, i));
+ method->signature()->as_C_string(), j, version));
+ if (method->method_data() != NULL) {
+ // Clean out any weak method links for running methods
+ // (also should include not EMCP methods)
+ method->method_data()->clean_weak_method_links();
+ }
}
}
}
+ // next previous version
+ last = pv_node;
+ pv_node = pv_node->previous_versions();
+ version++;
}
- assert(ik->previous_versions()->length() == live_count, "sanity check");
RC_TRACE(0x00000200,
("purge: previous version stats: live=%d, deleted=%d", live_count,
deleted_count));
}
-}
-// External interface for use during class unloading.
-void InstanceKlass::purge_previous_versions(InstanceKlass* ik) {
- // Call with >0 emcp methods since they are not currently being redefined.
- purge_previous_versions_internal(ik, 1);
-}
-
-
-// Potentially add an information node that contains pointers to the
-// interesting parts of the previous version of the_class.
-// This is also where we clean out any unused references.
-// Note that while we delete nodes from the _previous_versions
-// array, we never delete the array itself until the klass is
-// unloaded. The has_been_redefined() query depends on that fact.
-//
-void InstanceKlass::add_previous_version(instanceKlassHandle ikh,
- BitMap* emcp_methods, int emcp_method_count) {
- assert(Thread::current()->is_VM_thread(),
- "only VMThread can add previous versions");
-
- if (_previous_versions == NULL) {
- // This is the first previous version so make some space.
- // Start with 2 elements under the assumption that the class
- // won't be redefined much.
- _previous_versions = new (ResourceObj::C_HEAP, mtClass)
- GrowableArray<PreviousVersionNode *>(2, true);
- }
-
- ConstantPool* cp_ref = ikh->constants();
-
- // RC_TRACE macro has an embedded ResourceMark
- RC_TRACE(0x00000400, ("adding previous version ref for %s @%d, EMCP_cnt=%d "
- "on_stack=%d",
- ikh->external_name(), _previous_versions->length(), emcp_method_count,
- cp_ref->on_stack()));
-
- // If the constant pool for this previous version of the class
- // is not marked as being on the stack, then none of the methods
- // in this previous version of the class are on the stack so
- // we don't need to create a new PreviousVersionNode. However,
- // we still need to examine older previous versions below.
- Array<Method*>* old_methods = ikh->methods();
-
- if (cp_ref->on_stack()) {
- PreviousVersionNode * pv_node = NULL;
- if (emcp_method_count == 0) {
- // non-shared ConstantPool gets a reference
- pv_node = new PreviousVersionNode(cp_ref, NULL);
- RC_TRACE(0x00000400,
- ("add: all methods are obsolete; flushing any EMCP refs"));
- } else {
- int local_count = 0;
- GrowableArray<Method*>* method_refs = new (ResourceObj::C_HEAP, mtClass)
- GrowableArray<Method*>(emcp_method_count, true);
- for (int i = 0; i < old_methods->length(); i++) {
- if (emcp_methods->at(i)) {
- // this old method is EMCP. Save it only if it's on the stack
- Method* old_method = old_methods->at(i);
- if (old_method->on_stack()) {
- method_refs->append(old_method);
- }
- if (++local_count >= emcp_method_count) {
- // no more EMCP methods so bail out now
- break;
- }
- }
- }
- // non-shared ConstantPool gets a reference
- pv_node = new PreviousVersionNode(cp_ref, method_refs);
+ // Clean MethodData of this class's methods so they don't refer to
+ // old methods that are no longer running.
+ Array<Method*>* methods = ik->methods();
+ int num_methods = methods->length();
+ for (int index2 = 0; index2 < num_methods; ++index2) {
+ if (methods->at(index2)->method_data() != NULL) {
+ methods->at(index2)->method_data()->clean_weak_method_links();
}
- // append new previous version.
- _previous_versions->append(pv_node);
}
+}
- // Since the caller is the VMThread and we are at a safepoint, this
- // is a good time to clear out unused references.
-
- RC_TRACE(0x00000400, ("add: previous version length=%d",
- _previous_versions->length()));
-
- // Purge previous versions not executing on the stack
- purge_previous_versions_internal(this, emcp_method_count);
-
+void InstanceKlass::mark_newly_obsolete_methods(Array<Method*>* old_methods,
+ int emcp_method_count) {
int obsolete_method_count = old_methods->length() - emcp_method_count;
if (emcp_method_count != 0 && obsolete_method_count != 0 &&
- _previous_versions->length() > 0) {
+ _previous_versions != NULL) {
// We have a mix of obsolete and EMCP methods so we have to
// clear out any matching EMCP method entries the hard way.
int local_count = 0;
for (int i = 0; i < old_methods->length(); i++) {
- if (!emcp_methods->at(i)) {
+ Method* old_method = old_methods->at(i);
+ if (old_method->is_obsolete()) {
// only obsolete methods are interesting
- Method* old_method = old_methods->at(i);
Symbol* m_name = old_method->name();
Symbol* m_signature = old_method->signature();
- // we might not have added the last entry
- for (int j = _previous_versions->length() - 1; j >= 0; j--) {
- // check the previous versions array for non executing obsolete methods
- PreviousVersionNode * pv_node = _previous_versions->at(j);
+ // previous versions are linked together through the InstanceKlass
+ int j = 0;
+ for (InstanceKlass* prev_version = _previous_versions;
+ prev_version != NULL;
+ prev_version = prev_version->previous_versions(), j++) {
- GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
- if (method_refs == NULL) {
- // We have run into a PreviousVersion generation where
- // all methods were made obsolete during that generation's
- // RedefineClasses() operation. At the time of that
- // operation, all EMCP methods were flushed so we don't
- // have to go back any further.
- //
- // A NULL method_refs is different than an empty method_refs.
- // We cannot infer any optimizations about older generations
- // from an empty method_refs for the current generation.
- break;
- }
-
- for (int k = method_refs->length() - 1; k >= 0; k--) {
+ Array<Method*>* method_refs = prev_version->methods();
+ for (int k = 0; k < method_refs->length(); k++) {
Method* method = method_refs->at(k);
if (!method->is_obsolete() &&
@@ -3816,14 +3728,11 @@
method->signature() == m_signature) {
// The current RedefineClasses() call has made all EMCP
// versions of this method obsolete so mark it as obsolete
- // and remove the reference.
RC_TRACE(0x00000400,
("add: %s(%s): flush obsolete method @%d in version @%d",
m_name->as_C_string(), m_signature->as_C_string(), k, j));
method->set_is_obsolete();
- // Leave obsolete methods on the previous version list to
- // clean up later.
break;
}
}
@@ -3831,9 +3740,9 @@
// The previous loop may not find a matching EMCP method, but
// that doesn't mean that we can optimize and not go any
// further back in the PreviousVersion generations. The EMCP
- // method for this generation could have already been deleted,
+ // method for this generation could have already been made obsolete,
// but there still may be an older EMCP method that has not
- // been deleted.
+ // been made obsolete.
}
if (++local_count >= obsolete_method_count) {
@@ -3843,30 +3752,67 @@
}
}
}
-} // end add_previous_version()
-
-
-// Determine if InstanceKlass has a previous version.
-bool InstanceKlass::has_previous_version() const {
- return (_previous_versions != NULL && _previous_versions->length() > 0);
-} // end has_previous_version()
-
-
-InstanceKlass* InstanceKlass::get_klass_version(int version) {
- if (constants()->version() == version) {
- return this;
- }
- PreviousVersionWalker pvw(Thread::current(), (InstanceKlass*)this);
- for (PreviousVersionNode * pv_node = pvw.next_previous_version();
- pv_node != NULL; pv_node = pvw.next_previous_version()) {
- ConstantPool* prev_cp = pv_node->prev_constant_pool();
- if (prev_cp->version() == version) {
- return prev_cp->pool_holder();
- }
- }
- return NULL; // None found
}
+// Save the scratch_class as the previous version if any of the methods are running.
+// The previous_versions are used to set breakpoints in EMCP methods and they are
+// also used to clean MethodData links to redefined methods that are no longer running.
+void InstanceKlass::add_previous_version(instanceKlassHandle scratch_class,
+ int emcp_method_count) {
+ assert(Thread::current()->is_VM_thread(),
+ "only VMThread can add previous versions");
+
+ // RC_TRACE macro has an embedded ResourceMark
+ RC_TRACE(0x00000400, ("adding previous version ref for %s, EMCP_cnt=%d",
+ scratch_class->external_name(), emcp_method_count));
+
+ // Clean out old previous versions
+ purge_previous_versions(this);
+
+ // Mark newly obsolete methods in remaining previous versions. An EMCP method from
+ // a previous redefinition may be made obsolete by this redefinition.
+ Array<Method*>* old_methods = scratch_class->methods();
+ mark_newly_obsolete_methods(old_methods, emcp_method_count);
+
+ // If the constant pool for this previous version of the class
+ // is not marked as being on the stack, then none of the methods
+ // in this previous version of the class are on the stack so
+ // we don't need to add this as a previous version.
+ ConstantPool* cp_ref = scratch_class->constants();
+ if (!cp_ref->on_stack()) {
+ RC_TRACE(0x00000400, ("add: scratch class not added; no methods are running"));
+ return;
+ }
+
+ if (emcp_method_count != 0) {
+ // At least one method is still running, check for EMCP methods
+ for (int i = 0; i < old_methods->length(); i++) {
+ Method* old_method = old_methods->at(i);
+ if (!old_method->is_obsolete() && old_method->on_stack()) {
+ // if EMCP method (not obsolete) is on the stack, mark as EMCP so that
+ // we can add breakpoints for it.
+
+ // We set the method->on_stack bit during safepoints for class redefinition and
+ // class unloading and use this bit to set the is_running_emcp bit.
+ // After the safepoint, the on_stack bit is cleared and the running emcp
+ // method may exit. If so, we would set a breakpoint in a method that
+ // is never reached, but this won't be noticeable to the programmer.
+ old_method->set_running_emcp(true);
+ RC_TRACE(0x00000400, ("add: EMCP method %s is on_stack " INTPTR_FORMAT,
+ old_method->name_and_sig_as_C_string(), old_method));
+ } else if (!old_method->is_obsolete()) {
+ RC_TRACE(0x00000400, ("add: EMCP method %s is NOT on_stack " INTPTR_FORMAT,
+ old_method->name_and_sig_as_C_string(), old_method));
+ }
+ }
+ }
+
+ // Add previous version if any methods are still running.
+ RC_TRACE(0x00000400, ("add: scratch class added; one of its methods is on_stack"));
+ assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version");
+ scratch_class->link_previous_versions(previous_versions());
+ link_previous_versions(scratch_class());
+} // end add_previous_version()
Method* InstanceKlass::method_with_idnum(int idnum) {
Method* m = NULL;
@@ -3924,61 +3870,3 @@
unsigned char * InstanceKlass::get_cached_class_file_bytes() {
return VM_RedefineClasses::get_cached_class_file_bytes(_cached_class_file);
}
-
-
-// Construct a PreviousVersionNode entry for the array hung off
-// the InstanceKlass.
-PreviousVersionNode::PreviousVersionNode(ConstantPool* prev_constant_pool,
- GrowableArray<Method*>* prev_EMCP_methods) {
-
- _prev_constant_pool = prev_constant_pool;
- _prev_EMCP_methods = prev_EMCP_methods;
-}
-
-
-// Destroy a PreviousVersionNode
-PreviousVersionNode::~PreviousVersionNode() {
- if (_prev_constant_pool != NULL) {
- _prev_constant_pool = NULL;
- }
-
- if (_prev_EMCP_methods != NULL) {
- delete _prev_EMCP_methods;
- }
-}
-
-// Construct a helper for walking the previous versions array
-PreviousVersionWalker::PreviousVersionWalker(Thread* thread, InstanceKlass *ik) {
- _thread = thread;
- _previous_versions = ik->previous_versions();
- _current_index = 0;
- _current_p = NULL;
- _current_constant_pool_handle = constantPoolHandle(thread, ik->constants());
-}
-
-
-// Return the interesting information for the next previous version
-// of the klass. Returns NULL if there are no more previous versions.
-PreviousVersionNode* PreviousVersionWalker::next_previous_version() {
- if (_previous_versions == NULL) {
- // no previous versions so nothing to return
- return NULL;
- }
-
- _current_p = NULL; // reset to NULL
- _current_constant_pool_handle = NULL;
-
- int length = _previous_versions->length();
-
- while (_current_index < length) {
- PreviousVersionNode * pv_node = _previous_versions->at(_current_index++);
-
- // Save a handle to the constant pool for this previous version,
- // which keeps all the methods from being deallocated.
- _current_constant_pool_handle = constantPoolHandle(_thread, pv_node->prev_constant_pool());
- _current_p = pv_node;
- return pv_node;
- }
-
- return NULL;
-} // end next_previous_version()
diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp
index f21d8d8..a5f2eb3 100644
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp
@@ -88,7 +88,6 @@
class fieldDescriptor;
class DepChange;
class nmethodBucket;
-class PreviousVersionNode;
class JvmtiCachedClassFieldMap;
class MemberNameTable;
@@ -235,7 +234,8 @@
_misc_is_anonymous = 1 << 3, // has embedded _host_klass field
_misc_is_contended = 1 << 4, // marked with contended annotation
_misc_has_default_methods = 1 << 5, // class/superclass/implemented interfaces has default methods
- _misc_declares_default_methods = 1 << 6 // directly declares default methods (any access)
+ _misc_declares_default_methods = 1 << 6, // directly declares default methods (any access)
+ _misc_has_been_redefined = 1 << 7 // class has been redefined
};
u2 _misc_flags;
u2 _minor_version; // minor version number of class file
@@ -250,9 +250,8 @@
nmethodBucket* _dependencies; // list of dependent nmethods
nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class
BreakpointInfo* _breakpoints; // bpt lists, managed by Method*
- // Array of interesting part(s) of the previous version(s) of this
- // InstanceKlass. See PreviousVersionWalker below.
- GrowableArray<PreviousVersionNode *>* _previous_versions;
+ // Linked instanceKlasses of previous versions
+ InstanceKlass* _previous_versions;
// JVMTI fields can be moved to their own structure - see 6315920
// JVMTI: cached class file, before retransformable agent modified it in CFLH
JvmtiCachedClassFileData* _cached_class_file;
@@ -669,21 +668,31 @@
}
// RedefineClasses() support for previous versions:
- void add_previous_version(instanceKlassHandle ikh, BitMap *emcp_methods,
- int emcp_method_count);
- // If the _previous_versions array is non-NULL, then this klass
- // has been redefined at least once even if we aren't currently
- // tracking a previous version.
- bool has_been_redefined() const { return _previous_versions != NULL; }
- bool has_previous_version() const;
+ void add_previous_version(instanceKlassHandle ikh, int emcp_method_count);
+
+ InstanceKlass* previous_versions() const { return _previous_versions; }
+
+ bool has_been_redefined() const {
+ return (_misc_flags & _misc_has_been_redefined) != 0;
+ }
+ void set_has_been_redefined() {
+ _misc_flags |= _misc_has_been_redefined;
+ }
+
void init_previous_versions() {
_previous_versions = NULL;
}
- GrowableArray<PreviousVersionNode *>* previous_versions() const {
- return _previous_versions;
+
+
+ InstanceKlass* get_klass_version(int version) {
+ for (InstanceKlass* ik = this; ik != NULL; ik = ik->previous_versions()) {
+ if (ik->constants()->version() == version) {
+ return ik;
+ }
+ }
+ return NULL;
}
- InstanceKlass* get_klass_version(int version);
static void purge_previous_versions(InstanceKlass* ik);
// JVMTI: Support for caching a class file before it is modified by an agent that can do retransformation
@@ -1124,6 +1133,10 @@
// Free CHeap allocated fields.
void release_C_heap_structures();
+
+ // RedefineClasses support
+ void link_previous_versions(InstanceKlass* pv) { _previous_versions = pv; }
+ void mark_newly_obsolete_methods(Array<Method*>* old_methods, int emcp_method_count);
public:
// CDS support - remove and restore oops from metadata. Oops are not shared.
virtual void remove_unshareable_info();
@@ -1222,62 +1235,6 @@
};
-// If breakpoints are more numerous than just JVMTI breakpoints,
-// consider compressing this data structure.
-// It is currently a simple linked list defined in method.hpp.
-
-class BreakpointInfo;
-
-
-// A collection point for interesting information about the previous
-// version(s) of an InstanceKlass. A GrowableArray of PreviousVersionNodes
-// is attached to the InstanceKlass as needed. See PreviousVersionWalker below.
-class PreviousVersionNode : public CHeapObj<mtClass> {
- private:
- ConstantPool* _prev_constant_pool;
-
- // If the previous version of the InstanceKlass doesn't have any
- // EMCP methods, then _prev_EMCP_methods will be NULL. If all the
- // EMCP methods have been collected, then _prev_EMCP_methods can
- // have a length of zero.
- GrowableArray<Method*>* _prev_EMCP_methods;
-
-public:
- PreviousVersionNode(ConstantPool* prev_constant_pool,
- GrowableArray<Method*>* prev_EMCP_methods);
- ~PreviousVersionNode();
- ConstantPool* prev_constant_pool() const {
- return _prev_constant_pool;
- }
- GrowableArray<Method*>* prev_EMCP_methods() const {
- return _prev_EMCP_methods;
- }
-};
-
-
-// Helper object for walking previous versions.
-class PreviousVersionWalker : public StackObj {
- private:
- Thread* _thread;
- GrowableArray<PreviousVersionNode *>* _previous_versions;
- int _current_index;
-
- // A pointer to the current node object so we can handle the deletes.
- PreviousVersionNode* _current_p;
-
- // The constant pool handle keeps all the methods in this class from being
- // deallocated from the metaspace during class unloading.
- constantPoolHandle _current_constant_pool_handle;
-
- public:
- PreviousVersionWalker(Thread* thread, InstanceKlass *ik);
-
- // Return the interesting information for the next previous version
- // of the klass. Returns NULL if there are no more previous versions.
- PreviousVersionNode* next_previous_version();
-};
-
-
//
// nmethodBucket is used to record dependent nmethods for
// deoptimization. nmethod dependencies are actually <klass, method>
diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp
index 4f577e5..fdc93bc 100644
--- a/hotspot/src/share/vm/oops/klass.cpp
+++ b/hotspot/src/share/vm/oops/klass.cpp
@@ -468,6 +468,12 @@
if (clean_alive_klasses && current->oop_is_instance()) {
InstanceKlass* ik = InstanceKlass::cast(current);
ik->clean_weak_instanceklass_links(is_alive);
+
+ // JVMTI RedefineClasses creates previous versions that are not in
+ // the class hierarchy, so process them here.
+ while ((ik = ik->previous_versions()) != NULL) {
+ ik->clean_weak_instanceklass_links(is_alive);
+ }
}
}
}
diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp
index 35d5508..0e199cb 100644
--- a/hotspot/src/share/vm/oops/method.cpp
+++ b/hotspot/src/share/vm/oops/method.cpp
@@ -91,6 +91,7 @@
set_hidden(false);
set_dont_inline(false);
set_has_injected_profile(false);
+ set_running_emcp(false);
set_method_data(NULL);
clear_method_counters();
set_vtable_index(Method::garbage_vtable_index);
diff --git a/hotspot/src/share/vm/oops/method.hpp b/hotspot/src/share/vm/oops/method.hpp
index 2d6f025..fc6f433 100644
--- a/hotspot/src/share/vm/oops/method.hpp
+++ b/hotspot/src/share/vm/oops/method.hpp
@@ -111,6 +111,7 @@
_caller_sensitive : 1,
_force_inline : 1,
_hidden : 1,
+ _running_emcp : 1,
_dont_inline : 1,
_has_injected_profile : 1,
: 2;
@@ -712,6 +713,21 @@
void set_is_obsolete() { _access_flags.set_is_obsolete(); }
bool is_deleted() const { return access_flags().is_deleted(); }
void set_is_deleted() { _access_flags.set_is_deleted(); }
+
+ bool is_running_emcp() const {
+ // EMCP methods are old but not obsolete or deleted. Equivalent
+ // Modulo Constant Pool means the method is equivalent except
+ // the constant pool and instructions that access the constant
+ // pool might be different.
+ // If a breakpoint is set in a redefined method, its EMCP methods that are
+ // still running must have a breakpoint also.
+ return _running_emcp;
+ }
+
+ void set_running_emcp(bool x) {
+ _running_emcp = x;
+ }
+
bool on_stack() const { return access_flags().on_stack(); }
void set_on_stack(const bool value);
diff --git a/hotspot/src/share/vm/oops/methodData.cpp b/hotspot/src/share/vm/oops/methodData.cpp
index f8ec09b..2c78cc1 100644
--- a/hotspot/src/share/vm/oops/methodData.cpp
+++ b/hotspot/src/share/vm/oops/methodData.cpp
@@ -1559,9 +1559,35 @@
}
}
-// Remove SpeculativeTrapData entries that reference an unloaded
-// method
-void MethodData::clean_extra_data(BoolObjectClosure* is_alive) {
+class CleanExtraDataClosure : public StackObj {
+public:
+ virtual bool is_live(Method* m) = 0;
+};
+
+// Check for entries that reference an unloaded method
+class CleanExtraDataKlassClosure : public CleanExtraDataClosure {
+private:
+ BoolObjectClosure* _is_alive;
+public:
+ CleanExtraDataKlassClosure(BoolObjectClosure* is_alive) : _is_alive(is_alive) {}
+ bool is_live(Method* m) {
+ return m->method_holder()->is_loader_alive(_is_alive);
+ }
+};
+
+// Check for entries that reference a redefined method
+class CleanExtraDataMethodClosure : public CleanExtraDataClosure {
+public:
+ CleanExtraDataMethodClosure() {}
+ bool is_live(Method* m) {
+ return m->on_stack();
+ }
+};
+
+
+// Remove SpeculativeTrapData entries that reference an unloaded or
+// redefined method
+void MethodData::clean_extra_data(CleanExtraDataClosure* cl) {
DataLayout* dp = extra_data_base();
DataLayout* end = extra_data_limit();
@@ -1572,7 +1598,7 @@
SpeculativeTrapData* data = new SpeculativeTrapData(dp);
Method* m = data->method();
assert(m != NULL, "should have a method");
- if (!m->method_holder()->is_loader_alive(is_alive)) {
+ if (!cl->is_live(m)) {
// "shift" accumulates the number of cells for dead
// SpeculativeTrapData entries that have been seen so
// far. Following entries must be shifted left by that many
@@ -1603,9 +1629,9 @@
}
}
-// Verify there's no unloaded method referenced by a
+// Verify there's no unloaded or redefined method referenced by a
// SpeculativeTrapData entry
-void MethodData::verify_extra_data_clean(BoolObjectClosure* is_alive) {
+void MethodData::verify_extra_data_clean(CleanExtraDataClosure* cl) {
#ifdef ASSERT
DataLayout* dp = extra_data_base();
DataLayout* end = extra_data_limit();
@@ -1615,7 +1641,7 @@
case DataLayout::speculative_trap_data_tag: {
SpeculativeTrapData* data = new SpeculativeTrapData(dp);
Method* m = data->method();
- assert(m != NULL && m->method_holder()->is_loader_alive(is_alive), "Method should exist");
+ assert(m != NULL && cl->is_live(m), "Method should exist");
break;
}
case DataLayout::bit_data_tag:
@@ -1641,6 +1667,19 @@
parameters->clean_weak_klass_links(is_alive);
}
- clean_extra_data(is_alive);
- verify_extra_data_clean(is_alive);
+ CleanExtraDataKlassClosure cl(is_alive);
+ clean_extra_data(&cl);
+ verify_extra_data_clean(&cl);
+}
+
+void MethodData::clean_weak_method_links() {
+ for (ProfileData* data = first_data();
+ is_valid(data);
+ data = next_data(data)) {
+ data->clean_weak_method_links();
+ }
+
+ CleanExtraDataMethodClosure cl;
+ clean_extra_data(&cl);
+ verify_extra_data_clean(&cl);
}
diff --git a/hotspot/src/share/vm/oops/methodData.hpp b/hotspot/src/share/vm/oops/methodData.hpp
index dd4ca1f..3cd7cd6 100644
--- a/hotspot/src/share/vm/oops/methodData.hpp
+++ b/hotspot/src/share/vm/oops/methodData.hpp
@@ -251,6 +251,9 @@
// GC support
void clean_weak_klass_links(BoolObjectClosure* cl);
+
+ // Redefinition support
+ void clean_weak_method_links();
};
@@ -508,6 +511,9 @@
// GC support
virtual void clean_weak_klass_links(BoolObjectClosure* is_alive_closure) {}
+ // Redefinition support
+ virtual void clean_weak_method_links() {}
+
// CI translation: ProfileData can represent both MethodDataOop data
// as well as CIMethodData data. This function is provided for translating
// an oop in a ProfileData to the ci equivalent. Generally speaking,
@@ -2030,6 +2036,7 @@
//
CC_INTERP_ONLY(class BytecodeInterpreter;)
+class CleanExtraDataClosure;
class MethodData : public Metadata {
friend class VMStructs;
@@ -2183,9 +2190,9 @@
static bool profile_parameters_jsr292_only();
static bool profile_all_parameters();
- void clean_extra_data(BoolObjectClosure* is_alive);
+ void clean_extra_data(CleanExtraDataClosure* cl);
void clean_extra_data_helper(DataLayout* dp, int shift, bool reset = false);
- void verify_extra_data_clean(BoolObjectClosure* is_alive);
+ void verify_extra_data_clean(CleanExtraDataClosure* cl);
public:
static int header_size() {
@@ -2477,6 +2484,8 @@
static bool profile_return_jsr292_only();
void clean_method_data(BoolObjectClosure* is_alive);
+
+ void clean_weak_method_links();
};
#endif // SHARE_VM_OOPS_METHODDATAOOP_HPP
diff --git a/hotspot/src/share/vm/opto/ifnode.cpp b/hotspot/src/share/vm/opto/ifnode.cpp
index a5f0f34..3101455 100644
--- a/hotspot/src/share/vm/opto/ifnode.cpp
+++ b/hotspot/src/share/vm/opto/ifnode.cpp
@@ -453,6 +453,9 @@
// offset. Return 2 if we had to negate the test. Index is NULL if the check
// is versus a constant.
int IfNode::is_range_check(Node* &range, Node* &index, jint &offset) {
+ if (outcnt() != 2) {
+ return 0;
+ }
Node* b = in(1);
if (b == NULL || !b->is_Bool()) return 0;
BoolNode* bn = b->as_Bool();
diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp
index 6ef48fd..7ee5331 100644
--- a/hotspot/src/share/vm/opto/library_call.cpp
+++ b/hotspot/src/share/vm/opto/library_call.cpp
@@ -6026,7 +6026,7 @@
}
assert(UseMontgomeryMultiplyIntrinsic, "not implemented on this platform");
- const char* stubName = "montgomery_square";
+ const char* stubName = "montgomery_multiply";
assert(callee()->signature()->size() == 7, "montgomeryMultiply has 7 parameters");
diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp
index c4bac05..4cf1afb 100644
--- a/hotspot/src/share/vm/opto/runtime.cpp
+++ b/hotspot/src/share/vm/opto/runtime.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1234,17 +1234,23 @@
force_unwind ? NULL : nm->handler_for_exception_and_pc(exception, pc);
if (handler_address == NULL) {
- Handle original_exception(thread, exception());
- handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true);
+ bool recursive_exception = false;
+ handler_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true, recursive_exception);
assert (handler_address != NULL, "must have compiled handler");
// Update the exception cache only when the unwind was not forced
// and there didn't happen another exception during the computation of the
- // compiled exception handler.
- if (!force_unwind && original_exception() == exception()) {
+ // compiled exception handler. Checking for exception oop equality is not
+ // sufficient because some exceptions are pre-allocated and reused.
+ if (!force_unwind && !recursive_exception) {
nm->add_handler_for_exception_and_pc(exception,pc,handler_address);
}
} else {
- assert(handler_address == SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true), "Must be the same");
+#ifdef ASSERT
+ bool recursive_exception = false;
+ address computed_address = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, force_unwind, true, recursive_exception);
+ assert(recursive_exception || (handler_address == computed_address), err_msg("Handler address inconsistency: " PTR_FORMAT " != " PTR_FORMAT,
+ p2i(handler_address), p2i(computed_address)));
+#endif
}
}
diff --git a/hotspot/src/share/vm/prims/jvmtiGetLoadedClasses.cpp b/hotspot/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
index 70aede5..a292f89 100644
--- a/hotspot/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiGetLoadedClasses.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,9 @@
#include "memory/universe.inline.hpp"
#include "prims/jvmtiGetLoadedClasses.hpp"
#include "runtime/thread.hpp"
+#if INCLUDE_ALL_GCS
+#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
+#endif
// The closure for GetLoadedClasses
@@ -35,6 +38,20 @@
Stack<jclass, mtInternal> _classStack;
JvmtiEnv* _env;
+// Tell the GC to keep this klass alive
+static void ensure_klass_alive(oop o) {
+ // A klass that was previously considered dead can be looked up in the
+ // CLD/SD, and its _java_mirror or _class_loader can be stored in a root
+ // or a reachable object making it alive again. The SATB part of G1 needs
+ // to get notified about this potential resurrection, otherwise the marking
+ // might not find the object.
+#if INCLUDE_ALL_GCS
+ if (UseG1GC && o != NULL) {
+ G1SATBCardTableModRefBS::enqueue(o);
+ }
+#endif
+}
+
public:
LoadedClassesClosure(JvmtiEnv* env) {
_env = env;
@@ -43,6 +60,7 @@
void do_klass(Klass* k) {
// Collect all jclasses
_classStack.push((jclass) _env->jni_reference(k->java_mirror()));
+ ensure_klass_alive(k->java_mirror());
}
int extract(jclass* result_list) {
diff --git a/hotspot/src/share/vm/prims/jvmtiImpl.cpp b/hotspot/src/share/vm/prims/jvmtiImpl.cpp
index 9b308d4..3c66b16 100644
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp
@@ -282,39 +282,22 @@
void JvmtiBreakpoint::each_method_version_do(method_action meth_act) {
((Method*)_method->*meth_act)(_bci);
- // add/remove breakpoint to/from versions of the method that
- // are EMCP. Directly or transitively obsolete methods are
- // not saved in the PreviousVersionNodes.
+ // add/remove breakpoint to/from versions of the method that are EMCP.
Thread *thread = Thread::current();
instanceKlassHandle ikh = instanceKlassHandle(thread, _method->method_holder());
Symbol* m_name = _method->name();
Symbol* m_signature = _method->signature();
// search previous versions if they exist
- PreviousVersionWalker pvw(thread, (InstanceKlass *)ikh());
- for (PreviousVersionNode * pv_node = pvw.next_previous_version();
- pv_node != NULL; pv_node = pvw.next_previous_version()) {
- GrowableArray<Method*>* methods = pv_node->prev_EMCP_methods();
-
- if (methods == NULL) {
- // We have run into a PreviousVersion generation where
- // all methods were made obsolete during that generation's
- // RedefineClasses() operation. At the time of that
- // operation, all EMCP methods were flushed so we don't
- // have to go back any further.
- //
- // A NULL methods array is different than an empty methods
- // array. We cannot infer any optimizations about older
- // generations from an empty methods array for the current
- // generation.
- break;
- }
+ for (InstanceKlass* pv_node = ikh->previous_versions();
+ pv_node != NULL;
+ pv_node = pv_node->previous_versions()) {
+ Array<Method*>* methods = pv_node->methods();
for (int i = methods->length() - 1; i >= 0; i--) {
Method* method = methods->at(i);
- // obsolete methods that are running are not deleted from
- // previous version array, but they are skipped here.
- if (!method->is_obsolete() &&
+ // Only set breakpoints in running EMCP methods.
+ if (method->is_running_emcp() &&
method->name() == m_name &&
method->signature() == m_signature) {
RC_TRACE(0x00000800, ("%sing breakpoint in %s(%s)",
diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
index f610db2..0e194b6 100644
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp
@@ -3435,13 +3435,12 @@
}
// the previous versions' constant pool caches may need adjustment
- PreviousVersionWalker pvw(_thread, ik);
- for (PreviousVersionNode * pv_node = pvw.next_previous_version();
- pv_node != NULL; pv_node = pvw.next_previous_version()) {
- other_cp = pv_node->prev_constant_pool();
- cp_cache = other_cp->cache();
+ for (InstanceKlass* pv_node = ik->previous_versions();
+ pv_node != NULL;
+ pv_node = pv_node->previous_versions()) {
+ cp_cache = pv_node->constants()->cache();
if (cp_cache != NULL) {
- cp_cache->adjust_method_entries(other_cp->pool_holder(), &trace_name_printed);
+ cp_cache->adjust_method_entries(pv_node, &trace_name_printed);
}
}
}
@@ -3461,9 +3460,8 @@
}
}
-void VM_RedefineClasses::check_methods_and_mark_as_obsolete(
- BitMap *emcp_methods, int * emcp_method_count_p) {
- *emcp_method_count_p = 0;
+int VM_RedefineClasses::check_methods_and_mark_as_obsolete() {
+ int emcp_method_count = 0;
int obsolete_count = 0;
int old_index = 0;
for (int j = 0; j < _matching_methods_length; ++j, ++old_index) {
@@ -3537,9 +3535,9 @@
// that we get from effectively overwriting the old methods
// when the new methods are attached to the_class.
- // track which methods are EMCP for add_previous_version() call
- emcp_methods->set_bit(old_index);
- (*emcp_method_count_p)++;
+ // Count number of methods that are EMCP. The method will be marked
+ // old but not obsolete if it is EMCP.
+ emcp_method_count++;
// An EMCP method is _not_ obsolete. An obsolete method has a
// different jmethodID than the current method. An EMCP method
@@ -3589,10 +3587,11 @@
old_method->name()->as_C_string(),
old_method->signature()->as_C_string()));
}
- assert((*emcp_method_count_p + obsolete_count) == _old_methods->length(),
+ assert((emcp_method_count + obsolete_count) == _old_methods->length(),
"sanity check");
- RC_TRACE(0x00000100, ("EMCP_cnt=%d, obsolete_cnt=%d", *emcp_method_count_p,
+ RC_TRACE(0x00000100, ("EMCP_cnt=%d, obsolete_cnt=%d", emcp_method_count,
obsolete_count));
+ return emcp_method_count;
}
// This internal class transfers the native function registration from old methods
@@ -3973,11 +3972,8 @@
old_constants->set_pool_holder(scratch_class());
#endif
- // track which methods are EMCP for add_previous_version() call below
- BitMap emcp_methods(_old_methods->length());
- int emcp_method_count = 0;
- emcp_methods.clear(); // clears 0..(length() - 1)
- check_methods_and_mark_as_obsolete(&emcp_methods, &emcp_method_count);
+ // track number of methods that are EMCP for add_previous_version() call below
+ int emcp_method_count = check_methods_and_mark_as_obsolete();
transfer_old_native_function_registrations(the_class);
// The class file bytes from before any retransformable agents mucked
@@ -4064,9 +4060,10 @@
scratch_class->enclosing_method_method_index());
scratch_class->set_enclosing_method_indices(old_class_idx, old_method_idx);
+ the_class->set_has_been_redefined();
+
// keep track of previous versions of this class
- the_class->add_previous_version(scratch_class, &emcp_methods,
- emcp_method_count);
+ the_class->add_previous_version(scratch_class, emcp_method_count);
RC_TIMER_STOP(_timer_rsc_phase1);
RC_TIMER_START(_timer_rsc_phase2);
diff --git a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp
index d2611f2..aab9d45 100644
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp
@@ -403,14 +403,9 @@
// Change jmethodIDs to point to the new methods
void update_jmethod_ids();
- // In addition to marking methods as obsolete, this routine
- // records which methods are EMCP (Equivalent Module Constant
- // Pool) in the emcp_methods BitMap and returns the number of
- // EMCP methods via emcp_method_count_p. This information is
- // used when information about the previous version of the_class
- // is squirreled away.
- void check_methods_and_mark_as_obsolete(BitMap *emcp_methods,
- int * emcp_method_count_p);
+ // In addition to marking methods as old and/or obsolete, this routine
+ // counts the number of methods that are EMCP (Equivalent Module Constant Pool).
+ int check_methods_and_mark_as_obsolete();
void transfer_old_native_function_registrations(instanceKlassHandle the_class);
// Install the redefinition of a class
diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp
index c3e0688..284a4a9 100644
--- a/hotspot/src/share/vm/prims/whitebox.cpp
+++ b/hotspot/src/share/vm/prims/whitebox.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -158,6 +158,10 @@
}
WB_END
+#ifdef LINUX
+#include "utilities/elfFile.hpp"
+#include "osContainer_linux.hpp"
+#endif
WB_ENTRY(jlong, WB_GetCompressedOopsMaxHeapSize(JNIEnv* env, jobject o)) {
return (jlong)Arguments::max_heap_for_compressed_oops();
@@ -1010,6 +1014,30 @@
}
}
+// Checks that the library libfile has the noexecstack bit set.
+WB_ENTRY(jboolean, WB_CheckLibSpecifiesNoexecstack(JNIEnv* env, jobject o, jstring libfile))
+ jboolean ret = false;
+#ifdef LINUX
+ // Can't be in VM when we call JNI.
+ ThreadToNativeFromVM ttnfv(thread);
+ const char* lf = env->GetStringUTFChars(libfile, NULL);
+ CHECK_JNI_EXCEPTION_(env, 0);
+ ElfFile ef(lf);
+ ret = (jboolean) ef.specifies_noexecstack();
+ env->ReleaseStringUTFChars(libfile, lf);
+#endif
+ return ret;
+WB_END
+
+WB_ENTRY(jboolean, WB_IsContainerized(JNIEnv* env, jobject o))
+ LINUX_ONLY(return OSContainer::is_containerized();)
+ return false;
+WB_END
+
+WB_ENTRY(void, WB_PrintOsInfo(JNIEnv* env, jobject o))
+ os::print_os_info(tty);
+WB_END
+
#define CC (char*)
static JNINativeMethod methods[] = {
@@ -1121,6 +1149,10 @@
(void*)&WB_GetNMethod },
{CC"isMonitorInflated", CC"(Ljava/lang/Object;)Z", (void*)&WB_IsMonitorInflated },
{CC"forceSafepoint", CC"()V", (void*)&WB_ForceSafepoint },
+ {CC"checkLibSpecifiesNoexecstack", CC"(Ljava/lang/String;)Z",
+ (void*)&WB_CheckLibSpecifiesNoexecstack},
+ {CC"isContainerized", CC"()Z", (void*)&WB_IsContainerized },
+ {CC"printOsInfo", CC"()V", (void*)&WB_PrintOsInfo },
};
#undef CC
diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp
index 204a991..cf36cb3 100644
--- a/hotspot/src/share/vm/runtime/arguments.cpp
+++ b/hotspot/src/share/vm/runtime/arguments.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1801,20 +1801,34 @@
}
}
+ // Convert Fraction to Precentage values
+ if (FLAG_IS_DEFAULT(MaxRAMPercentage) &&
+ !FLAG_IS_DEFAULT(MaxRAMFraction))
+ MaxRAMPercentage = 100.0 / MaxRAMFraction;
+
+ if (FLAG_IS_DEFAULT(MinRAMPercentage) &&
+ !FLAG_IS_DEFAULT(MinRAMFraction))
+ MinRAMPercentage = 100.0 / MinRAMFraction;
+
+ if (FLAG_IS_DEFAULT(InitialRAMPercentage) &&
+ !FLAG_IS_DEFAULT(InitialRAMFraction))
+ InitialRAMPercentage = 100.0 / InitialRAMFraction;
+
// If the maximum heap size has not been set with -Xmx,
// then set it as fraction of the size of physical memory,
// respecting the maximum and minimum sizes of the heap.
if (FLAG_IS_DEFAULT(MaxHeapSize)) {
- julong reasonable_max = phys_mem / MaxRAMFraction;
-
- if (phys_mem <= MaxHeapSize * MinRAMFraction) {
+ julong reasonable_max = (julong)((phys_mem * MaxRAMPercentage) / 100);
+ const julong reasonable_min = (julong)((phys_mem * MinRAMPercentage) / 100);
+ if (reasonable_min < MaxHeapSize) {
// Small physical memory, so use a minimum fraction of it for the heap
- reasonable_max = phys_mem / MinRAMFraction;
+ reasonable_max = reasonable_min;
} else {
// Not-small physical memory, so require a heap at least
// as large as MaxHeapSize
reasonable_max = MAX2(reasonable_max, (julong)MaxHeapSize);
}
+
if (!FLAG_IS_DEFAULT(ErgoHeapSizeLimit) && ErgoHeapSizeLimit != 0) {
// Limit the heap size to ErgoHeapSizeLimit
reasonable_max = MIN2(reasonable_max, (julong)ErgoHeapSizeLimit);
@@ -1856,7 +1870,7 @@
reasonable_minimum = limit_by_allocatable_memory(reasonable_minimum);
if (InitialHeapSize == 0) {
- julong reasonable_initial = phys_mem / InitialRAMFraction;
+ julong reasonable_initial = (julong)((phys_mem * InitialRAMPercentage) / 100);
reasonable_initial = MAX3(reasonable_initial, reasonable_minimum, (julong)min_heap_size());
reasonable_initial = MIN2(reasonable_initial, (julong)MaxHeapSize);
@@ -1881,6 +1895,94 @@
}
}
+// This option inspects the machine and attempts to set various
+// parameters to be optimal for long-running, memory allocation
+// intensive jobs. It is intended for machines with large
+// amounts of cpu and memory.
+jint Arguments::set_aggressive_heap_flags() {
+ // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit
+ // VM, but we may not be able to represent the total physical memory
+ // available (like having 8gb of memory on a box but using a 32bit VM).
+ // Thus, we need to make sure we're using a julong for intermediate
+ // calculations.
+ julong initHeapSize;
+ julong total_memory = os::physical_memory();
+
+ if (total_memory < (julong) 256 * M) {
+ jio_fprintf(defaultStream::error_stream(),
+ "You need at least 256mb of memory to use -XX:+AggressiveHeap\n");
+ vm_exit(1);
+ }
+
+ // The heap size is half of available memory, or (at most)
+ // all of possible memory less 160mb (leaving room for the OS
+ // when using ISM). This is the maximum; because adaptive sizing
+ // is turned on below, the actual space used may be smaller.
+
+ initHeapSize = MIN2(total_memory / (julong) 2,
+ total_memory - (julong) 160 * M);
+
+ initHeapSize = limit_by_allocatable_memory(initHeapSize);
+
+ if (FLAG_IS_DEFAULT(MaxHeapSize)) {
+ FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize);
+ FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize);
+ // Currently the minimum size and the initial heap sizes are the same.
+ set_min_heap_size(initHeapSize);
+ }
+ if (FLAG_IS_DEFAULT(NewSize)) {
+ // Make the young generation 3/8ths of the total heap.
+ FLAG_SET_CMDLINE(uintx, NewSize,
+ ((julong) MaxHeapSize / (julong) 8) * (julong) 3);
+ FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
+ }
+
+#ifndef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD.
+ FLAG_SET_DEFAULT(UseLargePages, true);
+#endif
+
+ // Increase some data structure sizes for efficiency
+ FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize);
+ FLAG_SET_CMDLINE(bool, ResizeTLAB, false);
+ FLAG_SET_CMDLINE(uintx, TLABSize, 256 * K);
+
+ // See the OldPLABSize comment below, but replace 'after promotion'
+ // with 'after copying'. YoungPLABSize is the size of the survivor
+ // space per-gc-thread buffers. The default is 4kw.
+ FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256 * K); // Note: this is in words
+
+ // OldPLABSize is the size of the buffers in the old gen that
+ // UseParallelGC uses to promote live data that doesn't fit in the
+ // survivor spaces. At any given time, there's one for each gc thread.
+ // The default size is 1kw. These buffers are rarely used, since the
+ // survivor spaces are usually big enough. For specjbb, however, there
+ // are occasions when there's lots of live data in the young gen
+ // and we end up promoting some of it. We don't have a definite
+ // explanation for why bumping OldPLABSize helps, but the theory
+ // is that a bigger PLAB results in retaining something like the
+ // original allocation order after promotion, which improves mutator
+ // locality. A minor effect may be that larger PLABs reduce the
+ // number of PLAB allocation events during gc. The value of 8kw
+ // was arrived at by experimenting with specjbb.
+ FLAG_SET_CMDLINE(uintx, OldPLABSize, 8 * K); // Note: this is in words
+
+ // Enable parallel GC and adaptive generation sizing
+ FLAG_SET_CMDLINE(bool, UseParallelGC, true);
+
+ // Encourage steady state memory management
+ FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100);
+
+ // This appears to improve mutator locality
+ FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
+
+ // Get around early Solaris scheduling bug
+ // (affinity vs other jobs on system)
+ // but disallow DR and offlining (5008695).
+ FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true);
+
+ return JNI_OK;
+}
+
// This must be called after ergonomics because we want bytecode rewriting
// if the server compiler is used, or if UseSharedSpaces is disabled.
void Arguments::set_bytecode_flags() {
@@ -2644,6 +2746,14 @@
return result;
}
+ // We need to ensure processor and memory resources have been properly
+ // configured - which may rely on arguments we just processed - before
+ // doing the final argument processing. Any argument processing that
+ // needs to know about processor and memory resources must occur after
+ // this point.
+
+ os::init_container_support();
+
// Do final processing now that all arguments have been parsed
result = finalize_vm_init_args(&scp, scp_assembly_required);
if (result != JNI_OK) {
@@ -3117,94 +3227,6 @@
_exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo);
} else if (match_option(option, "abort", &tail)) {
_abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo);
- // -XX:+AggressiveHeap
- } else if (match_option(option, "-XX:+AggressiveHeap", &tail)) {
-
- // This option inspects the machine and attempts to set various
- // parameters to be optimal for long-running, memory allocation
- // intensive jobs. It is intended for machines with large
- // amounts of cpu and memory.
-
- // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit
- // VM, but we may not be able to represent the total physical memory
- // available (like having 8gb of memory on a box but using a 32bit VM).
- // Thus, we need to make sure we're using a julong for intermediate
- // calculations.
- julong initHeapSize;
- julong total_memory = os::physical_memory();
-
- if (total_memory < (julong)256*M) {
- jio_fprintf(defaultStream::error_stream(),
- "You need at least 256mb of memory to use -XX:+AggressiveHeap\n");
- vm_exit(1);
- }
-
- // The heap size is half of available memory, or (at most)
- // all of possible memory less 160mb (leaving room for the OS
- // when using ISM). This is the maximum; because adaptive sizing
- // is turned on below, the actual space used may be smaller.
-
- initHeapSize = MIN2(total_memory / (julong)2,
- total_memory - (julong)160*M);
-
- initHeapSize = limit_by_allocatable_memory(initHeapSize);
-
- if (FLAG_IS_DEFAULT(MaxHeapSize)) {
- FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize);
- FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize);
- // Currently the minimum size and the initial heap sizes are the same.
- set_min_heap_size(initHeapSize);
- }
- if (FLAG_IS_DEFAULT(NewSize)) {
- // Make the young generation 3/8ths of the total heap.
- FLAG_SET_CMDLINE(uintx, NewSize,
- ((julong)MaxHeapSize / (julong)8) * (julong)3);
- FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
- }
-
-#ifndef _ALLBSD_SOURCE // UseLargePages is not yet supported on BSD.
- FLAG_SET_DEFAULT(UseLargePages, true);
-#endif
-
- // Increase some data structure sizes for efficiency
- FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize);
- FLAG_SET_CMDLINE(bool, ResizeTLAB, false);
- FLAG_SET_CMDLINE(uintx, TLABSize, 256*K);
-
- // See the OldPLABSize comment below, but replace 'after promotion'
- // with 'after copying'. YoungPLABSize is the size of the survivor
- // space per-gc-thread buffers. The default is 4kw.
- FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256*K); // Note: this is in words
-
- // OldPLABSize is the size of the buffers in the old gen that
- // UseParallelGC uses to promote live data that doesn't fit in the
- // survivor spaces. At any given time, there's one for each gc thread.
- // The default size is 1kw. These buffers are rarely used, since the
- // survivor spaces are usually big enough. For specjbb, however, there
- // are occasions when there's lots of live data in the young gen
- // and we end up promoting some of it. We don't have a definite
- // explanation for why bumping OldPLABSize helps, but the theory
- // is that a bigger PLAB results in retaining something like the
- // original allocation order after promotion, which improves mutator
- // locality. A minor effect may be that larger PLABs reduce the
- // number of PLAB allocation events during gc. The value of 8kw
- // was arrived at by experimenting with specjbb.
- FLAG_SET_CMDLINE(uintx, OldPLABSize, 8*K); // Note: this is in words
-
- // Enable parallel GC and adaptive generation sizing
- FLAG_SET_CMDLINE(bool, UseParallelGC, true);
-
- // Encourage steady state memory management
- FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100);
-
- // This appears to improve mutator locality
- FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
-
- // Get around early Solaris scheduling bug
- // (affinity vs other jobs on system)
- // but disallow DR and offlining (5008695).
- FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true);
-
} else if (match_option(option, "-XX:+NeverTenure", &tail)) {
// The last option must always win.
FLAG_SET_CMDLINE(bool, AlwaysTenure, false);
@@ -3605,6 +3627,15 @@
return JNI_ERR;
}
+ // This must be done after all arguments have been processed
+ // and the container support has been initialized since AggressiveHeap
+ // relies on the amount of total memory available.
+ if (AggressiveHeap) {
+ jint result = set_aggressive_heap_flags();
+ if (result != JNI_OK) {
+ return result;
+ }
+ }
// This must be done after all arguments have been processed.
// java_compiler() true means set to "NONE" or empty.
if (java_compiler() && !xdebug_mode()) {
diff --git a/hotspot/src/share/vm/runtime/arguments.hpp b/hotspot/src/share/vm/runtime/arguments.hpp
index 8fd3e3f..133ac33 100644
--- a/hotspot/src/share/vm/runtime/arguments.hpp
+++ b/hotspot/src/share/vm/runtime/arguments.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -365,6 +365,8 @@
// Aggressive optimization flags.
static void set_aggressive_opts_flags();
+ static jint set_aggressive_heap_flags();
+
// Argument parsing
static void do_pd_flag_adjustments();
static bool parse_argument(const char* arg, Flag::Flags origin);
diff --git a/hotspot/src/share/vm/runtime/frame.hpp b/hotspot/src/share/vm/runtime/frame.hpp
index c83808b..255596e 100644
--- a/hotspot/src/share/vm/runtime/frame.hpp
+++ b/hotspot/src/share/vm/runtime/frame.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,11 +45,9 @@
# include "adfiles/adGlobals_ppc_64.hpp"
#endif
#endif // COMPILER2
-#ifdef ZERO
#ifdef TARGET_ARCH_zero
# include "stack_zero.hpp"
#endif
-#endif
typedef class BytecodeInterpreter* interpreterState;
diff --git a/hotspot/src/share/vm/runtime/frame.inline.hpp b/hotspot/src/share/vm/runtime/frame.inline.hpp
index ce72595..37d13f8 100644
--- a/hotspot/src/share/vm/runtime/frame.inline.hpp
+++ b/hotspot/src/share/vm/runtime/frame.inline.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -46,14 +46,12 @@
#ifdef TARGET_ARCH_ppc
# include "jniTypes_ppc.hpp"
#endif
-#ifdef ZERO
#ifdef TARGET_ARCH_zero
# include "entryFrame_zero.hpp"
# include "fakeStubFrame_zero.hpp"
# include "interpreterFrame_zero.hpp"
# include "sharkFrame_zero.hpp"
#endif
-#endif
// This file holds platform-independent bodies of inline functions for frames.
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 6c9bd3b..b07bc53 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -2064,13 +2064,23 @@
product_pd(uint64_t, MaxRAM, \
"Real memory size (in bytes) used to set maximum heap size") \
\
+ product(bool, AggressiveHeap, false, \
+ "Optimize heap options for long-running memory intensive apps") \
+ \
product(uintx, ErgoHeapSizeLimit, 0, \
"Maximum ergonomically set heap size (in bytes); zero means use " \
- "MaxRAM / MaxRAMFraction") \
+ "MaxRAM * MaxRAMPercentage / 100") \
\
experimental(bool, UseCGroupMemoryLimitForHeap, false, \
"Use CGroup memory limit as physical memory limit for heap " \
- "sizing") \
+ "sizing" \
+ "Deprecated, replaced by container support") \
+ \
+ diagnostic(bool, PrintContainerInfo, false, \
+ "Print container related information") \
+ \
+ diagnostic(bool, PrintActiveCpus, false, \
+ "Print the number of CPUs detected in os::active_processor_count") \
\
product(uintx, MaxRAMFraction, 4, \
"Maximum fraction (1/n) of real memory used for maximum heap " \
@@ -2087,6 +2097,19 @@
product(uintx, InitialRAMFraction, 64, \
"Fraction (1/n) of real memory used for initial heap size") \
\
+ product(double, MaxRAMPercentage, 25.0, \
+ "Maximum percentage of real memory used for maximum heap size") \
+ \
+ product(double, MinRAMPercentage, 50.0, \
+ "Minimum percentage of real memory used for maximum heap" \
+ "size on systems with small physical memory size") \
+ \
+ product(double, InitialRAMPercentage, 1.5625, \
+ "Percentage of real memory used for initial heap size") \
+ \
+ product(intx, ActiveProcessorCount, -1, \
+ "Specify the CPU count the VM should use and report as active") \
+ \
develop(uintx, MaxVirtMemFraction, 2, \
"Maximum fraction (1/n) of virtual memory used for ergonomically "\
"determining maximum heap size") \
diff --git a/hotspot/src/share/vm/runtime/os.hpp b/hotspot/src/share/vm/runtime/os.hpp
index e008b9c..e63d8d9 100644
--- a/hotspot/src/share/vm/runtime/os.hpp
+++ b/hotspot/src/share/vm/runtime/os.hpp
@@ -152,8 +152,16 @@
static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned);
static void initialize_initial_active_processor_count();
+
+ LINUX_ONLY(static void pd_init_container_support();)
+
public:
static void init(void); // Called before command line parsing
+
+ static void init_container_support() { // Called during command line parsing.
+ LINUX_ONLY(pd_init_container_support();)
+ }
+
static void init_before_ergo(void); // Called after command line parsing
// before VM ergonomics processing.
static jint init_2(void); // Called after command line parsing
diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp
index 8ffa8ab..a831012 100644
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp
@@ -639,7 +639,7 @@
// ret_pc points into caller; we are returning caller's exception handler
// for given exception
address SharedRuntime::compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception,
- bool force_unwind, bool top_frame_only) {
+ bool force_unwind, bool top_frame_only, bool& recursive_exception_occurred) {
assert(nm != NULL, "must exist");
ResourceMark rm;
@@ -667,6 +667,7 @@
// BCI of the exception handler which caused the exception to be
// thrown (bugs 4307310 and 4546590). Set "exception" reference
// argument to ensure that the correct exception is thrown (4870175).
+ recursive_exception_occurred = true;
exception = Handle(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
if (handler_bci >= 0) {
diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.hpp b/hotspot/src/share/vm/runtime/sharedRuntime.hpp
index 2167eb8..c6a96a8 100644
--- a/hotspot/src/share/vm/runtime/sharedRuntime.hpp
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -184,7 +184,7 @@
// exception handling and implicit exceptions
static address compute_compiled_exc_handler(nmethod* nm, address ret_pc, Handle& exception,
- bool force_unwind, bool top_frame_only);
+ bool force_unwind, bool top_frame_only, bool& recursive_exception_occurred);
enum ImplicitExceptionKind {
IMPLICIT_NULL,
IMPLICIT_DIVIDE_BY_ZERO,
diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp
index 71b3b2d..adff844 100644
--- a/hotspot/src/share/vm/runtime/thread.cpp
+++ b/hotspot/src/share/vm/runtime/thread.cpp
@@ -3335,6 +3335,7 @@
Arguments::init_version_specific_system_properties();
// Parse arguments
+ // Note: this internally calls os::init_container_support()
jint parse_result = Arguments::parse(args);
if (parse_result != JNI_OK) return parse_result;
diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp
index 1117c87..c203211 100644
--- a/hotspot/src/share/vm/runtime/thread.hpp
+++ b/hotspot/src/share/vm/runtime/thread.hpp
@@ -51,11 +51,9 @@
#include "gc_implementation/g1/dirtyCardQueue.hpp"
#include "gc_implementation/g1/satbQueue.hpp"
#endif // INCLUDE_ALL_GCS
-#ifdef ZERO
#ifdef TARGET_ARCH_zero
# include "stack_zero.hpp"
#endif
-#endif
class ThreadSafepointState;
class ThreadProfiler;
diff --git a/hotspot/test/compiler/loopopts/TestCMovSplitThruPhi.java b/hotspot/test/compiler/loopopts/TestCMovSplitThruPhi.java
index 03df3c0..86e9134 100644
--- a/hotspot/test/compiler/loopopts/TestCMovSplitThruPhi.java
+++ b/hotspot/test/compiler/loopopts/TestCMovSplitThruPhi.java
@@ -25,7 +25,7 @@
* @test
* @bug 8187822
* @summary C2 conditonal move optimization might create broken graph
- * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestCMovSplitThruPhi::not_inlined -XX:CompileOnly=TestCMovSplitThruPhi::test -XX:-LoopUnswitching TestCMovSplitThruPhi
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestCMovSplitThruPhi::not_inlined -XX:CompileOnly=TestCMovSplitThruPhi::test -XX:-LoopUnswitching TestCMovSplitThruPhi
*
*/
diff --git a/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java b/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java
new file mode 100644
index 0000000..4227046
--- /dev/null
+++ b/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.*;
+import java.lang.instrument.*;
+import java.lang.reflect.*;
+import java.lang.management.ManagementFactory;
+import com.sun.tools.attach.VirtualMachine;
+
+class A {
+ void m() {
+ }
+}
+
+class B extends A {
+ void m() {
+ }
+}
+
+class C extends A {
+ void m() {
+ }
+}
+
+class Test {
+
+ static public void m() throws Exception {
+ for (int i = 0; i < 20000; i++) {
+ m1(a);
+ }
+ for (int i = 0; i < 4; i++) {
+ m1(b);
+ }
+ }
+
+ static boolean m1(A a) {
+ boolean res = Agent.m2(a);
+ return res;
+ }
+
+ static public A a = new A();
+ static public B b = new B();
+ static public C c = new C();
+}
+
+public class Agent implements ClassFileTransformer {
+
+
+ static class MemoryChunk {
+ MemoryChunk other;
+ long[] array;
+ MemoryChunk(MemoryChunk other) {
+ other = other;
+ array = new long[1024 * 1024 * 1024];
+ }
+ }
+
+ static public boolean m2(A a) {
+ boolean res = false;
+ if (a.getClass() == B.class) {
+ a.m();
+ } else {
+ res = true;
+ }
+ return res;
+ }
+
+ static public void main(String[] args) throws Exception {
+ // Create speculative trap entries
+ Test.m();
+
+ String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
+ int p = nameOfRunningVM.indexOf('@');
+ String pid = nameOfRunningVM.substring(0, p);
+
+ // Make the nmethod go away
+ for (int i = 0; i < 10; i++) {
+ System.gc();
+ }
+
+ // Redefine class
+ try {
+ VirtualMachine vm = VirtualMachine.attach(pid);
+ vm.loadAgent(System.getProperty("test.classes",".") + "/agent.jar", "");
+ vm.detach();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ Test.m();
+ // GC will hit dead method pointer
+ for (int i = 0; i < 10; i++) {
+ System.gc();
+ }
+ }
+
+ public synchronized byte[] transform(final ClassLoader classLoader,
+ final String className,
+ Class<?> classBeingRedefined,
+ ProtectionDomain protectionDomain,
+ byte[] classfileBuffer) {
+ System.out.println("Transforming class " + className);
+ return classfileBuffer;
+ }
+
+ public static void redefine(String agentArgs, Instrumentation instrumentation, Class to_redefine) {
+
+ try {
+ instrumentation.retransformClasses(to_redefine);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception {
+ Agent transformer = new Agent();
+ instrumentation.addTransformer(transformer, true);
+
+ redefine(agentArgs, instrumentation, Test.class);
+ }
+}
diff --git a/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java b/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java
new file mode 100644
index 0000000..9142738
--- /dev/null
+++ b/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.PrintWriter;
+import com.oracle.java.testlibrary.*;
+
+/*
+ * @test
+ * @bug 8038636
+ * @library /testlibrary
+ * @build Agent
+ * @run main ClassFileInstaller Agent
+ * @run main Launcher
+ * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 -Xmx1M -XX:ReservedCodeCacheSize=3M Agent
+ */
+public class Launcher {
+ public static void main(String[] args) throws Exception {
+
+ PrintWriter pw = new PrintWriter("MANIFEST.MF");
+ pw.println("Agent-Class: Agent");
+ pw.println("Can-Retransform-Classes: true");
+ pw.close();
+
+ ProcessBuilder pb = new ProcessBuilder();
+ pb.command(new String[] { JDKToolFinder.getJDKTool("jar"), "cmf", "MANIFEST.MF", System.getProperty("test.classes",".") + "/agent.jar", "Agent.class"});
+ pb.start().waitFor();
+ }
+}
diff --git a/hotspot/test/runtime/RedefineFinalizer/RedefineFinalizer.java b/hotspot/test/runtime/RedefineTests/RedefineFinalizer.java
similarity index 95%
rename from hotspot/test/runtime/RedefineFinalizer/RedefineFinalizer.java
rename to hotspot/test/runtime/RedefineTests/RedefineFinalizer.java
index 227b9e8..3d98452 100644
--- a/hotspot/test/runtime/RedefineFinalizer/RedefineFinalizer.java
+++ b/hotspot/test/runtime/RedefineTests/RedefineFinalizer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/hotspot/test/runtime/RedefineTests/RedefineRunningMethods.java b/hotspot/test/runtime/RedefineTests/RedefineRunningMethods.java
new file mode 100644
index 0000000..7d44a8a
--- /dev/null
+++ b/hotspot/test/runtime/RedefineTests/RedefineRunningMethods.java
@@ -0,0 +1,143 @@
+/*
+ * 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 8055008
+ * @summary Redefine EMCP and non-EMCP methods that are running in an infinite loop
+ * @library /testlibrary
+ * @build RedefineClassHelper
+ * @run main RedefineClassHelper
+ * @run main/othervm -javaagent:redefineagent.jar RedefineRunningMethods
+ */
+public class RedefineRunningMethods {
+
+ public static String newB =
+ "class RedefineRunningMethods$B {" +
+ " static int count1 = 0;" +
+ " static int count2 = 0;" +
+ " public static volatile boolean stop = false;" +
+ " static void localSleep() { " +
+ " try{ " +
+ " Thread.currentThread().sleep(10);" +
+ " } catch(InterruptedException ie) { " +
+ " } " +
+ " } " +
+ " public static void infinite() { " +
+ " System.out.println(\"infinite called\");" +
+ " }" +
+ " public static void infinite_emcp() { " +
+ " while (!stop) { count2++; localSleep(); }" +
+ " }" +
+ "}";
+
+ public static String evenNewerB =
+ "class RedefineRunningMethods$B {" +
+ " static int count1 = 0;" +
+ " static int count2 = 0;" +
+ " public static volatile boolean stop = false;" +
+ " static void localSleep() { " +
+ " try{ " +
+ " Thread.currentThread().sleep(1);" +
+ " } catch(InterruptedException ie) { " +
+ " } " +
+ " } " +
+ " public static void infinite() { }" +
+ " public static void infinite_emcp() { " +
+ " System.out.println(\"infinite_emcp now obsolete called\");" +
+ " }" +
+ "}";
+
+ static class B {
+ static int count1 = 0;
+ static int count2 = 0;
+ public static volatile boolean stop = false;
+ static void localSleep() {
+ try{
+ Thread.currentThread().sleep(10);//sleep for 10 ms
+ } catch(InterruptedException ie) {
+ }
+ }
+
+ public static void infinite() {
+ while (!stop) { count1++; localSleep(); }
+ }
+ public static void infinite_emcp() {
+ while (!stop) { count2++; localSleep(); }
+ }
+ }
+
+
+ public static void main(String[] args) throws Exception {
+
+ new Thread() {
+ public void run() {
+ B.infinite();
+ }
+ }.start();
+
+ new Thread() {
+ public void run() {
+ B.infinite_emcp();
+ }
+ }.start();
+
+ RedefineClassHelper.redefineClass(B.class, newB);
+
+ System.gc();
+
+ B.infinite();
+
+ // Start a thread with the second version of infinite_emcp running
+ new Thread() {
+ public void run() {
+ B.infinite_emcp();
+ }
+ }.start();
+
+ for (int i = 0; i < 20 ; i++) {
+ String s = new String("some garbage");
+ System.gc();
+ }
+
+ RedefineClassHelper.redefineClass(B.class, evenNewerB);
+ System.gc();
+
+ for (int i = 0; i < 20 ; i++) {
+ B.infinite();
+ String s = new String("some garbage");
+ System.gc();
+ }
+
+ B.infinite_emcp();
+
+ // purge should clean everything up.
+ B.stop = true;
+
+ for (int i = 0; i < 20 ; i++) {
+ B.infinite();
+ String s = new String("some garbage");
+ System.gc();
+ }
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/AttemptOOM.java b/hotspot/test/runtime/containers/docker/AttemptOOM.java
new file mode 100644
index 0000000..4d46828
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/AttemptOOM.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.
+ */
+
+public class AttemptOOM {
+ private static MyObj[] data;
+
+ public static void main(String[] args) throws Exception {
+ System.out.println("Entering AttemptOOM main");
+
+ // each MyObj will allocate 1024 byte array
+ int sizeInMb = Integer.parseInt(args[0]);
+ data = new MyObj[sizeInMb*1024];
+
+ System.out.println("data.length = " + data.length);
+
+ for (int i=0; i < data.length; i++) {
+ data[i] = new MyObj(1024);
+ }
+
+ System.out.println("AttemptOOM allocation successful");
+ }
+
+ private static class MyObj {
+ private byte[] myData;
+ MyObj(int size) {
+ myData = new byte[size];
+ }
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/CPUSetsReader.java b/hotspot/test/runtime/containers/docker/CPUSetsReader.java
new file mode 100644
index 0000000..f6fa93e
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/CPUSetsReader.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.Optional;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import com.oracle.java.testlibrary.Asserts;
+
+
+// A simple CPU sets reader and parser
+public class CPUSetsReader {
+ public static String PROC_SELF_STATUS_PATH="/proc/self/status";
+
+ // Test the parser
+ public static void test() {
+ assertParse("0-7", "0,1,2,3,4,5,6,7");
+ assertParse("1,3,6", "1,3,6");
+ assertParse("0,2-4,6,10-11", "0,2,3,4,6,10,11");
+ assertParse("0", "0");
+ }
+
+
+ private static void assertParse(String cpuSet, String expectedResult) {
+ Asserts.assertEquals(listToString(parseCpuSet(cpuSet)), expectedResult);
+ }
+
+
+ public static String readFromProcStatus(String setType) {
+ String path = PROC_SELF_STATUS_PATH;
+ Optional<String> o = Optional.empty();
+
+ System.out.println("readFromProcStatus() entering for: " + setType);
+
+ try (Stream<String> stream = Files.lines(Paths.get(path))) {
+ o = stream
+ .filter(line -> line.contains(setType))
+ .findFirst();
+ } catch (IOException e) {
+ return null;
+ }
+
+ if (!o.isPresent()) {
+ return null; // entry not found
+ }
+
+ String[] parts = o.get().replaceAll("\\s","").split(":");
+
+ // Should be 2 parts, before and after ":"
+ Asserts.assertEquals(parts.length, 2);
+
+ String result = parts[1];
+ System.out.println("readFromProcStatus() returning: " + result);
+ return result;
+ }
+
+
+ public static List<Integer> parseCpuSet(String value) {
+ ArrayList<Integer> result = new ArrayList<Integer>();
+
+ try {
+ String[] commaSeparated = value.split(",");
+
+ for (String item : commaSeparated) {
+ if (item.contains("-")) {
+ addRange(result, item);
+ } else {
+ result.add(Integer.parseInt(item));
+ }
+ }
+ } catch (Exception e) {
+ System.err.println("Exception in getMaxCpuSets(): " + e);
+ return null;
+ }
+
+ return result;
+ }
+
+
+ private static void addRange(ArrayList<Integer> list, String s) {
+ String[] range = s.split("-");
+ if ( range.length != 2 ) {
+ throw new RuntimeException("Range should only contain two items, but contains "
+ + range.length + " items");
+ }
+
+ int min = Integer.parseInt(range[0]);
+ int max = Integer.parseInt(range[1]);
+
+ if (min >= max) {
+ String msg = String.format("min is greater or equals to max, min = %d, max = %d",
+ min, max);
+ throw new RuntimeException(msg);
+ }
+
+ for (int i = min; i <= max; i++) {
+ list.add(i);
+ }
+ }
+
+
+ // Convert list of integers to string with comma-separated values
+ public static String listToString(List<Integer> list) {
+ return listToString(list, Integer.MAX_VALUE);
+ }
+
+ // Convert list of integers to a string with comma-separated values;
+ // include up to maxCount.
+ public static String listToString(List<Integer> list, int maxCount) {
+ return list.stream()
+ .limit(maxCount)
+ .map(Object::toString)
+ .collect(Collectors.joining(","));
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/CheckContainerized.java b/hotspot/test/runtime/containers/docker/CheckContainerized.java
new file mode 100644
index 0000000..c0ca4bf
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/CheckContainerized.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 sun.hotspot.WhiteBox;
+
+public class CheckContainerized {
+ public static String OUTSIDE_OF_CONTAINER =
+ "CheckContainerized: Running outside of a container";
+ public static String INSIDE_A_CONTAINER =
+ "CheckContainerized: Running inside a container";
+
+ public static void main(String[] args) {
+ System.out.println("CheckContainerized: Entering");
+ WhiteBox wb = WhiteBox.getWhiteBox();
+
+ if (wb.isContainerized()) {
+ System.out.println(INSIDE_A_CONTAINER);
+
+ } else {
+ System.out.println(OUTSIDE_OF_CONTAINER);
+ }
+ }
+}
+
diff --git a/hotspot/test/runtime/containers/docker/DockerBasicTest.java b/hotspot/test/runtime/containers/docker/DockerBasicTest.java
new file mode 100644
index 0000000..fe5d441
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/DockerBasicTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 Basic (sanity) test for JDK-under-test inside a docker image.
+ * @library /testlibrary
+ * @build HelloDocker
+ * @run driver DockerBasicTest
+ */
+
+import com.oracle.java.testlibrary.Utils;
+import com.oracle.java.testlibrary.Platform;
+import com.oracle.java.testlibrary.DockerTestUtils;
+import com.oracle.java.testlibrary.DockerRunOptions;
+
+public class DockerBasicTest {
+ private static final String imageNameAndTag = "jdk8-internal:test";
+ // Diganostics: set to false to examine image after the test
+ private static final boolean removeImageAfterTest = true;
+
+ public static void main(String[] args) throws Exception {
+ if (!DockerTestUtils.canTestDocker()) {
+ return;
+ }
+ DockerTestUtils.buildJdkDockerImage(imageNameAndTag, "Dockerfile-BasicTest", "jdk-docker");
+
+ try {
+ testJavaVersion();
+ testHelloDocker();
+ } finally {
+ if (removeImageAfterTest)
+ DockerTestUtils.removeDockerImage(imageNameAndTag);
+ }
+ }
+
+
+ private static void testJavaVersion() throws Exception {
+ DockerRunOptions opts =
+ new DockerRunOptions(imageNameAndTag, "/jdk/bin/java", "-version");
+
+ DockerTestUtils.dockerRunJava(opts)
+ .shouldHaveExitValue(0)
+ .shouldContain(Platform.vmName);
+ }
+
+
+ private static void testHelloDocker() throws Exception {
+ DockerRunOptions opts =
+ new DockerRunOptions(imageNameAndTag, "/jdk/bin/java", "HelloDocker")
+ .addJavaOpts("-cp", "/test-classes/")
+ .addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/");
+
+ DockerTestUtils.dockerRunJava(opts)
+ .shouldHaveExitValue(0)
+ .shouldContain("Hello Docker");
+ }
+}
+
diff --git a/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest
new file mode 100644
index 0000000..166c969
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest
@@ -0,0 +1,8 @@
+FROM oraclelinux:7.2
+MAINTAINER mikhailo.seledtsov@oracle.com
+
+COPY /jdk /jdk
+
+ENV JAVA_HOME=/jdk
+
+CMD ["/bin/bash"]
diff --git a/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-aarch64 b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-aarch64
new file mode 100644
index 0000000..082a4d8
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-aarch64
@@ -0,0 +1,8 @@
+# Use generic ubuntu Linux on AArch64
+FROM aarch64/ubuntu
+
+COPY /jdk /jdk
+
+ENV JAVA_HOME=/jdk
+
+CMD ["/bin/bash"]
diff --git a/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-ppc64le b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-ppc64le
new file mode 100644
index 0000000..57dfb0f
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-ppc64le
@@ -0,0 +1,10 @@
+# test on x86_64 uses Oracle Linux but we do not have this for ppc64le
+# so use some other Linux where OpenJDK works
+# FROM oraclelinux:7.2
+FROM ppc64le/ubuntu
+
+COPY /jdk /jdk
+
+ENV JAVA_HOME=/jdk
+
+CMD ["/bin/bash"]
diff --git a/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-s390x b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-s390x
new file mode 100644
index 0000000..940b36e
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/Dockerfile-BasicTest-s390x
@@ -0,0 +1,7 @@
+FROM s390x/ubuntu
+
+COPY /jdk /jdk
+
+ENV JAVA_HOME=/jdk
+
+CMD ["/bin/bash"]
diff --git a/hotspot/test/runtime/containers/docker/HelloDocker.java b/hotspot/test/runtime/containers/docker/HelloDocker.java
new file mode 100644
index 0000000..5fe7a5a
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/HelloDocker.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.
+ */
+
+public class HelloDocker {
+ public static void main(String args[]) {
+ System.out.println("Hello Docker");
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/PrintContainerInfo.java b/hotspot/test/runtime/containers/docker/PrintContainerInfo.java
new file mode 100644
index 0000000..b060477
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/PrintContainerInfo.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 sun.hotspot.WhiteBox;
+
+public class PrintContainerInfo {
+
+ public static void main(String[] args) {
+ System.out.println("PrintContainerInfo: Entering");
+ WhiteBox wb = WhiteBox.getWhiteBox();
+
+ wb.printOsInfo();
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/TEST.properties b/hotspot/test/runtime/containers/docker/TEST.properties
new file mode 100644
index 0000000..3d748e1
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/TEST.properties
@@ -0,0 +1 @@
+exclusiveAccess.dirs=.
diff --git a/hotspot/test/runtime/containers/docker/TestCPUAwareness.java b/hotspot/test/runtime/containers/docker/TestCPUAwareness.java
new file mode 100644
index 0000000..fe7d449
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/TestCPUAwareness.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 JVM's CPU resource awareness when running inside docker container
+ * @library /testlibrary
+ * @run driver TestCPUAwareness
+ */
+
+import java.util.List;
+import com.oracle.java.testlibrary.Common;
+import com.oracle.java.testlibrary.DockerTestUtils;
+import com.oracle.java.testlibrary.DockerRunOptions;
+
+public class TestCPUAwareness {
+private static final String imageName = Common.imageName("cpu");
+ private static final int availableCPUs = Runtime.getRuntime().availableProcessors();
+
+ public static void main(String[] args) throws Exception {
+ if (!DockerTestUtils.canTestDocker()) {
+ return;
+ }
+
+ System.out.println("Test Environment: detected availableCPUs = " + availableCPUs);
+ DockerTestUtils.buildJdkDockerImage(imageName, "Dockerfile-BasicTest", "jdk-docker");
+
+ try {
+ // cpuset, period, shares, expected Active Processor Count
+ testComboWithCpuSets();
+
+ // cpu shares - it should be safe to use CPU shares exceeding available CPUs
+ testCpuShares(256, 1);
+ testCpuShares(2048, 2);
+ testCpuShares(4096, 4);
+
+ // leave one CPU for system and tools, otherwise this test may be unstable
+ int maxNrOfAvailableCpus = availableCPUs - 1;
+ for (int i=1; i < maxNrOfAvailableCpus; i = i * 2) {
+ testCpus(i, i);
+ }
+
+ // If ActiveProcessorCount is set, the VM should use it, regardless of other
+ // container settings, host settings or available CPUs on the host.
+ testActiveProcessorCount(1, 1);
+ testActiveProcessorCount(2, 2);
+
+ // cpu quota and period
+ testCpuQuotaAndPeriod(50*1000, 100*1000);
+ testCpuQuotaAndPeriod(100*1000, 100*1000);
+ testCpuQuotaAndPeriod(150*1000, 100*1000);
+ testCpuQuotaAndPeriod(400*1000, 100*1000);
+
+ } finally {
+ DockerTestUtils.removeDockerImage(imageName);
+ }
+ }
+
+
+ private static void testComboWithCpuSets() throws Exception {
+ String cpuSetStr = CPUSetsReader.readFromProcStatus("Cpus_allowed_list");
+ System.out.println("cpuSetStr = " + cpuSetStr);
+
+ if (cpuSetStr == null) {
+ System.out.printf("The cpuset test cases are skipped");
+ } else {
+ List<Integer> cpuSet = CPUSetsReader.parseCpuSet(cpuSetStr);
+
+ // Test subset of cpuset with one element
+ if (cpuSet.size() >= 1) {
+ String testCpuSet = CPUSetsReader.listToString(cpuSet, 1);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 4*1024, true, 1);
+ }
+
+ // Test subset of cpuset with two elements
+ if (cpuSet.size() >= 2) {
+ String testCpuSet = CPUSetsReader.listToString(cpuSet, 2);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 4*1024, true, 2);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 1023, true, 2);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 1023, false, 1);
+ }
+
+ // Test subset of cpuset with three elements
+ if (cpuSet.size() >= 3) {
+ String testCpuSet = CPUSetsReader.listToString(cpuSet, 3);
+ testAPCCombo(testCpuSet, 100*1000, 100*1000, 2*1024, true, 1);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 1023, true, 2);
+ testAPCCombo(testCpuSet, 200*1000, 100*1000, 1023, false, 1);
+ }
+ }
+ }
+
+
+ private static void testActiveProcessorCount(int valueToSet, int expectedValue) throws Exception {
+ Common.logNewTestCase("Test ActiveProcessorCount: valueToSet = " + valueToSet);
+
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addJavaOpts("-XX:ActiveProcessorCount=" + valueToSet, "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintActiveCpus");
+ Common.run(opts)
+ .shouldMatch("active processor count set by user.*" + expectedValue);
+ }
+
+
+ private static void testCpus(int valueToSet, int expectedTraceValue) throws Exception {
+ Common.logNewTestCase("test cpus: " + valueToSet);
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addDockerOpts("--cpus", "" + valueToSet);
+ Common.run(opts)
+ .shouldMatch("active_processor_count.*" + expectedTraceValue);
+ }
+
+
+ // Expected active processor count can not exceed available CPU count
+ private static int adjustExpectedAPCForAvailableCPUs(int expectedAPC) {
+ if (expectedAPC > availableCPUs) {
+ expectedAPC = availableCPUs;
+ System.out.println("Adjusted expectedAPC = " + expectedAPC);
+ }
+ return expectedAPC;
+ }
+
+
+ private static void testCpuQuotaAndPeriod(int quota, int period)
+ throws Exception {
+ Common.logNewTestCase("test cpu quota and period: ");
+ System.out.println("quota = " + quota);
+ System.out.println("period = " + period);
+
+ int expectedAPC = (int) Math.ceil((float) quota / (float) period);
+ System.out.println("expectedAPC = " + expectedAPC);
+ expectedAPC = adjustExpectedAPCForAvailableCPUs(expectedAPC);
+
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addDockerOpts("--cpu-period=" + period)
+ .addDockerOpts("--cpu-quota=" + quota);
+
+ Common.run(opts)
+ .shouldMatch("CPU Period is.*" + period)
+ .shouldMatch("CPU Quota is.*" + quota)
+ .shouldMatch("active_processor_count.*" + expectedAPC);
+ }
+
+
+ // Test correctess of automatically selected active processor cound
+ private static void testAPCCombo(String cpuset, int quota, int period, int shares,
+ boolean usePreferContainerQuotaForCPUCount,
+ int expectedAPC) throws Exception {
+ Common.logNewTestCase("test APC Combo");
+ System.out.println("cpuset = " + cpuset);
+ System.out.println("quota = " + quota);
+ System.out.println("period = " + period);
+ System.out.println("shares = " + period);
+ System.out.println("usePreferContainerQuotaForCPUCount = " + usePreferContainerQuotaForCPUCount);
+ System.out.println("expectedAPC = " + expectedAPC);
+
+ expectedAPC = adjustExpectedAPCForAvailableCPUs(expectedAPC);
+
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addDockerOpts("--cpuset-cpus", "" + cpuset)
+ .addDockerOpts("--cpu-period=" + period)
+ .addDockerOpts("--cpu-quota=" + quota)
+ .addDockerOpts("--cpu-shares=" + shares);
+
+ if (!usePreferContainerQuotaForCPUCount) opts.addJavaOpts("-XX:-PreferContainerQuotaForCPUCount");
+
+ Common.run(opts)
+ .shouldMatch("active_processor_count.*" + expectedAPC);
+ }
+
+
+ private static void testCpuShares(int shares, int expectedAPC) throws Exception {
+ Common.logNewTestCase("test cpu shares, shares = " + shares);
+ System.out.println("expectedAPC = " + expectedAPC);
+
+ expectedAPC = adjustExpectedAPCForAvailableCPUs(expectedAPC);
+
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addDockerOpts("--cpu-shares=" + shares);
+ Common.run(opts)
+ .shouldMatch("CPU Shares is.*" + shares)
+ .shouldMatch("active_processor_count.*" + expectedAPC);
+ }
+}
diff --git a/hotspot/test/runtime/containers/docker/TestCPUSets.java b/hotspot/test/runtime/containers/docker/TestCPUSets.java
new file mode 100644
index 0000000..baf0eba
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/TestCPUSets.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 JVM's awareness of cpu sets (cpus and mems)
+ * @library /testlibrary /testlibrary/whitebox
+ * @build AttemptOOM CPUSetsReader sun.hotspot.WhiteBox PrintContainerInfo
+ * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver TestCPUSets
+ */
+
+import java.util.List;
+import com.oracle.java.testlibrary.Common;
+import com.oracle.java.testlibrary.DockerRunOptions;
+import com.oracle.java.testlibrary.DockerTestUtils;
+import com.oracle.java.testlibrary.Asserts;
+import com.oracle.java.testlibrary.Platform;
+import com.oracle.java.testlibrary.Utils;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+
+public class TestCPUSets {
+ private static final String imageName = Common.imageName("cpusets");
+
+ public static void main(String[] args) throws Exception {
+ if (!DockerTestUtils.canTestDocker()) {
+ return;
+ }
+
+ Common.prepareWhiteBox();
+ DockerTestUtils.buildJdkDockerImage(imageName, "Dockerfile-BasicTest", "jdk-docker");
+
+ try {
+ // Sanity test the cpu sets reader and parser
+ CPUSetsReader.test();
+ testTheSet("Cpus_allowed_list");
+ testTheSet("Mems_allowed_list");
+ } finally {
+ DockerTestUtils.removeDockerImage(imageName);
+ }
+ }
+
+
+ private static void testTheSet(String setType) throws Exception {
+ String cpuSetStr = CPUSetsReader.readFromProcStatus(setType);
+
+ if (cpuSetStr == null) {
+ System.out.printf("The %s test is skipped %n", setType);
+ } else {
+ List<Integer> cpuSet = CPUSetsReader.parseCpuSet(cpuSetStr);
+
+ // Test subset of one, full subset, and half of the subset
+ testCpuSet(CPUSetsReader.listToString(cpuSet, 1));
+ if (cpuSet.size() > 1) {
+ testCpuSet(CPUSetsReader.listToString(cpuSet));
+ }
+ if (cpuSet.size() > 2) {
+ testCpuSet(CPUSetsReader.listToString(cpuSet, cpuSet.size()/2 ));
+ }
+ }
+ }
+
+
+ private static DockerRunOptions commonOpts() {
+ DockerRunOptions opts = new DockerRunOptions(imageName, "/jdk/bin/java",
+ "PrintContainerInfo");
+ opts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/");
+ opts.addJavaOpts("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintContainerInfo", "-cp", "/test-classes/");
+ Common.addWhiteBoxOpts(opts);
+ return opts;
+ }
+
+
+ private static void checkResult(List<String> lines, String lineMarker, String value) {
+ boolean lineMarkerFound = false;
+
+ for (String line : lines) {
+ if (line.contains(lineMarker)) {
+ lineMarkerFound = true;
+ String[] parts = line.split(":");
+ System.out.println("DEBUG: line = " + line);
+ System.out.println("DEBUG: parts.length = " + parts.length);
+
+ Asserts.assertEquals(parts.length, 2);
+ String set = parts[1].replaceAll("\\s","");
+ String actual = CPUSetsReader.listToString(CPUSetsReader.parseCpuSet(set));
+ Asserts.assertEquals(actual, value);
+ break;
+ }
+ }
+ Asserts.assertTrue(lineMarkerFound);
+ }
+
+
+ private static void testCpuSet(String value) throws Exception {
+ Common.logNewTestCase("cpusets.cpus, value = " + value);
+
+ DockerRunOptions opts = commonOpts();
+ opts.addDockerOpts("--cpuset-cpus=" + value);
+
+ List<String> lines = Common.run(opts).asLines();
+ checkResult(lines, "cpuset.cpus is:", value);
+ }
+
+ private static void testMemSet(String value) throws Exception {
+ Common.logNewTestCase("cpusets.mems, value = " + value);
+
+ DockerRunOptions opts = commonOpts();
+ opts.addDockerOpts("--cpuset-mems=" + value);
+
+ List<String> lines = Common.run(opts).asLines();
+ checkResult(lines, "cpuset.mems is:", value);
+ }
+
+}
diff --git a/hotspot/test/runtime/containers/docker/TestMemoryAwareness.java b/hotspot/test/runtime/containers/docker/TestMemoryAwareness.java
new file mode 100644
index 0000000..415f2c9
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/TestMemoryAwareness.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 JVM's memory resource awareness when running inside docker container
+ * @library /testlibrary /testlibrary/whitebox
+ * @build AttemptOOM sun.hotspot.WhiteBox PrintContainerInfo
+ * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver TestMemoryAwareness
+ */
+
+import com.oracle.java.testlibrary.Common;
+import com.oracle.java.testlibrary.DockerRunOptions;
+import com.oracle.java.testlibrary.DockerTestUtils;
+
+
+public class TestMemoryAwareness {
+ private static final String imageName = Common.imageName("memory");
+
+ public static void main(String[] args) throws Exception {
+ if (!DockerTestUtils.canTestDocker()) {
+ return;
+ }
+
+ Common.prepareWhiteBox();
+ DockerTestUtils.buildJdkDockerImage(imageName, "Dockerfile-BasicTest", "jdk-docker");
+
+ try {
+ testMemoryLimit("100m", "104857600");
+ testMemoryLimit("500m", "524288000");
+ testMemoryLimit("1g", "1073741824");
+ testMemoryLimit("4g", "4294967296");
+
+ testMemorySoftLimit("500m", "524288000");
+ testMemorySoftLimit("1g", "1073741824");
+
+ // Add extra 10 Mb to allocator limit, to be sure to cause OOM
+ testOOM("256m", 256 + 10);
+
+ } finally {
+ DockerTestUtils.removeDockerImage(imageName);
+ }
+ }
+
+
+ private static void testMemoryLimit(String valueToSet, String expectedTraceValue)
+ throws Exception {
+
+ Common.logNewTestCase("memory limit: " + valueToSet);
+
+ DockerRunOptions opts = Common.newOpts(imageName)
+ .addDockerOpts("--memory", valueToSet);
+
+ Common.run(opts)
+ .shouldMatch("Memory Limit is:.*" + expectedTraceValue);
+ }
+
+
+ private static void testMemorySoftLimit(String valueToSet, String expectedTraceValue)
+ throws Exception {
+ Common.logNewTestCase("memory soft limit: " + valueToSet);
+
+ DockerRunOptions opts = Common.newOpts(imageName, "PrintContainerInfo");
+ Common.addWhiteBoxOpts(opts);
+ opts.addDockerOpts("--memory-reservation=" + valueToSet);
+
+ Common.run(opts)
+ .shouldMatch("Memory Soft Limit.*" + expectedTraceValue);
+ }
+
+
+ // provoke OOM inside the container, see how VM reacts
+ private static void testOOM(String dockerMemLimit, int sizeToAllocInMb) throws Exception {
+ Common.logNewTestCase("OOM");
+
+ DockerRunOptions opts = Common.newOpts(imageName, "AttemptOOM")
+ .addDockerOpts("--memory", dockerMemLimit, "--memory-swap", dockerMemLimit);
+ opts.classParams.add("" + sizeToAllocInMb);
+
+ DockerTestUtils.dockerRunJava(opts)
+ .shouldHaveExitValue(1)
+ .shouldContain("Entering AttemptOOM main")
+ .shouldNotContain("AttemptOOM allocation successful")
+ .shouldContain("java.lang.OutOfMemoryError");
+ }
+
+}
diff --git a/hotspot/test/runtime/containers/docker/TestMisc.java b/hotspot/test/runtime/containers/docker/TestMisc.java
new file mode 100644
index 0000000..efd5227
--- /dev/null
+++ b/hotspot/test/runtime/containers/docker/TestMisc.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 miscellanous functionality related to JVM running in docker container
+ * @library /testlibrary /testlibrary/whitebox
+ * @build CheckContainerized sun.hotspot.WhiteBox PrintContainerInfo
+ * @run driver ClassFileInstaller -jar whitebox.jar sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run driver TestMisc
+ */
+
+import com.oracle.java.testlibrary.Common;
+import com.oracle.java.testlibrary.DockerTestUtils;
+import com.oracle.java.testlibrary.DockerRunOptions;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+
+public class TestMisc {
+ private static final String imageName = Common.imageName("misc");
+
+ public static void main(String[] args) throws Exception {
+ if (!DockerTestUtils.canTestDocker()) {
+ return;
+ }
+
+ Common.prepareWhiteBox();
+ DockerTestUtils.buildJdkDockerImage(imageName, "Dockerfile-BasicTest", "jdk-docker");
+
+ try {
+ testMinusContainerSupport();
+ testIsContainerized();
+ testPrintContainerInfo();
+ } finally {
+ DockerTestUtils.removeDockerImage(imageName);
+ }
+ }
+
+
+ private static void testMinusContainerSupport() throws Exception {
+ Common.logNewTestCase("Test related flags: '-UseContainerSupport'");
+ DockerRunOptions opts = new DockerRunOptions(imageName, "/jdk/bin/java", "-version");
+ opts.addJavaOpts("-XX:+UnlockDiagnosticVMOptions", "-XX:-UseContainerSupport", "-XX:+PrintContainerInfo");
+
+ Common.run(opts)
+ .shouldContain("Container Support not enabled");
+ }
+
+
+ private static void testIsContainerized() throws Exception {
+ Common.logNewTestCase("Test is_containerized() inside a docker container");
+
+ DockerRunOptions opts = Common.newOpts(imageName, "CheckContainerized");
+ Common.addWhiteBoxOpts(opts);
+
+ Common.run(opts)
+ .shouldContain(CheckContainerized.INSIDE_A_CONTAINER);
+ }
+
+
+ private static void testPrintContainerInfo() throws Exception {
+ Common.logNewTestCase("Test print_container_info()");
+
+ DockerRunOptions opts = Common.newOpts(imageName, "PrintContainerInfo");
+ Common.addWhiteBoxOpts(opts);
+
+ checkContainerInfo(Common.run(opts));
+ }
+
+
+ private static void checkContainerInfo(OutputAnalyzer out) throws Exception {
+ String[] expectedToContain = new String[] {
+ "cpuset.cpus",
+ "cpuset.mems",
+ "CPU Shares",
+ "CPU Quota",
+ "CPU Period",
+ "OSContainer::active_processor_count",
+ "Memory Limit",
+ "Memory Soft Limit",
+ "Memory Usage",
+ "Maximum Memory Usage",
+ "memory_max_usage_in_bytes"
+ };
+
+ for (String s : expectedToContain) {
+ out.shouldContain(s);
+ }
+ }
+
+}
diff --git a/hotspot/test/runtime/execstack/TestCheckJDK.java b/hotspot/test/runtime/execstack/TestCheckJDK.java
new file mode 100644
index 0000000..e22d6039
--- /dev/null
+++ b/hotspot/test/runtime/execstack/TestCheckJDK.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 Testexecstack.java
+ * @summary Searches for all libraries in test VM and checks that they
+ * have the noexecstack bit set.
+ * @requires (os.family == "linux")
+ * @library /testlibrary /testlibrary/whitebox
+ * @build sun.hotspot.WhiteBox
+ * @run driver ClassFileInstaller sun.hotspot.WhiteBox
+ * sun.hotspot.WhiteBox$WhiteBoxPermission
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * TestCheckJDK
+ */
+
+import com.oracle.java.testlibrary.Asserts;
+import sun.hotspot.WhiteBox;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class TestCheckJDK {
+ static boolean testPassed = true;
+ private static final WhiteBox WB = WhiteBox.getWhiteBox();
+
+ static void checkExecStack(Path file) {
+ String filename = file.toString();
+ if (filename.endsWith(".so")) {
+ if (!WB.checkLibSpecifiesNoexecstack(filename)) {
+ System.out.println("Library does not have the noexecstack bit set: " + filename);
+ testPassed = false;
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Throwable {
+ String vmInstallDir = System.getProperty("java.home");
+
+ Files.walk(Paths.get(vmInstallDir)).filter(Files::isRegularFile).forEach(TestCheckJDK::checkExecStack);
+
+ Asserts.assertTrue(testPassed,
+ "The tested VM contains libs that don't have the noexecstack " +
+ "bit set. They must be linked with -z,noexecstack.");
+ }
+}
diff --git a/hotspot/test/testlibrary/ClassFileInstaller.java b/hotspot/test/testlibrary/ClassFileInstaller.java
index 303e96e..d319e45 100644
--- a/hotspot/test/testlibrary/ClassFileInstaller.java
+++ b/hotspot/test/testlibrary/ClassFileInstaller.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -21,28 +21,229 @@
* questions.
*/
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
import java.io.InputStream;
+import java.io.ByteArrayInputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
/**
- * Dump a class file for a class on the class path in the current directory
+ * Dump a class file for a class on the class path in the current directory, or
+ * in the specified JAR file. This class is usually used when you build a class
+ * from a test library, but want to use this class in a sub-process.
+ *
+ * For example, to build the following library class:
+ * test/lib/sun/hotspot/WhiteBox.java
+ *
+ * You would use the following tags:
+ *
+ * @library /test/lib
+ * @build sun.hotspot.WhiteBox
+ *
+ * JTREG would build the class file under
+ * ${JTWork}/classes/test/lib/sun/hotspot/WhiteBox.class
+ *
+ * With you run your main test class using "@run main MyMainClass", JTREG would setup the
+ * -classpath to include "${JTWork}/classes/test/lib/", so MyMainClass would be able to
+ * load the WhiteBox class.
+ *
+ * However, if you run a sub process, and do not wish to use the exact same -classpath,
+ * You can use ClassFileInstaller to ensure that WhiteBox is available in the current
+ * directory of your test:
+ *
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ *
+ * Or, you can use the -jar option to store the class in the specified JAR file. If a relative
+ * path name is given, the JAR file would be relative to the current directory of
+ *
+ * @run main ClassFileInstaller -jar myjar.jar sun.hotspot.WhiteBox
*/
public class ClassFileInstaller {
/**
+ * You can enable debug tracing of ClassFileInstaller by running JTREG with
+ * jtreg -DClassFileInstaller.debug=true ... <names of tests>
+ */
+ public static boolean DEBUG = Boolean.getBoolean("ClassFileInstaller.debug");
+
+ /**
* @param args The names of the classes to dump
* @throws Exception
*/
public static void main(String... args) throws Exception {
- for (String arg : args) {
- ClassLoader cl = ClassFileInstaller.class.getClassLoader();
+ if (args.length > 1 && args[0].equals("-jar")) {
+ if (args.length < 2) {
+ throw new RuntimeException("Usage: ClassFileInstaller <options> <classes>\n" +
+ "where possible options include:\n" +
+ " -jar <path> Write to the JAR file <path>");
+ }
+ writeJar(args[1], null, args, 2, args.length);
+ } else {
+ if (DEBUG) {
+ System.out.println("ClassFileInstaller: Writing to " + System.getProperty("user.dir"));
+ }
+ for (String arg : args) {
+ writeClassToDisk(arg);
+ }
+ }
+ }
- // Convert dotted class name to a path to a class file
- String pathName = arg.replace('.', '/').concat(".class");
- InputStream is = cl.getResourceAsStream(pathName);
+ public static class Manifest {
+ private InputStream in;
+ private Manifest(InputStream in) {
+ this.in = in;
+ }
+
+ static Manifest fromSourceFile(String fileName) throws Exception {
+ String pathName = System.getProperty("test.src") + File.separator + fileName;
+ return new Manifest(new FileInputStream(pathName));
+ }
+
+ // Example:
+ // String manifest = "Premain-Class: RedefineClassHelper\n" +
+ // "Can-Redefine-Classes: true\n";
+ // ClassFileInstaller.writeJar("redefineagent.jar",
+ // ClassFileInstaller.Manifest.fromString(manifest),
+ // "RedefineClassHelper");
+ static Manifest fromString(String manifest) throws Exception {
+ return new Manifest(new ByteArrayInputStream(manifest.getBytes()));
+ }
+
+ public InputStream getInputStream() {
+ return in;
+ }
+ }
+
+ private static void writeJar(String jarFile, Manifest manifest, String classes[], int from, int to) throws Exception {
+ if (DEBUG) {
+ System.out.println("ClassFileInstaller: Writing to " + getJarPath(jarFile));
+ }
+
+ (new File(jarFile)).delete();
+ FileOutputStream fos = new FileOutputStream(jarFile);
+ ZipOutputStream zos = new ZipOutputStream(fos);
+
+ // The manifest must be the first or second entry. See comments in JarInputStream
+ // constructor and JDK-5046178.
+ if (manifest != null) {
+ writeToDisk(zos, "META-INF/MANIFEST.MF", manifest.getInputStream());
+ }
+
+ for (int i=from; i<to; i++) {
+ writeClassToDisk(zos, classes[i]);
+ }
+
+ zos.close();
+ fos.close();
+ }
+
+ /*
+ * You can call ClassFileInstaller.writeJar() from your main test class instead of
+ * using "@run ClassFileInstaller -jar ...". E.g.,
+ *
+ * String jarPath = ClassFileInstaller.getJarPath("myjar.jar", "sun.hotspot.WhiteBox")
+ *
+ * If you call this API, make sure you build ClassFileInstaller with the following tags:
+ *
+ * @library testlibrary
+ * @build ClassFileInstaller
+ */
+ public static String writeJar(String jarFile, String... classes) throws Exception {
+ writeJar(jarFile, null, classes, 0, classes.length);
+ return getJarPath(jarFile);
+ }
+
+ public static String writeJar(String jarFile, Manifest manifest, String... classes) throws Exception {
+ writeJar(jarFile, manifest, classes, 0, classes.length);
+ return getJarPath(jarFile);
+ }
+
+ /**
+ * This returns the absolute path to the file specified in "@ClassFileInstaller -jar myjar.jar",
+ * In your test program, instead of using the JAR file name directly:
+ *
+ * String jarPath = "myjar.jar";
+ *
+ * you should call this function, like:
+ *
+ * String jarPath = ClassFileInstaller.getJarPath("myjar.jar")
+ *
+ * The reasons are:
+ * (1) Using absolute path makes it easy to cut-and-paste from the JTR file and rerun your
+ * test in any directory.
+ * (2) In the future, we may make the JAR file name unique to avoid clobbering
+ * during parallel JTREG execution.
+ *
+ */
+ public static String getJarPath(String jarFileName) {
+ return new File(jarFileName).getAbsolutePath();
+ }
+
+ public static void writeClassToDisk(String className) throws Exception {
+ writeClassToDisk((ZipOutputStream)null, className);
+ }
+ private static void writeClassToDisk(ZipOutputStream zos, String className) throws Exception {
+ writeClassToDisk(zos, className, "");
+ }
+
+ public static void writeClassToDisk(String className, String prependPath) throws Exception {
+ writeClassToDisk(null, className, prependPath);
+ }
+ private static void writeClassToDisk(ZipOutputStream zos, String className, String prependPath) throws Exception {
+ ClassLoader cl = ClassFileInstaller.class.getClassLoader();
+
+ // Convert dotted class name to a path to a class file
+ String pathName = className.replace('.', '/').concat(".class");
+ InputStream is = cl.getResourceAsStream(pathName);
+ if (is == null) {
+ throw new RuntimeException("Failed to find " + pathName);
+ }
+ if (prependPath.length() > 0) {
+ pathName = prependPath + "/" + pathName;
+ }
+ writeToDisk(zos, pathName, is);
+ }
+
+ public static void writeClassToDisk(String className, byte[] bytecode) throws Exception {
+ writeClassToDisk(null, className, bytecode);
+ }
+ private static void writeClassToDisk(ZipOutputStream zos, String className, byte[] bytecode) throws Exception {
+ writeClassToDisk(zos, className, bytecode, "");
+ }
+
+ public static void writeClassToDisk(String className, byte[] bytecode, String prependPath) throws Exception {
+ writeClassToDisk(null, className, bytecode, prependPath);
+ }
+ private static void writeClassToDisk(ZipOutputStream zos, String className, byte[] bytecode, String prependPath) throws Exception {
+ // Convert dotted class name to a path to a class file
+ String pathName = className.replace('.', '/').concat(".class");
+ if (prependPath.length() > 0) {
+ pathName = prependPath + "/" + pathName;
+ }
+ writeToDisk(zos, pathName, new ByteArrayInputStream(bytecode));
+ }
+
+ private static void writeToDisk(ZipOutputStream zos, String pathName, InputStream is) throws Exception {
+ if (DEBUG) {
+ System.out.println("ClassFileInstaller: Writing " + pathName);
+ }
+ if (zos != null) {
+ ZipEntry ze = new ZipEntry(pathName);
+ zos.putNextEntry(ze);
+ byte[] buf = new byte[1024];
+ int len;
+ while ((len = is.read(buf))>0){
+ zos.write(buf, 0, len);
+ }
+ } else {
// Create the class file's package directory
Path p = Paths.get(pathName);
if (pathName.contains("/")) {
@@ -51,5 +252,6 @@
// Create the class file
Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
}
+ is.close();
}
}
diff --git a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Common.java b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Common.java
new file mode 100644
index 0000000..3d5a529
--- /dev/null
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Common.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 com.oracle.java.testlibrary;
+
+/*
+ * Methods and definitions common to docker tests container in this directory
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import com.oracle.java.testlibrary.DockerTestUtils;
+import com.oracle.java.testlibrary.DockerRunOptions;
+import com.oracle.java.testlibrary.Utils;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+
+public class Common {
+ public static final String imageNameAndTag = "jdk-internal:test";
+
+ public static String imageName(String suffix) {
+ return imageNameAndTag + "-" + suffix;
+ }
+
+ public static void prepareWhiteBox() throws Exception {
+ Path whiteboxPath = Paths.get(Utils.TEST_CLASSES, "whitebox.jar");
+ if( !Files.exists(whiteboxPath) ) {
+ Files.copy(Paths.get(new File("whitebox.jar").getAbsolutePath()),
+ Paths.get(Utils.TEST_CLASSES, "whitebox.jar"));
+ }
+ }
+
+ // create simple commonly used options
+ public static DockerRunOptions newOpts(String imageNameAndTag) {
+ return new DockerRunOptions(imageNameAndTag, "/jdk/bin/java", "-version")
+ .addJavaOpts("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintContainerInfo");
+ }
+
+
+ // create commonly used options with class to be launched inside container
+ public static DockerRunOptions newOpts(String imageNameAndTag, String testClass) {
+ DockerRunOptions opts =
+ new DockerRunOptions(imageNameAndTag, "/jdk/bin/java", testClass);
+ opts.addDockerOpts("--volume", Utils.TEST_CLASSES + ":/test-classes/");
+ opts.addJavaOpts("-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintContainerInfo", "-cp", "/test-classes/");
+ return opts;
+ }
+
+ public static DockerRunOptions addWhiteBoxOpts(DockerRunOptions opts) {
+ opts.addJavaOpts("-Xbootclasspath/a:/test-classes/whitebox.jar",
+ "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI");
+ return opts;
+ }
+
+ // most common type of run and checks
+ public static OutputAnalyzer run(DockerRunOptions opts) throws Exception {
+ return DockerTestUtils.dockerRunJava(opts)
+ .shouldHaveExitValue(0).shouldContain("Initializing Container Support");
+ }
+
+
+ // log beginning of a test case
+ public static void logNewTestCase(String msg) {
+ System.out.println("========== NEW TEST CASE: " + msg);
+ }
+
+}
diff --git a/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerRunOptions.java b/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerRunOptions.java
new file mode 100644
index 0000000..05e3b6b
--- /dev/null
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerRunOptions.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 com.oracle.java.testlibrary;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+
+// This class represents options for running java inside docker containers
+// in test environment.
+public class DockerRunOptions {
+ public String imageNameAndTag;
+ public ArrayList<String> dockerOpts = new ArrayList<String>();
+ public String command; // normally a full path to java
+ public ArrayList<String> javaOpts = new ArrayList<String>();
+ public String classToRun; // class or "-version"
+ public ArrayList<String> classParams = new ArrayList<String>();
+
+ public boolean tty = true;
+ public boolean removeContainerAfterUse = true;
+ public boolean appendTestJavaOptions = true;
+ public boolean retainChildStdout = false;
+
+ /**
+ * Convenience constructor for most common use cases in testing.
+ * @param imageNameAndTag a string representing name and tag for the
+ * docker image to run, as "name:tag"
+ * @param javaCmd a java command to run (e.g. /jdk/bin/java)
+ * @param classToRun a class to run, or "-version"
+ * @param javaOpts java options to use
+ *
+ * @return Default docker run options
+ */
+ public DockerRunOptions(String imageNameAndTag, String javaCmd,
+ String classToRun, String... javaOpts) {
+ this.imageNameAndTag = imageNameAndTag;
+ this.command = javaCmd;
+ this.classToRun = classToRun;
+ this.addJavaOpts(javaOpts);
+ }
+
+ public DockerRunOptions addDockerOpts(String... opts) {
+ Collections.addAll(dockerOpts, opts);
+ return this;
+ }
+
+ public DockerRunOptions addJavaOpts(String... opts) {
+ Collections.addAll(javaOpts, opts);
+ return this;
+ }
+
+}
diff --git a/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerTestUtils.java b/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerTestUtils.java
new file mode 100644
index 0000000..ea125b1
--- /dev/null
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/DockerTestUtils.java
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 com.oracle.java.testlibrary;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.oracle.java.testlibrary.Utils;
+import com.oracle.java.testlibrary.Platform;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+public class DockerTestUtils {
+ private static final String FS = File.separator;
+ private static boolean isDockerEngineAvailable = false;
+ private static boolean wasDockerEngineChecked = false;
+
+ // Diagnostics: set to true to enable more diagnostic info
+ private static final boolean DEBUG = false;
+
+ /**
+ * Optimized check of whether the docker engine is available in a given
+ * environment. Checks only once, then remembers the result in a singleton.
+ *
+ * @return true if docker engine is available
+ * @throws Exception
+ */
+ public static boolean isDockerEngineAvailable() throws Exception {
+ if (wasDockerEngineChecked)
+ return isDockerEngineAvailable;
+
+ isDockerEngineAvailable = isDockerEngineAvailableCheck();
+ wasDockerEngineChecked = true;
+ return isDockerEngineAvailable;
+ }
+
+
+ /**
+ * Convenience method, will check if docker engine is available and usable;
+ * will print the appropriate message when not available.
+ *
+ * @return true if docker engine is available
+ * @throws Exception
+ */
+ public static boolean canTestDocker() throws Exception {
+ if (isDockerEngineAvailable()) {
+ return true;
+ } else {
+ System.out.println("Docker engine is not available on this system");
+ System.out.println("This test is SKIPPED");
+ return false;
+ }
+ }
+
+
+ /**
+ * Simple check - is docker engine available, accessible and usable.
+ * Run basic docker command: 'docker ps' - list docker instances.
+ * If docker engine is available and accesible then true is returned
+ * and we can proceed with testing docker.
+ *
+ * @return true if docker engine is available and usable
+ * @throws Exception
+ */
+ private static boolean isDockerEngineAvailableCheck() throws Exception {
+ try {
+ execute("docker", "ps")
+ .shouldHaveExitValue(0)
+ .shouldContain("CONTAINER")
+ .shouldContain("IMAGE");
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * Build a docker image that contains JDK under test.
+ * The jdk will be placed under the "/jdk/" folder inside the docker file system.
+ *
+ * @param imageName name of the image to be created, including version tag
+ * @param dockerfile name of the dockerfile residing in the test source;
+ * we check for a platform specific dockerfile as well
+ * and use this one in case it exists
+ * @param buildDirName name of the docker build/staging directory, which will
+ * be created in the jtreg's scratch folder
+ * @throws Exception
+ */
+ public static void
+ buildJdkDockerImage(String imageName, String dockerfile, String buildDirName)
+ throws Exception {
+ Path buildDir = Paths.get(".", buildDirName);
+ if (Files.exists(buildDir)) {
+ throw new RuntimeException("The docker build directory already exists: " + buildDir);
+ }
+ // check for the existance of a platform specific docker file as well
+ String platformSpecificDockerfile = dockerfile + "-" + Platform.getOsArch();
+ if (Files.exists(Paths.get(Utils.TEST_SRC, platformSpecificDockerfile))) {
+ dockerfile = platformSpecificDockerfile;
+ }
+
+ Path jdkSrcDir = Paths.get(Utils.TEST_JDK);
+ Path jdkDstDir = buildDir.resolve("jdk");
+
+ Files.createDirectories(jdkDstDir);
+
+ // Copy JDK-under-test tree to the docker build directory.
+ // This step is required for building a docker image.
+ Files.walkFileTree(jdkSrcDir, new CopyFileVisitor(jdkSrcDir, jdkDstDir));
+ buildDockerImage(imageName, Paths.get(Utils.TEST_SRC, dockerfile), buildDir);
+ }
+
+
+ /**
+ * Build a docker image based on given docker file and docker build directory.
+ *
+ * @param imageName name of the image to be created, including version tag
+ * @param dockerfile path to the Dockerfile to be used for building the docker
+ * image. The specified dockerfile will be copied to the docker build
+ * directory as 'Dockerfile'
+ * @param buildDir build directory; it should already contain all the content
+ * needed to build the docker image.
+ * @throws Exception
+ */
+ public static void
+ buildDockerImage(String imageName, Path dockerfile, Path buildDir) throws Exception {
+ // Copy docker file to the build dir
+ Files.copy(dockerfile, buildDir.resolve("Dockerfile"));
+
+ // Build the docker
+ execute("docker", "build", "--no-cache", "--tag", imageName, buildDir.toString())
+ .shouldHaveExitValue(0)
+ .shouldContain("Successfully built");
+ }
+
+
+ /**
+ * Run Java inside the docker image with specified parameters and options.
+ *
+ * @param DockerRunOptions optins for running docker
+ *
+ * @return output of the run command
+ * @throws Exception
+ */
+ public static OutputAnalyzer dockerRunJava(DockerRunOptions opts) throws Exception {
+ ArrayList<String> cmd = new ArrayList<>();
+
+ cmd.add("docker");
+ cmd.add("run");
+ if (opts.tty)
+ cmd.add("--tty=true");
+ if (opts.removeContainerAfterUse)
+ cmd.add("--rm");
+
+ cmd.addAll(opts.dockerOpts);
+ cmd.add(opts.imageNameAndTag);
+ cmd.add(opts.command);
+
+ cmd.addAll(opts.javaOpts);
+ if (opts.appendTestJavaOptions) {
+ Collections.addAll(cmd, Utils.getTestJavaOpts());
+ }
+
+ cmd.add(opts.classToRun);
+ cmd.addAll(opts.classParams);
+ return execute(cmd);
+ }
+
+
+ /**
+ * Remove docker image
+ *
+ * @param DockerRunOptions optins for running docker
+ * @return output of the command
+ * @throws Exception
+ */
+ public static OutputAnalyzer removeDockerImage(String imageNameAndTag) throws Exception {
+ return execute("docker", "rmi", "--force", imageNameAndTag);
+ }
+
+
+
+ /**
+ * Convenience method - express command as sequence of strings
+ *
+ * @param command to execute
+ * @return The output from the process
+ * @throws Exception
+ */
+ public static OutputAnalyzer execute(List<String> command) throws Exception {
+ return execute(command.toArray(new String[command.size()]));
+ }
+
+
+ /**
+ * Execute a specified command in a process, report diagnostic info.
+ *
+ * @param command to be executed
+ * @return The output from the process
+ * @throws Exception
+ */
+ public static OutputAnalyzer execute(String... command) throws Exception {
+
+ ProcessBuilder pb = new ProcessBuilder(command);
+ System.out.println("[COMMAND]\n" + Utils.getCommandLine(pb));
+
+ long started = System.currentTimeMillis();
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ System.out.println("[ELAPSED: " + (System.currentTimeMillis() - started) + " ms]");
+ System.out.println("[STDERR]\n" + output.getStderr());
+ System.out.println("[STDOUT]\n" + output.getStdout());
+
+ return output;
+ }
+
+
+ private static class CopyFileVisitor extends SimpleFileVisitor<Path> {
+ private final Path src;
+ private final Path dst;
+
+ public CopyFileVisitor(Path src, Path dst) {
+ this.src = src;
+ this.dst = dst;
+ }
+
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path file,
+ BasicFileAttributes attrs) throws IOException {
+ Path dstDir = dst.resolve(src.relativize(file));
+ if (!dstDir.toFile().exists()) {
+ Files.createDirectories(dstDir);
+ }
+ return FileVisitResult.CONTINUE;
+ }
+
+
+ @Override
+ public FileVisitResult visitFile(Path file,
+ BasicFileAttributes attrs) throws IOException {
+ if (!file.toFile().isFile()) {
+ return FileVisitResult.CONTINUE;
+ }
+ Path dstFile = dst.resolve(src.relativize(file));
+ Files.copy(file, dstFile, StandardCopyOption.COPY_ATTRIBUTES);
+ return FileVisitResult.CONTINUE;
+ }
+ }
+}
diff --git a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java
index 93841bf..6a14079 100644
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,7 +32,7 @@
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");
- private static final String vmName = System.getProperty("java.vm.name");
+ public static final String vmName = System.getProperty("java.vm.name");
private static final String userName = System.getProperty("user.name");
public static boolean isClient() {
diff --git a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java
index b332c1e..902e3b1 100644
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Utils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,6 +61,15 @@
*/
public static final String JAVA_OPTIONS = System.getProperty("test.java.opts", "").trim();
+ public static final String TEST_JDK = System.getProperty("test.jdk");
+
+ public static final String COMPILE_JDK= System.getProperty("compile.jdk", TEST_JDK);
+
+ public static final String TEST_SRC = System.getProperty("test.src", "").trim();
+
+ public static final String TEST_CLASSES = System.getProperty("test.classes", ".");
+
+
private static Unsafe unsafe = null;
/**
diff --git a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
index 6b3d3e3..d2f49da 100644
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -235,4 +235,12 @@
// Class Data Sharing
public native boolean isSharedClass(Class<?> c);
+
+ // Returns true on linux if library has the noexecstack flag set.
+ public native boolean checkLibSpecifiesNoexecstack(String libfilename);
+
+ // Container testing
+ public native boolean isContainerized();
+ public native void printOsInfo();
+
}
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 53059c8..1575ec9 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -850,12 +850,37 @@
5a5ebaf38e63c4afa1554fdbadc6192bc01dfeb9 jdk8u162-b11
fa7504e2b2410e4a0a1fe3dc93fb4fcb6bd1533d jdk8u162-b12
ecdf7d13fd8ba2b366e3a72cbb9bceba484489e7 jdk8u162-b31
+71194348ef551f9f646e4ab1658d38477c041143 jdk8u162-b32
+7d5f26e2dbe45acf22730ae0128afb149c18ee08 jdk8u162-b33
+133bf94b8bc90c8d4ddf9b7364362ab42d4a3800 jdk8u162-b34
+099bc2c3852c5ab7c5ad9502360eb83b8329bd28 jdk8u162-b35
+093c1f6ae899b8cf6608e80162323c41c167c7d7 jdk8u162-b36
+fbc5640f9de7f243407ea92bec9f2b70eae960f2 jdk8u162-b37
+bcec94dc82ad46f6a716b60b2b5bdfb7b1410e84 jdk8u162-b38
7984f6d87395d9ed0397137be97670c1f12543b0 jdk8u171-b00
3a4b6f741a1b1ed06a56262ae69e36d4f4d4637c jdk8u171-b01
0eb59cc7716f47525b80b9764c86188063e7cfff jdk8u171-b02
1e523ce5792f08f3dc015084e3f018d6ee0c5859 jdk8u171-b03
a19f8b3a9242df77ed3df29ceefc30d0b0d2766c jdk8u171-b04
5279c6da822efa9073793968777a2b3a65376e8e jdk8u171-b05
+dcef061c36284bbf5a9f7093dcbc134b9f62e9f5 jdk8u172-b00
+a8bd8d03df39500a37fd8066104bfd02daae9d5c jdk8u172-b01
+78e071b5c0675416e499e26d82903f436de83156 jdk8u172-b02
+f6f4bebcbf4b7df5eca6e253b596851cca18b5c4 jdk8u172-b03
+d7f51a2cb3fac2d3a7a3ebcd55adaf7b251a3973 jdk8u172-b04
+1e523ce5792f08f3dc015084e3f018d6ee0c5859 jdk8u181-b00
+a56ca62af8987f5a532e0290a99e3da47458957c jdk8u191-b00
+264518389b7f9b5969aa6914f83cc70f527ec4c9 jdk8u172-b05
+099bc2c3852c5ab7c5ad9502360eb83b8329bd28 jdk8u162-b35
+093c1f6ae899b8cf6608e80162323c41c167c7d7 jdk8u162-b36
+fbc5640f9de7f243407ea92bec9f2b70eae960f2 jdk8u162-b37
+7984f6d87395d9ed0397137be97670c1f12543b0 jdk8u171-b00
+3a4b6f741a1b1ed06a56262ae69e36d4f4d4637c jdk8u171-b01
+0eb59cc7716f47525b80b9764c86188063e7cfff jdk8u171-b02
+1e523ce5792f08f3dc015084e3f018d6ee0c5859 jdk8u181-b00
+1e523ce5792f08f3dc015084e3f018d6ee0c5859 jdk8u171-b03
+a19f8b3a9242df77ed3df29ceefc30d0b0d2766c jdk8u171-b04
+5279c6da822efa9073793968777a2b3a65376e8e jdk8u171-b05
daab1512cd1580aacc23db4802b9e8baea11f17c jdk8u171-b06
d5b13a2a6fbfff3fb8218694d539da0f25ba8ea9 jdk8u171-b07
8cc732073801433748468889b0e526da79291868 jdk8u171-b08
@@ -873,3 +898,33 @@
b79b95aa47593166c238d8ea136c16fe12433bac jdk8u172-b08
81808062121ea018f93fe834a77069a1f1a41205 jdk8u172-b09
ed6b3d50e81221b439f942d56002b760e6b242b8 jdk8u172-b10
+257c09605def81666af2e696212dd27458fb59d4 jdk8u172-b11
+da88c57953bc3a6adb2bcaec204fdc613e41431f jdk8u172-b31
+0e7fe394fa9ed92862348fa37499ff4ed865a07d jdk8u172-b32
+d96e2b804bcd8e69f4b667cc0766c3619f032242 jdk8u172-b33
+100de781988dc7b1e234a8ee9076b25442c9a5ac jdk8u172-b34
+d6075b4648f25d8a47e25dc5c838fb550c67a30f jdk8u172-b35
+70138507060656f166d613e3d717206cbb22720c jdk8u172-b36
+8182425105506f8ce15a7ec1c6e87bd5c10aa9f2 jdk8u172-b37
+9fd0ff00a2457dd46aeecfed5c9381ce3a35750b jdk8u181-b01
+42930d218e2a32e0d1ed6a3adba7ff5fc0032517 jdk8u181-b02
+39229ae0bafff1999db8cf127db6183922a2f545 jdk8u181-b03
+76542e709e5aa8a26276b0e86315ab604ca41f47 jdk8u181-b04
+e67979ed2c5d38c9bfb0613a3dc9c0c7816ffe68 jdk8u181-b05
+f24500bf566f42dfcb9f3716a784f6c1de3bb47e jdk8u181-b06
+34632d55768377110d22e03aacdb6d9c42f06106 jdk8u181-b07
+99e5004367a7e9abc915102ed6bc55c09a89ea5c jdk8u181-b08
+d18fa9498c85ad11fa72d75ebb47ca60911a15eb jdk8u181-b09
+59005b2778662662d4d96f8daa6351e47929b6d0 jdk8u181-b10
+f32e6dfd8c7bfdc6f44cb0cff9702d50e96debe7 jdk8u181-b11
+d347fe847fc2a5d59b753631404839f8b6fb2f29 jdk8u181-b12
+79cd9a0e041e64443d9d0bf29baf46c7459b3e91 jdk8u181-b13
+102e8b07bdda4263087593b0a52a90a7a64b4956 jdk8u191-b01
+ecdbe3bf911c3f1f4eceb895f0f7513a8d3964e0 jdk8u191-b02
+a7ad7ceac906d5f609ddcecbd20fe82b6edf9491 jdk8u191-b03
+12a53eff34938f836f2c09b1c288da6ce783f795 jdk8u191-b04
+32aa1c40e8fb784c2ac021db6f70eb6b20bffc88 jdk8u191-b05
+9c6c6e24e8f68be0b6bd238a05e147f65ad873ab jdk8u191-b06
+66f5468a9c1316df2b097c2ff103c6e869f70fe1 jdk8u191-b07
+556336c606f5c658d5ec1251783a31de62c83e4b jdk8u191-b08
+92543f5f314603d6b0d8f751a8b06c1035466aeb jdk8u191-b09
diff --git a/jaxp/THIRD_PARTY_README b/jaxp/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/jaxp/THIRD_PARTY_README
+++ b/jaxp/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java b/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java
index 9da7059..685ecc6 100644
--- a/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_de.java
@@ -254,7 +254,7 @@
* text.
*/
{ErrorMsg.ILLEGAL_ATTRIBUTE_ERR,
- "Ung\u00FCltiges Attribut \"{0}\"."},
+ "Unzul\u00E4ssiges Attribut \"{0}\"."},
/*
* Note to translators: "import" and "include" are keywords that should
@@ -307,7 +307,7 @@
* function has too many or too few arguments.
*/
{ErrorMsg.ILLEGAL_ARG_ERR,
- "Ung\u00FCltige Argumente f\u00FCr Funktionsaufruf."},
+ "Unzul\u00E4ssige Argumente f\u00FCr Funktionsaufruf."},
/*
* Note to translators: "document()" is the name of function and must
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties
index 8125537..5ae848a 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties
@@ -15,7 +15,7 @@
INDEX_SIZE_ERR = Index oder Gr\u00F6\u00DFe ist negativ oder gr\u00F6\u00DFer als der zul\u00E4ssige Wert.
INUSE_ATTRIBUTE_ERR = Es wurde versucht, ein Attribut hinzuzuf\u00FCgen, das bereits an einer anderen Stelle verwendet wird.
INVALID_ACCESS_ERR = Ein Parameter oder Vorgang wird nicht vom zugrunde liegenden Objekt unterst\u00FCtzt.
-INVALID_CHARACTER_ERR = Ung\u00FCltiges XML-Zeichen angegeben.
+INVALID_CHARACTER_ERR = Ung\u00FCltiges oder unzul\u00E4ssiges XML-Zeichen angegeben.
INVALID_MODIFICATION_ERR = Es wurde versucht, den Typ des zugrunde liegenden Objekts zu \u00E4ndern.
INVALID_STATE_ERR = Es wurde versucht, ein Objekt zu \u00E4ndern, das nicht verwendet werden kann.
NAMESPACE_ERR = Es wurde versucht, ein Objekt auf eine Weise zu erstellen oder zu \u00E4ndern, die falsch in Bezug auf Namespaces ist.
@@ -23,7 +23,7 @@
NOT_SUPPORTED_ERR = Der angeforderte Typ des Objekts oder Vorgangs wird nicht von der Implementierung unterst\u00FCtzt.
NO_DATA_ALLOWED_ERR = Daten wurden f\u00FCr einen Knoten angegeben, der keine Daten unterst\u00FCtzt.
NO_MODIFICATION_ALLOWED_ERR = Es wurde versucht, ein Objekt zu \u00E4ndern, bei dem \u00C4nderungen nicht zul\u00E4ssig sind.
-SYNTAX_ERR = Ung\u00FCltige Zeichenfolge angegeben.
+SYNTAX_ERR = Ung\u00FCltige oder unzul\u00E4ssige Zeichenfolge angegeben.
VALIDATION_ERR = Aufruf einer Methode wie insertBefore oder removeChild w\u00FCrde die Dokumentgrammatik des Knotens ung\u00FCltig machen.
WRONG_DOCUMENT_ERR = Ein Knoten wird in einem anderen Dokument verwendet als dem, von dem er erstellt wurde.
TYPE_MISMATCH_ERR = Der Werttyp f\u00FCr diesen Parameternamen ist nicht mit dem erwarteten Werttyp kompatibel.
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
index 0848270..4628ef5 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XMLMessages_de.properties
@@ -123,7 +123,7 @@
InvalidHighSurrogate = High-Surrogate-Bits in UTF-8-Sequenz d\u00FCrfen 0x10 nicht \u00FCberschreiten, gefunden wurde aber 0x{0}.
OperationNotSupported = Vorgang "{0}" nicht unterst\u00FCtzt von {1}-Reader.
InvalidASCII = Byte "{0}" geh\u00F6rt nicht zum (7-Bit) ASCII-Zeichensatz.
- CharConversionFailure = Eine Entity, f\u00FCr die eine bestimmte Codierung ermittelt wurde, darf keine Sequenzen enthalten, die in dieser Codierung ung\u00FCltig sind.
+ CharConversionFailure = Eine Entity, f\u00FCr die eine bestimmte Codierung ermittelt wurde, darf keine Sequenzen enthalten, die in dieser Codierung unzul\u00E4ssig sind.
# DTD Messages
# 2.2 Characters
diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
index 84543ec..025aa1d 100644
--- a/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
+++ b/jaxp/src/com/sun/org/apache/xerces/internal/jaxp/datatype/XMLGregorianCalendarImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -189,6 +189,7 @@
* @version $Revision: 1.14 $, $Date: 2010-11-10 07:41:41 $
* @see javax.xml.datatype.Duration
* @since 1.5
+ * @LastModified: June 2018
*/
public class XMLGregorianCalendarImpl
@@ -2730,7 +2731,7 @@
if ((fractional.compareTo(DECIMAL_ZERO) < 0) ||
(fractional.compareTo(DECIMAL_ONE) > 0)) {
throw new IllegalArgumentException(DatatypeMessageFormatter.formatMessage(null,
- "InvalidFractional", new Object[]{fractional}));
+ "InvalidFractional", new Object[]{fractional.toString()}));
}
}
this.fractionalSecond = fractional;
diff --git a/jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java b/jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java
index e7624ef..51d1c85 100644
--- a/jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java
+++ b/jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java
@@ -429,7 +429,7 @@
"ERROR. Unbekannter Vorgangscode: {0}"},
{ ER_EXTRA_ILLEGAL_TOKENS,
- "Zus\u00E4tzliche ung\u00FCltige Tokens: {0}"},
+ "Zus\u00E4tzliche unzul\u00E4ssige Tokens: {0}"},
{ ER_EXPECTED_DOUBLE_QUOTE,
"Literal in falschen Anf\u00FChrungszeichen... Doppelte Anf\u00FChrungszeichen erwartet."},
@@ -456,10 +456,10 @@
"\",\" gefunden, aber kein folgendes Argument vorhanden."},
{ ER_PREDICATE_ILLEGAL_SYNTAX,
- "\"..[predicate]\" oder \".[predicate]\" ist ung\u00FCltige Syntax. Verwenden Sie stattdessen \"self::node()[predicate]\"."},
+ "\"..[predicate]\" oder \".[predicate]\" ist unzul\u00E4ssige Syntax. Verwenden Sie stattdessen \"self::node()[predicate]\"."},
{ ER_ILLEGAL_AXIS_NAME,
- "Ung\u00FCltiger Achsenname: {0}"},
+ "Unzul\u00E4ssiger Achsenname: {0}"},
{ ER_UNKNOWN_NODETYPE,
"Unbekannter Knotentyp: {0}"},
diff --git a/jaxws/.hgtags b/jaxws/.hgtags
index 2e078ac..8b489d4 100644
--- a/jaxws/.hgtags
+++ b/jaxws/.hgtags
@@ -824,6 +824,61 @@
7b5ea369d72a15f8c2f2b299a0e0c94a9f6299c9 jdk8u162-b11
b73f27fc902bdd1eb47e57ad1d72e40d37d16db2 jdk8u162-b12
b2dfabe81b62db3668f75cdce74c749241bd35d2 jdk8u162-b31
+f9bd31b2202d3db0b3fd6f09aa1f32005011d704 jdk8u162-b32
+15b35c21a296d36f9145e2ccf18fecf584c9ee99 jdk8u162-b33
+783ed73023f5168d67624eae02a0caa0441552ad jdk8u162-b34
+7a536f0ffba631f36c43820df8eb201886c4f6b7 jdk8u162-b35
+518c46fee6170452a8e0376e08cc9de4a1db339b jdk8u162-b36
+57fac9abdbddf9fc875f31aefeb2623b443607cd jdk8u162-b37
+cfde39a81b5dbeb17920efce8e96d6968685e72b jdk8u162-b38
+b43391a4015f0c890c90ab33fe03b941876d2ee6 jdk8u171-b00
+25e6ecbfeb092b43c2a04014fe8f1bf03e005c63 jdk8u171-b01
+294248d232cf45819af0d15000b0e172953f3fa9 jdk8u171-b02
+2e4cccb6df4802405c21078b905f9c9db74fea04 jdk8u171-b03
+068b0c57acac24edcf925e3cca73afe671ed7cac jdk8u171-b04
+8479be9da1fa9572a36adcfce19bd36579c9c37c jdk8u171-b05
+16be4c9dff93fdcdb2b705680b641e26320cfd5a jdk8u172-b00
+c4309a2d981b00619635888a63a75b1f32f34555 jdk8u172-b01
+703e4709edae7f83c3794009954f453d6f3706e8 jdk8u172-b02
+b327c90d911f7ad1cfdf32cc18c5f32514b9ce2f jdk8u172-b03
+e9368eb17ab6b839b20f4ff6bd657329aac788b4 jdk8u172-b04
+2e4cccb6df4802405c21078b905f9c9db74fea04 jdk8u181-b00
+2e4cccb6df4802405c21078b905f9c9db74fea04 jdk8u171-b03
+068b0c57acac24edcf925e3cca73afe671ed7cac jdk8u171-b04
+8479be9da1fa9572a36adcfce19bd36579c9c37c jdk8u171-b05
+bd5a858e029446e777a99835482ccb389c417299 jdk8u171-b06
+9a1b6701c75304bf9522b75ce20449aa5ee9b4b7 jdk8u171-b07
+3a59623f4028e807b45186078aab1e85958c1172 jdk8u171-b08
+615e81982055c9082c795f793ef6fd7fa13b2105 jdk8u171-b09
+6b406f0e2b54cff29ec3da1c4d7b34af1590748f jdk8u171-b10
+45e4320c2c64893fc20a8b46ff80df92021526cf jdk8u171-b11
+16be4c9dff93fdcdb2b705680b641e26320cfd5a jdk8u172-b00
+c4309a2d981b00619635888a63a75b1f32f34555 jdk8u172-b01
+703e4709edae7f83c3794009954f453d6f3706e8 jdk8u172-b02
+b327c90d911f7ad1cfdf32cc18c5f32514b9ce2f jdk8u172-b03
+e9368eb17ab6b839b20f4ff6bd657329aac788b4 jdk8u172-b04
+570a943deff0a58a1c78d6ae392b8f7664189639 jdk8u172-b05
+d214e78a945098244a79a0066b827769ea189e29 jdk8u172-b06
+db5f564ce31b9b9abe5966138c6d45adc608b80e jdk8u172-b07
+ef209b1aa531edb8eaee608e851b8df844d476fa jdk8u172-b08
+fc695409c23dca5cb6c0ebe22ee48100fe7aa893 jdk8u172-b09
+7287e0008d111fdd1c259432f4883bb859d84221 jdk8u172-b10
+980c4675006fb42ef630d3020f502635bd8811e3 jdk8u172-b11
+112ddcc5f7c071c89bf23d5ab2a678f29e464ca2 jdk8u172-b31
+e716ed4b0efb1792ff1ad0ec8fdfdc30fdec40ef jdk8u172-b32
+f8e3998fe3d6657c7634e59d49f064169fb295c9 jdk8u172-b33
+fb84bb8b59a762e7f48789df98a816ea131c4f54 jdk8u172-b34
+15d23e3bac63e5e5e3afe5bc4e345227e940aa5e jdk8u172-b35
+285e9030fcc7f91a8a38aff1acc548344f75e9bc jdk8u172-b36
+9cdcca47c0b4cf24b1dd8dd82f51a7cf2b445f2c jdk8u172-b37
+878ad885b1cf41de2bdcf143f15edc10c0238920 jdk8u181-b01
+7a978c1e3ac0f8ef05c4b1ca3526db204f978f2e jdk8u181-b02
+291ef420de8c8c5eb6c7004dd99c41d150f59696 jdk8u181-b03
+35053a2559d252b12754fc30694d61cbd688dcdb jdk8u191-b00
+570a943deff0a58a1c78d6ae392b8f7664189639 jdk8u172-b05
+7a536f0ffba631f36c43820df8eb201886c4f6b7 jdk8u162-b35
+518c46fee6170452a8e0376e08cc9de4a1db339b jdk8u162-b36
+57fac9abdbddf9fc875f31aefeb2623b443607cd jdk8u162-b37
b43391a4015f0c890c90ab33fe03b941876d2ee6 jdk8u171-b00
25e6ecbfeb092b43c2a04014fe8f1bf03e005c63 jdk8u171-b01
294248d232cf45819af0d15000b0e172953f3fa9 jdk8u171-b02
@@ -847,3 +902,23 @@
ef209b1aa531edb8eaee608e851b8df844d476fa jdk8u172-b08
fc695409c23dca5cb6c0ebe22ee48100fe7aa893 jdk8u172-b09
7287e0008d111fdd1c259432f4883bb859d84221 jdk8u172-b10
+980c4675006fb42ef630d3020f502635bd8811e3 jdk8u172-b11
+711ace1c558d14a086481048254bab4821489533 jdk8u181-b04
+09b083e0759c73cd8c3aae6940c9ffb890e66b80 jdk8u181-b05
+49f87757336025a7caa1b9b5100358fe67ef17ab jdk8u181-b06
+9582f56dddd1c696234f43ecb5a8634a7f9f801c jdk8u181-b07
+1bb2d70147a0b1449136e49c256c257f405688bb jdk8u181-b08
+e92ee3b672446b6e9dfbc9a54495ab3fd0bc0021 jdk8u181-b09
+cc55da2f27700b75f83b0501660cff4e63ad27d9 jdk8u181-b10
+1ce36a1fca8d437720b014c0123ce87ff89131ab jdk8u181-b11
+0e8e98ee9f488e885295d4a4fa2f38ab2e123c77 jdk8u181-b12
+2a12eb329cb9457033a16fe8ebc14a9c5b16e83d jdk8u181-b13
+bc04ed57bd9748b241599af98c7b9fb878cbcaf9 jdk8u191-b01
+d25514e95cfb9ad9d2afbc17c2eb6f5a4b162cd4 jdk8u191-b02
+09ee8f82ecab760192aa7689ceb2cbce881dbf42 jdk8u191-b03
+e545fe27629455481aa1cfc96694747c18d51f44 jdk8u191-b04
+7aeacf26b3832f7796ea8a16bffbe2ea392e0219 jdk8u191-b05
+56f7f52f57fe4aaabf613f6295c6f1ce4032f9c2 jdk8u191-b06
+0fdc1c2cdad0cdd44427a647b7c4c630107db7ca jdk8u191-b07
+a45582ee03c59bda9b305b24d104052e1ca9f5a9 jdk8u191-b08
+2fbd39f7ce39fe7001474fda85edf490e09a66ec jdk8u191-b09
diff --git a/jaxws/THIRD_PARTY_README b/jaxws/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/jaxws/THIRD_PARTY_README
+++ b/jaxws/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java
index a4d7fd5..3367a1b 100644
--- a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java
+++ b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* 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 javax.xml.stream.XMLStreamWriter;
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
+import com.sun.xml.internal.bind.marshaller.NoEscapeHandler;
import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl;
import com.sun.xml.internal.bind.v2.runtime.XMLSerializer;
@@ -71,7 +72,7 @@
}
CharacterEscapeHandler xmlStreamEscapeHandler = escapeHandler != null ?
- escapeHandler : NewLineEscapeHandler.theInstance;
+ escapeHandler : NoEscapeHandler.theInstance;
// otherwise the normal writer.
return new XMLStreamWriterOutput(out, xmlStreamEscapeHandler);
@@ -217,45 +218,6 @@
}
}
-
- /**
- * Performs character escaping only for new lines.
- */
- private static class NewLineEscapeHandler implements CharacterEscapeHandler {
-
- public static final NewLineEscapeHandler theInstance = new NewLineEscapeHandler();
-
- @Override
- public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
- int limit = start+length;
- int lastEscaped = start;
-
- for (int i = start; i < limit; i++) {
- char c = ch[i];
- if (c == '\r' || c == '\n') {
- if (i != lastEscaped) {
- out.write(ch, lastEscaped, i - lastEscaped);
- }
- lastEscaped = i + 1;
- if (out instanceof XmlStreamOutWriterAdapter) {
- try {
- ((XmlStreamOutWriterAdapter)out).writeEntityRef("#x" + Integer.toHexString(c));
- } catch (XMLStreamException e) {
- throw new IOException("Error writing xml stream", e);
- }
- } else {
- out.write("&#x");
- out.write(Integer.toHexString(c));
- out.write(';');
- }
- }
- }
- if (lastEscaped != limit) {
- out.write(ch, lastEscaped, length - lastEscaped);
- }
- }
- }
-
private static final class XmlStreamOutWriterAdapter extends Writer {
private final XMLStreamWriter writer;
diff --git a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java
index 6cff489..878a896 100644
--- a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java
+++ b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -386,7 +386,7 @@
}
- private static class HasEncodingWriter extends XMLStreamWriterFilter implements HasEncoding {
+ public static class HasEncodingWriter extends XMLStreamWriterFilter implements HasEncoding {
private final String encoding;
HasEncodingWriter(XMLStreamWriter writer, String encoding) {
@@ -399,7 +399,7 @@
return encoding;
}
- XMLStreamWriter getWriter() {
+ public XMLStreamWriter getWriter() {
return writer;
}
}
diff --git a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java
index b72cb73..92e1e10 100644
--- a/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java
+++ b/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package com.sun.xml.internal.ws.streaming;
import com.sun.istack.internal.Nullable;
+import com.sun.xml.internal.ws.api.streaming.XMLStreamWriterFactory;
import com.sun.xml.internal.ws.encoding.HasEncoding;
import com.sun.xml.internal.ws.encoding.SOAPBindingCodec;
@@ -57,9 +58,15 @@
public static @Nullable OutputStream getOutputStream(XMLStreamWriter writer) throws XMLStreamException {
Object obj = null;
+ XMLStreamWriter xmlStreamWriter =
+ writer instanceof XMLStreamWriterFactory.HasEncodingWriter ?
+ ((XMLStreamWriterFactory.HasEncodingWriter) writer).getWriter()
+ : writer;
+
+
// Hack for JDK6's SJSXP
- if (writer instanceof Map) {
- obj = ((Map) writer).get("sjsxp-outputstream");
+ if (xmlStreamWriter instanceof Map) {
+ obj = ((Map) xmlStreamWriter).get("sjsxp-outputstream");
}
// woodstox
diff --git a/jdk/.hgtags b/jdk/.hgtags
index cae3660..d0c41ef 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -857,9 +857,17 @@
95df717479b19f5ea244afc67434827f2f851287 jdk8u162-b11
ddae5cb11d6c04130b8002b852bc7f80e0c8bcd2 jdk8u162-b12
8e40acfcc41a631f5922824712d4336742652eac jdk8u162-b31
+c00bdbbd9a77150f565298af9c305d7e6863eb59 jdk8u162-b32
+70a653814e61a5552312345308b85330fa8f27bc jdk8u162-b33
+f1f949ac13549c6fb3766279848539b124ad835e jdk8u162-b34
+b3de2b1e82fb2427cd40bb230aa26d9b7d8fb09c jdk8u162-b35
+e03fff22900242d92a97839a9c095bb106bdc68f jdk8u162-b36
+19696e8204b0e77e0f10af106c384b7ba6dd5bda jdk8u162-b37
+305c40e81a6fd59699036d4c35d8994f8501f116 jdk8u162-b38
b6195815c4bbbf275f1aefd337d805eb66f2b5b8 jdk8u171-b00
f1792a59f1fa20e47fe5d4561754012440564bec jdk8u171-b01
cac020298633fc736f5e21afddf00145665ef0a7 jdk8u171-b02
+e7e27f446209924f66a4bf86738f3e5f2fbbef5f jdk8u181-b00
c260afc0c5a13407aad4f066f81fba814bb0cbae jdk8u171-b03
ac700f67341a20ddae093c319da1c65e41edcacd jdk8u171-b04
863ef3413aa42c15fbdc14fef6732f2741f97046 jdk8u171-b05
@@ -874,9 +882,44 @@
db8272cb8c99eea536a66c4c368c4bf2bf013a81 jdk8u172-b02
bd24ee3a9a0494121fd1d96c308b9738f585001b jdk8u172-b03
cf952b84daa1e74403a4d1df541c0ecca830717d jdk8u172-b04
+e7e27f446209924f66a4bf86738f3e5f2fbbef5f jdk8u181-b00
+a8746b41e23a1deda3d0f41ed2eca3d3a4cc74de jdk8u191-b00
076daed81c0a851f6d13fac538834ac465cdc122 jdk8u172-b05
94491d0dc59590535339a2ffae510166bb16f34c jdk8u172-b06
7e9eeb74e84beb6d8a6f562441eb7dd0ab0befa9 jdk8u172-b07
3974ec9cd04057a19d02c04f3484d5686d70d21c jdk8u172-b08
f52ece1d8708024735f06e7e3bdc771efbc073d0 jdk8u172-b09
9e9009034e5ce97a97f72c00cd37cf2a638fa1a4 jdk8u172-b10
+2a041b1f858dc6a372ac07b8cf5bf6fab879dcc8 jdk8u172-b11
+d902fae6241006af3c4cfc4ce82ebcb3efb9d725 jdk8u181-b01
+baac18e216fb47b4cfa04169b3c3de58d667de7c jdk8u181-b02
+d237c59d14e1c1fb1f750e9cdabcea6e711f4d34 jdk8u181-b03
+f3185b46a35b82727f39d52ac7fad7c4c78ddcdd jdk8u172-b31
+0939503b7477ba081484c54f26f177f9a66d92e4 jdk8u172-b32
+f4b138a6c95cf17f6138598fe04a90dfe1086bf4 jdk8u172-b33
+93b4d31ee70576a45a87607e2f5474d90ba31653 jdk8u172-b34
+6b4e239c74929b86b46113e92fe36d355157e235 jdk8u172-b35
+010852525831e0e88f622167d615438b82002e1f jdk8u172-b36
+9ac2466ffdbb1b9d9005b50aa633a5986617a002 jdk8u172-b37
+d902fae6241006af3c4cfc4ce82ebcb3efb9d725 jdk8u181-b01
+baac18e216fb47b4cfa04169b3c3de58d667de7c jdk8u181-b02
+d237c59d14e1c1fb1f750e9cdabcea6e711f4d34 jdk8u181-b03
+6eeca4fb7748e8bdca4afbd6785b04376b1d44cc jdk8u181-b04
+f34c24087b0e6f52391f491d6c3a608616d1db2c jdk8u181-b05
+076f5fd6258846fce7010a598de2c7583628bb1e jdk8u181-b06
+446351642449411566d7fd0a26e32c8825f4f03e jdk8u181-b07
+f26f68978e0e7ed0e6e61f9d64fa2d06f1c1a24c jdk8u181-b08
+71b4f630e5225b9dcb939325f1a2ee0d04dc98f6 jdk8u181-b09
+1f7b9ad2c572fe2c905a771bac15f252e374c2c6 jdk8u181-b10
+112f3576f12e24d5e35d8d31782698e7d9a8fa52 jdk8u181-b11
+22e01e7c5c39bfa3f5e2d18be76c7bf0dc71033a jdk8u181-b12
+0cb452d66676bc1b3824bea4a0c16ac76e58b070 jdk8u181-b13
+b01c6e5aa43c784fc66465b56227ddd9aa29eee6 jdk8u191-b01
+2db6890a956723ac347b573217d91bbbedbb0528 jdk8u191-b02
+89e2889d02d2f5dabdeda7f60cf80a8df3100eb4 jdk8u191-b03
+94e4769c6d69241f9eb7164a85fc91fc83faab5c jdk8u191-b04
+6329d17c17d7a40a8747b346e324d39476b045d1 jdk8u191-b05
+ca864c999536f7b036b704c03a7e6e7b3ce12702 jdk8u191-b06
+8d7260f7df9e122a74ab7fe6a91e07ab103d1c54 jdk8u191-b07
+f1e4b0f8695fed5ae0f506e27cbf247e7c8ef5aa jdk8u191-b08
+dca9c1978ed662fae851a38ad260a2811c80da21 jdk8u191-b09
diff --git a/jdk/THIRD_PARTY_README b/jdk/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/jdk/THIRD_PARTY_README
+++ b/jdk/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/jdk/make/CompileDemos.gmk b/jdk/make/CompileDemos.gmk
index 97bb060..6c5eb43 100644
--- a/jdk/make/CompileDemos.gmk
+++ b/jdk/make/CompileDemos.gmk
@@ -455,29 +455,6 @@
##################################################################################################
-ifndef OPENJDK
- DB_DEMO_ZIPFILE := $(wildcard $(JDK_TOPDIR)/src/closed/share/db/db-derby-*-bin.zip)
-
- $(JDK_OUTPUTDIR)/demo/_the.db.unzipped: $(DB_DEMO_ZIPFILE)
- $(MKDIR) -p $(@D)
- $(RM) -r $(JDK_OUTPUTDIR)/demo/db $(JDK_OUTPUTDIR)/demo/demo
- $(CD) $(JDK_OUTPUTDIR)/demo && $(UNZIP) -q -o $<
- $(MV) $(JDK_OUTPUTDIR)/demo/db-derby-*-bin/demo $(JDK_OUTPUTDIR)/demo/db
- $(CD) $(JDK_OUTPUTDIR)/demo && $(RM) -r db-derby-*-bin
- $(TOUCH) $@
-
- # Copy this after the unzip above to avoid race with directory creation and mv command.
- $(JDK_OUTPUTDIR)/demo/db/README-JDK-DEMOS.html: \
- $(JDK_TOPDIR)/src/closed/share/db/README-JDK-DEMOS.html \
- | $(JDK_OUTPUTDIR)/demo/_the.db.unzipped
- $(MKDIR) -p $(@D)
- $(CAT) $< | $(SED) "s/XXXX/$(shell cat $(JDK_TOPDIR)/src/closed/share/db/COPYRIGHTYEAR)/" > $@
-
- BUILD_DEMOS += $(JDK_OUTPUTDIR)/demo/_the.db.unzipped $(JDK_OUTPUTDIR)/demo/db/README-JDK-DEMOS.html
-endif
-
-##################################################################################################
-
all: $(BUILD_DEMOS)
.PHONY: all
diff --git a/jdk/make/Images.gmk b/jdk/make/Images.gmk
index 48b4d0f..06077dc 100644
--- a/jdk/make/Images.gmk
+++ b/jdk/make/Images.gmk
@@ -542,37 +542,6 @@
$(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_IMAGE_DIR),$f,JDK_SAMPLE_TARGETS)))
################################################################################
-# /db dir
-
-ifndef OPENJDK
- $(IMAGES_OUTPUTDIR)/_unzip/%.unzipped: $(JDK_TOPDIR)/src/closed/share/db/%
- $(ECHO) Unzipping $(patsubst $(SRC_ROOT)/%,%,$<)
- $(MKDIR) -p $(JDK_IMAGE_DIR)/db
- cd $(JDK_IMAGE_DIR)/db && $(UNZIP) -q -o $< -x */index.html */KEYS */test/* *javadoc/* */docs/* */demo/* 2> /dev/null
- cd $(JDK_IMAGE_DIR)/db && $(MV) db-derby-*-bin/* . && $(RM) -r db-derby-*-bin
-ifneq ($(OPENJDK_TARGET_OS), windows)
- $(RM) $(JDK_IMAGE_DIR)/db/bin/*.bat
-endif
- $(MKDIR) -p $(@D)
- $(TOUCH) $@
-
- $(JDK_IMAGE_DIR)/db/README-JDK.html: $(JDK_TOPDIR)/src/closed/share/db/README-JDK.html
- $(ECHO) $(LOG_INFO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)'
- $(MKDIR) -p $(@D)
- $(CAT) $< | $(SED) "s/XXXX/$(shell cat $(JDK_TOPDIR)/src/closed/share/db/COPYRIGHTYEAR)/" > $@
-
- $(JDK_IMAGE_DIR)/db/3RDPARTY: $(JDK_TOPDIR)/src/closed/share/db/3RDPARTY
- $(ECHO) $(LOG_INFO) Copying '$(patsubst $(OUTPUT_ROOT)/%,%,$@)'
- $(MKDIR) -p $(@D)
- $(CAT) $< | $(SED) "s/XXXX/$(shell cat $(JDK_TOPDIR)/src/closed/share/db/COPYRIGHTYEAR)/" > $@
-
- JDK_DB_TARGETS := $(patsubst $(JDK_TOPDIR)/src/closed/share/db/%, $(IMAGES_OUTPUTDIR)/_unzip/%.unzipped, \
- $(wildcard $(JDK_TOPDIR)/src/closed/share/db/db-derby-*-bin.zip)) \
- $(JDK_IMAGE_DIR)/db/README-JDK.html $(JDK_IMAGE_DIR)/db/3RDPARTY
-
-endif
-
-################################################################################
# /include dir
$(foreach f,$(call CacheFind,$(JDK_OUTPUTDIR)/include), \
diff --git a/jdk/make/data/tzdata/VERSION b/jdk/make/data/tzdata/VERSION
index 561bd27..22002be 100644
--- a/jdk/make/data/tzdata/VERSION
+++ b/jdk/make/data/tzdata/VERSION
@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-tzdata2018c
+tzdata2018e
diff --git a/jdk/make/data/tzdata/africa b/jdk/make/data/tzdata/africa
index 92c0b43ec..1c305f8 100644
--- a/jdk/make/data/tzdata/africa
+++ b/jdk/make/data/tzdata/africa
@@ -29,7 +29,7 @@
# tz@iana.org for general use in the future). For more, please see
# the file CONTRIBUTING in the tz distribution.
-# From Paul Eggert (2017-02-20):
+# From Paul Eggert (2017-04-09):
#
# Unless otherwise specified, the source for data through 1990 is:
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
@@ -75,7 +75,7 @@
# cannot now come up with solid citations.
#
# I invented the following abbreviations; corrections are welcome!
-# +02 WAST West Africa Summer Time
+# +02 WAST West Africa Summer Time (no longer used)
# +03 CAST Central Africa Summer Time (no longer used)
# +03 SAST South Africa Summer Time (no longer used)
# +03 EAT East Africa Time
@@ -138,13 +138,13 @@
# Cape Verde / Cabo Verde
#
+# From Paul Eggert (2018-02-16):
# Shanks gives 1907 for the transition to +02.
-# Perhaps the 1911-05-26 Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# merely made it official?
+# For now, ignore that and follow the 1911-05-26 Portuguese decree
+# (see Europe/Lisbon).
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Atlantic/Cape_Verde -1:34:04 - LMT 1907 # Praia
+Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
-2:00 - -02 1942 Sep
-2:00 1:00 -01 1945 Oct 15
-2:00 - -02 1975 Nov 25 2:00
@@ -393,15 +393,34 @@
# See Africa/Abidjan.
# Ghana
-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+
+# From Paul Eggert (2018-01-30):
# Whitman says DST was observed from 1931 to "the present";
-# Shanks & Pottenger say 1936 to 1942;
-# and September 1 to January 1 is given by:
-# Scott Keltie J, Epstein M (eds), The Statesman's Year-Book,
-# 57th ed. Macmillan, London (1920), OCLC 609408015, pp xxviii.
-# For lack of better info, assume DST was observed from 1920 to 1942.
-Rule Ghana 1920 1942 - Sep 1 0:00 0:20 GHST
-Rule Ghana 1920 1942 - Dec 31 0:00 0 GMT
+# Shanks & Pottenger say 1936 to 1942 with 20 minutes of DST,
+# with transitions on 09-01 and 12-31 at 00:00.
+# Page 33 of Parish GCB, Colonial Reports - Annual. No. 1066. Gold
+# Coast. Report for 1919. (March 1921), OCLC 784024077
+# http://libsysdigi.library.illinois.edu/ilharvest/africana/books2011-05/5530214/5530214_1919/5530214_1919_opt.pdf
+# lists the Determination of the Time Ordinance, 1919, No. 18,
+# "to advance the time observed locally by the space of twenty minutes
+# during the last four months of each year; the object in view being
+# to extend during those months the period of daylight-time available
+# for evening recreation after office hours."
+# Vanessa Ogle, The Global Transformation of Time, 1870-1950 (2015), p 33,
+# writes "In 1919, the Gold Coast (Ghana as of 1957) made Greenwich
+# time its legal time and simultaneously legalized a summer time of
+# UTC - 00:20 minutes from March to October."; a footnote lists
+# the ordinance as being dated 1919-11-24.
+# The Crown Colonist, Volume 12 (1942), p 176, says "the Government
+# intend advancing Gold Coast time half an hour ahead of G.M.T.
+# The actual date of the alteration has not yet been announced."
+# These sources are incomplete and contradictory. Possibly what is
+# now Ghana observed different DST regimes in different years. For
+# lack of better info, use Shanks except treat the minus sign as a
+# typo, and assume DST started in 1920 not 1936.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Ghana 1920 1942 - Sep 1 0:00 0:20 -
+Rule Ghana 1920 1942 - Dec 31 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Accra -0:00:52 - LMT 1918
0:00 Ghana GMT/+0020
@@ -411,13 +430,13 @@
# Guinea-Bissau
#
+# From Paul Eggert (2018-02-16):
# Shanks gives 1911-05-26 for the transition to WAT,
# evidently confusing the date of the Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# with the date that it took effect, namely 1912-01-01.
+# (see Europe/Lisbon) with the date that it took effect.
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1
+Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
-1:00 - -01 1975
0:00 - GMT
@@ -613,9 +632,9 @@
# at 2am (or 02:00) local time..."
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Mauritius 1982 only - Oct 10 0:00 1:00 S
+Rule Mauritius 1982 only - Oct 10 0:00 1:00 -
Rule Mauritius 1983 only - Mar 21 0:00 0 -
-Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 S
+Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
@@ -971,6 +990,10 @@
# commence at OOhOO on Monday 21 March 1994 and shall end at 02h00 on
# Sunday 4 September 1994.
+# From Michael Deckers (2017-04-06):
+# ... both summer and winter time are called "standard"
+# (which differs from the use in Ireland) ...
+
# From Petronella Sibeene (2007-03-30):
# http://allafrica.com/stories/200703300178.html
# While the entire country changes its time, Katima Mulilo and other
@@ -996,19 +1019,42 @@
# the same time they would normally start DST, the first Sunday in September:
# https://www.timeanddate.com/news/time/namibia-new-time-zone.html
+# From Paul Eggert (2017-04-09):
+# Before the change, summer and winter time were both standard time legally.
+# However in common parlance, winter time was considered to be DST. See, e.g.:
+# http://www.nbc.na/news/namibias-winter-time-could-be-scrapped.2706
+# https://zone.my.na/news/times-are-changing-in-namibia
+# https://www.newera.com.na/2017/02/23/namibias-winter-time-might-be-repealed/
+# Use plain "WAT" and "CAT" for the time zone abbreviations, to be compatible
+# with Namibia's neighbors.
+
# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Namibia 1994 only - Mar 21 0:00 0 -
-Rule Namibia 1994 2016 - Sep Sun>=1 2:00 1:00 S
-Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 -
+# Vanguard section, for zic and other parsers that support negative DST.
+#Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT
+#Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT
+#Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
+# Rearguard section, for parsers that do not support negative DST.
+Rule Namibia 1994 only - Mar 21 0:00 0 WAT
+Rule Namibia 1994 2017 - Sep Sun>=1 2:00 1:00 CAT
+Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 WAT
+# End of rearguard section.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
1:30 - +0130 1903 Mar
2:00 - SAST 1942 Sep 20 2:00
2:00 1:00 SAST 1943 Mar 21 2:00
2:00 - SAST 1990 Mar 21 # independence
+# Vanguard section, for zic and other parsers that support negative DST.
+# 2:00 Namibia %s
+# Rearguard section, for parsers that do not support negative DST.
2:00 - CAT 1994 Mar 21 0:00
- 1:00 Namibia WA%sT 2017 Sep 3 2:00
+# From Paul Eggert (2017-04-07):
+# The official date of the 2017 rule change was 2017-10-24. See:
+# http://www.lac.org.na/laws/annoSTAT/Namibian%20Time%20Act%209%20of%202017.pdf
+ 1:00 Namibia %s 2017 Oct 24
2:00 - CAT
+# End of rearguard section.
# Niger
# See Africa/Lagos.
@@ -1060,6 +1106,8 @@
# São Tomé and Príncipe
+# See Europe/Lisbon for info about the 1912 transition.
+
# From Steffen Thorsen (2018-01-08):
# Multiple sources tell that São Tomé changed from UTC to UTC+1 as
# they entered the year 2018.
@@ -1068,7 +1116,7 @@
# http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017
Zone Africa/Sao_Tome 0:26:56 - LMT 1884
- -0:36:45 - LMT 1912 # Lisbon Mean Time
+ -0:36:45 - LMT 1912 Jan 1 00:00u # Lisbon MT
0:00 - GMT 2018 Jan 1 01:00
1:00 - WAT
diff --git a/jdk/make/data/tzdata/antarctica b/jdk/make/data/tzdata/antarctica
index c78ef7e..74ce2dc 100644
--- a/jdk/make/data/tzdata/antarctica
+++ b/jdk/make/data/tzdata/antarctica
@@ -98,7 +98,8 @@
8:00 - +08 2011 Oct 28 2:00
11:00 - +11 2012 Feb 21 17:00u
8:00 - +08 2016 Oct 22
- 11:00 - +11
+ 11:00 - +11 2018 Mar 11 4:00
+ 8:00 - +08
Zone Antarctica/Davis 0 - -00 1957 Jan 13
7:00 - +07 1964 Nov
0 - -00 1969 Feb
diff --git a/jdk/make/data/tzdata/asia b/jdk/make/data/tzdata/asia
index c281ece..877f53d 100644
--- a/jdk/make/data/tzdata/asia
+++ b/jdk/make/data/tzdata/asia
@@ -92,13 +92,13 @@
Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S
Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 -
Rule EUAsia 1996 max - Oct lastSun 1:00u 0 -
-Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S
+Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 -
Rule E-EurAsia 1979 1995 - Sep lastSun 0:00 0 -
Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 -
-Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 S
+Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 -
Rule RussiaAsia 1981 1983 - Oct 1 0:00 0 -
Rule RussiaAsia 1984 1995 - Sep lastSun 2:00s 0 -
-Rule RussiaAsia 1985 2010 - Mar lastSun 2:00s 1:00 S
+Rule RussiaAsia 1985 2010 - Mar lastSun 2:00s 1:00 -
Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
# Afghanistan
@@ -133,7 +133,7 @@
# (brief)
# http://www.worldtimezone.com/dst_news/dst_news_armenia03.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 S
+Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
@@ -159,7 +159,7 @@
# http://en.apa.az/xeber_azerbaijan_abolishes_daylight_savings_ti_240862.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 S
+Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Baku 3:19:24 - LMT 1924 May 2
@@ -246,7 +246,7 @@
# http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Dhaka 2009 only - Jun 19 23:00 1:00 S
+Rule Dhaka 2009 only - Jun 19 23:00 1:00 -
Rule Dhaka 2009 only - Dec 31 24:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -787,8 +787,9 @@
Rule Macau 1975 1977 - Apr Sun>=15 3:30 1:00 D
Rule Macau 1978 1980 - Apr Sun>=15 0:00 1:00 D
Rule Macau 1978 1980 - Oct Sun>=15 0:00 0 S
+# See Europe/Lisbon for info about the 1912 transition.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Macau 7:34:20 - LMT 1912 Jan 1
+Zone Asia/Macau 7:34:20 - LMT 1911 Dec 31 16:00u
8:00 Macau C%sT
@@ -1129,61 +1130,61 @@
# thirtieth day of Shahrivar.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iran 1978 1980 - Mar 21 0:00 1:00 D
-Rule Iran 1978 only - Oct 21 0:00 0 S
-Rule Iran 1979 only - Sep 19 0:00 0 S
-Rule Iran 1980 only - Sep 23 0:00 0 S
-Rule Iran 1991 only - May 3 0:00 1:00 D
-Rule Iran 1992 1995 - Mar 22 0:00 1:00 D
-Rule Iran 1991 1995 - Sep 22 0:00 0 S
-Rule Iran 1996 only - Mar 21 0:00 1:00 D
-Rule Iran 1996 only - Sep 21 0:00 0 S
-Rule Iran 1997 1999 - Mar 22 0:00 1:00 D
-Rule Iran 1997 1999 - Sep 22 0:00 0 S
-Rule Iran 2000 only - Mar 21 0:00 1:00 D
-Rule Iran 2000 only - Sep 21 0:00 0 S
-Rule Iran 2001 2003 - Mar 22 0:00 1:00 D
-Rule Iran 2001 2003 - Sep 22 0:00 0 S
-Rule Iran 2004 only - Mar 21 0:00 1:00 D
-Rule Iran 2004 only - Sep 21 0:00 0 S
-Rule Iran 2005 only - Mar 22 0:00 1:00 D
-Rule Iran 2005 only - Sep 22 0:00 0 S
-Rule Iran 2008 only - Mar 21 0:00 1:00 D
-Rule Iran 2008 only - Sep 21 0:00 0 S
-Rule Iran 2009 2011 - Mar 22 0:00 1:00 D
-Rule Iran 2009 2011 - Sep 22 0:00 0 S
-Rule Iran 2012 only - Mar 21 0:00 1:00 D
-Rule Iran 2012 only - Sep 21 0:00 0 S
-Rule Iran 2013 2015 - Mar 22 0:00 1:00 D
-Rule Iran 2013 2015 - Sep 22 0:00 0 S
-Rule Iran 2016 only - Mar 21 0:00 1:00 D
-Rule Iran 2016 only - Sep 21 0:00 0 S
-Rule Iran 2017 2019 - Mar 22 0:00 1:00 D
-Rule Iran 2017 2019 - Sep 22 0:00 0 S
-Rule Iran 2020 only - Mar 21 0:00 1:00 D
-Rule Iran 2020 only - Sep 21 0:00 0 S
-Rule Iran 2021 2023 - Mar 22 0:00 1:00 D
-Rule Iran 2021 2023 - Sep 22 0:00 0 S
-Rule Iran 2024 only - Mar 21 0:00 1:00 D
-Rule Iran 2024 only - Sep 21 0:00 0 S
-Rule Iran 2025 2027 - Mar 22 0:00 1:00 D
-Rule Iran 2025 2027 - Sep 22 0:00 0 S
-Rule Iran 2028 2029 - Mar 21 0:00 1:00 D
-Rule Iran 2028 2029 - Sep 21 0:00 0 S
-Rule Iran 2030 2031 - Mar 22 0:00 1:00 D
-Rule Iran 2030 2031 - Sep 22 0:00 0 S
-Rule Iran 2032 2033 - Mar 21 0:00 1:00 D
-Rule Iran 2032 2033 - Sep 21 0:00 0 S
-Rule Iran 2034 2035 - Mar 22 0:00 1:00 D
-Rule Iran 2034 2035 - Sep 22 0:00 0 S
+Rule Iran 1978 1980 - Mar 21 0:00 1:00 -
+Rule Iran 1978 only - Oct 21 0:00 0 -
+Rule Iran 1979 only - Sep 19 0:00 0 -
+Rule Iran 1980 only - Sep 23 0:00 0 -
+Rule Iran 1991 only - May 3 0:00 1:00 -
+Rule Iran 1992 1995 - Mar 22 0:00 1:00 -
+Rule Iran 1991 1995 - Sep 22 0:00 0 -
+Rule Iran 1996 only - Mar 21 0:00 1:00 -
+Rule Iran 1996 only - Sep 21 0:00 0 -
+Rule Iran 1997 1999 - Mar 22 0:00 1:00 -
+Rule Iran 1997 1999 - Sep 22 0:00 0 -
+Rule Iran 2000 only - Mar 21 0:00 1:00 -
+Rule Iran 2000 only - Sep 21 0:00 0 -
+Rule Iran 2001 2003 - Mar 22 0:00 1:00 -
+Rule Iran 2001 2003 - Sep 22 0:00 0 -
+Rule Iran 2004 only - Mar 21 0:00 1:00 -
+Rule Iran 2004 only - Sep 21 0:00 0 -
+Rule Iran 2005 only - Mar 22 0:00 1:00 -
+Rule Iran 2005 only - Sep 22 0:00 0 -
+Rule Iran 2008 only - Mar 21 0:00 1:00 -
+Rule Iran 2008 only - Sep 21 0:00 0 -
+Rule Iran 2009 2011 - Mar 22 0:00 1:00 -
+Rule Iran 2009 2011 - Sep 22 0:00 0 -
+Rule Iran 2012 only - Mar 21 0:00 1:00 -
+Rule Iran 2012 only - Sep 21 0:00 0 -
+Rule Iran 2013 2015 - Mar 22 0:00 1:00 -
+Rule Iran 2013 2015 - Sep 22 0:00 0 -
+Rule Iran 2016 only - Mar 21 0:00 1:00 -
+Rule Iran 2016 only - Sep 21 0:00 0 -
+Rule Iran 2017 2019 - Mar 22 0:00 1:00 -
+Rule Iran 2017 2019 - Sep 22 0:00 0 -
+Rule Iran 2020 only - Mar 21 0:00 1:00 -
+Rule Iran 2020 only - Sep 21 0:00 0 -
+Rule Iran 2021 2023 - Mar 22 0:00 1:00 -
+Rule Iran 2021 2023 - Sep 22 0:00 0 -
+Rule Iran 2024 only - Mar 21 0:00 1:00 -
+Rule Iran 2024 only - Sep 21 0:00 0 -
+Rule Iran 2025 2027 - Mar 22 0:00 1:00 -
+Rule Iran 2025 2027 - Sep 22 0:00 0 -
+Rule Iran 2028 2029 - Mar 21 0:00 1:00 -
+Rule Iran 2028 2029 - Sep 21 0:00 0 -
+Rule Iran 2030 2031 - Mar 22 0:00 1:00 -
+Rule Iran 2030 2031 - Sep 22 0:00 0 -
+Rule Iran 2032 2033 - Mar 21 0:00 1:00 -
+Rule Iran 2032 2033 - Sep 21 0:00 0 -
+Rule Iran 2034 2035 - Mar 22 0:00 1:00 -
+Rule Iran 2034 2035 - Sep 22 0:00 0 -
#
# The following rules are approximations starting in the year 2038.
# These are the best post-2037 approximations available, given the
# restrictions of a single rule using a Gregorian-based data format.
# At some point this table will need to be extended, though quite
# possibly Iran will change the rules first.
-Rule Iran 2036 max - Mar 21 0:00 1:00 D
-Rule Iran 2036 max - Sep 21 0:00 0 S
+Rule Iran 2036 max - Mar 21 0:00 1:00 -
+Rule Iran 2036 max - Sep 21 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Tehran 3:25:44 - LMT 1916
@@ -1219,17 +1220,17 @@
# https://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iraq 1982 only - May 1 0:00 1:00 D
-Rule Iraq 1982 1984 - Oct 1 0:00 0 S
-Rule Iraq 1983 only - Mar 31 0:00 1:00 D
-Rule Iraq 1984 1985 - Apr 1 0:00 1:00 D
-Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 S
-Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D
+Rule Iraq 1982 only - May 1 0:00 1:00 -
+Rule Iraq 1982 1984 - Oct 1 0:00 0 -
+Rule Iraq 1983 only - Mar 31 0:00 1:00 -
+Rule Iraq 1984 1985 - Apr 1 0:00 1:00 -
+Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 -
+Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 -
# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the ':01' is a typo.
# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
#
-Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 D
-Rule Iraq 1991 2007 - Oct 1 3:00s 0 S
+Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 -
+Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time?
@@ -1501,8 +1502,7 @@
# From Hideyuki Suzuki (1998-11-09):
# 'Tokyo' usually stands for the former location of Tokyo Astronomical
-# Observatory: 139 degrees 44' 40.90" E (9h 18m 58.727s),
-# 35 degrees 39' 16.0" N.
+# Observatory: 139° 44' 40.90" E (9h 18m 58.727s), 35° 39' 16.0" N.
# This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996'
# edited by National Astronomical Observatory of Japan....
# JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).
@@ -1510,10 +1510,10 @@
# From Hideyuki Suzuki (1998-11-16):
# The ordinance No. 51 (1886) established "standard time" in Japan,
-# which stands for the time on 135 degrees E.
+# which stands for the time on 135° E.
# In the ordinance No. 167 (1895), "standard time" was renamed to "central
# standard time". And the same ordinance also established "western standard
-# time", which stands for the time on 120 degrees E.... But "western standard
+# time", which stands for the time on 120° E.... But "western standard
# time" was abolished in the ordinance No. 529 (1937). In the ordinance No.
# 167, there is no mention regarding for what place western standard time is
# standard....
@@ -1926,9 +1926,9 @@
# From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 S
+Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 -
Rule Kyrgyz 1992 1996 - Sep lastSun 0:00 0 -
-Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 S
+Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
@@ -2006,6 +2006,19 @@
# There is no common English-language abbreviation for this time zone.
# Use KST, as that's what we already use for 1954-1961 in ROK.
+# From Kang Seonghoon (2018-04-29):
+# North Korea will revert its time zone from UTC+8:30 (PYT; Pyongyang
+# Time) back to UTC+9 (KST; Korea Standard Time).
+#
+# From Seo Sanghyeon (2018-04-30):
+# Rodong Sinmun 2018-04-30 announced Pyongyang Time transition plan.
+# https://www.nknews.org/kcna/wp-content/uploads/sites/5/2018/04/rodong-2018-04-30.pdf
+# ... the transition date is 2018-05-05 ... Citation should be Decree
+# No. 2232 of April 30, 2018, of the Presidium of the Supreme People's
+# Assembly, as published in Rodong Sinmun.
+# From Tim Parenti (2018-04-29):
+# It appears to be the front page story at the top in the right-most column.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Seoul 8:27:52 - LMT 1908 Apr 1
8:30 - KST 1912 Jan 1
@@ -2017,7 +2030,8 @@
8:30 - KST 1912 Jan 1
9:00 - JST 1945 Aug 24
9:00 - KST 2015 Aug 15 00:00
- 8:30 - KST
+ 8:30 - KST 2018 May 5
+ 9:00 - KST
###############################################################################
@@ -2060,7 +2074,7 @@
# Malaysia
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 TS # one-Third Summer
+Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 -
Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
#
# peninsular Malaysia
@@ -2205,7 +2219,7 @@
# http://zasag.mn/news/view/8969
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Mongol 1983 1984 - Apr 1 0:00 1:00 S
+Rule Mongol 1983 1984 - Apr 1 0:00 1:00 -
Rule Mongol 1983 only - Oct 1 0:00 0 -
# Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
# but McDow says the 2001 switches occurred at 02:00. Also, IATA SSIM
@@ -2222,13 +2236,13 @@
# Mongolian Government meeting has concluded today to cancel daylight
# saving time adoption in Mongolia. Source: http://zasag.mn/news/view/16192
-Rule Mongol 1985 1998 - Mar lastSun 0:00 1:00 S
+Rule Mongol 1985 1998 - Mar lastSun 0:00 1:00 -
Rule Mongol 1984 1998 - Sep lastSun 0:00 0 -
# IATA SSIM (1999-09) says Mongolia no longer observes DST.
-Rule Mongol 2001 only - Apr lastSat 2:00 1:00 S
+Rule Mongol 2001 only - Apr lastSat 2:00 1:00 -
Rule Mongol 2001 2006 - Sep lastSat 2:00 0 -
-Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 S
-Rule Mongol 2015 2016 - Mar lastSat 2:00 1:00 S
+Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 -
+Rule Mongol 2015 2016 - Mar lastSat 2:00 1:00 -
Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -2662,9 +2676,6 @@
# [Google translation]: "The Council also decided to start daylight
# saving in Palestine as of one o'clock on Saturday morning,
# 2016-03-26, to provide the clock 60 minutes ahead."
-#
-# From Paul Eggert (2016-03-12):
-# Predict spring transitions on March's last Saturday at 01:00 from now on.
# From Sharef Mustafa (2016-10-19):
# [T]he Palestinian cabinet decision (Mar 8th 2016) published on
@@ -2681,6 +2692,16 @@
# https://www.timeanddate.com/time/change/gaza-strip/gaza
# https://www.timeanddate.com/time/change/west-bank/hebron
+# From Sharef Mustafa (2018-03-16):
+# Palestine summer time will start on Mar 24th 2018 by advancing the
+# clock by 60 minutes as per Palestinian cabinet decision published on
+# the official website, though the decree did not specify the exact
+# time of the time shift.
+# http://www.palestinecabinet.gov.ps/Website/AR/NDecrees/ViewFile.ashx?ID=e7a42ab7-ee23-435a-b9c8-a4f7e81f3817
+#
+# From Paul Eggert (2018-03-16):
+# For 2016 on, predict spring transitions on March's fourth Saturday at 01:00.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 -
@@ -2710,7 +2731,7 @@
Rule Palestine 2013 only - Sep Fri>=21 0:00 0 -
Rule Palestine 2014 2015 - Oct Fri>=21 0:00 0 -
Rule Palestine 2015 only - Mar lastFri 24:00 1:00 S
-Rule Palestine 2016 max - Mar lastSat 1:00 1:00 S
+Rule Palestine 2016 max - Mar Sat>=22 1:00 1:00 S
Rule Palestine 2016 max - Oct lastSat 1:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -2760,11 +2781,11 @@
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Phil 1936 only - Nov 1 0:00 1:00 S
+Rule Phil 1936 only - Nov 1 0:00 1:00 -
Rule Phil 1937 only - Feb 1 0:00 0 -
-Rule Phil 1954 only - Apr 12 0:00 1:00 S
+Rule Phil 1954 only - Apr 12 0:00 1:00 -
Rule Phil 1954 only - Jul 1 0:00 0 -
-Rule Phil 1978 only - Mar 22 0:00 1:00 S
+Rule Phil 1978 only - Mar 22 0:00 1:00 -
Rule Phil 1978 only - Sep 21 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
@@ -3120,9 +3141,9 @@
# and is the basis for the information below.
#
# The 1906 transition was effective July 1 and standardized Indochina to
-# Phù Liễn Observatory, legally 104 deg. 17'17" east of Paris.
+# Phù Liễn Observatory, legally 104° 17' 17" east of Paris.
# It's unclear whether this meant legal Paris Mean Time (00:09:21) or
-# the Paris Meridian (2 deg. 20'14.03" E); the former yields 07:06:30.1333...
+# the Paris Meridian (2° 20' 14.03" E); the former yields 07:06:30.1333...
# and the latter 07:06:29.333... so either way it rounds to 07:06:30,
# which is used below even though the modern-day Phù Liễn Observatory
# is closer to 07:06:31. Abbreviate Phù Liễn Mean Time as PLMT.
diff --git a/jdk/make/data/tzdata/australasia b/jdk/make/data/tzdata/australasia
index f97957d..2c60fd3 100644
--- a/jdk/make/data/tzdata/australasia
+++ b/jdk/make/data/tzdata/australasia
@@ -219,20 +219,20 @@
# Lord Howe Island
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule LH 1981 1984 - Oct lastSun 2:00 1:00 D
-Rule LH 1982 1985 - Mar Sun>=1 2:00 0 S
-Rule LH 1985 only - Oct lastSun 2:00 0:30 D
-Rule LH 1986 1989 - Mar Sun>=15 2:00 0 S
-Rule LH 1986 only - Oct 19 2:00 0:30 D
-Rule LH 1987 1999 - Oct lastSun 2:00 0:30 D
-Rule LH 1990 1995 - Mar Sun>=1 2:00 0 S
-Rule LH 1996 2005 - Mar lastSun 2:00 0 S
-Rule LH 2000 only - Aug lastSun 2:00 0:30 D
-Rule LH 2001 2007 - Oct lastSun 2:00 0:30 D
-Rule LH 2006 only - Apr Sun>=1 2:00 0 S
-Rule LH 2007 only - Mar lastSun 2:00 0 S
-Rule LH 2008 max - Apr Sun>=1 2:00 0 S
-Rule LH 2008 max - Oct Sun>=1 2:00 0:30 D
+Rule LH 1981 1984 - Oct lastSun 2:00 1:00 -
+Rule LH 1982 1985 - Mar Sun>=1 2:00 0 -
+Rule LH 1985 only - Oct lastSun 2:00 0:30 -
+Rule LH 1986 1989 - Mar Sun>=15 2:00 0 -
+Rule LH 1986 only - Oct 19 2:00 0:30 -
+Rule LH 1987 1999 - Oct lastSun 2:00 0:30 -
+Rule LH 1990 1995 - Mar Sun>=1 2:00 0 -
+Rule LH 1996 2005 - Mar lastSun 2:00 0 -
+Rule LH 2000 only - Aug lastSun 2:00 0:30 -
+Rule LH 2001 2007 - Oct lastSun 2:00 0:30 -
+Rule LH 2006 only - Apr Sun>=1 2:00 0 -
+Rule LH 2007 only - Mar lastSun 2:00 0 -
+Rule LH 2008 max - Apr Sun>=1 2:00 0 -
+Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
10:00 - AEST 1981 Mar
10:30 LH +1030/+1130 1985 Jul
@@ -390,15 +390,15 @@
# practice than guessing no DST.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S
+Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 -
Rule Fiji 1999 2000 - Feb lastSun 3:00 0 -
-Rule Fiji 2009 only - Nov 29 2:00 1:00 S
+Rule Fiji 2009 only - Nov 29 2:00 1:00 -
Rule Fiji 2010 only - Mar lastSun 3:00 0 -
-Rule Fiji 2010 2013 - Oct Sun>=21 2:00 1:00 S
+Rule Fiji 2010 2013 - Oct Sun>=21 2:00 1:00 -
Rule Fiji 2011 only - Mar Sun>=1 3:00 0 -
Rule Fiji 2012 2013 - Jan Sun>=18 3:00 0 -
Rule Fiji 2014 only - Jan Sun>=18 2:00 0 -
-Rule Fiji 2014 max - Nov Sun>=1 2:00 1:00 S
+Rule Fiji 2014 max - Nov Sun>=1 2:00 1:00 -
Rule Fiji 2015 max - Jan Sun>=14 3:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
@@ -429,11 +429,11 @@
12:00 - +12
Zone Pacific/Enderbury -11:24:20 - LMT 1901
-12:00 - -12 1979 Oct
- -11:00 - -11 1995
+ -11:00 - -11 1994 Dec 31
13:00 - +13
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
-10:40 - -1040 1979 Oct
- -10:00 - -10 1995
+ -10:00 - -10 1994 Dec 31
14:00 - +14
# N Mariana Is
@@ -470,9 +470,9 @@
# New Caledonia
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule NC 1977 1978 - Dec Sun>=1 0:00 1:00 S
+Rule NC 1977 1978 - Dec Sun>=1 0:00 1:00 -
Rule NC 1978 1979 - Feb 27 0:00 0 -
-Rule NC 1996 only - Dec 1 2:00s 1:00 S
+Rule NC 1996 only - Dec 1 2:00s 1:00 -
# Shanks & Pottenger say the following was at 2:00; go with IATA.
Rule NC 1997 only - Mar 2 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -492,27 +492,28 @@
Rule NZ 1934 1940 - Apr lastSun 2:00 0 M
Rule NZ 1934 1940 - Sep lastSun 2:00 0:30 S
Rule NZ 1946 only - Jan 1 0:00 0 S
-# Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no
-# convenient single notation for the date and time of this transition
-# so we must duplicate the Rule lines.
+# Since 1957 Chatham has been 45 minutes ahead of NZ, but until 2018a
+# there was no documented single notation for the date and time of this
+# transition. Duplicate the Rule lines for now, to give the 2018a change
+# time to percolate out.
Rule NZ 1974 only - Nov Sun>=1 2:00s 1:00 D
-Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 D
+Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 -
Rule NZ 1975 only - Feb lastSun 2:00s 0 S
-Rule Chatham 1975 only - Feb lastSun 2:45s 0 S
+Rule Chatham 1975 only - Feb lastSun 2:45s 0 -
Rule NZ 1975 1988 - Oct lastSun 2:00s 1:00 D
-Rule Chatham 1975 1988 - Oct lastSun 2:45s 1:00 D
+Rule Chatham 1975 1988 - Oct lastSun 2:45s 1:00 -
Rule NZ 1976 1989 - Mar Sun>=1 2:00s 0 S
-Rule Chatham 1976 1989 - Mar Sun>=1 2:45s 0 S
+Rule Chatham 1976 1989 - Mar Sun>=1 2:45s 0 -
Rule NZ 1989 only - Oct Sun>=8 2:00s 1:00 D
-Rule Chatham 1989 only - Oct Sun>=8 2:45s 1:00 D
+Rule Chatham 1989 only - Oct Sun>=8 2:45s 1:00 -
Rule NZ 1990 2006 - Oct Sun>=1 2:00s 1:00 D
-Rule Chatham 1990 2006 - Oct Sun>=1 2:45s 1:00 D
+Rule Chatham 1990 2006 - Oct Sun>=1 2:45s 1:00 -
Rule NZ 1990 2007 - Mar Sun>=15 2:00s 0 S
-Rule Chatham 1990 2007 - Mar Sun>=15 2:45s 0 S
+Rule Chatham 1990 2007 - Mar Sun>=15 2:45s 0 -
Rule NZ 2007 max - Sep lastSun 2:00s 1:00 D
-Rule Chatham 2007 max - Sep lastSun 2:45s 1:00 D
+Rule Chatham 2007 max - Sep lastSun 2:45s 1:00 -
Rule NZ 2008 max - Apr Sun>=1 2:00s 0 S
-Rule Chatham 2008 max - Apr Sun>=1 2:45s 0 S
+Rule Chatham 2008 max - Apr Sun>=1 2:45s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
11:30 NZ NZ%sT 1946 Jan 1
@@ -536,9 +537,9 @@
# Cook Is
# From Shanks & Pottenger:
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Cook 1978 only - Nov 12 0:00 0:30 HS
+Rule Cook 1978 only - Nov 12 0:00 0:30 -
Rule Cook 1979 1991 - Mar Sun>=1 0:00 0 -
-Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 HS
+Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Rarotonga -10:39:04 - LMT 1901 # Avarua
-10:30 - -1030 1978 Nov 12
@@ -679,11 +680,11 @@
# Assume the pattern instituted in 2012 will continue indefinitely.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule WS 2010 only - Sep lastSun 0:00 1 D
-Rule WS 2011 only - Apr Sat>=1 4:00 0 S
-Rule WS 2011 only - Sep lastSat 3:00 1 D
-Rule WS 2012 max - Apr Sun>=1 4:00 0 S
-Rule WS 2012 max - Sep lastSun 3:00 1 D
+Rule WS 2010 only - Sep lastSun 0:00 1 -
+Rule WS 2011 only - Apr Sat>=1 4:00 0 -
+Rule WS 2011 only - Sep lastSat 3:00 1 -
+Rule WS 2012 max - Apr Sun>=1 4:00 0 -
+Rule WS 2012 max - Sep lastSun 3:00 1 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
-11:26:56 - LMT 1911
@@ -723,11 +724,11 @@
# Tonga
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Tonga 1999 only - Oct 7 2:00s 1:00 S
+Rule Tonga 1999 only - Oct 7 2:00s 1:00 -
Rule Tonga 2000 only - Mar 19 2:00s 0 -
-Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S
+Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2001 2002 - Jan lastSun 2:00 0 -
-Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 S
+Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Tongatapu 12:19:20 - LMT 1901
@@ -804,12 +805,12 @@
# Vanuatu
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Vanuatu 1983 only - Sep 25 0:00 1:00 S
+Rule Vanuatu 1983 only - Sep 25 0:00 1:00 -
Rule Vanuatu 1984 1991 - Mar Sun>=23 0:00 0 -
-Rule Vanuatu 1984 only - Oct 23 0:00 1:00 S
-Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 S
+Rule Vanuatu 1984 only - Oct 23 0:00 1:00 -
+Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 -
Rule Vanuatu 1992 1993 - Jan Sun>=23 0:00 0 -
-Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 S
+Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
11:00 Vanuatu +11/+12
@@ -1107,7 +1108,23 @@
# (1999-09-27) writes that Giles Meteorological Station uses
# South Australian time even though it's located in Western Australia.
+# From Paul Eggert (2018-04-01):
+# The Guardian Express of Perth, Australia reported today that the
+# government decided to advance the clocks permanently on January 1,
+# 2019, from UT +08 to UT +09. The article noted that an exemption
+# would be made for people aged 61 and over, who "can apply in writing
+# to have the extra hour of sunshine removed from their area." See:
+# Daylight saving coming to WA in 2019. Guardian Express. 2018-04-01.
+# https://www.communitynews.com.au/guardian-express/news/exclusive-daylight-savings-coming-wa-summer-2018/
+
# Queensland
+
+# From Paul Eggert (2018-02-26):
+# I lack access to the following source for Queensland DST:
+# Pearce C. History of daylight saving time in Queensland.
+# Queensland Hist J. 2017 Aug;23(6):389-403
+# https://search.informit.com.au/documentSummary;dn=994682348436426;res=IELHSS
+
# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
# # The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
# # [ Dec 1990 ]
@@ -1534,6 +1551,12 @@
# "declared it the same day [throughout] the country as of Jan. 1, 1995"
# as part of the competition to be first into the 21st century.
+# From Kerry Shetline (2018-02-03):
+# December 31 was the day that was skipped, so that the transition
+# would be from Friday December 30, 1994 to Sunday January 1, 1995.
+# From Paul Eggert (2018-02-04):
+# One source for this is page 202 of: Bartky IR. One Time Fits All:
+# The Campaigns for Global Uniformity (2007).
# Kwajalein
@@ -1626,7 +1649,7 @@
# From Howie Phelps (1999-11-10), who talked to a Pitcairner via shortwave:
# Betty Christian told me yesterday that their local time is the same as
-# Pacific Standard Time. They used to be 1/2 hour different from us here in
+# Pacific Standard Time. They used to be ½ hour different from us here in
# Sacramento but it was changed a couple of years ago.
@@ -1665,7 +1688,7 @@
# 12 hours and 20 minutes ahead of GMT. When New Zealand adjusted its
# standard time in 1940s, Tonga had the choice of subtracting from its
# local time to come on the same standard time as New Zealand or of
-# advancing its time to maintain the differential of 13 degrees
+# advancing its time to maintain the differential of 13°
# (approximately 50 minutes ahead of New Zealand time).
#
# Because His Majesty King Tāufaʻāhau Tupou IV, then Crown Prince
diff --git a/jdk/make/data/tzdata/europe b/jdk/make/data/tzdata/europe
index 1565814..99109ec 100644
--- a/jdk/make/data/tzdata/europe
+++ b/jdk/make/data/tzdata/europe
@@ -140,8 +140,8 @@
# along the towpath within a few yards of it.'
#
# I have a one inch to one mile map of London and my estimate of the stone's
-# position is 51 degrees 28' 30" N, 0 degrees 18' 45" W. The longitude should
-# be within about +-2". The Ordnance Survey grid reference is TQ172761.
+# position is 51° 28' 30" N, 0° 18' 45" W. The longitude should
+# be within about ±2". The Ordnance Survey grid reference is TQ172761.
#
# [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
@@ -181,7 +181,7 @@
# after-hours daylight in which to pursue his research.
# In 1895 he presented a paper to the Wellington Philosophical Society
# that proposed a two-hour daylight-saving shift. See:
-# Hudson GV. On seasonal time-adjustment in countries south of lat. 30 deg.
+# Hudson GV. On seasonal time-adjustment in countries south of lat. 30°.
# Transactions and Proceedings of the New Zealand Institute. 1895;28:734
# http://rsnz.natlib.govt.nz/volume/rsnz_28/rsnz_28_00_006110.html
# Although some interest was expressed in New Zealand, his proposal
@@ -531,19 +531,33 @@
Link Europe/London Europe/Guernsey
Link Europe/London Europe/Isle_of_Man
-# From Paul Eggert (2018-01-19):
+# From Paul Eggert (2018-02-15):
+# In January 2018 we discovered that the negative SAVE values in the
+# Eire rules cause problems with tests for ICU:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# and with tests for OpenJDK:
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+#
+# To work around this problem, the build procedure can translate the
+# following data into two forms, one with negative SAVE values and the
+# other form with a traditional approximation for Irish time stamps
+# after 1971-10-31 02:00 UTC; although this approximation has tm_isdst
+# flags that are reversed, its UTC offsets are correct and this often
+# suffices. This source file currently uses only nonnegative SAVE
+# values, but this is intended to change and downstream code should
+# not rely on it.
+#
# The following is like GB-Eire and EU, except with standard time in
-# summer and negative daylight saving time in winter.
-# Although currently commented out, this will need to become uncommented
-# once the ICU/OpenJDK workaround is removed; see below.
+# summer and negative daylight saving time in winter. It is for when
+# negative SAVE values are used.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-#Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT
-#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST
-#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 GMT
-#Rule Eire 1981 max - Mar lastSun 1:00u 0 IST
-#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 GMT
-#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 GMT
-#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 GMT
+#Rule Eire 1971 only - Oct 31 2:00u -1:00 -
+#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 -
+#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 -
+#Rule Eire 1981 max - Mar lastSun 1:00u 0 -
+#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 -
+#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 -
+#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2
@@ -556,24 +570,12 @@
0:00 1:00 IST 1947 Nov 2 2:00s
0:00 - GMT 1948 Apr 18 2:00s
0:00 GB-Eire GMT/IST 1968 Oct 27
-# From Paul Eggert (2018-01-18):
-# The next line should look like this:
+# The next line is for when negative SAVE values are used.
# 1:00 Eire IST/GMT
-# However, in January 2018 we discovered that the Eire rules cause
-# problems with tests for ICU:
-# https://mm.icann.org/pipermail/tz/2018-January/025825.html
-# and with tests for OpenJDK:
-# https://mm.icann.org/pipermail/tz/2018-January/025822.html
-# To work around this problem, use a traditional approximation for
-# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK
-# developers breathing room to fix bugs. This approximation has
-# correct UTC offsets, but results in tm_isdst flags are the reverse
-# of what they should be. This workaround is temporary and should be
-# removed reasonably soon.
+# These three lines are for when SAVE values are always nonnegative.
1:00 - IST 1971 Oct 31 2:00u
0:00 GB-Eire GMT/IST 1996
0:00 EU GMT/IST
-# End of workaround for ICU and OpenJDK bugs.
###############################################################################
@@ -991,18 +993,30 @@
# Please see the 'asia' file for Asia/Nicosia.
# Czech Republic / Czechia
+#
+# From Paul Eggert (2018-04-15):
+# The source for Czech data is: Kdy začíná a končí letní čas. 2018-04-15.
+# https://kalendar.beda.cz/kdy-zacina-a-konci-letni-cas
+# We know of no English-language name for historical Czech winter time;
+# abbreviate it as "GMT", as it happened to be GMT.
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Czech 1945 only - Apr 8 2:00s 1:00 S
-Rule Czech 1945 only - Nov 18 2:00s 0 -
+Rule Czech 1945 only - Apr Mon>=1 2:00s 1:00 S
+Rule Czech 1945 only - Oct 1 2:00s 0 -
Rule Czech 1946 only - May 6 2:00s 1:00 S
Rule Czech 1946 1949 - Oct Sun>=1 2:00s 0 -
-Rule Czech 1947 only - Apr 20 2:00s 1:00 S
-Rule Czech 1948 only - Apr 18 2:00s 1:00 S
+Rule Czech 1947 1948 - Apr Sun>=15 2:00s 1:00 S
Rule Czech 1949 only - Apr 9 2:00s 1:00 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Prague 0:57:44 - LMT 1850
0:57:44 - PMT 1891 Oct # Prague Mean Time
- 1:00 C-Eur CE%sT 1944 Sep 17 2:00s
+ 1:00 C-Eur CE%sT 1945 May 9
+ 1:00 Czech CE%sT 1946 Dec 1 3:00
+# Vanguard section, for zic and other parsers that support negative DST.
+# 1:00 -1:00 GMT 1947 Feb 23 2:00
+# Rearguard section, for parsers that do not support negative DST.
+ 0:00 - GMT 1947 Feb 23 2:00
+# End of rearguard section.
1:00 Czech CE%sT 1979
1:00 EU CE%sT
# Use Europe/Prague also for Slovakia.
@@ -1557,21 +1571,21 @@
# http://www.almanak.hi.is/klukkan.html
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iceland 1917 1919 - Feb 19 23:00 1:00 S
+Rule Iceland 1917 1919 - Feb 19 23:00 1:00 -
Rule Iceland 1917 only - Oct 21 1:00 0 -
Rule Iceland 1918 1919 - Nov 16 1:00 0 -
-Rule Iceland 1921 only - Mar 19 23:00 1:00 S
+Rule Iceland 1921 only - Mar 19 23:00 1:00 -
Rule Iceland 1921 only - Jun 23 1:00 0 -
-Rule Iceland 1939 only - Apr 29 23:00 1:00 S
+Rule Iceland 1939 only - Apr 29 23:00 1:00 -
Rule Iceland 1939 only - Oct 29 2:00 0 -
-Rule Iceland 1940 only - Feb 25 2:00 1:00 S
+Rule Iceland 1940 only - Feb 25 2:00 1:00 -
Rule Iceland 1940 1941 - Nov Sun>=2 1:00s 0 -
-Rule Iceland 1941 1942 - Mar Sun>=2 1:00s 1:00 S
+Rule Iceland 1941 1942 - Mar Sun>=2 1:00s 1:00 -
# 1943-1946 - first Sunday in March until first Sunday in winter
-Rule Iceland 1943 1946 - Mar Sun>=1 1:00s 1:00 S
+Rule Iceland 1943 1946 - Mar Sun>=1 1:00s 1:00 -
Rule Iceland 1942 1948 - Oct Sun>=22 1:00s 0 -
# 1947-1967 - first Sunday in April until first Sunday in winter
-Rule Iceland 1947 1967 - Apr Sun>=1 1:00s 1:00 S
+Rule Iceland 1947 1967 - Apr Sun>=1 1:00s 1:00 -
# 1949 and 1967 Oct transitions delayed by 1 week
Rule Iceland 1949 only - Oct 30 1:00s 0 -
Rule Iceland 1950 1966 - Oct Sun>=22 1:00s 0 -
@@ -2037,7 +2051,7 @@
Rule Neth 1945 only - Apr 2 2:00s 1:00 S
Rule Neth 1945 only - Sep 16 2:00s 0 -
#
-# Amsterdam Mean Time was +00:19:32.13 exactly, but the .13 is omitted
+# Amsterdam Mean Time was +00:19:32.13, but the .13 is omitted
# below because the current format requires GMTOFF to be an integer.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Amsterdam 0:19:32 - LMT 1835
@@ -2161,15 +2175,19 @@
1:00 EU CE%sT
# Portugal
-#
+
# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
# According to a Portuguese decree (1911-05-26)
# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
-# Round the old offset to -0:36:45. This agrees with Willett but disagrees
-# with Shanks, who says the transition occurred on 1911-05-24 at 00:00 for
-# Europe/Lisbon, Atlantic/Azores, and Atlantic/Madeira.
+# Round the old offset to -0:36:45. This agrees with Willett....
#
+# From Michael Deckers (2018-02-15):
+# article 5 [of the 1911 decree; Deckers's translation] ...:
+# These dispositions shall enter into force at the instant at which,
+# according to the 2nd article, the civil day January 1, 1912 begins,
+# all clocks therefore having to be advanced or set back correspondingly ...
+
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
@@ -2252,7 +2270,7 @@
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Lisbon -0:36:45 - LMT 1884
- -0:36:45 - LMT 1912 Jan 1 # Lisbon Mean Time
+ -0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
0:00 Port WE%sT 1966 Apr 3 2:00
1:00 - CET 1976 Sep 26 1:00
0:00 Port WE%sT 1983 Sep 25 1:00s
@@ -2261,7 +2279,7 @@
0:00 EU WE%sT
# This Zone can be simplified once we assume zic %z.
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
- -1:54:32 - HMT 1912 Jan 1 # Horta Mean Time
+ -1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
-2:00 Port -02/-01 1942 Apr 25 22:00s
-2:00 Port +00 1942 Aug 15 22:00s
-2:00 Port -02/-01 1943 Apr 17 22:00s
@@ -2277,7 +2295,7 @@
-1:00 EU -01/+00
# This Zone can be simplified once we assume zic %z.
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
- -1:07:36 - FMT 1912 Jan 1 # Funchal Mean Time
+ -1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
-1:00 Port -01/+00 1942 Apr 25 22:00s
-1:00 Port +01 1942 Aug 15 22:00s
-1:00 Port -01/+00 1943 Apr 17 22:00s
@@ -2615,13 +2633,13 @@
# From Vladimir Karpinsky (2014-07-08):
# LMT in Moscow (before Jul 3, 1916) is 2:30:17, that was defined by Moscow
-# Observatory (coordinates: 55 deg. 45'29.70", 37 deg. 34'05.30")....
+# Observatory (coordinates: 55° 45' 29.70", 37° 34' 05.30")....
# LMT in Moscow since Jul 3, 1916 is 2:31:01 as a result of new standard.
# (The info is from the book by Byalokoz ... p. 18.)
# The time in St. Petersburg as capital of Russia was defined by
# Pulkov observatory, near St. Petersburg. In 1916 LMT Moscow
# was synchronized with LMT St. Petersburg (+30 minutes), (Pulkov observatory
-# coordinates: 59 deg. 46'18.70", 30 deg. 19'40.70") so 30 deg. 19'40.70" >
+# coordinates: 59° 46' 18.70", 30° 19' 40.70") so 30° 19' 40.70" >
# 2h01m18.7s = 2:01:19. LMT Moscow = LMT St.Petersburg + 30m 2:01:19 + 0:30 =
# 2:31:19 ...
#
@@ -3450,7 +3468,7 @@
# three degrees, or twelve minutes of time, to the west of the
# meridian of the Observatory of Stockholm". The law is dated 1878-05-31.
#
-# The observatory at that time had the meridian 18 degrees 03' 30"
+# The observatory at that time had the meridian 18° 03' 30"
# eastern longitude = 01:12:14 in time. Less 12 minutes gives the
# national standard time as 01:00:14 ahead of GMT....
#
@@ -3554,7 +3572,7 @@
# From Alois Treindl (2013-09-11):
# The Federal regulations say
# https://www.admin.ch/opc/de/classified-compilation/20071096/index.html
-# ... the meridian for Bern mean time ... is 7 degrees 26' 22.50".
+# ... the meridian for Bern mean time ... is 7° 26' 22.50".
# Expressed in time, it is 0h29m45.5s.
# From Pierre-Yves Berger (2013-09-11):
diff --git a/jdk/make/data/tzdata/northamerica b/jdk/make/data/tzdata/northamerica
index 2aa184b..bcfb662 100644
--- a/jdk/make/data/tzdata/northamerica
+++ b/jdk/make/data/tzdata/northamerica
@@ -48,7 +48,7 @@
# in New York City (1869-10). His 1870 proposal was based on Washington, DC,
# but in 1872-05 he moved the proposed origin to Greenwich.
-# From Paul Eggert (2016-09-21):
+# From Paul Eggert (2018-03-20):
# Dowd's proposal left many details unresolved, such as where to draw
# lines between time zones. The key individual who made time zones
# work in the US was William Frederick Allen - railway engineer,
@@ -59,10 +59,9 @@
# to the General Time Convention on 1883-04-11, saying that his plan
# meant "local time would be practically abolished" - a plus for
# railway scheduling. By the next convention on 1883-10-11 nearly all
-# railroads had agreed and it took effect on 1883-11-18 at 12:00.
-# That Sunday was called the "day of two noons", as the eastern parts
-# of the new zones observed noon twice. Allen witnessed the
-# transition in New York City, writing:
+# railroads had agreed and it took effect on 1883-11-18. That Sunday
+# was called the "day of two noons", as some locations observed noon
+# twice. Allen witnessed the transition in New York City, writing:
#
# I heard the bells of St. Paul's strike on the old time. Four
# minutes later, obedient to the electrical signal from the Naval
@@ -447,8 +446,7 @@
# ...according to the Census Bureau, the largest city is Beulah (although
# it's commonly referred to as Beulah-Hazen, with Hazen being the next
# largest city in Mercer County). Google Maps places Beulah's city hall
-# at 47 degrees 15' 51" N, 101 degrees 46' 40" W, which yields an offset
-# of 6h47'07".
+# at 47° 15' 51" N, 101° 46' 40" W, which yields an offset of 6h47'07".
Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53
-7:00 US M%sT 2010 Nov 7 2:00
@@ -481,7 +479,7 @@
# California, northern Idaho (Benewah, Bonner, Boundary, Clearwater,
# Kootenai, Latah, Lewis, Nez Perce, and Shoshone counties, Idaho county
# north of the Salmon River, and the towns of Burgdorf and Warren),
-# Nevada (except West Wendover), Oregon (except the northern 3/4 of
+# Nevada (except West Wendover), Oregon (except the northern ¾ of
# Malheur county), and Washington
# From Paul Eggert (2016-08-20):
@@ -979,6 +977,13 @@
-5:00 - EST 2006
-5:00 US E%sT
+# From Paul Eggert (2018-03-20):
+# The Louisville & Nashville Railroad's 1883-11-18 change occurred at
+# 10:00 old local time; train were supposed to come to a standstill
+# for precisely 18 minutes. See Bartky Fig. 1 (page 50). It is not
+# clear how this matched civil time in Louisville, so for now continue
+# to assume Louisville switched at noon new local time, like New York.
+#
# Part of Kentucky left its clocks alone in 1974.
# This also includes Clark, Floyd, and Harrison counties in Indiana.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
@@ -3287,8 +3292,8 @@
# http://www.jamaicaobserver.com/columns/The-politician-in-all-of-us_17573647
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Jamaica -5:07:11 - LMT 1890 # Kingston
- -5:07:11 - KMT 1912 Feb # Kingston Mean Time
+Zone America/Jamaica -5:07:10 - LMT 1890 # Kingston
+ -5:07:10 - KMT 1912 Feb # Kingston Mean Time
-5:00 - EST 1974
-5:00 US E%sT 1984
-5:00 - EST
@@ -3438,7 +3443,7 @@
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Grand_Turk -4:44:32 - LMT 1890
- -5:07:11 - KMT 1912 Feb # Kingston Mean Time
+ -5:07:10 - KMT 1912 Feb # Kingston Mean Time
-5:00 - EST 1979
-5:00 US E%sT 2015 Nov Sun>=1 2:00
-4:00 - AST 2018 Mar 11 3:00
diff --git a/jdk/make/data/tzdata/southamerica b/jdk/make/data/tzdata/southamerica
index 38dd275..65d3c9f 100644
--- a/jdk/make/data/tzdata/southamerica
+++ b/jdk/make/data/tzdata/southamerica
@@ -70,28 +70,28 @@
# AR was chosen because they are the ISO letters that represent Argentina.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Arg 1930 only - Dec 1 0:00 1:00 S
+Rule Arg 1930 only - Dec 1 0:00 1:00 -
Rule Arg 1931 only - Apr 1 0:00 0 -
-Rule Arg 1931 only - Oct 15 0:00 1:00 S
+Rule Arg 1931 only - Oct 15 0:00 1:00 -
Rule Arg 1932 1940 - Mar 1 0:00 0 -
-Rule Arg 1932 1939 - Nov 1 0:00 1:00 S
-Rule Arg 1940 only - Jul 1 0:00 1:00 S
+Rule Arg 1932 1939 - Nov 1 0:00 1:00 -
+Rule Arg 1940 only - Jul 1 0:00 1:00 -
Rule Arg 1941 only - Jun 15 0:00 0 -
-Rule Arg 1941 only - Oct 15 0:00 1:00 S
+Rule Arg 1941 only - Oct 15 0:00 1:00 -
Rule Arg 1943 only - Aug 1 0:00 0 -
-Rule Arg 1943 only - Oct 15 0:00 1:00 S
+Rule Arg 1943 only - Oct 15 0:00 1:00 -
Rule Arg 1946 only - Mar 1 0:00 0 -
-Rule Arg 1946 only - Oct 1 0:00 1:00 S
+Rule Arg 1946 only - Oct 1 0:00 1:00 -
Rule Arg 1963 only - Oct 1 0:00 0 -
-Rule Arg 1963 only - Dec 15 0:00 1:00 S
+Rule Arg 1963 only - Dec 15 0:00 1:00 -
Rule Arg 1964 1966 - Mar 1 0:00 0 -
-Rule Arg 1964 1966 - Oct 15 0:00 1:00 S
+Rule Arg 1964 1966 - Oct 15 0:00 1:00 -
Rule Arg 1967 only - Apr 2 0:00 0 -
-Rule Arg 1967 1968 - Oct Sun>=1 0:00 1:00 S
+Rule Arg 1967 1968 - Oct Sun>=1 0:00 1:00 -
Rule Arg 1968 1969 - Apr Sun>=1 0:00 0 -
-Rule Arg 1974 only - Jan 23 0:00 1:00 S
+Rule Arg 1974 only - Jan 23 0:00 1:00 -
Rule Arg 1974 only - May 1 0:00 0 -
-Rule Arg 1988 only - Dec 1 0:00 1:00 S
+Rule Arg 1988 only - Dec 1 0:00 1:00 -
#
# From Hernan G. Otero (1995-06-26):
# These corrections were contributed by InterSoft Argentina S.A.,
@@ -99,7 +99,7 @@
# Talleres de Hidrografía Naval Argentina
# (Argentine Naval Hydrography Institute)
Rule Arg 1989 1993 - Mar Sun>=1 0:00 0 -
-Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S
+Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 -
#
# From Hernan G. Otero (1995-06-26):
# From this moment on, the law that mandated the daylight saving
@@ -110,7 +110,7 @@
# On October 3, 1999, 0:00 local, Argentina implemented daylight savings time,
# which did not result in the switch of a time zone, as they stayed 9 hours
# from the International Date Line.
-Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 S
+Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 -
# From Paul Eggert (2007-12-28):
# DST was set to expire on March 5, not March 3, but since it was converted
# to standard time on March 3 it's more convenient for us to pretend that
@@ -213,9 +213,9 @@
# la modificación del huso horario, ya que 2009 nos encuentra con
# crecimiento en la producción y distribución energética."
-Rule Arg 2007 only - Dec 30 0:00 1:00 S
+Rule Arg 2007 only - Dec 30 0:00 1:00 -
Rule Arg 2008 2009 - Mar Sun>=15 0:00 0 -
-Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S
+Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
# From Mariano Absatz (2004-05-21):
# Today it was officially published that the Province of Mendoza is changing
@@ -225,12 +225,14 @@
# It's Law No. 7,210. This change is due to a public power emergency, so for
# now we'll assume it's for this year only.
#
-# From Paul Eggert (2014-08-09):
+# From Paul Eggert (2018-01-31):
# Hora de verano para la República Argentina
# http://buenasiembra.com.ar/esoterismo/astrologia/hora-de-verano-de-la-republica-argentina-27.html
# says that standard time in Argentina from 1894-10-31
# to 1920-05-01 was -4:16:48.25. Go with this more-precise value
-# over Shanks & Pottenger.
+# over Shanks & Pottenger. It is upward compatible with Milne, who
+# says Córdoba time was -4:16:48.2.
+
#
# From Mariano Absatz (2004-06-05):
# These media articles from a major newspaper mostly cover the current state:
@@ -404,9 +406,9 @@
# rules...San Luis is still using "Western ARgentina Time" and it got
# stuck on Summer daylight savings time even though the summer is over.
-# From Paul Eggert (2013-09-05):
+# From Paul Eggert (2018-01-23):
# Perhaps San Luis operates on the legal fiction that it is at -04
-# with perpetual summer time, but ordinary usage typically seems to
+# with perpetual daylight saving time, but ordinary usage typically seems to
# just say it's at -03; see, for example,
# https://es.wikipedia.org/wiki/Hora_oficial_argentina
# We've documented similar situations as being plain changes to
@@ -415,9 +417,6 @@
# plus is that this silences a zic complaint that there's no POSIX TZ
# setting for time stamps past 2038.
-# From Paul Eggert (2013-02-21):
-# Milne says Córdoba time was -4:16:48.2. Round to the nearest second.
-
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
#
# Buenos Aires (BA), Capital Federal (CF),
@@ -552,7 +551,7 @@
# San Luis (SL)
Rule SanLuis 2008 2009 - Mar Sun>=8 0:00 0 -
-Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 S
+Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May
@@ -794,14 +793,14 @@
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
# Decree 20,466 <http://pcdsh01.on.br/HV20466.htm> (1931-10-01)
# Decree 21,896 <http://pcdsh01.on.br/HV21896.htm> (1932-01-10)
-Rule Brazil 1931 only - Oct 3 11:00 1:00 S
+Rule Brazil 1931 only - Oct 3 11:00 1:00 -
Rule Brazil 1932 1933 - Apr 1 0:00 0 -
-Rule Brazil 1932 only - Oct 3 0:00 1:00 S
+Rule Brazil 1932 only - Oct 3 0:00 1:00 -
# Decree 23,195 <http://pcdsh01.on.br/HV23195.htm> (1933-10-10)
# revoked DST.
# Decree 27,496 <http://pcdsh01.on.br/HV27496.htm> (1949-11-24)
# Decree 27,998 <http://pcdsh01.on.br/HV27998.htm> (1950-04-13)
-Rule Brazil 1949 1952 - Dec 1 0:00 1:00 S
+Rule Brazil 1949 1952 - Dec 1 0:00 1:00 -
Rule Brazil 1950 only - Apr 16 1:00 0 -
Rule Brazil 1951 1952 - Apr 1 0:00 0 -
# Decree 32,308 <http://pcdsh01.on.br/HV32308.htm> (1953-02-24)
@@ -813,51 +812,51 @@
# in SP, RJ, GB, MG, ES, due to the prolongation of the drought.
# Decree 53,071 <http://pcdsh01.on.br/HV53071.htm> (1963-12-03)
# extended the above decree to all of the national territory on 12-09.
-Rule Brazil 1963 only - Dec 9 0:00 1:00 S
+Rule Brazil 1963 only - Dec 9 0:00 1:00 -
# Decree 53,604 <http://pcdsh01.on.br/HV53604.htm> (1964-02-25)
# extended summer time by one day to 1964-03-01 00:00 (start of school).
Rule Brazil 1964 only - Mar 1 0:00 0 -
# Decree 55,639 <http://pcdsh01.on.br/HV55639.htm> (1965-01-27)
-Rule Brazil 1965 only - Jan 31 0:00 1:00 S
+Rule Brazil 1965 only - Jan 31 0:00 1:00 -
Rule Brazil 1965 only - Mar 31 0:00 0 -
# Decree 57,303 <http://pcdsh01.on.br/HV57303.htm> (1965-11-22)
-Rule Brazil 1965 only - Dec 1 0:00 1:00 S
+Rule Brazil 1965 only - Dec 1 0:00 1:00 -
# Decree 57,843 <http://pcdsh01.on.br/HV57843.htm> (1966-02-18)
Rule Brazil 1966 1968 - Mar 1 0:00 0 -
-Rule Brazil 1966 1967 - Nov 1 0:00 1:00 S
+Rule Brazil 1966 1967 - Nov 1 0:00 1:00 -
# Decree 63,429 <http://pcdsh01.on.br/HV63429.htm> (1968-10-15)
# revoked DST.
# Decree 91,698 <http://pcdsh01.on.br/HV91698.htm> (1985-09-27)
-Rule Brazil 1985 only - Nov 2 0:00 1:00 S
+Rule Brazil 1985 only - Nov 2 0:00 1:00 -
# Decree 92,310 (1986-01-21)
# Decree 92,463 (1986-03-13)
Rule Brazil 1986 only - Mar 15 0:00 0 -
# Decree 93,316 (1986-10-01)
-Rule Brazil 1986 only - Oct 25 0:00 1:00 S
+Rule Brazil 1986 only - Oct 25 0:00 1:00 -
Rule Brazil 1987 only - Feb 14 0:00 0 -
# Decree 94,922 <http://pcdsh01.on.br/HV94922.htm> (1987-09-22)
-Rule Brazil 1987 only - Oct 25 0:00 1:00 S
+Rule Brazil 1987 only - Oct 25 0:00 1:00 -
Rule Brazil 1988 only - Feb 7 0:00 0 -
# Decree 96,676 <http://pcdsh01.on.br/HV96676.htm> (1988-09-12)
# except for the states of AC, AM, PA, RR, RO, and AP (then a territory)
-Rule Brazil 1988 only - Oct 16 0:00 1:00 S
+Rule Brazil 1988 only - Oct 16 0:00 1:00 -
Rule Brazil 1989 only - Jan 29 0:00 0 -
# Decree 98,077 <http://pcdsh01.on.br/HV98077.htm> (1989-08-21)
# with the same exceptions
-Rule Brazil 1989 only - Oct 15 0:00 1:00 S
+Rule Brazil 1989 only - Oct 15 0:00 1:00 -
Rule Brazil 1990 only - Feb 11 0:00 0 -
# Decree 99,530 <http://pcdsh01.on.br/HV99530.htm> (1990-09-17)
# adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF.
# Decree 99,629 (1990-10-19) adds BA, MT.
-Rule Brazil 1990 only - Oct 21 0:00 1:00 S
+Rule Brazil 1990 only - Oct 21 0:00 1:00 -
Rule Brazil 1991 only - Feb 17 0:00 0 -
# Unnumbered decree <http://pcdsh01.on.br/HV1991.htm> (1991-09-25)
# adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF.
-Rule Brazil 1991 only - Oct 20 0:00 1:00 S
+Rule Brazil 1991 only - Oct 20 0:00 1:00 -
Rule Brazil 1992 only - Feb 9 0:00 0 -
# Unnumbered decree <http://pcdsh01.on.br/HV1992.htm> (1992-10-16)
# adopted by same states.
-Rule Brazil 1992 only - Oct 25 0:00 1:00 S
+Rule Brazil 1992 only - Oct 25 0:00 1:00 -
Rule Brazil 1993 only - Jan 31 0:00 0 -
# Decree 942 <http://pcdsh01.on.br/HV942.htm> (1993-09-28)
# adopted by same states, plus AM.
@@ -867,12 +866,12 @@
# adopted by same states, plus MT and TO.
# Decree 1,674 <http://pcdsh01.on.br/HV1674.htm> (1995-10-13)
# adds AL, SE.
-Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 S
+Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 -
Rule Brazil 1994 1995 - Feb Sun>=15 0:00 0 -
Rule Brazil 1996 only - Feb 11 0:00 0 -
# Decree 2,000 <http://pcdsh01.on.br/HV2000.htm> (1996-09-04)
# adopted by same states, minus AL, SE.
-Rule Brazil 1996 only - Oct 6 0:00 1:00 S
+Rule Brazil 1996 only - Oct 6 0:00 1:00 -
Rule Brazil 1997 only - Feb 16 0:00 0 -
# From Daniel C. Sobral (1998-02-12):
# In 1997, the DS began on October 6. The stated reason was that
@@ -882,19 +881,19 @@
# to help dealing with the shortages of electric power.
#
# Decree 2,317 (1997-09-04), adopted by same states.
-Rule Brazil 1997 only - Oct 6 0:00 1:00 S
+Rule Brazil 1997 only - Oct 6 0:00 1:00 -
# Decree 2,495 <http://pcdsh01.on.br/figuras/HV2495.JPG>
# (1998-02-10)
Rule Brazil 1998 only - Mar 1 0:00 0 -
# Decree 2,780 <http://pcdsh01.on.br/figuras/Hv98.jpg> (1998-09-11)
# adopted by the same states as before.
-Rule Brazil 1998 only - Oct 11 0:00 1:00 S
+Rule Brazil 1998 only - Oct 11 0:00 1:00 -
Rule Brazil 1999 only - Feb 21 0:00 0 -
# Decree 3,150 <http://pcdsh01.on.br/figuras/HV3150.gif>
# (1999-08-23) adopted by same states.
# Decree 3,188 <http://pcdsh01.on.br/DecHV99.gif> (1999-09-30)
# adds SE, AL, PB, PE, RN, CE, PI, MA and RR.
-Rule Brazil 1999 only - Oct 3 0:00 1:00 S
+Rule Brazil 1999 only - Oct 3 0:00 1:00 -
Rule Brazil 2000 only - Feb 27 0:00 0 -
# Decree 3,592 <http://pcdsh01.on.br/DEC3592.htm> (2000-09-06)
# adopted by the same states as before.
@@ -904,34 +903,34 @@
# repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00.
# Decree 3,916 <http://pcdsh01.on.br/figuras/HV3916.gif>
# (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
-Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 -
Rule Brazil 2001 2006 - Feb Sun>=15 0:00 0 -
# Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
# 4,399 <http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm>
-Rule Brazil 2002 only - Nov 3 0:00 1:00 S
+Rule Brazil 2002 only - Nov 3 0:00 1:00 -
# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
# 4,844 <http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm>
-Rule Brazil 2003 only - Oct 19 0:00 1:00 S
+Rule Brazil 2003 only - Oct 19 0:00 1:00 -
# Decree 5,223 (2004-10-01) reestablishes DST in MT.
# 5,223 <http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm>
-Rule Brazil 2004 only - Nov 2 0:00 1:00 S
+Rule Brazil 2004 only - Nov 2 0:00 1:00 -
# Decree 5,539 <http://pcdsh01.on.br/DecHV5539.gif> (2005-09-19),
# adopted by the same states as before.
-Rule Brazil 2005 only - Oct 16 0:00 1:00 S
+Rule Brazil 2005 only - Oct 16 0:00 1:00 -
# Decree 5,920 <http://pcdsh01.on.br/DecHV5920.gif> (2006-10-03),
# adopted by the same states as before.
-Rule Brazil 2006 only - Nov 5 0:00 1:00 S
+Rule Brazil 2006 only - Nov 5 0:00 1:00 -
Rule Brazil 2007 only - Feb 25 0:00 0 -
# Decree 6,212 <http://pcdsh01.on.br/DecHV6212.gif> (2007-09-26),
# adopted by the same states as before.
-Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 -
# From Frederico A. C. Neves (2008-09-10):
# According to this decree
# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
# [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the
# 3rd Feb Sunday. There is an exception on the return date when this is
# the Carnival Sunday then the return date will be the next Sunday...
-Rule Brazil 2008 2017 - Oct Sun>=15 0:00 1:00 S
+Rule Brazil 2008 2017 - Oct Sun>=15 0:00 1:00 -
Rule Brazil 2008 2011 - Feb Sun>=15 0:00 0 -
# Decree 7,584 <http://pcdsh01.on.br/HVdecreto7584_20111013.jpg> (2011-10-13)
# added Bahia.
@@ -949,7 +948,7 @@
# ... https://www.timeanddate.com/news/time/brazil-delays-dst-2018.html
# From Steffen Thorsen (2017-12-20):
# http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2017/decreto/D9242.htm
-Rule Brazil 2018 max - Nov Sun>=1 0:00 1:00 S
+Rule Brazil 2018 max - Nov Sun>=1 0:00 1:00 -
Rule Brazil 2023 only - Feb Sun>=22 0:00 0 -
Rule Brazil 2024 2025 - Feb Sun>=15 0:00 0 -
Rule Brazil 2026 only - Feb Sun>=22 0:00 0 -
@@ -1256,28 +1255,28 @@
# For now, assume that they will not revert.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Chile 1927 1931 - Sep 1 0:00 1:00 S
+Rule Chile 1927 1931 - Sep 1 0:00 1:00 -
Rule Chile 1928 1932 - Apr 1 0:00 0 -
-Rule Chile 1968 only - Nov 3 4:00u 1:00 S
+Rule Chile 1968 only - Nov 3 4:00u 1:00 -
Rule Chile 1969 only - Mar 30 3:00u 0 -
-Rule Chile 1969 only - Nov 23 4:00u 1:00 S
+Rule Chile 1969 only - Nov 23 4:00u 1:00 -
Rule Chile 1970 only - Mar 29 3:00u 0 -
Rule Chile 1971 only - Mar 14 3:00u 0 -
-Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1972 1986 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1973 only - Sep 30 4:00u 1:00 S
-Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1973 only - Sep 30 4:00u 1:00 -
+Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1987 only - Apr 12 3:00u 0 -
Rule Chile 1988 1990 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1988 1989 - Oct Sun>=9 4:00u 1:00 S
-Rule Chile 1990 only - Sep 16 4:00u 1:00 S
+Rule Chile 1988 1989 - Oct Sun>=9 4:00u 1:00 -
+Rule Chile 1990 only - Sep 16 4:00u 1:00 -
Rule Chile 1991 1996 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1997 only - Mar 30 3:00u 0 -
Rule Chile 1998 only - Mar Sun>=9 3:00u 0 -
-Rule Chile 1998 only - Sep 27 4:00u 1:00 S
+Rule Chile 1998 only - Sep 27 4:00u 1:00 -
Rule Chile 1999 only - Apr 4 3:00u 0 -
-Rule Chile 1999 2010 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1999 2010 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
# N.B.: the end of March 29 in Chile is March 30 in Universal time,
# which is used below in specifying the transition.
@@ -1285,11 +1284,11 @@
Rule Chile 2009 only - Mar Sun>=9 3:00u 0 -
Rule Chile 2010 only - Apr Sun>=1 3:00u 0 -
Rule Chile 2011 only - May Sun>=2 3:00u 0 -
-Rule Chile 2011 only - Aug Sun>=16 4:00u 1:00 S
+Rule Chile 2011 only - Aug Sun>=16 4:00u 1:00 -
Rule Chile 2012 2014 - Apr Sun>=23 3:00u 0 -
-Rule Chile 2012 2014 - Sep Sun>=2 4:00u 1:00 S
+Rule Chile 2012 2014 - Sep Sun>=2 4:00u 1:00 -
Rule Chile 2016 max - May Sun>=9 3:00u 0 -
-Rule Chile 2016 max - Aug Sun>=9 4:00u 1:00 S
+Rule Chile 2016 max - Aug Sun>=9 4:00u 1:00 -
# IATA SSIM anomalies: (1992-02) says 1992-03-14;
# (1996-09) says 1998-03-08. Ignore these.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1354,7 +1353,7 @@
# "A variation of fifteen minutes in the public clocks of Bogota is not rare."
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule CO 1992 only - May 3 0:00 1:00 S
+Rule CO 1992 only - May 3 0:00 1:00 -
Rule CO 1993 only - Apr 4 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
@@ -1414,7 +1413,7 @@
# repeated. For now, assume transitions were at 00:00 local time country-wide.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Ecuador 1992 only - Nov 28 0:00 1:00 S
+Rule Ecuador 1992 only - Nov 28 0:00 1:00 -
Rule Ecuador 1993 only - Feb 5 0:00 0 -
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1504,22 +1503,22 @@
# the maintainers of the database to inform them we're adopting
# the same policy this year and suggest recommendations for future years.
#
-# For now we will assume permanent summer time for the Falklands
+# For now we will assume permanent -03 for the Falklands
# until advised differently (to apply for 2012 and beyond, after the 2011
# experiment was apparently successful.)
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Falk 1937 1938 - Sep lastSun 0:00 1:00 S
+Rule Falk 1937 1938 - Sep lastSun 0:00 1:00 -
Rule Falk 1938 1942 - Mar Sun>=19 0:00 0 -
-Rule Falk 1939 only - Oct 1 0:00 1:00 S
-Rule Falk 1940 1942 - Sep lastSun 0:00 1:00 S
+Rule Falk 1939 only - Oct 1 0:00 1:00 -
+Rule Falk 1940 1942 - Sep lastSun 0:00 1:00 -
Rule Falk 1943 only - Jan 1 0:00 0 -
-Rule Falk 1983 only - Sep lastSun 0:00 1:00 S
+Rule Falk 1983 only - Sep lastSun 0:00 1:00 -
Rule Falk 1984 1985 - Apr lastSun 0:00 0 -
-Rule Falk 1984 only - Sep 16 0:00 1:00 S
-Rule Falk 1985 2000 - Sep Sun>=9 0:00 1:00 S
+Rule Falk 1984 only - Sep 16 0:00 1:00 -
+Rule Falk 1985 2000 - Sep Sun>=9 0:00 1:00 -
Rule Falk 1986 2000 - Apr Sun>=16 0:00 0 -
Rule Falk 2001 2010 - Apr Sun>=15 2:00 0 -
-Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 S
+Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Atlantic/Stanley -3:51:24 - LMT 1890
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
@@ -1554,16 +1553,16 @@
# adjust their clocks at 0 hour of the given dates.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Para 1975 1988 - Oct 1 0:00 1:00 S
+Rule Para 1975 1988 - Oct 1 0:00 1:00 -
Rule Para 1975 1978 - Mar 1 0:00 0 -
Rule Para 1979 1991 - Apr 1 0:00 0 -
-Rule Para 1989 only - Oct 22 0:00 1:00 S
-Rule Para 1990 only - Oct 1 0:00 1:00 S
-Rule Para 1991 only - Oct 6 0:00 1:00 S
+Rule Para 1989 only - Oct 22 0:00 1:00 -
+Rule Para 1990 only - Oct 1 0:00 1:00 -
+Rule Para 1991 only - Oct 6 0:00 1:00 -
Rule Para 1992 only - Mar 1 0:00 0 -
-Rule Para 1992 only - Oct 5 0:00 1:00 S
+Rule Para 1992 only - Oct 5 0:00 1:00 -
Rule Para 1993 only - Mar 31 0:00 0 -
-Rule Para 1993 1995 - Oct 1 0:00 1:00 S
+Rule Para 1993 1995 - Oct 1 0:00 1:00 -
Rule Para 1994 1995 - Feb lastSun 0:00 0 -
Rule Para 1996 only - Mar 1 0:00 0 -
# IATA SSIM (2000-02) says 1999-10-10; ignore this for now.
@@ -1581,7 +1580,7 @@
# year, the time will change on the first Sunday of October; likewise, the
# clock will be set back on the first Sunday of March.
#
-Rule Para 1996 2001 - Oct Sun>=1 0:00 1:00 S
+Rule Para 1996 2001 - Oct Sun>=1 0:00 1:00 -
# IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
Rule Para 1997 only - Feb lastSun 0:00 0 -
# Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
@@ -1592,7 +1591,7 @@
# dst method to be from the first Sunday in September to the first Sunday in
# April.
Rule Para 2002 2004 - Apr Sun>=1 0:00 0 -
-Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 S
+Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 -
#
# From Jesper Nørgaard Welen (2005-01-02):
# There are several sources that claim that Paraguay made
@@ -1601,7 +1600,7 @@
# Decree 1,867 (2004-03-05)
# From Carlos Raúl Perasso via Jesper Nørgaard Welen (2006-10-13)
# http://www.presidencia.gov.py/decretos/D1867.pdf
-Rule Para 2004 2009 - Oct Sun>=15 0:00 1:00 S
+Rule Para 2004 2009 - Oct Sun>=15 0:00 1:00 -
Rule Para 2005 2009 - Mar Sun>=8 0:00 0 -
# From Carlos Raúl Perasso (2010-02-18):
# By decree number 3958 issued yesterday
@@ -1614,7 +1613,7 @@
# and that on the first Sunday of the month of October, it is to be set
# forward 60 minutes, in all the territory of the Paraguayan Republic.
# ...
-Rule Para 2010 max - Oct Sun>=1 0:00 1:00 S
+Rule Para 2010 max - Oct Sun>=1 0:00 1:00 -
Rule Para 2010 2012 - Apr Sun>=8 0:00 0 -
#
# From Steffen Thorsen (2013-03-07):
@@ -1647,16 +1646,16 @@
# Shanks & Pottenger don't have this transition. Assume 1986 was like 1987.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Peru 1938 only - Jan 1 0:00 1:00 S
+Rule Peru 1938 only - Jan 1 0:00 1:00 -
Rule Peru 1938 only - Apr 1 0:00 0 -
-Rule Peru 1938 1939 - Sep lastSun 0:00 1:00 S
+Rule Peru 1938 1939 - Sep lastSun 0:00 1:00 -
Rule Peru 1939 1940 - Mar Sun>=24 0:00 0 -
-Rule Peru 1986 1987 - Jan 1 0:00 1:00 S
+Rule Peru 1986 1987 - Jan 1 0:00 1:00 -
Rule Peru 1986 1987 - Apr 1 0:00 0 -
-Rule Peru 1990 only - Jan 1 0:00 1:00 S
+Rule Peru 1990 only - Jan 1 0:00 1:00 -
Rule Peru 1990 only - Apr 1 0:00 0 -
# IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
-Rule Peru 1994 only - Jan 1 0:00 1:00 S
+Rule Peru 1994 only - Jan 1 0:00 1:00 -
Rule Peru 1994 only - Apr 1 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Lima -5:08:12 - LMT 1890
@@ -1702,72 +1701,201 @@
# Uruguay
# From Paul Eggert (1993-11-18):
# Uruguay wins the prize for the strangest peacetime manipulation of the rules.
-# From Shanks & Pottenger:
+#
+# From Tim Parenti (2018-02-20), per Jeremie Bonjour (2018-01-31) and Michael
+# Deckers (2018-02-20):
+# ... At least they kept good records...
+#
+# http://www.armada.mil.uy/ContenidosPDFs/sohma/web/almanaque/almanaque_2018.pdf#page=36
+# Page 36 of Almanaque 2018, published by the Oceanography, Hydrography, and
+# Meteorology Service of the Uruguayan Navy, seems to give many transitions
+# with greater clarity than we've had before. It directly references many laws
+# and decrees which are, in turn, referenced below. They can be viewed in the
+# public archives of the Diario Oficial (in Spanish) at
+# http://www.impo.com.uy/diariooficial/
+#
+# Ley No. 3920 of 1908-06-10 placed the determination of legal time under the
+# auspices of the National Institute for the Prediction of Time. It is unclear
+# exactly what offset was used during this period, though Ley No. 7200 of
+# 1920-04-23 used the Observatory of the National Meteorological Institute in
+# Montevideo (34° 54' 33" S, 56° 12' 45" W) as its reference meridian,
+# retarding legal time by 15 minutes 9 seconds from 1920-04-30 24:00,
+# resulting in UT-04. Assume the corresponding LMT of UT-03:44:51 (given on
+# page 725 of the Proceedings of the Second Pan-American Scientific Congress,
+# 1915-1916) was in use, and merely became official from 1908-06-10.
+# https://www.impo.com.uy/diariooficial/1908/06/18/12
+# https://www.impo.com.uy/diariooficial/1920/04/27/9
+#
+# Ley No. 7594 of 1923-06-28 specified legal time as Observatory time advanced
+# by 44 minutes 51 seconds (UT-03) "from 30 September to 31 March", and by 14
+# minutes 51 seconds (UT-03:30) "the rest of the year"; a message from the
+# National Council of Administration the same day, published directly below the
+# law in the Diario Oficial, specified the first transition to be 1923-09-30
+# 24:00. This effectively established standard time at UT-03:30 with 30
+# minutes DST. Assume transitions at 24:00 on the specified days until Ley No.
+# 7919 of 1926-03-05 ended this arrangement, repealing all "laws and other
+# provisions which oppose" it, resulting in year-round UT-03:30; a Resolución
+# of 1926-03-11 puts the final transition at 1926-03-31 24:00, the same as it
+# would have been under the previous law.
+# https://www.impo.com.uy/diariooficial/1923/07/02/2
+# https://www.impo.com.uy/diariooficial/1926/03/10/2
+# https://www.impo.com.uy/diariooficial/1926/03/18/2
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
-Rule Uruguay 1923 only - Oct 2 0:00 0:30 HS
+Rule Uruguay 1923 1925 - Oct 1 0:00 0:30 -
Rule Uruguay 1924 1926 - Apr 1 0:00 0 -
-Rule Uruguay 1924 1925 - Oct 1 0:00 0:30 HS
-Rule Uruguay 1933 1935 - Oct lastSun 0:00 0:30 HS
-# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
-Rule Uruguay 1934 1936 - Mar Sat>=25 23:30s 0 -
-Rule Uruguay 1936 only - Nov 1 0:00 0:30 HS
-Rule Uruguay 1937 1941 - Mar lastSun 0:00 0 -
-# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
-Rule Uruguay 1937 1940 - Oct lastSun 0:00 0:30 HS
-# Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
-# and 1943 Apr 13 "to present time"; go with Shanks & Pottenger.
-Rule Uruguay 1941 only - Aug 1 0:00 0:30 HS
-Rule Uruguay 1942 only - Jan 1 0:00 0 -
-Rule Uruguay 1942 only - Dec 14 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# http://www.impo.com.uy/diariooficial/1933/10/27/6
+#
+# It appears Ley No. 9122 of 1933 was never published as such in the Diario
+# Oficial, but instead appeared as Document 26 in the Diario on Friday
+# 1933-10-27 as a decree made Monday 1933-10-23 and filed under the Ministry of
+# National Defense. It reinstituted a DST of 30 minutes (to UT-03) "from the
+# last Sunday of October...until the last Saturday of March." In accordance
+# with this provision, the first transition was explicitly specified in Article
+# 2 of the decree as Saturday 1933-10-28 at 24:00; that is, Sunday 1933-10-29
+# at 00:00. Assume transitions at 00:00 Sunday throughout.
+#
+# Departing from the matter-of-fact nature of previous timekeeping laws, the
+# 1933 decree "consider[s] the advantages of...the advance of legal time":
+#
+# "Whereas: The measure adopted by almost all nations at the time of the last
+# World War still persists in North America and Europe, precisely because of
+# the economic, hygienic, and social advantages derived from such an
+# emergency measure...
+#
+# Whereas: The advance of the legal time during the summer seasons, by
+# displacing social activity near sunrise, favors the citizen populations
+# and especially the society that creates and works..."
+#
+# It further specified that "necessary measures" be taken to ensure that
+# "public spectacles finish, in general, before [01:00]."
+Rule Uruguay 1933 1938 - Oct lastSun 0:00 0:30 -
+Rule Uruguay 1934 1941 - Mar lastSat 24:00 0 -
+# From Tim Parenti (2018-02-15):
+# Most of the Rules below, and their contemporaneous Zone lines, have been
+# updated simply to match the Almanaque 2018. Although the document does not
+# list exact transition times, midnight transitions were already present in our
+# data here for all transitions through 2004-09, and this is both consistent
+# with prior transitions and verified in several decrees marked below between
+# 1939-09 and 2004-09, wherein the relevant text was typically of the form:
+#
+# "From 0 hours on [date], the legal time of the entire Republic will be...
+#
+# In accordance with [the preceding], on [previous date] at 24 hours, all
+# clocks throughout the Republic will be [advanced/retarded] by..."
+#
+# It is possible that there is greater specificity to be found for the Rules
+# below, but it is buried in no fewer than 40 different decrees individually
+# referenced by the Almanaque for the period from 1939-09 to 2014-09.
+# Four-fifths of these were promulgated less than two weeks before taking
+# effect; more than half within a week and none more than 5 weeks. Only the
+# handful with comments below have been checked with any thoroughness.
+Rule Uruguay 1939 only - Oct 1 0:00 0:30 -
+Rule Uruguay 1940 only - Oct 27 0:00 0:30 -
+# From Tim Parenti (2018-02-15):
+# Decreto 1145 of the Ministry of National Defense, dated 1941-07-26, specified
+# UT-03 from Friday 1941-08-01 00:00, citing an "urgent...need to save fuel".
+# http://www.impo.com.uy/diariooficial/1941/08/04/1
+Rule Uruguay 1941 only - Aug 1 0:00 0:30 -
+# From Tim Parenti (2018-02-15):
+# Decreto 1866 of the Ministry of National Defense, dated 1942-12-09, specified
+# further advancement (to UT-02:30) from Sunday 1942-12-13 24:00. Since clocks
+# never went back to UT-03:30 thereafter, this is modeled as advancing standard
+# time by 30 minutes to UT-03, while retaining 30 minutes of DST.
+# http://www.impo.com.uy/diariooficial/1942/12/16/3
+Rule Uruguay 1942 only - Dec 14 0:00 0:30 -
Rule Uruguay 1943 only - Mar 14 0:00 0 -
-Rule Uruguay 1959 only - May 24 0:00 1:00 S
+Rule Uruguay 1959 only - May 24 0:00 0:30 -
Rule Uruguay 1959 only - Nov 15 0:00 0 -
-Rule Uruguay 1960 only - Jan 17 0:00 1:00 S
+Rule Uruguay 1960 only - Jan 17 0:00 1:00 -
Rule Uruguay 1960 only - Mar 6 0:00 0 -
-Rule Uruguay 1965 1967 - Apr Sun>=1 0:00 1:00 S
+Rule Uruguay 1965 only - Apr 4 0:00 1:00 -
Rule Uruguay 1965 only - Sep 26 0:00 0 -
-Rule Uruguay 1966 1967 - Oct 31 0:00 0 -
-Rule Uruguay 1968 1970 - May 27 0:00 0:30 HS
-Rule Uruguay 1968 1970 - Dec 2 0:00 0 -
-Rule Uruguay 1972 only - Apr 24 0:00 1:00 S
-Rule Uruguay 1972 only - Aug 15 0:00 0 -
-Rule Uruguay 1974 only - Mar 10 0:00 0:30 HS
-Rule Uruguay 1974 only - Dec 22 0:00 1:00 S
-Rule Uruguay 1976 only - Oct 1 0:00 0 -
-Rule Uruguay 1977 only - Dec 4 0:00 1:00 S
-Rule Uruguay 1978 only - Apr 1 0:00 0 -
-Rule Uruguay 1979 only - Oct 1 0:00 1:00 S
-Rule Uruguay 1980 only - May 1 0:00 0 -
-Rule Uruguay 1987 only - Dec 14 0:00 1:00 S
-Rule Uruguay 1988 only - Mar 14 0:00 0 -
-Rule Uruguay 1988 only - Dec 11 0:00 1:00 S
-Rule Uruguay 1989 only - Mar 12 0:00 0 -
-Rule Uruguay 1989 only - Oct 29 0:00 1:00 S
-# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
-# and that 1992/3's DST was from 10-25 to 03-01. Go with IATA.
-Rule Uruguay 1990 1992 - Mar Sun>=1 0:00 0 -
-Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 S
-Rule Uruguay 1992 only - Oct 18 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# Decreto 321/968 of 1968-05-25, citing emergency drought measures decreed the
+# day before, brought clocks forward 30 minutes from Monday 1968-05-27 00:00.
+# http://www.impo.com.uy/diariooficial/1968/05/30/5
+Rule Uruguay 1968 only - May 27 0:00 0:30 -
+Rule Uruguay 1968 only - Dec 1 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 188/970 of 1970-04-23 instituted restrictions on electricity
+# consumption "as a consequence of the current rainfall regime in the country".
+# Articles 13 and 14 advanced clocks by an hour from Saturday 1970-04-25 00:00.
+# http://www.impo.com.uy/diariooficial/1970/04/29/4
+Rule Uruguay 1970 only - Apr 25 0:00 1:00 -
+Rule Uruguay 1970 only - Jun 14 0:00 0 -
+Rule Uruguay 1972 only - Apr 23 0:00 1:00 -
+Rule Uruguay 1972 only - Jul 16 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 29/974 of 1974-01-11, citing "the international rise in the price of
+# oil", advanced clocks by 90 minutes (to UT-01:30). Decreto 163/974 of
+# 1974-03-04 returned 60 of those minutes (to UT-02:30), and the remaining 30
+# minutes followed in Decreto 679/974 of 1974-08-29.
+# http://www.impo.com.uy/diariooficial/1974/01/22/11
+# http://www.impo.com.uy/diariooficial/1974/03/14/3
+# http://www.impo.com.uy/diariooficial/1974/09/04/6
+Rule Uruguay 1974 only - Jan 13 0:00 1:30 -
+Rule Uruguay 1974 only - Mar 10 0:00 0:30 -
+Rule Uruguay 1974 only - Sep 1 0:00 0 -
+Rule Uruguay 1974 only - Dec 22 0:00 1:00 -
+Rule Uruguay 1975 only - Mar 30 0:00 0 -
+Rule Uruguay 1976 only - Dec 19 0:00 1:00 -
+Rule Uruguay 1977 only - Mar 6 0:00 0 -
+Rule Uruguay 1977 only - Dec 4 0:00 1:00 -
+Rule Uruguay 1978 1979 - Mar Sun>=1 0:00 0 -
+Rule Uruguay 1978 only - Dec 17 0:00 1:00 -
+Rule Uruguay 1979 only - Apr 29 0:00 1:00 -
+Rule Uruguay 1980 only - Mar 16 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 725/987 of 1987-12-04 cited "better use of national tourist
+# attractions" to advance clocks one hour from Monday 1987-12-14 00:00.
+# http://www.impo.com.uy/diariooficial/1988/01/25/1
+Rule Uruguay 1987 only - Dec 14 0:00 1:00 -
+Rule Uruguay 1988 only - Feb 28 0:00 0 -
+Rule Uruguay 1988 only - Dec 11 0:00 1:00 -
+Rule Uruguay 1989 only - Mar 5 0:00 0 -
+Rule Uruguay 1989 only - Oct 29 0:00 1:00 -
+Rule Uruguay 1990 only - Feb 25 0:00 0 -
+# From Tim Parenti (2018-02-15), per Paul Eggert (1999-11-04):
+# IATA agrees as below for 1990-10 through 1993-02. Per Almanaque 2018, the
+# 1992/1993 season appears to be the first in over half a century where DST
+# both began and ended pursuant to the same decree.
+Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 -
+Rule Uruguay 1991 1992 - Mar Sun>=1 0:00 0 -
+Rule Uruguay 1992 only - Oct 18 0:00 1:00 -
Rule Uruguay 1993 only - Feb 28 0:00 0 -
# From Eduardo Cota (2004-09-20):
# The Uruguayan government has decreed a change in the local time....
-# http://www.presidencia.gub.uy/decretos/2004091502.htm
-Rule Uruguay 2004 only - Sep 19 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# Decreto 328/004 of 2004-09-15.
+# http://www.impo.com.uy/diariooficial/2004/09/23/documentos.pdf#page=1
+Rule Uruguay 2004 only - Sep 19 0:00 1:00 -
# From Steffen Thorsen (2005-03-11):
# Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
# save energy ... it was postponed two weeks....
-# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+# From Tim Parenti (2018-02-15):
+# This 2005 postponement is not in Almanaque 2018. Go with the contemporaneous
+# reporting, which is confirmed by Decreto 107/005 of 2005-03-10 amending
+# Decreto 328/004:
+# http://www.impo.com.uy/diariooficial/2005/03/15/documentos.pdf#page=1
+# The original decree specified a transition of 2005-03-12 24:00, but the new
+# one specified 2005-03-27 02:00.
Rule Uruguay 2005 only - Mar 27 2:00 0 -
# From Eduardo Cota (2005-09-27):
-# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
-# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
-# 02:00 local time, official time in Uruguay will be at GMT -2.
-Rule Uruguay 2005 only - Oct 9 2:00 1:00 S
-Rule Uruguay 2006 only - Mar 12 2:00 0 -
-# From Jesper Nørgaard Welen (2006-09-06):
-# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
-#
+# ...from 2005-10-09 at 02:00 local time, until 2006-03-12 at 02:00 local time,
+# official time in Uruguay will be at GMT -2.
+# From Tim Parenti (2018-02-15):
+# Decreto 318/005 of 2005-09-19.
+# http://www.impo.com.uy/diariooficial/2005/09/23/documentos.pdf#page=1
+Rule Uruguay 2005 only - Oct 9 2:00 1:00 -
+Rule Uruguay 2006 2015 - Mar Sun>=8 2:00 0 -
+# From Tim Parenti (2018-02-15), per Jesper Nørgaard Welen (2006-09-06):
+# Decreto 311/006 of 2006-09-04 established regular DST from the first Sunday
+# of October at 02:00 through the second Sunday of March at 02:00. Almanaque
+# 2018 appears to have a few typoed dates through this period; ignore them.
+# http://www.impo.com.uy/diariooficial/2006/09/08/documentos.pdf#page=1
+Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
# From Steffen Thorsen (2015-06-30):
# ... it looks like they will not be using DST the coming summer:
# http://www.elobservador.com.uy/gobierno-resolvio-que-no-habra-cambio-horario-verano-n656787
@@ -1777,17 +1905,19 @@
# instead of out to dinner.
# From Pablo Camargo (2015-07-13):
# http://archivo.presidencia.gub.uy/sci/decretos/2015/06/cons_min_201.pdf
-# [dated 2015-06-29; repeals Decree 311/006 dated 2006-09-04]
-Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 S
-Rule Uruguay 2007 2015 - Mar Sun>=8 2:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 178/015 of 2015-06-29; repeals Decreto 311/006.
# This Zone can be simplified once we assume zic %z.
-Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28
- -3:44:44 - MMT 1920 May 1 # Montevideo MT
+Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
+ -3:44:51 - MMT 1920 May 1 # Montevideo MT
+ -4:00 - -04 1923 Oct 1
-3:30 Uruguay -0330/-03 1942 Dec 14
+ -3:00 Uruguay -03/-0230 1960
-3:00 Uruguay -03/-02 1968
- -3:00 Uruguay -03/-0230 1971
+ -3:00 Uruguay -03/-0230 1970
-3:00 Uruguay -03/-02 1974
+ -3:00 Uruguay -03/-0130 1974 Mar 10
-3:00 Uruguay -03/-0230 1974 Dec 22
-3:00 Uruguay -03/-02
diff --git a/jdk/make/data/tzdata/zone.tab b/jdk/make/data/tzdata/zone.tab
index f6d9c66..873737e 100644
--- a/jdk/make/data/tzdata/zone.tab
+++ b/jdk/make/data/tzdata/zone.tab
@@ -452,7 +452,7 @@
US +643004-1652423 America/Nome Alaska (west)
US +515248-1763929 America/Adak Aleutian Islands
US +211825-1575130 Pacific/Honolulu Hawaii
-UY -3453-05611 America/Montevideo
+UY -345433-0561245 America/Montevideo
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
UZ +4120+06918 Asia/Tashkent Uzbekistan (east)
VA +415408+0122711 Europe/Vatican
diff --git a/jdk/make/mapfiles/libnio/mapfile-linux b/jdk/make/mapfiles/libnio/mapfile-linux
index 16f72e43..c38d3e5 100644
--- a/jdk/make/mapfiles/libnio/mapfile-linux
+++ b/jdk/make/mapfiles/libnio/mapfile-linux
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -59,6 +59,7 @@
Java_sun_nio_ch_FileChannelImpl_position0;
Java_sun_nio_ch_FileChannelImpl_transferTo0;
Java_sun_nio_ch_FileChannelImpl_unmap0;
+ Java_sun_nio_ch_FileDispatcherImpl_allocate0;
Java_sun_nio_ch_FileDispatcherImpl_close0;
Java_sun_nio_ch_FileDispatcherImpl_closeIntFD;
Java_sun_nio_ch_FileDispatcherImpl_force0;
diff --git a/jdk/make/mapfiles/libnio/mapfile-macosx b/jdk/make/mapfiles/libnio/mapfile-macosx
index 4dd0dc5..38eabf6 100644
--- a/jdk/make/mapfiles/libnio/mapfile-macosx
+++ b/jdk/make/mapfiles/libnio/mapfile-macosx
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -42,6 +42,7 @@
Java_sun_nio_ch_FileChannelImpl_position0;
Java_sun_nio_ch_FileChannelImpl_transferTo0;
Java_sun_nio_ch_FileChannelImpl_unmap0;
+ Java_sun_nio_ch_FileDispatcherImpl_allocate0;
Java_sun_nio_ch_FileDispatcherImpl_close0;
Java_sun_nio_ch_FileDispatcherImpl_closeIntFD;
Java_sun_nio_ch_FileDispatcherImpl_force0;
diff --git a/jdk/make/mapfiles/libnio/mapfile-solaris b/jdk/make/mapfiles/libnio/mapfile-solaris
index 3933cef..4ea153d 100644
--- a/jdk/make/mapfiles/libnio/mapfile-solaris
+++ b/jdk/make/mapfiles/libnio/mapfile-solaris
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -47,6 +47,7 @@
Java_sun_nio_ch_FileChannelImpl_position0;
Java_sun_nio_ch_FileChannelImpl_transferTo0;
Java_sun_nio_ch_FileChannelImpl_unmap0;
+ Java_sun_nio_ch_FileDispatcherImpl_allocate0;
Java_sun_nio_ch_FileDispatcherImpl_close0;
Java_sun_nio_ch_FileDispatcherImpl_closeIntFD;
Java_sun_nio_ch_FileDispatcherImpl_force0;
diff --git a/jdk/src/macosx/classes/com/apple/laf/resources/aqua_de.properties b/jdk/src/macosx/classes/com/apple/laf/resources/aqua_de.properties
index 8310556..de325f2 100644
--- a/jdk/src/macosx/classes/com/apple/laf/resources/aqua_de.properties
+++ b/jdk/src/macosx/classes/com/apple/laf/resources/aqua_de.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,7 @@
FileChooser.saveTitle.textAndMnemonic=Speichern
FileChooser.openTitle.textAndMnemonic=\u00D6ffnen
FileChooser.newFolderExistsError.textAndMnemonic=Dieser Name ist bereits vergeben
-FileChooser.chooseButton.textAndMnemonic=W\u00E4hlen
+FileChooser.chooseButton.textAndMnemonic=Ausw\u00E4hlen
FileChooser.newFolderButton.textAndMnemonic=Neuer Ordner
FileChooser.newFolderTitle.textAndMnemonic=Neuer Ordner
diff --git a/jdk/src/share/bin/java.c b/jdk/src/share/bin/java.c
index 5d2099b..80c9a08 100644
--- a/jdk/src/share/bin/java.c
+++ b/jdk/src/share/bin/java.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -660,15 +660,24 @@
* arguments are for the application (i.e. the main class name, or
* the -jar argument).
*/
- if ((i > 0 && *arg != '-')
- || JLI_StrCmp(arg, "-version") == 0
- || JLI_StrCmp(arg, "-fullversion") == 0
- || JLI_StrCmp(arg, "-help") == 0
- || JLI_StrCmp(arg, "-?") == 0
- || JLI_StrCmp(arg, "-jar") == 0
- || JLI_StrCmp(arg, "-X") == 0
- ) {
- return;
+ if (i > 0) {
+ char *prev = argv[i - 1];
+ // skip non-dash arg preceded by class path specifiers
+ if (*arg != '-' &&
+ ((JLI_StrCmp(prev, "-cp") == 0
+ || JLI_StrCmp(prev, "-classpath") == 0))) {
+ continue;
+ }
+
+ if (*arg != '-'
+ || JLI_StrCmp(arg, "-version") == 0
+ || JLI_StrCmp(arg, "-fullversion") == 0
+ || JLI_StrCmp(arg, "-help") == 0
+ || JLI_StrCmp(arg, "-?") == 0
+ || JLI_StrCmp(arg, "-jar") == 0
+ || JLI_StrCmp(arg, "-X") == 0) {
+ return;
+ }
}
/*
* The following case checks for "-XX:NativeMemoryTracking=value".
diff --git a/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java b/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java
index d988124..d9a3188 100644
--- a/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/Connection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,26 +27,27 @@
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
-import java.io.InterruptedIOException;
import java.io.IOException;
-import java.io.OutputStream;
import java.io.InputStream;
-import java.net.Socket;
-import javax.net.ssl.SSLSocket;
-
-import javax.naming.CommunicationException;
-import javax.naming.ServiceUnavailableException;
-import javax.naming.NamingException;
-import javax.naming.InterruptedNamingException;
-
-import javax.naming.ldap.Control;
-
-import java.lang.reflect.Method;
+import java.io.InterruptedIOException;
+import java.io.OutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.Socket;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.Arrays;
+
+import javax.naming.CommunicationException;
+import javax.naming.InterruptedNamingException;
+import javax.naming.NamingException;
+import javax.naming.ServiceUnavailableException;
+import javax.naming.ldap.Control;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.SSLSocket;
+
import sun.misc.IOUtils;
-//import javax.net.SocketFactory;
/**
* A thread that creates a connection to an LDAP server.
@@ -159,7 +160,18 @@
int readTimeout;
int connectTimeout;
+ private static final boolean IS_HOSTNAME_VERIFICATION_DISABLED
+ = hostnameVerificationDisabledValue();
+ private static boolean hostnameVerificationDisabledValue() {
+ PrivilegedAction<String> act = () -> System.getProperty(
+ "com.sun.jndi.ldap.object.disableEndpointIdentification");
+ String prop = AccessController.doPrivileged(act);
+ if (prop == null) {
+ return false;
+ }
+ return prop.isEmpty() ? true : Boolean.parseBoolean(prop);
+ }
// true means v3; false means v2
// Called in LdapClient.authenticate() (which is synchronized)
// when connection is "quiet" and not shared; no need to synchronize
@@ -368,15 +380,20 @@
// the SSL handshake following socket connection as part of the timeout.
// So explicitly set a socket read timeout, trigger the SSL handshake,
// then reset the timeout.
- if (connectTimeout > 0 && socket instanceof SSLSocket) {
+ if (socket instanceof SSLSocket) {
SSLSocket sslSocket = (SSLSocket) socket;
int socketTimeout = sslSocket.getSoTimeout();
-
- sslSocket.setSoTimeout(connectTimeout); // reuse full timeout value
+ if (!IS_HOSTNAME_VERIFICATION_DISABLED) {
+ SSLParameters param = sslSocket.getSSLParameters();
+ param.setEndpointIdentificationAlgorithm("LDAPS");
+ sslSocket.setSSLParameters(param);
+ }
+ if (connectTimeout > 0) {
+ sslSocket.setSoTimeout(connectTimeout); // reuse full timeout value
+ }
sslSocket.startHandshake();
sslSocket.setSoTimeout(socketTimeout);
}
-
return socket;
}
diff --git a/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java
index 87247ba..1aa62d9 100644
--- a/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java
+++ b/jdk/src/share/classes/com/sun/media/sound/DLSSoundbank.java
@@ -548,7 +548,7 @@
long count = riff.readUnsignedInt();
if (size - 8 != 0)
- riff.skipBytes(size - 8);
+ riff.skip(size - 8);
for (int i = 0; i < count; i++) {
DLSModulator modulator = new DLSModulator();
@@ -568,7 +568,7 @@
long count = riff.readUnsignedInt();
if (size - 8 != 0)
- riff.skipBytes(size - 8);
+ riff.skip(size - 8);
for (int i = 0; i < count; i++) {
DLSModulator modulator = new DLSModulator();
@@ -661,7 +661,7 @@
long loops = riff.readInt();
if (size > 20)
- riff.skipBytes(size - 20);
+ riff.skip(size - 20);
for (int i = 0; i < loops; i++) {
DLSSampleLoop loop = new DLSSampleLoop();
@@ -671,7 +671,7 @@
loop.length = riff.readUnsignedInt();
sampleOptions.loops.add(loop);
if (size2 > 16)
- riff.skipBytes(size2 - 16);
+ riff.skip(size2 - 16);
}
}
diff --git a/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java b/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java
index c307738..45208bc 100644
--- a/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java
+++ b/jdk/src/share/classes/com/sun/media/sound/RIFFReader.java
@@ -172,49 +172,41 @@
}
}
- public final long skipBytes(long n) throws IOException {
- if (n < 0)
+ @Override
+ public long skip(final long n) throws IOException {
+ if (n <= 0 || avail == 0) {
return 0;
- long skipped = 0;
- while (skipped != n) {
- long s = skip(n - skipped);
- if (s < 0)
- break;
- if (s == 0)
- Thread.yield();
- skipped += s;
}
- return skipped;
- }
-
- public long skip(long n) throws IOException {
- if (avail == 0)
- return -1;
- if (n > avail) {
- long len = stream.skip(avail);
- if (len != -1)
- filepointer += len;
- avail = 0;
- return len;
- } else {
- long ret = stream.skip(n);
- if (ret == -1) {
- avail = 0;
- return -1;
+ // will not skip more than
+ long remaining = Math.min(n, avail);
+ while (remaining > 0) {
+ // Some input streams like FileInputStream can return more bytes,
+ // when EOF is reached.
+ long ret = Math.min(stream.skip(remaining), remaining);
+ if (ret == 0) {
+ // EOF or not? we need to check.
+ Thread.yield();
+ if (stream.read() == -1) {
+ avail = 0;
+ break;
+ }
+ ret = 1;
}
+ remaining -= ret;
avail -= ret;
filepointer += ret;
- return ret;
}
+ return n - remaining;
}
+ @Override
public int available() {
return (int)avail;
}
public void finish() throws IOException {
if (avail != 0) {
- skipBytes(avail);
+ skip(avail);
}
}
@@ -337,6 +329,7 @@
return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24);
}
+ @Override
public void close() throws IOException {
finish();
if (this == root)
diff --git a/jdk/src/share/classes/com/sun/naming/internal/VersionHelper12.java b/jdk/src/share/classes/com/sun/naming/internal/VersionHelper12.java
index bf4586e..9133c73 100644
--- a/jdk/src/share/classes/com/sun/naming/internal/VersionHelper12.java
+++ b/jdk/src/share/classes/com/sun/naming/internal/VersionHelper12.java
@@ -62,6 +62,25 @@
}
/**
+ * Determines whether classes may be loaded from an arbitrary URL code base.
+ */
+ private static final String TRUST_URL_CODEBASE_PROPERTY =
+ "com.sun.jndi.ldap.object.trustURLCodebase";
+ private static final String trustURLCodebase =
+ AccessController.doPrivileged(
+ new PrivilegedAction<String>() {
+ public String run() {
+ try {
+ return System.getProperty(TRUST_URL_CODEBASE_PROPERTY,
+ "false");
+ } catch (SecurityException e) {
+ return "false";
+ }
+ }
+ }
+ );
+
+ /**
* Package private.
*
* This internal method is used with Thread Context Class Loader (TCCL),
@@ -79,12 +98,15 @@
*/
public Class<?> loadClass(String className, String codebase)
throws ClassNotFoundException, MalformedURLException {
+ if ("true".equalsIgnoreCase(trustURLCodebase)) {
+ ClassLoader parent = getContextClassLoader();
+ ClassLoader cl =
+ URLClassLoader.newInstance(getUrlArray(codebase), parent);
- ClassLoader parent = getContextClassLoader();
- ClassLoader cl =
- URLClassLoader.newInstance(getUrlArray(codebase), parent);
-
- return loadClass(className, cl);
+ return loadClass(className, cl);
+ } else {
+ return null;
+ }
}
String getJndiProperty(final int i) {
diff --git a/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties b/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties
index fe9d172..37af8f5 100644
--- a/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties
+++ b/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_de.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,11 @@
# CacheRowSetImpl exceptions
cachedrowsetimpl.populate = Ung\u00FCltiges ResultSet-Objekt zum Auff\u00FCllen der Methode angegeben
cachedrowsetimpl.invalidp = Ung\u00FCltiger Persistence-Provider generiert
-cachedrowsetimpl.nullhash = CachedRowSetImpl-Instanz kann nicht instanziiert werden. Null-Hash-Tabelle f\u00FCr Constructor angegeben
+cachedrowsetimpl.nullhash = CachedRowSetImpl-Instanz kann nicht instanziiert werden. Null-Hashtabelle f\u00FCr Constructor angegeben
cachedrowsetimpl.invalidop = Ung\u00FCltiger Vorgang beim Zeileneinf\u00FCgen
cachedrowsetimpl.accfailed = acceptChanges nicht erfolgreich
cachedrowsetimpl.invalidcp = Ung\u00FCltige Cursorposition
-cachedrowsetimpl.illegalop = Ung\u00FCltiger Vorgang bei nicht eingef\u00FCgter Zeile
+cachedrowsetimpl.illegalop = Unzul\u00E4ssiger Vorgang bei nicht eingef\u00FCgter Zeile
cachedrowsetimpl.clonefail = Klonen nicht erfolgreich: {0}
cachedrowsetimpl.invalidcol = Ung\u00FCltiger Spaltenindex
cachedrowsetimpl.invalcolnm = Ung\u00FCltiger Spaltenname
@@ -80,7 +80,7 @@
cachedrowsetimpl.featnotsupp = Feature nicht unterst\u00FCtzt
# WebRowSetImpl exceptions
-webrowsetimpl.nullhash = WebRowSetImpl-Instanz kann nicht instanziiert werden. Null-Hash-Tabelle f\u00FCr Constructor angegeben
+webrowsetimpl.nullhash = WebRowSetImpl-Instanz kann nicht instanziiert werden. Null-Hashtabelle f\u00FCr Constructor angegeben
webrowsetimpl.invalidwr = Ung\u00FCltiger Writer
webrowsetimpl.invalidrd = Ung\u00FCltiger Reader
diff --git a/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java b/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java
index 83547e4..8ba62f2 100644
--- a/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java
+++ b/jdk/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -674,20 +674,18 @@
versionInfo().jdwpMinor >= 6;
}
public boolean canGetInstanceInfo() {
- if (versionInfo().jdwpMajor < 1 ||
- versionInfo().jdwpMinor < 6) {
+ if (versionInfo().jdwpMajor > 1 ||
+ versionInfo().jdwpMinor >= 6) {
+ validateVM();
+ return hasNewCapabilities() &&
+ capabilitiesNew().canGetInstanceInfo;
+ } else {
return false;
}
- validateVM();
- return hasNewCapabilities() &&
- capabilitiesNew().canGetInstanceInfo;
}
public boolean canUseSourceNameFilters() {
- if (versionInfo().jdwpMajor < 1 ||
- versionInfo().jdwpMinor < 6) {
- return false;
- }
- return true;
+ return versionInfo().jdwpMajor > 1 ||
+ versionInfo().jdwpMinor >= 6;
}
public boolean canForceEarlyReturn() {
validateVM();
@@ -703,12 +701,8 @@
capabilitiesNew().canGetSourceDebugExtension;
}
public boolean canGetClassFileVersion() {
- if ( versionInfo().jdwpMajor < 1 &&
- versionInfo().jdwpMinor < 6) {
- return false;
- } else {
- return true;
- }
+ return versionInfo().jdwpMajor > 1 ||
+ versionInfo().jdwpMinor >= 6;
}
public boolean canGetConstantPool() {
validateVM();
diff --git a/jdk/src/share/classes/java/awt/Desktop.java b/jdk/src/share/classes/java/awt/Desktop.java
index a9b947d..577ffdd 100644
--- a/jdk/src/share/classes/java/awt/Desktop.java
+++ b/jdk/src/share/classes/java/awt/Desktop.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -202,15 +202,11 @@
* @throws NullPointerException if file is null
* @throws IllegalArgumentException if file doesn't exist
*/
- private static void checkFileValidation(File file){
- if (file == null) throw new NullPointerException("File must not be null");
-
+ private static void checkFileValidation(File file) {
if (!file.exists()) {
throw new IllegalArgumentException("The file: "
+ file.getPath() + " doesn't exist.");
}
-
- file.canRead();
}
/**
@@ -264,6 +260,7 @@
* @see java.awt.AWTPermission
*/
public void open(File file) throws IOException {
+ file = new File(file.getPath());
checkAWTPermission();
checkExec();
checkActionSupport(Action.OPEN);
@@ -295,6 +292,7 @@
* @see java.awt.AWTPermission
*/
public void edit(File file) throws IOException {
+ file = new File(file.getPath());
checkAWTPermission();
checkExec();
checkActionSupport(Action.EDIT);
@@ -325,6 +323,7 @@
* allowed to create a subprocess
*/
public void print(File file) throws IOException {
+ file = new File(file.getPath());
checkExec();
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
diff --git a/jdk/src/share/classes/java/io/ObjectInputStream.java b/jdk/src/share/classes/java/io/ObjectInputStream.java
index 7e173eb..9d293c7 100644
--- a/jdk/src/share/classes/java/io/ObjectInputStream.java
+++ b/jdk/src/share/classes/java/io/ObjectInputStream.java
@@ -1233,9 +1233,11 @@
if (serialFilter != null) {
RuntimeException ex = null;
ObjectInputFilter.Status status;
+ // Info about the stream is not available if overridden by subclass, return 0
+ long bytesRead = (bin == null) ? 0 : bin.getBytesRead();
try {
status = serialFilter.checkInput(new FilterValues(clazz, arrayLength,
- totalObjectRefs, depth, bin.getBytesRead()));
+ totalObjectRefs, depth, bytesRead));
} catch (RuntimeException e) {
// Preventive interception of an exception to log
status = ObjectInputFilter.Status.REJECTED;
@@ -1247,7 +1249,7 @@
if (Logging.infoLogger != null) {
Logging.infoLogger.info(
"ObjectInputFilter {0}: {1}, array length: {2}, nRefs: {3}, depth: {4}, bytes: {5}, ex: {6}",
- status, clazz, arrayLength, totalObjectRefs, depth, bin.getBytesRead(),
+ status, clazz, arrayLength, totalObjectRefs, depth, bytesRead,
Objects.toString(ex, "n/a"));
}
InvalidClassException ice = new InvalidClassException("filter status: " + status);
@@ -1258,7 +1260,7 @@
if (Logging.traceLogger != null) {
Logging.traceLogger.finer(
"ObjectInputFilter {0}: {1}, array length: {2}, nRefs: {3}, depth: {4}, bytes: {5}, ex: {6}",
- status, clazz, arrayLength, totalObjectRefs, depth, bin.getBytesRead(),
+ status, clazz, arrayLength, totalObjectRefs, depth, bytesRead,
Objects.toString(ex, "n/a"));
}
}
diff --git a/jdk/src/share/classes/java/io/ObjectStreamClass.java b/jdk/src/share/classes/java/io/ObjectStreamClass.java
index 16c9fc7..bcbbea2 100644
--- a/jdk/src/share/classes/java/io/ObjectStreamClass.java
+++ b/jdk/src/share/classes/java/io/ObjectStreamClass.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -86,6 +86,18 @@
private static final ObjectStreamField[] serialPersistentFields =
NO_FIELDS;
+ /** true if deserialization constructor checking is disabled */
+ private static boolean disableSerialConstructorChecks =
+ AccessController.doPrivileged(
+ new PrivilegedAction<Boolean>() {
+ public Boolean run() {
+ String prop = "jdk.disableSerialConstructorChecks";
+ return "true".equals(System.getProperty(prop))
+ ? Boolean.TRUE : Boolean.FALSE;
+ }
+ }
+ ).booleanValue();
+
/** reflection factory for obtaining serialization constructors */
private static final ReflectionFactory reflFactory =
AccessController.doPrivileged(
@@ -1497,6 +1509,46 @@
}
/**
+ * Given a class, determines whether its superclass has
+ * any constructors that are accessible from the class.
+ * This is a special purpose method intended to do access
+ * checking for a serializable class and its superclasses
+ * up to, but not including, the first non-serializable
+ * superclass. This also implies that the superclass is
+ * always non-null, because a serializable class must be a
+ * class (not an interface) and Object is not serializable.
+ *
+ * @param cl the class from which access is checked
+ * @return whether the superclass has a constructor accessible from cl
+ */
+ private static boolean superHasAccessibleConstructor(Class<?> cl) {
+ Class<?> superCl = cl.getSuperclass();
+ assert Serializable.class.isAssignableFrom(cl);
+ assert superCl != null;
+ if (packageEquals(cl, superCl)) {
+ // accessible if any non-private constructor is found
+ for (Constructor<?> ctor : superCl.getDeclaredConstructors()) {
+ if ((ctor.getModifiers() & Modifier.PRIVATE) == 0) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ // sanity check to ensure the parent is protected or public
+ if ((superCl.getModifiers() & (Modifier.PROTECTED | Modifier.PUBLIC)) == 0) {
+ return false;
+ }
+ // accessible if any constructor is protected or public
+ for (Constructor<?> ctor : superCl.getDeclaredConstructors()) {
+ if ((ctor.getModifiers() & (Modifier.PROTECTED | Modifier.PUBLIC)) != 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+
+ /**
* Returns subclass-accessible no-arg constructor of first non-serializable
* superclass, or null if none found. Access checks are disabled on the
* returned constructor (if any).
@@ -1504,7 +1556,9 @@
private static Constructor<?> getSerializableConstructor(Class<?> cl) {
Class<?> initCl = cl;
while (Serializable.class.isAssignableFrom(initCl)) {
- if ((initCl = initCl.getSuperclass()) == null) {
+ Class<?> prev = initCl;
+ if ((initCl = initCl.getSuperclass()) == null ||
+ (!disableSerialConstructorChecks && !superHasAccessibleConstructor(prev))) {
return null;
}
}
diff --git a/jdk/src/share/classes/java/net/InetAddress.java b/jdk/src/share/classes/java/net/InetAddress.java
index 3d0f65b..06ab66e 100644
--- a/jdk/src/share/classes/java/net/InetAddress.java
+++ b/jdk/src/share/classes/java/net/InetAddress.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import java.io.ObjectStreamException;
import java.io.ObjectStreamField;
import java.io.IOException;
+import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectInputStream.GetField;
import java.io.ObjectOutputStream;
@@ -1602,8 +1603,11 @@
}
GetField gf = s.readFields();
String host = (String)gf.get("hostName", null);
- int address= gf.get("address", 0);
- int family= gf.get("family", 0);
+ int address = gf.get("address", 0);
+ int family = gf.get("family", 0);
+ if (family != IPv4 && family != IPv6) {
+ throw new InvalidObjectException("invalid address family type: " + family);
+ }
InetAddressHolder h = new InetAddressHolder(host, address, family);
UNSAFE.putObject(this, FIELDS_OFFSET, h);
}
diff --git a/jdk/src/share/classes/java/net/NetworkInterface.java b/jdk/src/share/classes/java/net/NetworkInterface.java
index 411d8df..0b47e3d 100644
--- a/jdk/src/share/classes/java/net/NetworkInterface.java
+++ b/jdk/src/share/classes/java/net/NetworkInterface.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -319,8 +319,20 @@
if (addr == null) {
throw new NullPointerException();
}
- if (!(addr instanceof Inet4Address || addr instanceof Inet6Address)) {
- throw new IllegalArgumentException ("invalid address type");
+ if (addr instanceof Inet4Address) {
+ Inet4Address inet4Address = (Inet4Address) addr;
+ if (inet4Address.holder.family != InetAddress.IPv4) {
+ throw new IllegalArgumentException("invalid family type: "
+ + inet4Address.holder.family);
+ }
+ } else if (addr instanceof Inet6Address) {
+ Inet6Address inet6Address = (Inet6Address) addr;
+ if (inet6Address.holder.family != InetAddress.IPv6) {
+ throw new IllegalArgumentException("invalid family type: "
+ + inet6Address.holder.family);
+ }
+ } else {
+ throw new IllegalArgumentException("invalid address type: " + addr);
}
return getByInetAddress0(addr);
}
diff --git a/jdk/src/share/classes/java/net/URLClassLoader.java b/jdk/src/share/classes/java/net/URLClassLoader.java
index c2394c7..416941c 100644
--- a/jdk/src/share/classes/java/net/URLClassLoader.java
+++ b/jdk/src/share/classes/java/net/URLClassLoader.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,7 @@
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import sun.misc.Resource;
+import sun.misc.SharedSecrets;
import sun.misc.URLClassPath;
import sun.net.www.ParseUtil;
import sun.security.util.SecurityConstants;
@@ -486,13 +487,13 @@
protected Package definePackage(String name, Manifest man, URL url)
throws IllegalArgumentException
{
- String path = name.replace('.', '/').concat("/");
String specTitle = null, specVersion = null, specVendor = null;
String implTitle = null, implVersion = null, implVendor = null;
String sealed = null;
URL sealBase = null;
- Attributes attr = man.getAttributes(path);
+ Attributes attr = SharedSecrets.javaUtilJarAccess()
+ .getTrustedAttributes(man, name.replace('.', '/').concat("/"));
if (attr != null) {
specTitle = attr.getValue(Name.SPECIFICATION_TITLE);
specVersion = attr.getValue(Name.SPECIFICATION_VERSION);
@@ -536,10 +537,12 @@
/*
* Returns true if the specified package name is sealed according to the
* given manifest.
+ *
+ * @throws SecurityException if the package name is untrusted in the manifest
*/
private boolean isSealed(String name, Manifest man) {
- String path = name.replace('.', '/').concat("/");
- Attributes attr = man.getAttributes(path);
+ Attributes attr = SharedSecrets.javaUtilJarAccess()
+ .getTrustedAttributes(man, name.replace('.', '/').concat("/"));
String sealed = null;
if (attr != null) {
sealed = attr.getValue(Name.SEALED);
diff --git a/jdk/src/share/classes/java/util/jar/JarFile.java b/jdk/src/share/classes/java/util/jar/JarFile.java
index f78c36c..940dfb6 100644
--- a/jdk/src/share/classes/java/util/jar/JarFile.java
+++ b/jdk/src/share/classes/java/util/jar/JarFile.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -191,10 +191,10 @@
if (manEntry != null) {
if (verify) {
byte[] b = getBytes(manEntry);
- man = new Manifest(new ByteArrayInputStream(b));
if (!jvInitialized) {
jv = new JarVerifier(b);
}
+ man = new Manifest(jv, new ByteArrayInputStream(b));
} else {
man = new Manifest(super.getInputStream(manEntry));
}
@@ -602,7 +602,7 @@
return false;
}
- private synchronized void ensureInitialization() {
+ synchronized void ensureInitialization() {
try {
maybeInstantiateVerifier();
} catch (IOException e) {
diff --git a/jdk/src/share/classes/java/util/jar/JarVerifier.java b/jdk/src/share/classes/java/util/jar/JarVerifier.java
index 6e6eec5..34bf00c 100644
--- a/jdk/src/share/classes/java/util/jar/JarVerifier.java
+++ b/jdk/src/share/classes/java/util/jar/JarVerifier.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -879,4 +879,24 @@
static CodeSource getUnsignedCS(URL url) {
return new VerifierCodeSource(null, url, (java.security.cert.Certificate[]) null);
}
+
+ /**
+ * Returns whether the name is trusted. Used by
+ * {@link Manifest#getTrustedAttributes(String)}.
+ */
+ boolean isTrustedManifestEntry(String name) {
+ // How many signers? MANIFEST.MF is always verified
+ CodeSigner[] forMan = verifiedSigners.get(JarFile.MANIFEST_NAME);
+ if (forMan == null) {
+ return true;
+ }
+ // Check sigFileSigners first, because we are mainly dealing with
+ // non-file entries which will stay in sigFileSigners forever.
+ CodeSigner[] forName = sigFileSigners.get(name);
+ if (forName == null) {
+ forName = verifiedSigners.get(name);
+ }
+ // Returns trusted if all signers sign the entry
+ return forName != null && forName.length == forMan.length;
+ }
}
diff --git a/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java b/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java
index 84a7279..f1f132d 100644
--- a/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java
+++ b/jdk/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,4 +60,12 @@
public List<Object> getManifestDigests(JarFile jar) {
return jar.getManifestDigests();
}
+
+ public Attributes getTrustedAttributes(Manifest man, String name) {
+ return man.getTrustedAttributes(name);
+ }
+
+ public void ensureInitialization(JarFile jar) {
+ jar.ensureInitialization();
+ }
}
diff --git a/jdk/src/share/classes/java/util/jar/Manifest.java b/jdk/src/share/classes/java/util/jar/Manifest.java
index 976e44c..75434eb 100644
--- a/jdk/src/share/classes/java/util/jar/Manifest.java
+++ b/jdk/src/share/classes/java/util/jar/Manifest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -48,15 +48,19 @@
*/
public class Manifest implements Cloneable {
// manifest main attributes
- private Attributes attr = new Attributes();
+ private final Attributes attr = new Attributes();
// manifest entries
- private Map<String, Attributes> entries = new HashMap<>();
+ private final Map<String, Attributes> entries = new HashMap<>();
+
+ // associated JarVerifier, not null when called by JarFile::getManifest.
+ private final JarVerifier jv;
/**
* Constructs a new, empty Manifest.
*/
public Manifest() {
+ jv = null;
}
/**
@@ -66,7 +70,16 @@
* @throws IOException if an I/O error has occurred
*/
public Manifest(InputStream is) throws IOException {
+ this(null, is);
+ }
+
+ /**
+ * Constructs a new Manifest from the specified input stream
+ * and associates it with a JarVerifier.
+ */
+ Manifest(JarVerifier jv, InputStream is) throws IOException {
read(is);
+ this.jv = jv;
}
/**
@@ -77,6 +90,7 @@
public Manifest(Manifest man) {
attr.putAll(man.getMainAttributes());
entries.putAll(man.getEntries());
+ jv = man.jv;
}
/**
@@ -127,6 +141,27 @@
}
/**
+ * Returns the Attributes for the specified entry name, if trusted.
+ *
+ * @param name entry name
+ * @return returns the same result as {@link #getAttributes(String)}
+ * @throws SecurityException if the associated jar is signed but this entry
+ * has been modified after signing (i.e. the section in the manifest
+ * does not exist in SF files of all signers).
+ */
+ Attributes getTrustedAttributes(String name) {
+ // Note: Before the verification of MANIFEST.MF/.SF/.RSA files is done,
+ // jv.isTrustedManifestEntry() isn't able to detect MANIFEST.MF change.
+ // Users of this method should call SharedSecrets.javaUtilJarAccess()
+ // .ensureInitialization() first.
+ Attributes result = getAttributes(name);
+ if (result != null && jv != null && ! jv.isTrustedManifestEntry(name)) {
+ throw new SecurityException("Untrusted manifest entry: " + name);
+ }
+ return result;
+ }
+
+ /**
* Clears the main Attributes as well as the entries in this Manifest.
*/
public void clear() {
diff --git a/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java b/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java
index d6ac72a..15333b1 100644
--- a/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java
+++ b/jdk/src/share/classes/java/util/regex/PatternSyntaxException.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -113,7 +113,7 @@
}
sb.append(nl);
sb.append(pattern);
- if (index >= 0) {
+ if (index >= 0 && pattern != null && index < pattern.length()) {
sb.append(nl);
for (int i = 0; i < index; i++) sb.append(' ');
sb.append('^');
diff --git a/jdk/src/share/classes/javax/crypto/Cipher.java b/jdk/src/share/classes/javax/crypto/Cipher.java
index 0830560..919bb62 100644
--- a/jdk/src/share/classes/javax/crypto/Cipher.java
+++ b/jdk/src/share/classes/javax/crypto/Cipher.java
@@ -2703,7 +2703,7 @@
// Input sanity check
if ((src == null) || (offset < 0) || (len < 0)
- || ((len + offset) > src.length)) {
+ || (len > (src.length - offset))) {
throw new IllegalArgumentException("Bad arguments");
}
diff --git a/jdk/src/share/classes/javax/crypto/CipherInputStream.java b/jdk/src/share/classes/javax/crypto/CipherInputStream.java
index ded3b24..decae3c 100644
--- a/jdk/src/share/classes/javax/crypto/CipherInputStream.java
+++ b/jdk/src/share/classes/javax/crypto/CipherInputStream.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,13 @@
* that are not thrown by its ancestor classes. In particular, the
* <code>skip</code> method skips, and the <code>available</code>
* method counts only data that have been processed by the encapsulated Cipher.
+ * This class may catch BadPaddingException and other exceptions thrown by
+ * failed integrity checks during decryption. These exceptions are not
+ * re-thrown, so the client may not be informed that integrity checks
+ * failed. Because of this behavior, this class may not be suitable
+ * for use with decryption in an authenticated mode of operation (e.g. GCM).
+ * Applications that require authenticated encryption can use the Cipher API
+ * directly as an alternative to using this class.
*
* <p> It is crucial for a programmer using this class not to use
* methods that are not defined or overriden in this class (such as a
diff --git a/jdk/src/share/classes/javax/crypto/spec/GCMParameterSpec.java b/jdk/src/share/classes/javax/crypto/spec/GCMParameterSpec.java
index 403205a..879d729 100644
--- a/jdk/src/share/classes/javax/crypto/spec/GCMParameterSpec.java
+++ b/jdk/src/share/classes/javax/crypto/spec/GCMParameterSpec.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -120,7 +120,7 @@
// Input sanity check
if ((src == null) ||(len < 0) || (offset < 0)
- || ((len + offset) > src.length)) {
+ || (len > (src.length - offset))) {
throw new IllegalArgumentException("Invalid buffer arguments");
}
diff --git a/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java b/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java
index 3453855..01ae4d5 100644
--- a/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java
+++ b/jdk/src/share/classes/sun/misc/JavaUtilJarAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,8 +30,10 @@
import java.security.CodeSource;
import java.util.Enumeration;
import java.util.List;
+import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
+import java.util.jar.Manifest;
public interface JavaUtilJarAccess {
public boolean jarFileHasClassPathAttribute(JarFile jar) throws IOException;
@@ -41,4 +43,6 @@
public Enumeration<JarEntry> entries2(JarFile jar);
public void setEagerValidation(JarFile jar, boolean eager);
public List<Object> getManifestDigests(JarFile jar);
+ public Attributes getTrustedAttributes(Manifest man, String name);
+ public void ensureInitialization(JarFile jar);
}
diff --git a/jdk/src/share/classes/sun/misc/URLClassPath.java b/jdk/src/share/classes/sun/misc/URLClassPath.java
index 5f56056..b7d8594 100644
--- a/jdk/src/share/classes/sun/misc/URLClassPath.java
+++ b/jdk/src/share/classes/sun/misc/URLClassPath.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,7 @@
import java.util.jar.Attributes.Name;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
+import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
@@ -69,6 +70,8 @@
private static final boolean DEBUG_LOOKUP_CACHE;
private static final boolean DISABLE_JAR_CHECKING;
private static final boolean DISABLE_ACC_CHECKING;
+ private static final boolean DISABLE_CP_URL_CHECK;
+ private static final boolean DEBUG_CP_URL_CHECK;
static {
JAVA_VERSION = java.security.AccessController.doPrivileged(
@@ -84,6 +87,13 @@
p = AccessController.doPrivileged(
new GetPropertyAction("jdk.net.URLClassPath.disableRestrictedPermissions"));
DISABLE_ACC_CHECKING = p != null ? p.equals("true") || p.equals("") : false;
+
+ // This property will be removed in a later release
+ p = AccessController.doPrivileged(
+ new GetPropertyAction("jdk.net.URLClassPath.disableClassPathURLCheck"));
+
+ DISABLE_CP_URL_CHECK = p != null ? p.equals("true") || p.isEmpty() : false;
+ DEBUG_CP_URL_CHECK = "debug".equals(p);
}
/* The original search path of URLs. */
@@ -977,8 +987,10 @@
{ return jar.getInputStream(entry); }
public int getContentLength()
{ return (int)entry.getSize(); }
- public Manifest getManifest() throws IOException
- { return jar.getManifest(); };
+ public Manifest getManifest() throws IOException {
+ SharedSecrets.javaUtilJarAccess().ensureInitialization(jar);
+ return jar.getManifest();
+ }
public Certificate[] getCertificates()
{ return entry.getCertificates(); };
public CodeSigner[] getCodeSigners()
@@ -1217,11 +1229,51 @@
int i = 0;
while (st.hasMoreTokens()) {
String path = st.nextToken();
- urls[i] = new URL(base, path);
- i++;
+ URL url = DISABLE_CP_URL_CHECK ? new URL(base, path) : safeResolve(base, path);
+ if (url != null) {
+ urls[i] = url;
+ i++;
+ }
+ }
+ if (i == 0) {
+ urls = null;
+ } else if (i != urls.length) {
+ // Truncate nulls from end of array
+ urls = Arrays.copyOf(urls, i);
}
return urls;
}
+
+ /*
+ * Return a URL for the given path resolved against the base URL, or
+ * null if the resulting URL is invalid.
+ */
+ static URL safeResolve(URL base, String path) {
+ String child = path.replace(File.separatorChar, '/');
+ try {
+ if (!URI.create(child).isAbsolute()) {
+ URL url = new URL(base, child);
+ if (base.getProtocol().equalsIgnoreCase("file")) {
+ return url;
+ } else {
+ String bp = base.getPath();
+ String urlp = url.getPath();
+ int pos = bp.lastIndexOf('/');
+ if (pos == -1) {
+ pos = bp.length() - 1;
+ }
+ if (urlp.regionMatches(0, bp, 0, pos + 1)
+ && urlp.indexOf("..", pos) == -1) {
+ return url;
+ }
+ }
+ }
+ } catch (MalformedURLException | IllegalArgumentException e) {}
+ if (DEBUG_CP_URL_CHECK) {
+ System.err.println("Class-Path entry: \"" + path + "\" ignored in JAR file " + base);
+ }
+ return null;
+ }
}
/*
diff --git a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
index 6116fae..4c5ec78 100644
--- a/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
+++ b/jdk/src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -2686,6 +2686,8 @@
// doesn't know about proxy.
useProxyResponseCode = true;
} else {
+ final URL prevURL = url;
+
// maintain previous headers, just change the name
// of the file we're getting
url = locUrl;
@@ -2714,6 +2716,14 @@
poster = null;
if (!checkReuseConnection())
connect();
+
+ if (!sameDestination(prevURL, url)) {
+ // Ensures pre-redirect user-set cookie will not be reset.
+ // CookieHandler, if any, will be queried to determine
+ // cookies for redirected URL, if any.
+ userCookies = null;
+ userCookies2 = null;
+ }
} else {
if (!checkReuseConnection())
connect();
@@ -2736,11 +2746,52 @@
}
requests.set("Host", host);
}
+
+ if (!sameDestination(prevURL, url)) {
+ // Redirecting to a different destination will drop any
+ // security-sensitive headers, regardless of whether
+ // they are user-set or not. CookieHandler, if any, will be
+ // queried to determine cookies for redirected URL, if any.
+ userCookies = null;
+ userCookies2 = null;
+ requests.remove("Cookie");
+ requests.remove("Cookie2");
+ requests.remove("Authorization");
+
+ // check for preemptive authorization
+ AuthenticationInfo sauth =
+ AuthenticationInfo.getServerAuth(url);
+ if (sauth != null && sauth.supportsPreemptiveAuthorization() ) {
+ // Sets "Authorization"
+ requests.setIfNotSet(sauth.getHeaderName(), sauth.getHeaderValue(url,method));
+ currentServerCredentials = sauth;
+ }
+ }
}
}
return true;
}
+ /* Returns true iff the given URLs have the same host and effective port. */
+ private static boolean sameDestination(URL firstURL, URL secondURL) {
+ assert firstURL.getProtocol().equalsIgnoreCase(secondURL.getProtocol()):
+ "protocols not equal: " + firstURL + " - " + secondURL;
+
+ if (!firstURL.getHost().equalsIgnoreCase(secondURL.getHost()))
+ return false;
+
+ int firstPort = firstURL.getPort();
+ if (firstPort == -1)
+ firstPort = firstURL.getDefaultPort();
+ int secondPort = secondURL.getPort();
+ if (secondPort == -1)
+ secondPort = secondURL.getDefaultPort();
+ if (firstPort != secondPort)
+ return false;
+
+ return true;
+ }
+
/* dummy byte buffer for reading off socket prior to closing */
byte[] cdata = new byte [128];
diff --git a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java
index 4921774..d1a0f3d 100644
--- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java
+++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -889,57 +889,62 @@
if (!isOpen())
return null;
- long filesize;
- do {
- filesize = nd.size(fd);
- } while ((filesize == IOStatus.INTERRUPTED) && isOpen());
- if (!isOpen())
- return null;
-
- if (filesize < position + size) { // Extend file size
- if (!writable) {
- throw new IOException("Channel not open for writing " +
- "- cannot extend file to required size");
- }
- int rv;
+ long mapSize;
+ int pagePosition;
+ synchronized (positionLock) {
+ long filesize;
do {
- rv = nd.truncate(fd, position + size);
- } while ((rv == IOStatus.INTERRUPTED) && isOpen());
+ filesize = nd.size(fd);
+ } while ((filesize == IOStatus.INTERRUPTED) && isOpen());
if (!isOpen())
return null;
- }
- if (size == 0) {
- addr = 0;
- // a valid file descriptor is not required
- FileDescriptor dummy = new FileDescriptor();
- if ((!writable) || (imode == MAP_RO))
- return Util.newMappedByteBufferR(0, 0, dummy, null);
- else
- return Util.newMappedByteBuffer(0, 0, dummy, null);
- }
- int pagePosition = (int)(position % allocationGranularity);
- long mapPosition = position - pagePosition;
- long mapSize = size + pagePosition;
- try {
- // If no exception was thrown from map0, the address is valid
- addr = map0(imode, mapPosition, mapSize);
- } catch (OutOfMemoryError x) {
- // An OutOfMemoryError may indicate that we've exhausted memory
- // so force gc and re-attempt map
- System.gc();
- try {
- Thread.sleep(100);
- } catch (InterruptedException y) {
- Thread.currentThread().interrupt();
+ if (filesize < position + size) { // Extend file size
+ if (!writable) {
+ throw new IOException("Channel not open for writing " +
+ "- cannot extend file to required size");
+ }
+ int rv;
+ do {
+ rv = nd.allocate(fd, position + size);
+ } while ((rv == IOStatus.INTERRUPTED) && isOpen());
+ if (!isOpen())
+ return null;
}
+
+ if (size == 0) {
+ addr = 0;
+ // a valid file descriptor is not required
+ FileDescriptor dummy = new FileDescriptor();
+ if ((!writable) || (imode == MAP_RO))
+ return Util.newMappedByteBufferR(0, 0, dummy, null);
+ else
+ return Util.newMappedByteBuffer(0, 0, dummy, null);
+ }
+
+ pagePosition = (int)(position % allocationGranularity);
+ long mapPosition = position - pagePosition;
+ mapSize = size + pagePosition;
try {
+ // If map0 did not throw an exception, the address is valid
addr = map0(imode, mapPosition, mapSize);
- } catch (OutOfMemoryError y) {
- // After a second OOME, fail
- throw new IOException("Map failed", y);
+ } catch (OutOfMemoryError x) {
+ // An OutOfMemoryError may indicate that we've exhausted
+ // memory so force gc and re-attempt map
+ System.gc();
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException y) {
+ Thread.currentThread().interrupt();
+ }
+ try {
+ addr = map0(imode, mapPosition, mapSize);
+ } catch (OutOfMemoryError y) {
+ // After a second OOME, fail
+ throw new IOException("Map failed", y);
+ }
}
- }
+ } // synchronized
// On Windows, and potentially other platforms, we need an open
// file descriptor for some mapping operations.
diff --git a/jdk/src/share/classes/sun/nio/ch/FileDispatcher.java b/jdk/src/share/classes/sun/nio/ch/FileDispatcher.java
index 5e9f82f..85ba029 100644
--- a/jdk/src/share/classes/sun/nio/ch/FileDispatcher.java
+++ b/jdk/src/share/classes/sun/nio/ch/FileDispatcher.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,8 @@
abstract int truncate(FileDescriptor fd, long size) throws IOException;
+ abstract int allocate(FileDescriptor fd, long size) throws IOException;
+
abstract long size(FileDescriptor fd) throws IOException;
abstract int lock(FileDescriptor fd, boolean blocking, long pos, long size,
diff --git a/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_it.properties b/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_it.properties
index 40b9c65..68252d6 100644
--- a/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_it.properties
+++ b/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_it.properties
@@ -1,6 +1,6 @@
#
#
-# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -24,5 +24,5 @@
# questions.
#
-rmiregistry.usage=Uso: {0} <opzioni> <porta>\n\ndove <opzioni> include:\n -J<flag fase di esecuzione> Passa l''argomento all''interprete java
+rmiregistry.usage=Uso: {0} <opzioni> <porta>\n\ndove <opzioni> include:\n -J<flag runtime> Passa l''argomento all''interprete java
rmiregistry.port.badnumber=l''argomento della porta, {0}, non \u00E8 un numero.
diff --git a/jdk/src/share/classes/sun/rmi/server/resources/rmid_de.properties b/jdk/src/share/classes/sun/rmi/server/resources/rmid_de.properties
index 4198822..77de018 100644
--- a/jdk/src/share/classes/sun/rmi/server/resources/rmid_de.properties
+++ b/jdk/src/share/classes/sun/rmi/server/resources/rmid_de.properties
@@ -1,6 +1,6 @@
#
#
-# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -43,7 +43,7 @@
rmid.syntax.log.required=Option -log ist erforderlich
# {0} = the (string) illegal argument in question
-rmid.syntax.illegal.option=Ung\u00FCltige Option: {0}
+rmid.syntax.illegal.option=Unzul\u00E4ssige Option: {0}
# {0} = the (string) reason text that came with a thrown exception
# "Activation.main" should not be translated, because it's a codepoint
diff --git a/jdk/src/share/classes/sun/rmi/server/resources/rmid_it.properties b/jdk/src/share/classes/sun/rmi/server/resources/rmid_it.properties
index d415613..1042c87 100644
--- a/jdk/src/share/classes/sun/rmi/server/resources/rmid_it.properties
+++ b/jdk/src/share/classes/sun/rmi/server/resources/rmid_it.properties
@@ -1,6 +1,6 @@
#
#
-# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -75,7 +75,7 @@
# "rmid", "-port", "-log", "-stop", "-C" and "-J" should not be translated,
# because they are syntax
-rmid.usage=Uso: {0} <opzioni>\n\ndove <opzioni> include:\n -port <porta> Specifica la porta usata da rmid\n -log <directory> Specifica la directory in cui rmid scrive il log\n -stop Arresta l''invocazione corrente di rmid (per la porta specificata)\n -C<flag fase di esecuzione> Passa l''argomento a ciascun processo figlio (gruppo di attivazione)\n -J<flag fase di esecuzione> Passa l''argomento all''interprete java\n
+rmid.usage=Uso: {0} <opzioni>\n\ndove <opzioni> include:\n -port <porta> Specifica la porta usata da rmid\n -log <directory> Specifica la directory in cui rmid scrive il log\n -stop Arresta l''invocazione corrente di rmid (per la porta specificata)\n -C<flag runtime> Passa l''argomento a ciascun processo figlio (gruppo di attivazione)\n -J<flag runtime> Passa l''argomento all''interprete java\n
# This means "The currently running activation daemon has been shut down,
# and is about to exit".
rmid.daemon.shutdown=daemon di attivazione terminato
diff --git a/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java b/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java
index f4cdfdb..bc34672 100644
--- a/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java
+++ b/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java
@@ -727,7 +727,6 @@
int magic = in.readInt();
if (magic == POST) {
- System.err.println("DISABLED: " + disableIncomingHttp);
if (disableIncomingHttp) {
throw new RemoteException("RMI over HTTP is disabled");
}
diff --git a/jdk/src/share/classes/sun/security/krb5/internal/rcache/AuthList.java b/jdk/src/share/classes/sun/security/krb5/internal/rcache/AuthList.java
index 1764271..c978417 100644
--- a/jdk/src/share/classes/sun/security/krb5/internal/rcache/AuthList.java
+++ b/jdk/src/share/classes/sun/security/krb5/internal/rcache/AuthList.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -55,6 +55,9 @@
private final LinkedList<AuthTimeWithHash> entries;
private final int lifespan;
+ // entries.getLast().ctime, updated after each cleanup.
+ private volatile int oldestTime = Integer.MIN_VALUE;
+
/**
* Constructs a AuthList.
*/
@@ -67,11 +70,13 @@
* Puts the authenticator timestamp into the cache in descending order,
* and throw an exception if it's already there.
*/
- public void put(AuthTimeWithHash t, KerberosTime currentTime)
+ public synchronized void put(AuthTimeWithHash t, KerberosTime currentTime)
throws KrbApErrException {
if (entries.isEmpty()) {
entries.addFirst(t);
+ oldestTime = t.ctime;
+ return;
} else {
AuthTimeWithHash temp = entries.getFirst();
int cmp = temp.compareTo(t);
@@ -106,24 +111,26 @@
// let us cleanup while we are here
long timeLimit = currentTime.getSeconds() - lifespan;
- ListIterator<AuthTimeWithHash> it = entries.listIterator(0);
- AuthTimeWithHash temp = null;
- int index = -1;
- while (it.hasNext()) {
- // search expired timestamps.
- temp = it.next();
- if (temp.ctime < timeLimit) {
- index = entries.indexOf(temp);
- break;
+
+ // Only trigger a cleanup when the earliest entry is
+ // lifespan + 5 sec ago. This ensures a cleanup is done
+ // at most every 5 seconds so that we don't always
+ // addLast(removeLast).
+ if (oldestTime > timeLimit - 5) {
+ return;
+ }
+
+ // and we remove the *enough* old ones (1 lifetime ago)
+ while (!entries.isEmpty()) {
+ AuthTimeWithHash removed = entries.removeLast();
+ if (removed.ctime >= timeLimit) {
+ entries.addLast(removed);
+ oldestTime = removed.ctime;
+ return;
}
}
- // It would be nice if LinkedList has a method called truncate(index).
- if (index > -1) {
- do {
- // remove expired timestamps from the list.
- entries.removeLast();
- } while(entries.size() > index);
- }
+
+ oldestTime = Integer.MIN_VALUE;
}
public boolean isEmpty() {
diff --git a/jdk/src/share/classes/sun/security/krb5/internal/rcache/MemoryCache.java b/jdk/src/share/classes/sun/security/krb5/internal/rcache/MemoryCache.java
index 403d97f..351f14e 100644
--- a/jdk/src/share/classes/sun/security/krb5/internal/rcache/MemoryCache.java
+++ b/jdk/src/share/classes/sun/security/krb5/internal/rcache/MemoryCache.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,9 @@
package sun.security.krb5.internal.rcache;
-import java.util.*;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
import sun.security.krb5.internal.KerberosTime;
import sun.security.krb5.internal.KrbApErrException;
import sun.security.krb5.internal.ReplayCache;
@@ -48,31 +50,18 @@
private static final int lifespan = KerberosTime.getDefaultSkew();
private static final boolean DEBUG = sun.security.krb5.internal.Krb5.DEBUG;
- private final Map<String,AuthList> content = new HashMap<>();
+ private final Map<String,AuthList> content = new ConcurrentHashMap<>();
@Override
public synchronized void checkAndStore(KerberosTime currTime, AuthTimeWithHash time)
throws KrbApErrException {
String key = time.client + "|" + time.server;
- AuthList rc = content.get(key);
+ content.computeIfAbsent(key, k -> new AuthList(lifespan))
+ .put(time, currTime);
if (DEBUG) {
System.out.println("MemoryCache: add " + time + " to " + key);
}
- if (rc == null) {
- rc = new AuthList(lifespan);
- rc.put(time, currTime);
- if (!rc.isEmpty()) {
- content.put(key, rc);
- }
- } else {
- if (DEBUG) {
- System.out.println("MemoryCache: Existing AuthList:\n" + rc);
- }
- rc.put(time, currTime);
- if (rc.isEmpty()) {
- content.remove(key);
- }
- }
+ // TODO: clean up AuthList entries with only expired AuthTimeWithHash objects.
}
public String toString() {
diff --git a/jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java b/jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java
index 7edef24..187ae31 100644
--- a/jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java
+++ b/jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -191,19 +191,24 @@
*/
@Override
void processMessage(byte type, int messageLen) throws IOException {
- if (state >= type
- && (type != HandshakeMessage.ht_hello_request)) {
- throw new SSLProtocolException(
- "Handshake message sequence violation, " + type);
- }
+
+ // check the handshake state
+ List<Byte> ignoredOptStates = handshakeState.check(type);
switch (type) {
case HandshakeMessage.ht_hello_request:
- this.serverHelloRequest(new HelloRequest(input));
+ HelloRequest helloRequest = new HelloRequest(input);
+ handshakeState.update(helloRequest, resumingSession);
+ this.serverHelloRequest(helloRequest);
break;
case HandshakeMessage.ht_server_hello:
- this.serverHello(new ServerHello(input, messageLen));
+ ServerHello serverHello = new ServerHello(input, messageLen);
+ this.serverHello(serverHello);
+
+ // This handshake state update needs the resumingSession value
+ // set by serverHello().
+ handshakeState.update(serverHello, resumingSession);
break;
case HandshakeMessage.ht_certificate:
@@ -213,7 +218,9 @@
"unexpected server cert chain");
// NOTREACHED
}
- this.serverCertificate(new CertificateMsg(input));
+ CertificateMsg certificateMsg = new CertificateMsg(input);
+ handshakeState.update(certificateMsg, resumingSession);
+ this.serverCertificate(certificateMsg);
serverKey =
session.getPeerCertificates()[0].getPublicKey();
break;
@@ -249,15 +256,20 @@
}
try {
- this.serverKeyExchange(new RSA_ServerKeyExchange(input));
+ RSA_ServerKeyExchange rsaSrvKeyExchange =
+ new RSA_ServerKeyExchange(input);
+ handshakeState.update(rsaSrvKeyExchange, resumingSession);
+ this.serverKeyExchange(rsaSrvKeyExchange);
} catch (GeneralSecurityException e) {
throwSSLException("Server key", e);
}
break;
case K_DH_ANON:
try {
- this.serverKeyExchange(new DH_ServerKeyExchange(
- input, protocolVersion));
+ DH_ServerKeyExchange dhSrvKeyExchange =
+ new DH_ServerKeyExchange(input, protocolVersion);
+ handshakeState.update(dhSrvKeyExchange, resumingSession);
+ this.serverKeyExchange(dhSrvKeyExchange);
} catch (GeneralSecurityException e) {
throwSSLException("Server key", e);
}
@@ -265,11 +277,14 @@
case K_DHE_DSS:
case K_DHE_RSA:
try {
- this.serverKeyExchange(new DH_ServerKeyExchange(
+ DH_ServerKeyExchange dhSrvKeyExchange =
+ new DH_ServerKeyExchange(
input, serverKey,
clnt_random.random_bytes, svr_random.random_bytes,
messageLen,
- getLocalSupportedSignAlgs(), protocolVersion));
+ getLocalSupportedSignAlgs(), protocolVersion);
+ handshakeState.update(dhSrvKeyExchange, resumingSession);
+ this.serverKeyExchange(dhSrvKeyExchange);
} catch (GeneralSecurityException e) {
throwSSLException("Server key", e);
}
@@ -278,10 +293,13 @@
case K_ECDHE_RSA:
case K_ECDH_ANON:
try {
- this.serverKeyExchange(new ECDH_ServerKeyExchange
+ ECDH_ServerKeyExchange ecdhSrvKeyExchange =
+ new ECDH_ServerKeyExchange
(input, serverKey, clnt_random.random_bytes,
svr_random.random_bytes,
- getLocalSupportedSignAlgs(), protocolVersion));
+ getLocalSupportedSignAlgs(), protocolVersion);
+ handshakeState.update(ecdhSrvKeyExchange, resumingSession);
+ this.serverKeyExchange(ecdhSrvKeyExchange);
} catch (GeneralSecurityException e) {
throwSSLException("Server key", e);
}
@@ -320,6 +338,7 @@
if (debug != null && Debug.isOn("handshake")) {
certRequest.print(System.out);
}
+ handshakeState.update(certRequest, resumingSession);
if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
Collection<SignatureAndHashAlgorithm> peerSignAlgs =
@@ -345,33 +364,23 @@
break;
case HandshakeMessage.ht_server_hello_done:
- this.serverHelloDone(new ServerHelloDone(input));
+ ServerHelloDone serverHelloDone = new ServerHelloDone(input);
+ handshakeState.update(serverHelloDone, resumingSession);
+ this.serverHelloDone(serverHelloDone);
break;
case HandshakeMessage.ht_finished:
- // A ChangeCipherSpec record must have been received prior to
- // reception of the Finished message (RFC 5246, 7.4.9).
- if (!receivedChangeCipherSpec()) {
- fatalSE(Alerts.alert_handshake_failure,
- "Received Finished message before ChangeCipherSpec");
- }
+ Finished serverFinished =
+ new Finished(protocolVersion, input, cipherSuite);
+ handshakeState.update(serverFinished, resumingSession);
+ this.serverFinished(serverFinished);
- this.serverFinished(
- new Finished(protocolVersion, input, cipherSuite));
break;
default:
throw new SSLProtocolException(
"Illegal client handshake msg, " + type);
}
-
- //
- // Move state machine forward if the message handling
- // code didn't already do so
- //
- if (state < type) {
- state = type;
- }
}
/*
@@ -389,7 +398,7 @@
// Could be (e.g. at connection setup) that we already
// sent the "client hello" but the server's not seen it.
//
- if (state < HandshakeMessage.ht_client_hello) {
+ if (!clientHelloDelivered) {
if (!secureRenegotiation && !allowUnsafeRenegotiation) {
// renegotiation is not allowed.
if (activeProtocolVersion.v >= ProtocolVersion.TLS10.v) {
@@ -613,7 +622,6 @@
// looks fine; resume it, and update the state machine.
resumingSession = true;
- state = HandshakeMessage.ht_finished - 1;
calculateConnectionKeys(session.getMasterSecret());
if (debug != null && Debug.isOn("session")) {
System.out.println("%% Server resumed " + session);
@@ -711,7 +719,8 @@
session = new SSLSessionImpl(protocolVersion, cipherSuite,
getLocalSupportedSignAlgs(),
mesg.sessionId, getHostSE(), getPortSE(),
- (extendedMasterSecretExt != null));
+ (extendedMasterSecretExt != null),
+ getEndpointIdentificationAlgorithmSE());
session.setRequestedServerNames(requestedServerNames);
setHandshakeSessionSE(session);
if (debug != null && Debug.isOn("handshake")) {
@@ -903,6 +912,7 @@
m1.print(System.out);
}
m1.write(output);
+ handshakeState.update(m1, resumingSession);
}
}
@@ -1067,6 +1077,7 @@
}
m2.write(output);
+ handshakeState.update(m2, resumingSession);
/*
* THIRD, send a "change_cipher_spec" record followed by the
@@ -1169,6 +1180,7 @@
m3.print(System.out);
}
m3.write(output);
+ handshakeState.update(m3, resumingSession);
output.doHashes();
}
@@ -1226,6 +1238,8 @@
if (resumingSession) {
input.digestNow();
sendChangeCipherAndFinish(true);
+ } else {
+ handshakeFinished = true;
}
session.setLastAccessedTime(System.currentTimeMillis());
@@ -1271,13 +1285,6 @@
if (secureRenegotiation) {
clientVerifyData = mesg.getVerifyData();
}
-
- /*
- * Update state machine so server MUST send 'finished' next.
- * (In "long" handshake case; in short case, we're responding
- * to its message.)
- */
- state = HandshakeMessage.ht_finished - 1;
}
@@ -1385,6 +1392,24 @@
}
}
+ // ensure that the endpoint identification algorithm matches the
+ // one in the session
+ String identityAlg = getEndpointIdentificationAlgorithmSE();
+ if (session != null && identityAlg != null) {
+
+ String sessionIdentityAlg =
+ session.getEndpointIdentificationAlgorithm();
+ if (!Objects.equals(identityAlg, sessionIdentityAlg)) {
+
+ if (debug != null && Debug.isOn("session")) {
+ System.out.println("%% can't resume, endpoint id" +
+ " algorithm does not match, requested: " +
+ identityAlg + ", cached: " + sessionIdentityAlg);
+ }
+ session = null;
+ }
+ }
+
if (session != null) {
if (debug != null) {
if (Debug.isOn("handshake") || Debug.isOn("session")) {
diff --git a/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java b/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java
index 976b76e..f453b65 100644
--- a/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java
+++ b/jdk/src/share/classes/sun/security/ssl/HandshakeMessage.java
@@ -89,6 +89,8 @@
static final byte ht_finished = 20;
+ static final byte ht_not_applicable = -1; // N/A
+
/* Class and subclass dynamic debugging support */
public static final Debug debug = Debug.getInstance("ssl");
diff --git a/jdk/src/share/classes/sun/security/ssl/HandshakeStateManager.java b/jdk/src/share/classes/sun/security/ssl/HandshakeStateManager.java
new file mode 100644
index 0000000..d1dcea0
--- /dev/null
+++ b/jdk/src/share/classes/sun/security/ssl/HandshakeStateManager.java
@@ -0,0 +1,765 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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.security.ssl;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.HashMap;
+import javax.net.ssl.SSLProtocolException;
+
+import static sun.security.ssl.CipherSuite.KeyExchange;
+import static sun.security.ssl.CipherSuite.KeyExchange.*;
+import static sun.security.ssl.HandshakeStateManager.HandshakeState.*;
+import static sun.security.ssl.HandshakeMessage.*;
+
+/*
+ * Handshake state manager.
+ *
+ * Messages flow for a full handshake:
+ *
+ * - -
+ * | HelloRequest (No.0, RFC 5246) [*] |
+ * | <-------------------------------------------- |
+ * | |
+ * | ClientHello (No.1, RFC 5246) |
+ * | --------------------------------------------> |
+ * | |
+ * C | ServerHello (No.2, RFC 5246) | S
+ * L | SupplementalData (No.23, RFC4680) [*] | E
+ * I | Certificate (No.11, RFC 5246) [*] | R
+ * E | CertificateStatus (No.22, RFC 6066) [*] | V
+ * N | ServerKeyExchange (No.12, RFC 5246) [*] | E
+ * T | CertificateRequest (No.13, RFC 5246) [*] | R
+ * | ServerHelloDone (No.14, RFC 5246) |
+ * | <-------------------------------------------- |
+ * | |
+ * | SupplementalData (No.23, RFC4680) [*] |
+ * | Certificate (No.11, RFC 5246) [*] Or |
+ * | CertificateURL (No.21, RFC6066) [*] |
+ * | ClientKeyExchange (No.16, RFC 5246) |
+ * | CertificateVerify (No.15, RFC 5246) [*] |
+ * | [ChangeCipherSpec] (RFC 5246) |
+ * | Finished (No.20, RFC 5246) |
+ * | --------------------------------------------> |
+ * | |
+ * | NewSessionTicket (No.4, RFC4507) [*] |
+ * | [ChangeCipherSpec] (RFC 5246) |
+ * | Finished (No.20, RFC 5246) |
+ * | <-------------------------------------------- |
+ * - -
+ * [*] Indicates optional or situation-dependent messages that are not
+ * always sent.
+ *
+ * Message flow for an abbreviated handshake:
+ * - -
+ * | ClientHello (No.1, RFC 5246) |
+ * | --------------------------------------------> |
+ * | |
+ * C | ServerHello (No.2, RFC 5246) | S
+ * L | NewSessionTicket (No.4, RFC4507) [*] | E
+ * I | [ChangeCipherSpec] (RFC 5246) | R
+ * E | Finished (No.20, RFC 5246) | V
+ * N | <-------------------------------------------- | E
+ * T | | R
+ * | [ChangeCipherSpec] (RFC 5246) |
+ * | Finished (No.20, RFC 5246) |
+ * | --------------------------------------------> |
+ * - -
+ *
+ *
+ * State machine of handshake states:
+ *
+ * +--------------+
+ * START -----> | HelloRequest |
+ * | +--------------+
+ * | |
+ * v v
+ * +---------------------+ --> +---------------------+
+ * | ClientHello | | HelloVerifyRequest |
+ * +---------------------+ <-- +---------------------+
+ * |
+ * |
+ * =========================================================================
+ * |
+ * v
+ * +---------------------+
+ * | ServerHello | ----------------------------------+------+
+ * +---------------------+ --> +-------------------------+ | |
+ * | | Server SupplementalData | | |
+ * | +-------------------------+ | |
+ * | | | |
+ * v v | |
+ * +---------------------+ | |
+ * +---- | Server Certificate | | |
+ * | +---------------------+ | |
+ * | | | |
+ * | | +--------------------+ | |
+ * | +-> | CertificateStatus | | |
+ * | | +--------------------+ v |
+ * | | | | +--------------------+ |
+ * | v v +--> | ServerKeyExchange | |
+ * | +---------------------+ | +--------------------+ |
+ * | | CertificateRequest | | | |
+ * | +---------------------+ <-+---------+ |
+ * | | | | |
+ * v v | | |
+ * +---------------------+ <-------+ | |
+ * | ServerHelloDone | <-----------------+ |
+ * +---------------------+ |
+ * | | |
+ * | | |
+ * | | |
+ * =========================================================================
+ * | | |
+ * | v |
+ * | +-------------------------+ |
+ * | | Client SupplementalData | --------------+ |
+ * | +-------------------------+ | |
+ * | | | |
+ * | v | |
+ * | +--------------------+ | |
+ * +-> | Client Certificate | ALT. | |
+ * | +--------------------+----------------+ | |
+ * | | CertificateURL | | |
+ * | +----------------+ | |
+ * v | |
+ * +-------------------+ <------------------------+ |
+ * | ClientKeyExchange | |
+ * +-------------------+ |
+ * | | |
+ * | v |
+ * | +-------------------+ |
+ * | | CertificateVerify | |
+ * | +-------------------+ |
+ * | | |
+ * v v |
+ * +-------------------------+ |
+ * | Client ChangeCipherSpec | <---------------+ |
+ * +-------------------------+ | |
+ * | | |
+ * v | |
+ * +-----------------+ (abbreviated) | |
+ * | Client Finished | -------------> END | |
+ * +-----------------+ (Abbreviated handshake) | |
+ * | | |
+ * | (full) | |
+ * | | |
+ * ================================ | |
+ * | | |
+ * | ================================
+ * | | |
+ * v | |
+ * +------------------+ | (abbreviated) |
+ * | NewSessionTicket | <--------------------------------+
+ * +------------------+ | |
+ * | | |
+ * v | |
+ * +-------------------------+ | (abbreviated) |
+ * | Server ChangeCipherSpec | <-------------------------------------+
+ * +-------------------------+ |
+ * | |
+ * v |
+ * +-----------------+ (abbreviated) |
+ * | Server Finished | -------------------------+
+ * +-----------------+
+ * | (full)
+ * v
+ * END (Full handshake)
+ *
+ *
+ * The scenarios of the use of this class:
+ * 1. Create an instance of HandshakeStateManager during the initializtion
+ * handshake.
+ * 2. If receiving a handshake message, call HandshakeStateManager.check()
+ * to make sure that the message is of the expected handshake type. And
+ * then call HandshakeStateManager.update() in case handshake states may
+ * be impacted by this new incoming handshake message.
+ * 3. On delivering a handshake message, call HandshakeStateManager.update()
+ * in case handshake states may by thie new outgoing handshake message.
+ * 4. On receiving and delivering ChangeCipherSpec message, call
+ * HandshakeStateManager.changeCipherSpec() to check the present sequence
+ * of this message, and update the states if necessary.
+ */
+final class HandshakeStateManager {
+ // upcoming handshake states.
+ private LinkedList<HandshakeState> upcomingStates;
+ private LinkedList<HandshakeState> alternatives;
+
+ private static final boolean debugIsOn;
+
+ private static final HashMap<Byte, String> handshakeTypes;
+
+ static {
+ debugIsOn = (Handshaker.debug != null) &&
+ Debug.isOn("handshake") && Debug.isOn("verbose");
+ handshakeTypes = new HashMap<>(8);
+
+ handshakeTypes.put(ht_hello_request, "hello_request");
+ handshakeTypes.put(ht_client_hello, "client_hello");
+ handshakeTypes.put(ht_server_hello, "server_hello");
+ handshakeTypes.put(ht_certificate, "certificate");
+ handshakeTypes.put(ht_server_key_exchange, "server_key_exchange");
+ handshakeTypes.put(ht_server_hello_done, "server_hello_done");
+ handshakeTypes.put(ht_certificate_verify, "certificate_verify");
+ handshakeTypes.put(ht_client_key_exchange, "client_key_exchange");
+ handshakeTypes.put(ht_finished, "finished");
+ }
+
+ HandshakeStateManager() {
+ this.upcomingStates = new LinkedList<>();
+ this.alternatives = new LinkedList<>();
+ }
+
+ //
+ // enumation of handshake type
+ //
+ static enum HandshakeState {
+ HS_HELLO_REQUEST(
+ "hello_request",
+ HandshakeMessage.ht_hello_request),
+ HS_CLIENT_HELLO(
+ "client_hello",
+ HandshakeMessage.ht_client_hello),
+ HS_SERVER_HELLO(
+ "server_hello",
+ HandshakeMessage.ht_server_hello),
+ HS_SERVER_CERTIFICATE(
+ "server certificate",
+ HandshakeMessage.ht_certificate),
+ HS_SERVER_KEY_EXCHANGE(
+ "server_key_exchange",
+ HandshakeMessage.ht_server_key_exchange, true),
+ HS_CERTIFICATE_REQUEST(
+ "certificate_request",
+ HandshakeMessage.ht_certificate_request, true),
+ HS_SERVER_HELLO_DONE(
+ "server_hello_done",
+ HandshakeMessage.ht_server_hello_done),
+ HS_CLIENT_CERTIFICATE(
+ "client certificate",
+ HandshakeMessage.ht_certificate, true),
+ HS_CLIENT_KEY_EXCHANGE(
+ "client_key_exchange",
+ HandshakeMessage.ht_client_key_exchange),
+ HS_CERTIFICATE_VERIFY(
+ "certificate_verify",
+ HandshakeMessage.ht_certificate_verify, true),
+ HS_CLIENT_CHANGE_CIPHER_SPEC(
+ "client change_cipher_spec",
+ HandshakeMessage.ht_not_applicable),
+ HS_CLIENT_FINISHED(
+ "client finished",
+ HandshakeMessage.ht_finished),
+ HS_SERVER_CHANGE_CIPHER_SPEC(
+ "server change_cipher_spec",
+ HandshakeMessage.ht_not_applicable),
+ HS_SERVER_FINISHED(
+ "server finished",
+ HandshakeMessage.ht_finished);
+
+ final String description;
+ final byte handshakeType;
+ final boolean isOptional;
+
+ HandshakeState(String description, byte handshakeType) {
+ this.description = description;
+ this.handshakeType = handshakeType;
+ this.isOptional = false;
+ }
+
+ HandshakeState(String description,
+ byte handshakeType, boolean isOptional) {
+
+ this.description = description;
+ this.handshakeType = handshakeType;
+ this.isOptional = isOptional;
+ }
+
+ public String toString() {
+ return description + "[" + handshakeType + "]" +
+ (isOptional ? "(optional)" : "");
+ }
+ }
+
+ boolean isEmpty() {
+ return upcomingStates.isEmpty();
+ }
+
+ List<Byte> check(byte handshakeType) throws SSLProtocolException {
+ List<Byte> ignoredOptional = new LinkedList<>();
+ String exceptionMsg =
+ "Handshake message sequence violation, " + handshakeType;
+
+ if (debugIsOn) {
+ System.out.println(
+ "check handshake state: " + toString(handshakeType));
+ }
+
+ if (upcomingStates.isEmpty()) {
+ // Is it a kickstart message?
+ if ((handshakeType != HandshakeMessage.ht_hello_request) &&
+ (handshakeType != HandshakeMessage.ht_client_hello)) {
+ throw new SSLProtocolException(
+ "Handshake message sequence violation, " + handshakeType);
+ }
+
+ // It is a kickstart message.
+ return Collections.emptyList();
+ }
+
+ // Ignore the checking for HelloRequest messages as they
+ // may be sent by the server at any time.
+ if (handshakeType == HandshakeMessage.ht_hello_request) {
+ return Collections.emptyList();
+ }
+
+ for (HandshakeState handshakeState : upcomingStates) {
+ if (handshakeState.handshakeType == handshakeType) {
+ // It's the expected next handshake type.
+ return ignoredOptional;
+ }
+
+ if (handshakeState.isOptional) {
+ ignoredOptional.add(handshakeState.handshakeType);
+ continue;
+ } else {
+ for (HandshakeState alternative : alternatives) {
+ if (alternative.handshakeType == handshakeType) {
+ return ignoredOptional;
+ }
+
+ if (alternative.isOptional) {
+ continue;
+ } else {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+ }
+ }
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // Not an expected Handshake message.
+ throw new SSLProtocolException(
+ "Handshake message sequence violation, " + handshakeType);
+ }
+
+ void update(HandshakeMessage handshakeMessage,
+ boolean isAbbreviated) throws SSLProtocolException {
+
+ byte handshakeType = (byte)handshakeMessage.messageType();
+ String exceptionMsg =
+ "Handshake message sequence violation, " + handshakeType;
+
+ if (debugIsOn) {
+ System.out.println(
+ "update handshake state: " + toString(handshakeType));
+ }
+
+ boolean hasPresentState = false;
+ switch (handshakeType) {
+ case HandshakeMessage.ht_hello_request:
+ //
+ // State machine:
+ // PRESENT: START
+ // TO : ClientHello
+ //
+
+ // No old state to update.
+
+ // Add the upcoming states.
+ if (!upcomingStates.isEmpty()) {
+ // A ClientHello message should be followed.
+ upcomingStates.add(HS_CLIENT_HELLO);
+
+ } // Otherwise, ignore this HelloRequest message.
+
+ break;
+
+ case HandshakeMessage.ht_client_hello:
+ //
+ // State machine:
+ // PRESENT: START
+ // HS_CLIENT_HELLO
+ // TO : HS_SERVER_HELLO
+ //
+
+ // Check and update the present state.
+ if (!upcomingStates.isEmpty()) {
+ // The current state should be HS_CLIENT_HELLO.
+ HandshakeState handshakeState = upcomingStates.pop();
+ if (handshakeState != HS_CLIENT_HELLO) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+ }
+
+ // Add the upcoming states.
+ ClientHello clientHello = (ClientHello)handshakeMessage;
+ upcomingStates.add(HS_SERVER_HELLO);
+
+ break;
+
+ case HandshakeMessage.ht_server_hello:
+ //
+ // State machine:
+ // PRESENT: HS_SERVER_HELLO
+ // TO :
+ // Full handshake state stacks
+ // (ServerHello Flight)
+ // HS_SERVER_SUPPLEMENTAL_DATA [optional]
+ // --> HS_SERVER_CERTIFICATE [optional]
+ // --> HS_CERTIFICATE_STATUS [optional]
+ // --> HS_SERVER_KEY_EXCHANGE [optional]
+ // --> HS_CERTIFICATE_REQUEST [optional]
+ // --> HS_SERVER_HELLO_DONE
+ // (Client ClientKeyExchange Flight)
+ // --> HS_CLIENT_SUPPLEMENTAL_DATA [optional]
+ // --> HS_CLIENT_CERTIFICATE or
+ // HS_CERTIFICATE_URL
+ // --> HS_CLIENT_KEY_EXCHANGE
+ // --> HS_CERTIFICATE_VERIFY [optional]
+ // --> HS_CLIENT_CHANGE_CIPHER_SPEC
+ // --> HS_CLIENT_FINISHED
+ // (Server Finished Flight)
+ // --> HS_CLIENT_SUPPLEMENTAL_DATA [optional]
+ //
+ // Abbreviated handshake state stacks
+ // (Server Finished Flight)
+ // HS_NEW_SESSION_TICKET
+ // --> HS_SERVER_CHANGE_CIPHER_SPEC
+ // --> HS_SERVER_FINISHED
+ // (Client Finished Flight)
+ // --> HS_CLIENT_CHANGE_CIPHER_SPEC
+ // --> HS_CLIENT_FINISHED
+ //
+ // Note that this state may have an alternative option.
+
+ // Check and update the present state.
+ if (!upcomingStates.isEmpty()) {
+ // The current state should be HS_SERVER_HELLO
+ HandshakeState handshakeState = upcomingStates.pop();
+ HandshakeState alternative = null;
+ if (!alternatives.isEmpty()) {
+ alternative = alternatives.pop();
+ }
+
+ if ((handshakeState != HS_SERVER_HELLO) &&
+ (alternative != HS_SERVER_HELLO)) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+ } else {
+ // No present state.
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // Add the upcoming states.
+ ServerHello serverHello = (ServerHello)handshakeMessage;
+ HelloExtensions hes = serverHello.extensions;
+
+
+ // Not support SessionTicket extension yet.
+ //
+ // boolean hasSessionTicketExt =
+ // (hes.get(HandshakeMessage.ht_new_session_ticket) != null);
+
+ if (isAbbreviated) {
+ // Not support SessionTicket extension yet.
+ //
+ // // Mandatory NewSessionTicket message
+ // if (hasSessionTicketExt) {
+ // upcomingStates.add(HS_NEW_SESSION_TICKET);
+ // }
+
+ // Mandatory server ChangeCipherSpec and Finished messages
+ upcomingStates.add(HS_SERVER_CHANGE_CIPHER_SPEC);
+ upcomingStates.add(HS_SERVER_FINISHED);
+
+ // Mandatory client ChangeCipherSpec and Finished messages
+ upcomingStates.add(HS_CLIENT_CHANGE_CIPHER_SPEC);
+ upcomingStates.add(HS_CLIENT_FINISHED);
+ } else {
+ // Not support SupplementalData extension yet.
+ //
+ // boolean hasSupplementalDataExt =
+ // (hes.get(HandshakeMessage.ht_supplemental_data) != null);
+
+ // Not support CertificateURL extension yet.
+ //
+ // boolean hasCertificateUrlExt =
+ // (hes.get(ExtensionType EXT_CLIENT_CERTIFICATE_URL)
+ // != null);
+
+ // Not support SupplementalData extension yet.
+ //
+ // // Optional SupplementalData message
+ // if (hasSupplementalDataExt) {
+ // upcomingStates.add(HS_SERVER_SUPPLEMENTAL_DATA);
+ // }
+
+ // Need server Certificate message or not?
+ KeyExchange keyExchange = serverHello.cipherSuite.keyExchange;
+ if ((keyExchange != K_KRB5) &&
+ (keyExchange != K_KRB5_EXPORT) &&
+ (keyExchange != K_DH_ANON) &&
+ (keyExchange != K_ECDH_ANON)) {
+ // Mandatory Certificate message
+ upcomingStates.add(HS_SERVER_CERTIFICATE);
+ }
+
+ // Need ServerKeyExchange message or not?
+ if ((keyExchange == K_RSA_EXPORT) ||
+ (keyExchange == K_DHE_RSA) ||
+ (keyExchange == K_DHE_DSS) ||
+ (keyExchange == K_DH_ANON) ||
+ (keyExchange == K_ECDHE_RSA) ||
+ (keyExchange == K_ECDHE_ECDSA) ||
+ (keyExchange == K_ECDH_ANON)) {
+ // Optional ServerKeyExchange message
+ upcomingStates.add(HS_SERVER_KEY_EXCHANGE);
+ }
+
+ // Optional CertificateRequest message
+ upcomingStates.add(HS_CERTIFICATE_REQUEST);
+
+ // Mandatory ServerHelloDone message
+ upcomingStates.add(HS_SERVER_HELLO_DONE);
+
+ // Not support SupplementalData extension yet.
+ //
+ // // Optional SupplementalData message
+ // if (hasSupplementalDataExt) {
+ // upcomingStates.add(HS_CLIENT_SUPPLEMENTAL_DATA);
+ // }
+
+ // Optional client Certificate message
+ upcomingStates.add(HS_CLIENT_CERTIFICATE);
+
+ // Not support CertificateURL extension yet.
+ //
+ // // Alternative CertificateURL message, optional too.
+ // //
+ // // Please put CertificateURL rather than Certificate
+ // // message in the alternatives list. So that we can
+ // // simplify the process of this alternative pair later.
+ // if (hasCertificateUrlExt) {
+ // alternatives.add(HS_CERTIFICATE_URL);
+ // }
+
+ // Mandatory ClientKeyExchange message
+ upcomingStates.add(HS_CLIENT_KEY_EXCHANGE);
+
+ // Optional CertificateVerify message
+ upcomingStates.add(HS_CERTIFICATE_VERIFY);
+
+ // Mandatory client ChangeCipherSpec and Finished messages
+ upcomingStates.add(HS_CLIENT_CHANGE_CIPHER_SPEC);
+ upcomingStates.add(HS_CLIENT_FINISHED);
+
+ // Not support SessionTicket extension yet.
+ //
+ // // Mandatory NewSessionTicket message
+ // if (hasSessionTicketExt) {
+ // upcomingStates.add(HS_NEW_SESSION_TICKET);
+ // }
+
+ // Mandatory server ChangeCipherSpec and Finished messages
+ upcomingStates.add(HS_SERVER_CHANGE_CIPHER_SPEC);
+ upcomingStates.add(HS_SERVER_FINISHED);
+ }
+
+ break;
+
+ case HandshakeMessage.ht_certificate:
+ //
+ // State machine:
+ // PRESENT: HS_CERTIFICATE_URL or
+ // HS_CLIENT_CERTIFICATE
+ // TO : HS_CLIENT_KEY_EXCHANGE
+ //
+ // Or
+ //
+ // PRESENT: HS_SERVER_CERTIFICATE
+ // TO : HS_CERTIFICATE_STATUS [optional]
+ // HS_SERVER_KEY_EXCHANGE [optional]
+ // HS_CERTIFICATE_REQUEST [optional]
+ // HS_SERVER_HELLO_DONE
+ //
+ // Note that this state may have an alternative option.
+
+ // Check and update the present state.
+ while (!upcomingStates.isEmpty()) {
+ HandshakeState handshakeState = upcomingStates.pop();
+ if (handshakeState.handshakeType == handshakeType) {
+ hasPresentState = true;
+
+ // The current state should be HS_CLIENT_CERTIFICATE or
+ // HS_SERVER_CERTIFICATE.
+ //
+ // Note that we won't put HS_CLIENT_CERTIFICATE into
+ // the alternative list.
+ if ((handshakeState != HS_CLIENT_CERTIFICATE) &&
+ (handshakeState != HS_SERVER_CERTIFICATE)) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // Is it an expected client Certificate message?
+ boolean isClientMessage = false;
+ if (!upcomingStates.isEmpty()) {
+ // If the next expected message is ClientKeyExchange,
+ // this one should be an expected client Certificate
+ // message.
+ HandshakeState nextState = upcomingStates.getFirst();
+ if (nextState == HS_CLIENT_KEY_EXCHANGE) {
+ isClientMessage = true;
+ }
+ }
+
+ if (isClientMessage) {
+ if (handshakeState != HS_CLIENT_CERTIFICATE) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // Not support CertificateURL extension yet.
+ /*******************************************
+ // clear up the alternatives list
+ if (!alternatives.isEmpty()) {
+ HandshakeState alternative = alternatives.pop();
+
+ if (alternative != HS_CERTIFICATE_URL) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+ }
+ ********************************************/
+ } else {
+ if ((handshakeState != HS_SERVER_CERTIFICATE)) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+ }
+
+ break;
+ } else if (!handshakeState.isOptional) {
+ throw new SSLProtocolException(exceptionMsg);
+ } // Otherwise, looking for next state track.
+ }
+
+ // No present state.
+ if (!hasPresentState) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // no new upcoming states.
+
+ break;
+
+ default:
+ // Check and update the present state.
+ while (!upcomingStates.isEmpty()) {
+ HandshakeState handshakeState = upcomingStates.pop();
+ if (handshakeState.handshakeType == handshakeType) {
+ hasPresentState = true;
+ break;
+ } else if (!handshakeState.isOptional) {
+ throw new SSLProtocolException(exceptionMsg);
+ } // Otherwise, looking for next state track.
+ }
+
+ // No present state.
+ if (!hasPresentState) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // no new upcoming states.
+ }
+
+ if (debugIsOn) {
+ for (HandshakeState handshakeState : upcomingStates) {
+ System.out.println(
+ "upcoming handshake states: " + handshakeState);
+ }
+ for (HandshakeState handshakeState : alternatives) {
+ System.out.println(
+ "upcoming handshake alternative state: " + handshakeState);
+ }
+ }
+ }
+
+ void changeCipherSpec(boolean isInput,
+ boolean isClient) throws SSLProtocolException {
+
+ if (debugIsOn) {
+ System.out.println(
+ "update handshake state: change_cipher_spec");
+ }
+
+ String exceptionMsg = "ChangeCipherSpec message sequence violation";
+
+ HandshakeState expectedState;
+ if ((isClient && isInput) || (!isClient && !isInput)) {
+ expectedState = HS_SERVER_CHANGE_CIPHER_SPEC;
+ } else {
+ expectedState = HS_CLIENT_CHANGE_CIPHER_SPEC;
+ }
+
+ boolean hasPresentState = false;
+
+ // Check and update the present state.
+ while (!upcomingStates.isEmpty()) {
+ HandshakeState handshakeState = upcomingStates.pop();
+ if (handshakeState == expectedState) {
+ hasPresentState = true;
+ break;
+ } else if (!handshakeState.isOptional) {
+ throw new SSLProtocolException(exceptionMsg);
+ } // Otherwise, looking for next state track.
+ }
+
+ // No present state.
+ if (!hasPresentState) {
+ throw new SSLProtocolException(exceptionMsg);
+ }
+
+ // no new upcoming states.
+
+ if (debugIsOn) {
+ for (HandshakeState handshakeState : upcomingStates) {
+ System.out.println(
+ "upcoming handshake states: " + handshakeState);
+ }
+ for (HandshakeState handshakeState : alternatives) {
+ System.out.println(
+ "upcoming handshake alternative state: " + handshakeState);
+ }
+ }
+ }
+
+ private static String toString(byte handshakeType) {
+ String s = handshakeTypes.get(handshakeType);
+ if (s == null) {
+ s = "unknown";
+ }
+ return (s + "[" + handshakeType + "]");
+ }
+}
diff --git a/jdk/src/share/classes/sun/security/ssl/Handshaker.java b/jdk/src/share/classes/sun/security/ssl/Handshaker.java
index 8e570c4..beee9fd 100644
--- a/jdk/src/share/classes/sun/security/ssl/Handshaker.java
+++ b/jdk/src/share/classes/sun/security/ssl/Handshaker.java
@@ -118,10 +118,14 @@
HandshakeHash handshakeHash;
HandshakeInStream input;
HandshakeOutStream output;
- int state;
SSLContextImpl sslContext;
RandomCookie clnt_random, svr_random;
SSLSessionImpl session;
+ HandshakeStateManager handshakeState;
+ boolean clientHelloDelivered;
+ boolean serverHelloRequested;
+ boolean handshakeActivated;
+ boolean handshakeFinished;
// current CipherSuite. Never null, initially SSL_NULL_WITH_NULL_NULL
CipherSuite cipherSuite;
@@ -135,10 +139,6 @@
// True if it's OK to start a new SSL session
boolean enableNewSession;
- // True if session keys have been calculated and the caller may receive
- // and process a ChangeCipherSpec message
- private boolean sessKeysCalculated;
-
// Whether local cipher suites preference should be honored during
// handshaking?
//
@@ -277,9 +277,13 @@
this.secureRenegotiation = secureRenegotiation;
this.clientVerifyData = clientVerifyData;
this.serverVerifyData = serverVerifyData;
- enableNewSession = true;
- invalidated = false;
- sessKeysCalculated = false;
+ this.enableNewSession = true;
+ this.invalidated = false;
+ this.handshakeState = new HandshakeStateManager();
+ this.clientHelloDelivered = false;
+ this.serverHelloRequested = false;
+ this.handshakeActivated = false;
+ this.handshakeFinished = false;
setCipherSuite(CipherSuite.C_NULL);
setEnabledProtocols(enabledProtocols);
@@ -289,22 +293,6 @@
} else { // engine != null
algorithmConstraints = new SSLAlgorithmConstraints(engine, true);
}
-
-
- //
- // In addition to the connection state machine, controlling
- // how the connection deals with the different sorts of records
- // that get sent (notably handshake transitions!), there's
- // also a handshaking state machine that controls message
- // sequencing.
- //
- // It's a convenient artifact of the protocol that this can,
- // with only a couple of minor exceptions, be driven by the
- // type constant for the last message seen: except for the
- // client's cert verify, those constants are in a convenient
- // order to drastically simplify state machine checking.
- //
- state = -2; // initialized but not activated
}
/*
@@ -386,14 +374,6 @@
}
}
- final boolean receivedChangeCipherSpec() {
- if (conn != null) {
- return conn.receivedChangeCipherSpec();
- } else {
- return engine.receivedChangeCipherSpec();
- }
- }
-
String getEndpointIdentificationAlgorithmSE() {
SSLParameters paras;
if (conn != null) {
@@ -573,8 +553,7 @@
engine.outputRecord.setHelloVersion(helloVersion);
}
- // move state to activated
- state = -1;
+ handshakeActivated = true;
}
/**
@@ -919,10 +898,9 @@
* this freshly created session can become the current one.
*/
boolean isDone() {
- return state == HandshakeMessage.ht_finished;
+ return started() && handshakeState.isEmpty() && handshakeFinished;
}
-
/*
* Returns the session which was created through this
* handshake sequence ... should be called after isDone()
@@ -1028,6 +1006,13 @@
return;
}
+ // Set the flags in the message receiving side.
+ if (messageType == HandshakeMessage.ht_client_hello) {
+ clientHelloDelivered = true;
+ } else if (messageType == HandshakeMessage.ht_hello_request) {
+ serverHelloRequested = true;
+ }
+
/*
* Process the message. We require
* that processMessage() consumes the entire message. In
@@ -1062,15 +1047,14 @@
* In activated state, the handshaker may not send any messages out.
*/
boolean activated() {
- return state >= -1;
+ return handshakeActivated;
}
/**
* Returns true iff the handshaker has sent any messages.
*/
boolean started() {
- return state >= 0; // 0: HandshakeMessage.ht_hello_request
- // 1: HandshakeMessage.ht_client_hello
+ return (serverHelloRequested || clientHelloDelivered);
}
@@ -1080,11 +1064,13 @@
* the subclass returns. NOP if handshaking's already started.
*/
void kickstart() throws IOException {
- if (state >= 0) {
+ if ((isClient && clientHelloDelivered) ||
+ (!isClient && serverHelloRequested)) {
return;
}
HandshakeMessage m = getKickstartMessage();
+ handshakeState.update(m, resumingSession);
if (debug != null && Debug.isOn("handshake")) {
m.print(System.out);
@@ -1092,7 +1078,14 @@
m.write(output);
output.flush();
- state = m.messageType();
+ // Set the flags in the message delivering side.
+ int handshakeType = m.messageType();
+ if (handshakeType == HandshakeMessage.ht_hello_request) {
+ serverHelloRequested = true;
+ } else { // HandshakeMessage.ht_client_hello
+ clientHelloDelivered = true;
+ }
+
}
/**
@@ -1124,16 +1117,6 @@
output.flush(); // i.e. handshake data
- /*
- * The write cipher state is protected by the connection write lock
- * so we must grab it while making the change. We also
- * make sure no writes occur between sending the ChangeCipherSpec
- * message, installing the new cipher state, and sending the
- * Finished message.
- *
- * We already hold SSLEngine/SSLSocket "this" by virtue
- * of this being called from the readRecord code.
- */
OutputRecord r;
if (conn != null) {
r = new OutputRecord(Record.ct_change_cipher_spec);
@@ -1144,14 +1127,27 @@
r.setVersion(protocolVersion);
r.write(1); // single byte of data
+ /*
+ * The write cipher state is protected by the connection write lock
+ * so we must grab it while making the change. We also
+ * make sure no writes occur between sending the ChangeCipherSpec
+ * message, installing the new cipher state, and sending the
+ * Finished message.
+ *
+ * We already hold SSLEngine/SSLSocket "this" by virtue
+ * of this being called from the readRecord code.
+ */
if (conn != null) {
conn.writeLock.lock();
try {
+ handshakeState.changeCipherSpec(false, isClient);
conn.writeRecord(r);
conn.changeWriteCiphers();
if (debug != null && Debug.isOn("handshake")) {
mesg.print(System.out);
}
+
+ handshakeState.update(mesg, resumingSession);
mesg.write(output);
output.flush();
} finally {
@@ -1159,19 +1155,28 @@
}
} else {
synchronized (engine.writeLock) {
+ handshakeState.changeCipherSpec(false, isClient);
engine.writeRecord((EngineOutputRecord)r);
engine.changeWriteCiphers();
if (debug != null && Debug.isOn("handshake")) {
mesg.print(System.out);
}
- mesg.write(output);
+ handshakeState.update(mesg, resumingSession);
+ mesg.write(output);
if (lastMessage) {
output.setFinishedMsg();
}
output.flush();
}
}
+ if (lastMessage) {
+ handshakeFinished = true;
+ }
+ }
+
+ void receiveChangeCipherSpec() throws IOException {
+ handshakeState.changeCipherSpec(true, isClient);
}
/*
@@ -1353,10 +1358,6 @@
throw new ProviderException(e);
}
- // Mark a flag that allows outside entities (like SSLSocket/SSLEngine)
- // determine if a ChangeCipherSpec message could be processed.
- sessKeysCalculated = true;
-
//
// Dump the connection keys as they're generated.
//
@@ -1411,15 +1412,6 @@
}
}
- /**
- * Return whether or not the Handshaker has derived session keys for
- * this handshake. This is used for determining readiness to process
- * an incoming ChangeCipherSpec message.
- */
- boolean sessionKeysCalculated() {
- return sessKeysCalculated;
- }
-
private static void printHex(HexDumpEncoder dump, byte[] bytes) {
if (bytes == null) {
System.out.println("(key bytes not available)");
diff --git a/jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java
index 60aa908..2107add 100644
--- a/jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java
+++ b/jdk/src/share/classes/sun/security/ssl/SSLContextImpl.java
@@ -308,6 +308,13 @@
EnumSet.of(CryptoPrimitive.KEY_AGREEMENT),
suite.name, null)) {
suites.add(suite);
+ } else {
+ if (debug != null && Debug.isOn("sslctx") &&
+ Debug.isOn("verbose")) {
+ System.out.println(
+ "Ignoring disabled cipher suite: " +
+ suite.name);
+ }
}
} else if (debug != null &&
Debug.isOn("sslctx") && Debug.isOn("verbose")) {
diff --git a/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java
index e021d8e..376d45d 100644
--- a/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java
+++ b/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java
@@ -212,11 +212,6 @@
static final byte clauth_required = 2;
/*
- * Flag indicating that the engine has received a ChangeCipherSpec message.
- */
- private boolean receivedCCS;
-
- /*
* Flag indicating if the next record we receive MUST be a Finished
* message. Temporarily set during the handshake to ensure that
* a change cipher spec message is followed by a finished message.
@@ -377,7 +372,6 @@
*/
roleIsServer = true;
connectionState = cs_START;
- receivedCCS = false;
// default server name indication
serverNames =
@@ -525,7 +519,6 @@
return HandshakeStatus.NEED_UNWRAP;
} // else not handshaking
}
-
return HandshakeStatus.NOT_HANDSHAKING;
}
}
@@ -587,14 +580,6 @@
* Synchronized on "this" from readRecord.
*/
private void changeReadCiphers() throws SSLException {
- if (connectionState != cs_HANDSHAKE
- && connectionState != cs_RENEGOTIATE) {
- throw new SSLProtocolException(
- "State error, change cipher specs");
- }
-
- // ... create decompressor
-
CipherBox oldCipher = readCipher;
try {
@@ -780,6 +765,10 @@
synchronized (unwrapLock) {
return readNetRecord(ea);
}
+ } catch (SSLProtocolException spe) {
+ // may be an unexpected handshake message
+ fatal(Alerts.alert_unexpected_message, spe.getMessage(), spe);
+ return null; // make compiler happy
} catch (Exception e) {
/*
* Don't reset position so it looks like we didn't
@@ -1004,6 +993,7 @@
* session (new keys exchanged) with just this connection
* in it.
*/
+
initHandshaker();
if (!handshaker.activated()) {
// prior to handshaking, activate the handshake
@@ -1027,7 +1017,6 @@
if (handshaker.invalidated) {
handshaker = null;
- receivedCCS = false;
// if state is cs_RENEGOTIATE, revert it to cs_DATA
if (connectionState == cs_RENEGOTIATE) {
connectionState = cs_DATA;
@@ -1046,8 +1035,6 @@
}
handshaker = null;
connectionState = cs_DATA;
- receivedCCS = false;
-
// No handshakeListeners here. That's a
// SSLSocket thing.
} else if (handshaker.taskOutstanding()) {
@@ -1085,14 +1072,11 @@
case Record.ct_change_cipher_spec:
if ((connectionState != cs_HANDSHAKE
- && connectionState != cs_RENEGOTIATE)
- || !handshaker.sessionKeysCalculated()
- || receivedCCS) {
+ && connectionState != cs_RENEGOTIATE)) {
// For the CCS message arriving in the wrong state
fatal(Alerts.alert_unexpected_message,
"illegal change cipher spec msg, conn state = "
- + connectionState + ", handshake state = "
- + handshaker.state);
+ + connectionState);
} else if (inputRecord.available() != 1
|| inputRecord.read() != 1) {
// For structural/content issues with the CCS
@@ -1100,11 +1084,6 @@
"Malformed change cipher spec msg");
}
- // Once we've received CCS, update the flag.
- // If the remote endpoint sends it again in this handshake
- // we won't process it.
- receivedCCS = true;
-
//
// The first message after a change_cipher_spec
// record MUST be a "Finished" handshake record,
@@ -1112,6 +1091,7 @@
// to be checked by a minor tweak to the state
// machine.
//
+ handshaker.receiveChangeCipherSpec();
changeReadCiphers();
// next message MUST be a finished message
expectingFinished = true;
@@ -1151,7 +1131,6 @@
}
} // synchronized (this)
}
-
return hsStatus;
}
@@ -1185,6 +1164,10 @@
synchronized (wrapLock) {
return writeAppRecord(ea);
}
+ } catch (SSLProtocolException spe) {
+ // may be an unexpected handshake message
+ fatal(Alerts.alert_unexpected_message, spe.getMessage(), spe);
+ return null; // make compiler happy
} catch (Exception e) {
ea.resetPos();
@@ -1212,7 +1195,6 @@
* See if the handshaker needs to report back some SSLException.
*/
checkTaskThrown();
-
/*
* short circuit if we're closed/closing.
*/
@@ -1234,7 +1216,6 @@
* without trying to wrap anything.
*/
hsStatus = getHSStatus(null);
-
if (hsStatus == HandshakeStatus.NEED_UNWRAP) {
return new SSLEngineResult(Status.OK, hsStatus, 0, 0);
}
@@ -2140,14 +2121,6 @@
}
}
- /*
- * Returns a boolean indicating whether the ChangeCipherSpec message
- * has been received for this handshake.
- */
- boolean receivedChangeCipherSpec() {
- return receivedCCS;
- }
-
/**
* Returns a printable representation of this end of the connection.
*/
diff --git a/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java
index d96cde6..b3efe7c 100644
--- a/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java
+++ b/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -115,6 +115,10 @@
private Principal peerPrincipal;
private Principal localPrincipal;
+ // The endpoint identification algorithm used to check certificates
+ // in this session.
+ private final String endpointIdentificationAlgorithm;
+
/*
* Is the session currently re-established with a session-resumption
* abbreviated initial handshake?
@@ -146,7 +150,7 @@
*/
private SSLSessionImpl() {
this(ProtocolVersion.NONE, CipherSuite.C_NULL, null,
- new SessionId(false, null), null, -1, false);
+ new SessionId(false, null), null, -1, false, null);
}
/*
@@ -157,10 +161,10 @@
SSLSessionImpl(ProtocolVersion protocolVersion, CipherSuite cipherSuite,
Collection<SignatureAndHashAlgorithm> algorithms,
SecureRandom generator, String host, int port,
- boolean useExtendedMasterSecret) {
+ boolean useExtendedMasterSecret, String endpointIdAlgorithm) {
this(protocolVersion, cipherSuite, algorithms,
new SessionId(defaultRejoinable, generator), host, port,
- useExtendedMasterSecret);
+ useExtendedMasterSecret, endpointIdAlgorithm);
}
/*
@@ -169,7 +173,8 @@
SSLSessionImpl(ProtocolVersion protocolVersion, CipherSuite cipherSuite,
Collection<SignatureAndHashAlgorithm> algorithms,
SessionId id, String host, int port,
- boolean useExtendedMasterSecret) {
+ boolean useExtendedMasterSecret,
+ String endpointIdAlgorithm){
this.protocolVersion = protocolVersion;
sessionId = id;
peerCerts = null;
@@ -182,6 +187,7 @@
localSupportedSignAlgs =
SignatureAndHashAlgorithm.getAlgorithmNames(algorithms);
this.useExtendedMasterSecret = useExtendedMasterSecret;
+ this.endpointIdentificationAlgorithm = endpointIdAlgorithm;
if (debug != null && Debug.isOn("session")) {
System.out.println("%% Initialized: " + this);
@@ -247,6 +253,10 @@
localPrincipal = principal;
}
+ String getEndpointIdentificationAlgorithm() {
+ return this.endpointIdentificationAlgorithm;
+ }
+
/**
* Returns true iff this session may be resumed ... sessions are
* usually resumable. Security policies may suggest otherwise,
diff --git a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java
index d7322dd..d96dd5c 100644
--- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java
+++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java
@@ -175,12 +175,6 @@
private volatile int connectionState;
/*
- * Flag indicating that the engine's handshaker has done the necessary
- * steps so the engine may process a ChangeCipherSpec message.
- */
- private boolean receivedCCS;
-
- /*
* Flag indicating if the next record we receive MUST be a Finished
* message. Temporarily set during the handshake to ensure that
* a change cipher spec message is followed by a finished message.
@@ -610,7 +604,6 @@
*/
roleIsServer = isServer;
connectionState = cs_START;
- receivedCCS = false;
/*
* default read and write side cipher and MAC support
@@ -940,7 +933,6 @@
readRecord(r, true);
}
-
/*
* Clear the pipeline of records from the peer, optionally returning
* application data. Caller is responsible for knowing that it's
@@ -1074,7 +1066,8 @@
if (handshaker.invalidated) {
handshaker = null;
- receivedCCS = false;
+ inrec.setHandshakeHash(null);
+
// if state is cs_RENEGOTIATE, revert it to cs_DATA
if (connectionState == cs_RENEGOTIATE) {
connectionState = cs_DATA;
@@ -1090,7 +1083,6 @@
handshakeSession = null;
handshaker = null;
connectionState = cs_DATA;
- receivedCCS = false;
//
// Tell folk about handshake completion, but do
@@ -1137,25 +1129,17 @@
case Record.ct_change_cipher_spec:
if ((connectionState != cs_HANDSHAKE
- && connectionState != cs_RENEGOTIATE)
- || !handshaker.sessionKeysCalculated()
- || receivedCCS) {
+ && connectionState != cs_RENEGOTIATE)) {
// For the CCS message arriving in the wrong state
fatal(Alerts.alert_unexpected_message,
"illegal change cipher spec msg, conn state = "
- + connectionState + ", handshake state = "
- + handshaker.state);
+ + connectionState);
} else if (r.available() != 1 || r.read() != 1) {
// For structural/content issues with the CCS
fatal(Alerts.alert_unexpected_message,
"Malformed change cipher spec msg");
}
- // Once we've received CCS, update the flag.
- // If the remote endpoint sends it again in this handshake
- // we won't process it.
- receivedCCS = true;
-
//
// The first message after a change_cipher_spec
// record MUST be a "Finished" handshake record,
@@ -1163,6 +1147,7 @@
// to be checked by a minor tweak to the state
// machine.
//
+ handshaker.receiveChangeCipherSpec();
changeReadCiphers();
// next message MUST be a finished message
expectingFinished = true;
@@ -1361,13 +1346,10 @@
kickstartHandshake();
/*
- * All initial handshaking goes through this
- * InputRecord until we have a valid SSL connection.
- * Once initial handshaking is finished, AppInputStream's
- * InputRecord can handle any future renegotiation.
+ * All initial handshaking goes through this operation
+ * until we have a valid SSL connection.
*
- * Keep this local so that it goes out of scope and is
- * eventually GC'd.
+ * Handle handshake messages only, need no application data.
*/
if (inrec == null) {
inrec = new InputRecord();
@@ -2666,14 +2648,6 @@
}
}
- /*
- * Returns a boolean indicating whether the ChangeCipherSpec message
- * has been received for this handshake.
- */
- boolean receivedChangeCipherSpec() {
- return receivedCCS;
- }
-
//
// We allocate a separate thread to deliver handshake completion
// events. This ensures that the notifications don't block the
diff --git a/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java b/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java
index 2652bcc..bc2431e 100644
--- a/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java
+++ b/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -207,21 +207,14 @@
@Override
void processMessage(byte type, int message_len)
throws IOException {
- //
- // In SSLv3 and TLS, messages follow strictly increasing
- // numerical order _except_ for one annoying special case.
- //
- if ((state >= type)
- && (state != HandshakeMessage.ht_client_key_exchange
- && type != HandshakeMessage.ht_certificate_verify)) {
- throw new SSLProtocolException(
- "Handshake message sequence violation, state = " + state
- + ", type = " + type);
- }
+
+ // check the handshake state
+ handshakeState.check(type);
switch (type) {
case HandshakeMessage.ht_client_hello:
ClientHello ch = new ClientHello(input, message_len);
+ handshakeState.update(ch, resumingSession);
/*
* send it off for processing.
*/
@@ -234,7 +227,9 @@
"client sent unsolicited cert chain");
// NOTREACHED
}
- this.clientCertificate(new CertificateMsg(input));
+ CertificateMsg certificateMsg = new CertificateMsg(input);
+ handshakeState.update(certificateMsg, resumingSession);
+ this.clientCertificate(certificateMsg);
break;
case HandshakeMessage.ht_client_key_exchange:
@@ -252,17 +247,20 @@
protocolVersion, clientRequestedVersion,
sslContext.getSecureRandom(), input,
message_len, privateKey);
+ handshakeState.update(pms, resumingSession);
preMasterSecret = this.clientKeyExchange(pms);
break;
case K_KRB5:
case K_KRB5_EXPORT:
- preMasterSecret = this.clientKeyExchange(
+ KerberosClientKeyExchange kke =
new KerberosClientKeyExchange(protocolVersion,
clientRequestedVersion,
sslContext.getSecureRandom(),
input,
this.getAccSE(),
- serviceCreds));
+ serviceCreds);
+ handshakeState.update(kke, resumingSession);
+ preMasterSecret = this.clientKeyExchange(kke);
break;
case K_DHE_RSA:
case K_DHE_DSS:
@@ -273,16 +271,19 @@
* protocol difference in these five flavors is in how
* the ServerKeyExchange message was constructed!
*/
- preMasterSecret = this.clientKeyExchange(
- new DHClientKeyExchange(input));
+ DHClientKeyExchange dhcke = new DHClientKeyExchange(input);
+ handshakeState.update(dhcke, resumingSession);
+ preMasterSecret = this.clientKeyExchange(dhcke);
break;
case K_ECDH_RSA:
case K_ECDH_ECDSA:
case K_ECDHE_RSA:
case K_ECDHE_ECDSA:
case K_ECDH_ANON:
- preMasterSecret = this.clientKeyExchange
- (new ECDHClientKeyExchange(input));
+ ECDHClientKeyExchange ecdhcke =
+ new ECDHClientKeyExchange(input);
+ handshakeState.update(ecdhcke, resumingSession);
+ preMasterSecret = this.clientKeyExchange(ecdhcke);
break;
default:
throw new SSLProtocolException
@@ -302,38 +303,24 @@
break;
case HandshakeMessage.ht_certificate_verify:
- this.clientCertificateVerify(new CertificateVerify(input,
- getLocalSupportedSignAlgs(), protocolVersion));
+ CertificateVerify cvm =
+ new CertificateVerify(input,
+ getLocalSupportedSignAlgs(), protocolVersion);
+ handshakeState.update(cvm, resumingSession);
+ this.clientCertificateVerify(cvm);
break;
case HandshakeMessage.ht_finished:
- // A ChangeCipherSpec record must have been received prior to
- // reception of the Finished message (RFC 5246, 7.4.9).
- if (!receivedChangeCipherSpec()) {
- fatalSE(Alerts.alert_handshake_failure,
- "Received Finished message before ChangeCipherSpec");
- }
-
- this.clientFinished(
- new Finished(protocolVersion, input, cipherSuite));
+ Finished cfm =
+ new Finished(protocolVersion, input, cipherSuite);
+ handshakeState.update(cfm, resumingSession);
+ this.clientFinished(cfm);
break;
default:
throw new SSLProtocolException(
"Illegal server handshake msg, " + type);
}
-
- //
- // Move state machine forward if the message handling
- // code didn't already do so
- //
- if (state < type) {
- if(type == HandshakeMessage.ht_certificate_verify) {
- state = type + 2; // an annoying special case
- } else {
- state = type;
- }
- }
}
@@ -364,7 +351,7 @@
//
// This will not have any impact on server initiated renegotiation.
if (rejectClientInitiatedRenego && !isInitialHandshake &&
- state != HandshakeMessage.ht_hello_request) {
+ !serverHelloRequested) {
fatalSE(Alerts.alert_handshake_failure,
"Client initiated renegotiation is not allowed");
}
@@ -711,6 +698,25 @@
}
}
+ // ensure that the endpoint identification algorithm matches the
+ // one in the session
+ String identityAlg = getEndpointIdentificationAlgorithmSE();
+ if (resumingSession && identityAlg != null) {
+
+ String sessionIdentityAlg =
+ previous.getEndpointIdentificationAlgorithm();
+ if (!Objects.equals(identityAlg, sessionIdentityAlg)) {
+
+ if (debug != null && Debug.isOn("session")) {
+ System.out.println("%% can't resume, endpoint id"
+ + " algorithm does not match, requested: " +
+ identityAlg + ", cached: " +
+ sessionIdentityAlg);
+ }
+ resumingSession = false;
+ }
+ }
+
if (resumingSession) {
CipherSuite suite = previous.getSuite();
// verify that the ciphersuite from the cached session
@@ -782,7 +788,8 @@
sslContext.getSecureRandom(),
getHostAddressSE(), getPortSE(),
(requestedToUseEMS &&
- (protocolVersion.v >= ProtocolVersion.TLS10.v)));
+ (protocolVersion.v >= ProtocolVersion.TLS10.v)),
+ getEndpointIdentificationAlgorithmSE());
if (protocolVersion.v >= ProtocolVersion.TLS12.v) {
if (peerSupportedSignAlgs != null) {
@@ -856,6 +863,7 @@
System.out.println("Cipher suite: " + session.getSuite());
}
m1.write(output);
+ handshakeState.update(m1, resumingSession);
//
// If we are resuming a session, we finish writing handshake
@@ -895,6 +903,7 @@
m2.print(System.out);
}
m2.write(output);
+ handshakeState.update(m2, resumingSession);
// XXX has some side effects with OS TCP buffering,
// leave it out for now
@@ -990,6 +999,7 @@
m3.print(System.out);
}
m3.write(output);
+ handshakeState.update(m3, resumingSession);
}
//
@@ -1039,6 +1049,7 @@
m4.print(System.out);
}
m4.write(output);
+ handshakeState.update(m4, resumingSession);
}
/*
@@ -1050,6 +1061,7 @@
m5.print(System.out);
}
m5.write(output);
+ handshakeState.update(m5, resumingSession);
/*
* Flush any buffered messages so the client will see them.
@@ -1797,6 +1809,8 @@
if (!resumingSession) {
input.digestNow();
sendChangeCipherAndFinish(true);
+ } else {
+ handshakeFinished = true;
}
/*
@@ -1844,16 +1858,6 @@
if (secureRenegotiation) {
serverVerifyData = mesg.getVerifyData();
}
-
- /*
- * Update state machine so client MUST send 'finished' next
- * The update should only take place if it is not in the fast
- * handshake mode since the server has to wait for a finished
- * message from the client.
- */
- if (finishedTag) {
- state = HandshakeMessage.ht_finished;
- }
}
diff --git a/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java b/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java
index 6407b88..2ce5723 100644
--- a/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java
+++ b/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java
@@ -35,6 +35,7 @@
import java.security.KeyStore;
+import java.security.cert.X509Certificate;
import java.text.Collator;
import java.util.Locale;
@@ -59,6 +60,25 @@
};
/**
+ * Returns true if the certificate is self-signed, false otherwise.
+ */
+ public static boolean isSelfSigned(X509Certificate cert) {
+ return signedBy(cert, cert);
+ }
+
+ public static boolean signedBy(X509Certificate end, X509Certificate ca) {
+ if (!ca.getSubjectX500Principal().equals(end.getIssuerX500Principal())) {
+ return false;
+ }
+ try {
+ end.verify(ca.getPublicKey());
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ /**
* Returns true if KeyStore has a password. This is true except for
* MSCAPI KeyStores
*/
diff --git a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java
index 0d22d7d..57dc512 100644
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java
@@ -26,6 +26,8 @@
package sun.security.tools.jarsigner;
import java.io.*;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.PKIXBuilderParameters;
import java.util.*;
import java.util.zip.*;
import java.util.jar.*;
@@ -46,11 +48,9 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.security.cert.CertPath;
-import java.security.cert.CertPathValidator;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateNotYetValidException;
-import java.security.cert.PKIXParameters;
import java.security.cert.TrustAnchor;
import java.util.Map.Entry;
import sun.security.pkcs.PKCS7;
@@ -58,6 +58,8 @@
import sun.security.timestamp.TimestampToken;
import sun.security.tools.KeyStoreUtil;
import sun.security.tools.PathList;
+import sun.security.validator.Validator;
+import sun.security.validator.ValidatorException;
import sun.security.x509.*;
import sun.security.util.*;
import java.util.Base64;
@@ -173,22 +175,34 @@
private boolean noTimestamp = false;
private Date expireDate = new Date(0L); // used in noTimestamp warning
- // Severe warnings
+ // Severe warnings.
+
+ // jarsigner used to check signer cert chain validity and key usages
+ // itself and set various warnings. Later CertPath validation is
+ // added but chainNotValidated is only flagged when no other existing
+ // warnings are set. TSA cert chain check is added separately and
+ // only tsaChainNotValidated is set, i.e. has no affect on hasExpiredCert,
+ // notYetValidCert, or any badXyzUsage.
+
+ private int weakAlg = 0; // 1. digestalg, 2. sigalg, 4. tsadigestalg
private boolean hasExpiredCert = false;
private boolean notYetValidCert = false;
private boolean chainNotValidated = false;
+ private boolean tsaChainNotValidated = false;
private boolean notSignedByAlias = false;
private boolean aliasNotInStore = false;
private boolean hasUnsignedEntry = false;
private boolean badKeyUsage = false;
private boolean badExtendedKeyUsage = false;
private boolean badNetscapeCertType = false;
+ private boolean signerSelfSigned = false;
+
+ private Throwable chainNotValidatedReason = null;
+ private Throwable tsaChainNotValidatedReason = null;
private boolean seeWeak = false;
- CertificateFactory certificateFactory;
- CertPathValidator validator;
- PKIXParameters pkixParameters;
+ PKIXBuilderParameters pkixParameters;
public void run(String args[]) {
try {
@@ -275,7 +289,8 @@
if (strict) {
int exitCode = 0;
- if (chainNotValidated || hasExpiredCert || notYetValidCert) {
+ if (weakAlg != 0 || chainNotValidated
+ || hasExpiredCert || notYetValidCert || signerSelfSigned) {
exitCode |= 4;
}
if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType) {
@@ -287,6 +302,9 @@
if (notSignedByAlias || aliasNotInStore) {
exitCode |= 32;
}
+ if (tsaChainNotValidated) {
+ exitCode |= 64;
+ }
if (exitCode != 0) {
System.exit(exitCode);
}
@@ -807,6 +825,9 @@
System.out.println(rb.getString("no.manifest."));
}
+ // If there is a time stamp block inside the PKCS7 block file
+ boolean hasTimestampBlock = false;
+
// Even if the verbose option is not specified, all out strings
// must be generated so seeWeak can be updated.
if (!digestMap.isEmpty()
@@ -835,6 +856,7 @@
PublicKey key = signer.getPublicKey();
PKCS7 tsToken = si.getTsToken();
if (tsToken != null) {
+ hasTimestampBlock = true;
SignerInfo tsSi = tsToken.getSignerInfos()[0];
X509Certificate tsSigner = tsSi.getCertificate(tsToken);
byte[] encTsTokenInfo = tsToken.getContentInfo().getData();
@@ -890,6 +912,12 @@
}
System.out.println();
+ // If signer is a trusted cert or private entry in user's own
+ // keystore, it can be self-signed.
+ if (!aliasNotInStore) {
+ signerSelfSigned = false;
+ }
+
if (!anySigned) {
if (seeWeak) {
if (verbose != null) {
@@ -910,8 +938,8 @@
boolean errorAppeared = false;
if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType ||
notYetValidCert || chainNotValidated || hasExpiredCert ||
- hasUnsignedEntry ||
- aliasNotInStore || notSignedByAlias) {
+ hasUnsignedEntry || signerSelfSigned || (weakAlg != 0) ||
+ aliasNotInStore || notSignedByAlias || tsaChainNotValidated) {
if (strict) {
System.out.println(rb.getString("jar.verified.with.signer.errors."));
@@ -925,6 +953,12 @@
warningAppeared = true;
}
+ if (weakAlg != 0) {
+ // In fact, jarsigner verification did not catch this
+ // since it has not read the JarFile content itself.
+ // Everything is done with JarFile API.
+ }
+
if (badKeyUsage) {
System.out.println(
rb.getString("This.jar.contains.entries.whose.signer.certificate.s.KeyUsage.extension.doesn.t.allow.code.signing."));
@@ -954,8 +988,15 @@
}
if (chainNotValidated) {
- System.out.println(
- rb.getString("This.jar.contains.entries.whose.certificate.chain.is.not.validated."));
+ System.out.println(String.format(
+ rb.getString("This.jar.contains.entries.whose.certificate.chain.is.invalid.reason.1"),
+ chainNotValidatedReason.getLocalizedMessage()));
+ }
+
+ if (tsaChainNotValidated) {
+ System.out.println(String.format(
+ rb.getString("This.jar.contains.entries.whose.tsa.certificate.chain.is.invalid.reason.1"),
+ tsaChainNotValidatedReason.getLocalizedMessage()));
}
if (notSignedByAlias) {
@@ -966,6 +1007,11 @@
if (aliasNotInStore) {
System.out.println(rb.getString("This.jar.contains.signed.entries.that.s.not.signed.by.alias.in.this.keystore."));
}
+
+ if (signerSelfSigned) {
+ System.out.println(rb.getString(
+ "This.jar.contains.entries.whose.signer.certificate.is.self.signed."));
+ }
} else {
System.out.println(rb.getString("jar.verified."));
}
@@ -980,8 +1026,15 @@
"This.jar.contains.entries.whose.signer.certificate.will.expire.within.six.months."));
}
if (noTimestamp) {
- System.out.println(
- String.format(rb.getString("no.timestamp.verifying"), expireDate));
+ if (hasTimestampBlock) {
+ // JarSigner API has not seen the timestamp,
+ // might have ignored it due to weak alg, etc.
+ System.out.println(
+ String.format(rb.getString("bad.timestamp.verifying"), expireDate));
+ } else {
+ System.out.println(
+ String.format(rb.getString("no.timestamp.verifying"), expireDate));
+ }
}
}
if (warningAppeared || errorAppeared) {
@@ -1032,16 +1085,23 @@
private static MessageFormat expiredTimeForm = null;
private static MessageFormat expiringTimeForm = null;
- /*
- * Display some details about a certificate:
+ /**
+ * Returns a string about a certificate:
*
* [<tab>] <cert-type> [", " <subject-DN>] [" (" <keystore-entry-alias> ")"]
* [<validity-period> | <expiry-warning>]
+ * [<key-usage-warning>]
*
- * Note: no newline character at the end
+ * Note: no newline character at the end.
+ *
+ * When isTsCert is true, this method sets global flags like hasExpiredCert,
+ * notYetValidCert, badKeyUsage, badExtendedKeyUsage, badNetscapeCertType.
+ *
+ * @param isTsCert true if c is in the TSA cert chain, false otherwise.
+ * @param checkUsage true to check code signer keyUsage
*/
- String printCert(String tab, Certificate c, boolean checkValidityPeriod,
- Date timestamp, boolean checkUsage) {
+ String printCert(boolean isTsCert, String tab, Certificate c,
+ Date timestamp, boolean checkUsage) throws Exception {
StringBuilder certStr = new StringBuilder();
String space = rb.getString("SPACE");
@@ -1061,7 +1121,7 @@
certStr.append(space).append(alias);
}
- if (checkValidityPeriod && x509Cert != null) {
+ if (x509Cert != null) {
certStr.append("\n").append(tab).append("[");
Date notAfter = x509Cert.getNotAfter();
@@ -1074,7 +1134,7 @@
x509Cert.checkValidity();
// test if cert will expire within six months
if (notAfter.getTime() < System.currentTimeMillis() + SIX_MONTHS) {
- hasExpiringCert = true;
+ if (!isTsCert) hasExpiringCert = true;
if (expiringTimeForm == null) {
expiringTimeForm = new MessageFormat(
rb.getString("certificate.will.expire.on"));
@@ -1095,7 +1155,7 @@
certStr.append(validityTimeForm.format(source));
}
} catch (CertificateExpiredException cee) {
- hasExpiredCert = true;
+ if (!isTsCert) hasExpiredCert = true;
if (expiredTimeForm == null) {
expiredTimeForm = new MessageFormat(
@@ -1105,7 +1165,7 @@
certStr.append(expiredTimeForm.format(source));
} catch (CertificateNotYetValidException cnyve) {
- notYetValidCert = true;
+ if (!isTsCert) notYetValidCert = true;
if (notYetTimeForm == null) {
notYetTimeForm = new MessageFormat(
@@ -1218,7 +1278,25 @@
}
void signJar(String jarName, String alias, String[] args)
- throws Exception {
+ throws Exception {
+
+ DisabledAlgorithmConstraints dac =
+ new DisabledAlgorithmConstraints(
+ DisabledAlgorithmConstraints.PROPERTY_CERTPATH_DISABLED_ALGS);
+
+ if (digestalg != null && !dac.permits(
+ Collections.singleton(CryptoPrimitive.MESSAGE_DIGEST), digestalg, null)) {
+ weakAlg |= 1;
+ }
+ if (tSADigestAlg != null && !dac.permits(
+ Collections.singleton(CryptoPrimitive.MESSAGE_DIGEST), tSADigestAlg, null)) {
+ weakAlg |= 4;
+ }
+ if (sigalg != null && !dac.permits(
+ Collections.singleton(CryptoPrimitive.SIGNATURE), sigalg, null)) {
+ weakAlg |= 2;
+ }
+
boolean aliasUsed = false;
X509Certificate tsaCert = null;
@@ -1494,7 +1572,7 @@
tsaURI);
}
System.out.println(rb.getString("TSA.certificate.") +
- printCert("", tsaCert, false, null, false));
+ printCert(true, "", tsaCert, null, false));
}
if (signingMechanism != null) {
System.out.println(
@@ -1557,6 +1635,30 @@
}
}
+ // The JarSigner API always accepts the timestamp received.
+ // We need to extract the certs from the signed jar to
+ // validate it.
+ if (!noTimestamp) {
+ try (JarFile check = new JarFile(signedJarFile)) {
+ PKCS7 p7 = new PKCS7(check.getInputStream(check.getEntry(
+ "META-INF/" + sigfile + "." + privateKey.getAlgorithm())));
+ SignerInfo si = p7.getSignerInfos()[0];
+ PKCS7 tsToken = si.getTsToken();
+ SignerInfo tsSi = tsToken.getSignerInfos()[0];
+ try {
+ validateCertChain(Validator.VAR_TSA_SERVER,
+ tsSi.getCertificateChain(tsToken), null);
+ } catch (Exception e) {
+ tsaChainNotValidated = true;
+ tsaChainNotValidatedReason = e;
+ }
+ } catch (Exception e) {
+ if (debug) {
+ e.printStackTrace();
+ }
+ }
+ }
+
// no IOException thrown in the follow try clause, so disable
// the try clause.
// try {
@@ -1586,8 +1688,10 @@
}
boolean warningAppeared = false;
- if (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType ||
- notYetValidCert || chainNotValidated || hasExpiredCert) {
+ if (weakAlg != 0 || badKeyUsage || badExtendedKeyUsage
+ || badNetscapeCertType || notYetValidCert
+ || chainNotValidated || tsaChainNotValidated
+ || hasExpiredCert || signerSelfSigned) {
if (strict) {
System.out.println(rb.getString("jar.signed.with.signer.errors."));
System.out.println();
@@ -1623,8 +1727,37 @@
}
if (chainNotValidated) {
+ System.out.println(String.format(
+ rb.getString("The.signer.s.certificate.chain.is.invalid.reason.1"),
+ chainNotValidatedReason.getLocalizedMessage()));
+ }
+
+ if (tsaChainNotValidated) {
+ System.out.println(String.format(
+ rb.getString("The.tsa.certificate.chain.is.invalid.reason.1"),
+ tsaChainNotValidatedReason.getLocalizedMessage()));
+ }
+
+ if (signerSelfSigned) {
System.out.println(
- rb.getString("The.signer.s.certificate.chain.is.not.validated."));
+ rb.getString("The.signer.s.certificate.is.self.signed."));
+ }
+
+ if ((weakAlg & 1) == 1) {
+ System.out.println(String.format(
+ rb.getString("The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk."),
+ digestalg, "-digestalg"));
+ }
+
+ if ((weakAlg & 2) == 2) {
+ System.out.println(String.format(
+ rb.getString("The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk."),
+ sigalg, "-sigalg"));
+ }
+ if ((weakAlg & 4) == 4) {
+ System.out.println(String.format(
+ rb.getString("The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk."),
+ tSADigestAlg, "-tsadigestalg"));
}
} else {
System.out.println(rb.getString("jar.signed."));
@@ -1700,18 +1833,18 @@
/**
* Returns a string of singer info, with a newline at the end
*/
- private String signerInfo(CodeSigner signer, String tab) {
+ private String signerInfo(CodeSigner signer, String tab) throws Exception {
if (cacheForSignerInfo.containsKey(signer)) {
return cacheForSignerInfo.get(signer);
}
- StringBuffer s = new StringBuffer();
+ StringBuilder sb = new StringBuilder();
List<? extends Certificate> certs = signer.getSignerCertPath().getCertificates();
// display the signature timestamp, if present
Date timestamp;
Timestamp ts = signer.getTimestamp();
if (ts != null) {
- s.append(printTimestamp(tab, ts));
- s.append('\n');
+ sb.append(printTimestamp(tab, ts));
+ sb.append('\n');
timestamp = ts.getTimestamp();
} else {
timestamp = null;
@@ -1720,28 +1853,41 @@
// display the certificate(s). The first one is end-entity cert and
// its KeyUsage should be checked.
boolean first = true;
+ sb.append(tab).append(rb.getString("...Signer")).append('\n');
for (Certificate c : certs) {
- s.append(printCert(tab, c, true, timestamp, first));
- s.append('\n');
+ sb.append(printCert(false, tab, c, timestamp, first));
+ sb.append('\n');
first = false;
}
try {
- validateCertChain(certs);
+ validateCertChain(Validator.VAR_CODE_SIGNING, certs, ts);
} catch (Exception e) {
- if (debug) {
- e.printStackTrace();
+ chainNotValidated = true;
+ chainNotValidatedReason = e;
+ sb.append(tab).append(rb.getString(".Invalid.certificate.chain."))
+ .append(e.getLocalizedMessage()).append("]\n");
+ }
+ if (ts != null) {
+ sb.append(tab).append(rb.getString("...TSA")).append('\n');
+ for (Certificate c : ts.getSignerCertPath().getCertificates()) {
+ sb.append(printCert(true, tab, c, timestamp, false));
+ sb.append('\n');
}
- if (e.getCause() != null &&
- (e.getCause() instanceof CertificateExpiredException ||
- e.getCause() instanceof CertificateNotYetValidException)) {
- // No more warning, we alreay have hasExpiredCert or notYetValidCert
- } else {
- chainNotValidated = true;
- s.append(tab + rb.getString(".CertPath.not.validated.") +
- e.getLocalizedMessage() + "]\n"); // TODO
+ try {
+ validateCertChain(Validator.VAR_TSA_SERVER,
+ ts.getSignerCertPath().getCertificates(), null);
+ } catch (Exception e) {
+ tsaChainNotValidated = true;
+ tsaChainNotValidatedReason = e;
+ sb.append(tab).append(rb.getString(".Invalid.TSA.certificate.chain."))
+ .append(e.getLocalizedMessage()).append("]\n");
}
}
- String result = s.toString();
+ if (certs.size() == 1
+ && KeyStoreUtil.isSelfSigned((X509Certificate)certs.get(0))) {
+ signerSelfSigned = true;
+ }
+ String result = sb.toString();
cacheForSignerInfo.put(signer, result);
return result;
}
@@ -1793,9 +1939,6 @@
}
try {
-
- certificateFactory = CertificateFactory.getInstance("X.509");
- validator = CertPathValidator.getInstance("PKIX");
Set<TrustAnchor> tas = new HashSet<>();
try {
KeyStore caks = KeyStoreUtil.getCacertsKeyStore();
@@ -1871,7 +2014,7 @@
}
} finally {
try {
- pkixParameters = new PKIXParameters(tas);
+ pkixParameters = new PKIXBuilderParameters(tas, null);
pkixParameters.setRevocationEnabled(false);
} catch (InvalidAlgorithmParameterException ex) {
// Only if tas is empty
@@ -1987,7 +2130,7 @@
}
}
- void getAliasInfo(String alias) {
+ void getAliasInfo(String alias) throws Exception {
Key key = null;
@@ -2033,21 +2176,18 @@
// We don't meant to print anything, the next call
// checks validity and keyUsage etc
- printCert("", certChain[0], true, null, true);
+ printCert(false, "", certChain[0], null, true);
try {
- validateCertChain(Arrays.asList(certChain));
+ validateCertChain(Validator.VAR_CODE_SIGNING,
+ Arrays.asList(certChain), null);
} catch (Exception e) {
- if (debug) {
- e.printStackTrace();
- }
- if (e.getCause() != null &&
- (e.getCause() instanceof CertificateExpiredException ||
- e.getCause() instanceof CertificateNotYetValidException)) {
- // No more warning, we alreay have hasExpiredCert or notYetValidCert
- } else {
- chainNotValidated = true;
- }
+ chainNotValidated = true;
+ chainNotValidatedReason = e;
+ }
+
+ if (KeyStoreUtil.isSelfSigned(certChain[0])) {
+ signerSelfSigned = true;
}
try {
@@ -2101,19 +2241,55 @@
System.exit(1);
}
- void validateCertChain(List<? extends Certificate> certs) throws Exception {
- int cpLen = 0;
- out: for (; cpLen<certs.size(); cpLen++) {
- for (TrustAnchor ta: pkixParameters.getTrustAnchors()) {
- if (ta.getTrustedCert().equals(certs.get(cpLen))) {
- break out;
+ /**
+ * Validates a cert chain.
+ *
+ * @param parameter this might be a timestamp
+ */
+ void validateCertChain(String variant, List<? extends Certificate> certs,
+ Object parameter)
+ throws Exception {
+ try {
+ Validator.getInstance(Validator.TYPE_PKIX,
+ variant,
+ pkixParameters)
+ .validate(certs.toArray(new X509Certificate[certs.size()]),
+ null, parameter);
+ } catch (Exception e) {
+ if (debug) {
+ e.printStackTrace();
+ }
+
+ // Exception might be dismissed if another warning flag
+ // is already set by printCert. This is only done for
+ // code signing certs.
+
+ if (variant.equals(Validator.VAR_CODE_SIGNING) &&
+ e instanceof ValidatorException) {
+ // Throw cause if it's CertPathValidatorException,
+ if (e.getCause() != null &&
+ e.getCause() instanceof CertPathValidatorException) {
+ e = (Exception) e.getCause();
+ Throwable t = e.getCause();
+ if ((t instanceof CertificateExpiredException &&
+ hasExpiredCert) ||
+ (t instanceof CertificateNotYetValidException &&
+ notYetValidCert)) {
+ // we already have hasExpiredCert and notYetValidCert
+ return;
+ }
+ }
+ if (e instanceof ValidatorException) {
+ ValidatorException ve = (ValidatorException)e;
+ if (ve.getErrorType() == ValidatorException.T_EE_EXTENSIONS &&
+ (badKeyUsage || badExtendedKeyUsage || badNetscapeCertType)) {
+ // We already have badKeyUsage, badExtendedKeyUsage
+ // and badNetscapeCertType
+ return;
+ }
}
}
- }
- if (cpLen > 0) {
- CertPath cp = certificateFactory.generateCertPath(
- (cpLen == certs.size())? certs: certs.subList(0, cpLen));
- validator.validate(cp, pkixParameters);
+ throw e;
}
}
diff --git a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java
index bff9dd7..7a6ea5c 100644
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -199,7 +199,8 @@
{"certificate.is.not.valid.until",
"certificate is not valid until {0}"},
{"certificate.will.expire.on", "certificate will expire on {0}"},
- {".CertPath.not.validated.", "[CertPath not validated: "},
+ {".Invalid.certificate.chain.", "[Invalid certificate chain: "},
+ {".Invalid.TSA.certificate.chain.", "[Invalid TSA certificate chain: "},
{"requesting.a.signature.timestamp",
"requesting a signature timestamp"},
{"TSA.location.", "TSA location: "},
@@ -216,6 +217,8 @@
{"entry.was.signed.on", "entry was signed on {0}"},
{"Warning.", "Warning: "},
{"Error.", "Error: "},
+ {"...Signer", ">>> Signer"},
+ {"...TSA", ">>> TSA"},
{"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.",
"This jar contains unsigned entries which have not been integrity-checked. "},
{"This.jar.contains.entries.whose.signer.certificate.has.expired.",
@@ -224,6 +227,8 @@
"This jar contains entries whose signer certificate will expire within six months. "},
{"This.jar.contains.entries.whose.signer.certificate.is.not.yet.valid.",
"This jar contains entries whose signer certificate is not yet valid. "},
+ {"This.jar.contains.entries.whose.signer.certificate.is.self.signed.",
+ "This jar contains entries whose signer certificate is self-signed."},
{"Re.run.with.the.verbose.option.for.more.details.",
"Re-run with the -verbose option for more details."},
{"Re.run.with.the.verbose.and.certs.options.for.more.details.",
@@ -248,14 +253,24 @@
"This jar contains entries whose signer certificate's NetscapeCertType extension doesn't allow code signing."},
{".{0}.extension.does.not.support.code.signing.",
"[{0} extension does not support code signing]"},
- {"The.signer.s.certificate.chain.is.not.validated.",
- "The signer's certificate chain is not validated."},
- {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.",
- "This jar contains entries whose certificate chain is not validated."},
+ {"The.signer.s.certificate.chain.is.invalid.reason.1",
+ "The signer's certificate chain is invalid. Reason: %s"},
+ {"The.tsa.certificate.chain.is.invalid.reason.1",
+ "The TSA certificate chain is invalid. Reason: %s"},
+ {"The.signer.s.certificate.is.self.signed.",
+ "The signer's certificate is self-signed."},
+ {"The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk.",
+ "The %1$s algorithm specified for the %2$s option is considered a security risk."},
+ {"This.jar.contains.entries.whose.certificate.chain.is.invalid.reason.1",
+ "This jar contains entries whose certificate chain is invalid. Reason: %s"},
+ {"This.jar.contains.entries.whose.tsa.certificate.chain.is.invalid.reason.1",
+ "This jar contains entries whose TSA certificate chain is invalid. Reason: %s"},
{"no.timestamp.signing",
"No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (%1$tY-%1$tm-%1$td) or after any future revocation date."},
{"no.timestamp.verifying",
"This jar contains signatures that does not include a timestamp. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (%1$tY-%1$tm-%1$td) or after any future revocation date."},
+ {"bad.timestamp.verifying",
+ "This jar contains signatures that include an invalid timestamp. Without a valid timestamp, users may not be able to validate this jar after any of the signer certificates expire (as early as %1$tY-%1$tm-%1$td).\nRerun jarsigner with -J-Djava.security.debug=jar for more information."},
{"Unknown.password.type.", "Unknown password type: "},
{"Cannot.find.environment.variable.",
"Cannot find environment variable: "},
diff --git a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java
index cdf1526..26c6140 100644
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java
@@ -199,7 +199,8 @@
{"certificate.is.not.valid.until",
"\u8A3C\u660E\u66F8\u306F{0}\u307E\u3067\u6709\u52B9\u3067\u306F\u3042\u308A\u307E\u305B\u3093"},
{"certificate.will.expire.on", "\u8A3C\u660E\u66F8\u306F{0}\u306B\u5931\u52B9\u3057\u307E\u3059"},
- {".CertPath.not.validated.", "[CertPath\u304C\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093: "},
+ {".Invalid.certificate.chain.", "[\u7121\u52B9\u306A\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3: "},
+ {".Invalid.TSA.certificate.chain.", "[\u7121\u52B9\u306ATSA\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3: "},
{"requesting.a.signature.timestamp",
"\u30B7\u30B0\u30CD\u30C1\u30E3\u30FB\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u306E\u30EA\u30AF\u30A8\u30B9\u30C8"},
{"TSA.location.", "TSA\u306E\u5834\u6240: "},
@@ -214,6 +215,8 @@
{"entry.was.signed.on", "\u30A8\u30F3\u30C8\u30EA\u306F{0}\u306B\u7F72\u540D\u3055\u308C\u307E\u3057\u305F"},
{"Warning.", "\u8B66\u544A: "},
{"Error.", "\u30A8\u30E9\u30FC: "},
+ {"...Signer", ">>> \u7F72\u540D\u8005"},
+ {"...TSA", ">>> TSA"},
{"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.",
"\u3053\u306Ejar\u306B\u306F\u3001\u6574\u5408\u6027\u30C1\u30A7\u30C3\u30AF\u3092\u3057\u3066\u3044\u306A\u3044\u7F72\u540D\u306A\u3057\u306E\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 "},
{"This.jar.contains.entries.whose.signer.certificate.has.expired.",
@@ -222,6 +225,8 @@
"\u3053\u306Ejar\u306B\u306F\u3001\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u304C6\u304B\u6708\u4EE5\u5185\u306B\u671F\u9650\u5207\u308C\u3068\u306A\u308B\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 "},
{"This.jar.contains.entries.whose.signer.certificate.is.not.yet.valid.",
"\u3053\u306Ejar\u306B\u306F\u3001\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u304C\u307E\u3060\u6709\u52B9\u306B\u306A\u3063\u3066\u3044\u306A\u3044\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 "},
+ {"This.jar.contains.entries.whose.signer.certificate.is.self.signed.",
+ "\u3053\u306Ejar\u306B\u306F\u3001\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u304C\u81EA\u5DF1\u7F72\u540D\u3055\u308C\u3066\u3044\u308B\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002 "},
{"Re.run.with.the.verbose.option.for.more.details.",
"\u8A73\u7D30\u306F\u3001-verbose\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u3066\u518D\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"},
{"Re.run.with.the.verbose.and.certs.options.for.more.details.",
@@ -246,14 +251,24 @@
"\u3053\u306Ejar\u306B\u306F\u3001\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306ENetscapeCertType\u62E1\u5F35\u6A5F\u80FD\u304C\u30B3\u30FC\u30C9\u7F72\u540D\u3092\u8A31\u53EF\u3057\u306A\u3044\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002"},
{".{0}.extension.does.not.support.code.signing.",
"[{0}\u62E1\u5F35\u6A5F\u80FD\u306F\u30B3\u30FC\u30C9\u7F72\u540D\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u307E\u305B\u3093]"},
- {"The.signer.s.certificate.chain.is.not.validated.",
- "\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"},
- {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.",
- "\u3053\u306Ejar\u306B\u306F\u3001\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u306A\u3044\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002"},
+ {"The.signer.s.certificate.chain.is.invalid.reason.1",
+ "\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u7121\u52B9\u3067\u3059\u3002\u7406\u7531: %s"},
+ {"The.tsa.certificate.chain.is.invalid.reason.1",
+ "TSA\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u7121\u52B9\u3067\u3059\u3002\u7406\u7531: %s"},
+ {"The.signer.s.certificate.is.self.signed.",
+ "\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u306F\u81EA\u5DF1\u7F72\u540D\u3055\u308C\u3066\u3044\u307E\u3059\u3002"},
+ {"The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk.",
+ "%1$s\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0(%2$s\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u6307\u5B9A)\u306F\u3001\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30FB\u30EA\u30B9\u30AF\u3068\u307F\u306A\u3055\u308C\u307E\u3059\u3002"},
+ {"This.jar.contains.entries.whose.certificate.chain.is.invalid.reason.1",
+ "\u3053\u306Ejar\u306B\u306F\u3001\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u7121\u52B9\u306A\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u7406\u7531: %s"},
+ {"This.jar.contains.entries.whose.tsa.certificate.chain.is.invalid.reason.1",
+ "\u3053\u306Ejar\u306B\u306F\u3001TSA\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u7121\u52B9\u306A\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u7406\u7531: %s"},
{"no.timestamp.signing",
"-tsa\u307E\u305F\u306F-tsacert\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u3053\u306Ejar\u306B\u306F\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u52A0\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u3068\u3001\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u671F\u9650(%1$tY-%1$tm-%1$td)\u5F8C\u307E\u305F\u306F\u5C06\u6765\u306E\u5931\u52B9\u65E5\u5F8C\u306B\u3001\u30E6\u30FC\u30B6\u30FC\u306F\u3053\u306Ejar\u3092\u691C\u8A3C\u3067\u304D\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002"},
{"no.timestamp.verifying",
"\u3053\u306Ejar\u306B\u306F\u3001\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u7F72\u540D\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u3068\u3001\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u671F\u9650(%1$tY-%1$tm-%1$td)\u5F8C\u307E\u305F\u306F\u5C06\u6765\u306E\u5931\u52B9\u65E5\u5F8C\u306B\u3001\u30E6\u30FC\u30B6\u30FC\u306F\u3053\u306Ejar\u3092\u691C\u8A3C\u3067\u304D\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002"},
+ {"bad.timestamp.verifying",
+ "\u3053\u306Ejar\u306B\u306F\u3001\u7121\u52B9\u306A\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u306E\u3042\u308B\u7F72\u540D\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002\u6709\u52B9\u306A\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u306A\u3044\u3068\u3001\u3044\u305A\u308C\u304B\u306E\u7F72\u540D\u8005\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u671F\u9650\u5F8C\u306B(\u65E9\u3051\u308C\u3070%1$tY-%1$tm-%1$td)\u30E6\u30FC\u30B6\u30FC\u306F\u3053\u306Ejar\u3092\u691C\u8A3C\u3067\u304D\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\n\u8A73\u7D30\u306F\u3001-J-Djava.security.debug=jar\u3092\u6307\u5B9A\u3057\u3066jarsigner\u3092\u518D\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"},
{"Unknown.password.type.", "\u4E0D\u660E\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u30FB\u30BF\u30A4\u30D7: "},
{"Cannot.find.environment.variable.",
"\u74B0\u5883\u5909\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "},
diff --git a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
index 4560f90..22df992 100644
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java
@@ -199,7 +199,8 @@
{"certificate.is.not.valid.until",
"\u76F4\u5230{0}, \u8BC1\u4E66\u624D\u6709\u6548"},
{"certificate.will.expire.on", "\u8BC1\u4E66\u5C06\u5728{0}\u5230\u671F"},
- {".CertPath.not.validated.", "[CertPath \u672A\u9A8C\u8BC1: "},
+ {".Invalid.certificate.chain.", "[\u65E0\u6548\u7684\u8BC1\u4E66\u94FE: "},
+ {".Invalid.TSA.certificate.chain.", "[\u65E0\u6548 TSA \u7684\u8BC1\u4E66\u94FE: "},
{"requesting.a.signature.timestamp",
"\u6B63\u5728\u8BF7\u6C42\u7B7E\u540D\u65F6\u95F4\u6233"},
{"TSA.location.", "TSA \u4F4D\u7F6E: "},
@@ -214,6 +215,8 @@
{"entry.was.signed.on", "\u6761\u76EE\u7684\u7B7E\u540D\u65E5\u671F\u4E3A {0}"},
{"Warning.", "\u8B66\u544A: "},
{"Error.", "\u9519\u8BEF: "},
+ {"...Signer", ">>> \u7B7E\u540D\u8005"},
+ {"...TSA", ">>> TSA"},
{"This.jar.contains.unsigned.entries.which.have.not.been.integrity.checked.",
"\u6B64 jar \u5305\u542B\u5C1A\u672A\u8FDB\u884C\u5B8C\u6574\u6027\u68C0\u67E5\u7684\u672A\u7B7E\u540D\u6761\u76EE\u3002 "},
{"This.jar.contains.entries.whose.signer.certificate.has.expired.",
@@ -222,6 +225,8 @@
"\u6B64 jar \u5305\u542B\u7B7E\u540D\u8005\u8BC1\u4E66\u5C06\u5728\u516D\u4E2A\u6708\u5185\u8FC7\u671F\u7684\u6761\u76EE\u3002 "},
{"This.jar.contains.entries.whose.signer.certificate.is.not.yet.valid.",
"\u6B64 jar \u5305\u542B\u7B7E\u540D\u8005\u8BC1\u4E66\u4ECD\u65E0\u6548\u7684\u6761\u76EE\u3002 "},
+ {"This.jar.contains.entries.whose.signer.certificate.is.self.signed.",
+ "\u6B64 jar \u5305\u542B\u5176\u7B7E\u540D\u8005\u8BC1\u4E66\u4E3A\u81EA\u7B7E\u540D\u8BC1\u4E66\u7684\u6761\u76EE\u3002"},
{"Re.run.with.the.verbose.option.for.more.details.",
"\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u4F7F\u7528 -verbose \u9009\u9879\u91CD\u65B0\u8FD0\u884C\u3002"},
{"Re.run.with.the.verbose.and.certs.options.for.more.details.",
@@ -246,14 +251,24 @@
"\u6B64 jar \u5305\u542B\u7531\u4E8E\u7B7E\u540D\u8005\u8BC1\u4E66\u7684 NetscapeCertType \u6269\u5C55\u800C\u65E0\u6CD5\u8FDB\u884C\u4EE3\u7801\u7B7E\u540D\u7684\u6761\u76EE\u3002"},
{".{0}.extension.does.not.support.code.signing.",
"[{0} \u6269\u5C55\u4E0D\u652F\u6301\u4EE3\u7801\u7B7E\u540D]"},
- {"The.signer.s.certificate.chain.is.not.validated.",
- "\u7B7E\u540D\u8005\u7684\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u3002"},
- {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.",
- "\u6B64 jar \u5305\u542B\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u7684\u6761\u76EE\u3002"},
+ {"The.signer.s.certificate.chain.is.invalid.reason.1",
+ "\u7B7E\u540D\u8005\u8BC1\u4E66\u94FE\u65E0\u6548\u3002\u539F\u56E0: %s"},
+ {"The.tsa.certificate.chain.is.invalid.reason.1",
+ "TSA \u8BC1\u4E66\u94FE\u65E0\u6548\u3002\u539F\u56E0: %s"},
+ {"The.signer.s.certificate.is.self.signed.",
+ "\u7B7E\u540D\u8005\u8BC1\u4E66\u4E3A\u81EA\u7B7E\u540D\u8BC1\u4E66\u3002"},
+ {"The.1.algorithm.specified.for.the.2.option.is.considered.a.security.risk.",
+ "\u4E3A %2$s \u9009\u9879\u6307\u5B9A\u7684 %1$s \u7B97\u6CD5\u88AB\u89C6\u4E3A\u5B58\u5728\u5B89\u5168\u98CE\u9669\u3002"},
+ {"This.jar.contains.entries.whose.certificate.chain.is.invalid.reason.1",
+ "\u6B64 jar \u5305\u542B\u5176\u8BC1\u4E66\u94FE\u65E0\u6548\u7684\u6761\u76EE\u3002\u539F\u56E0: %s"},
+ {"This.jar.contains.entries.whose.tsa.certificate.chain.is.invalid.reason.1",
+ "\u6B64 jar \u5305\u542B\u5176 TSA \u8BC1\u4E66\u94FE\u65E0\u6548\u7684\u6761\u76EE\u3002\u539F\u56E0: %s"},
{"no.timestamp.signing",
"\u672A\u63D0\u4F9B -tsa \u6216 -tsacert, \u6B64 jar \u6CA1\u6709\u65F6\u95F4\u6233\u3002\u5982\u679C\u6CA1\u6709\u65F6\u95F4\u6233, \u5219\u5728\u7B7E\u540D\u8005\u8BC1\u4E66\u7684\u5230\u671F\u65E5\u671F (%1$tY-%1$tm-%1$td) \u6216\u4EE5\u540E\u7684\u4EFB\u4F55\u64A4\u9500\u65E5\u671F\u4E4B\u540E, \u7528\u6237\u53EF\u80FD\u65E0\u6CD5\u9A8C\u8BC1\u6B64 jar\u3002"},
{"no.timestamp.verifying",
"\u6B64 jar \u5305\u542B\u7684\u7B7E\u540D\u6CA1\u6709\u65F6\u95F4\u6233\u3002\u5982\u679C\u6CA1\u6709\u65F6\u95F4\u6233, \u5219\u5728\u7B7E\u540D\u8005\u8BC1\u4E66\u7684\u5230\u671F\u65E5\u671F (%1$tY-%1$tm-%1$td) \u6216\u4EE5\u540E\u7684\u4EFB\u4F55\u64A4\u9500\u65E5\u671F\u4E4B\u540E, \u7528\u6237\u53EF\u80FD\u65E0\u6CD5\u9A8C\u8BC1\u6B64 jar\u3002"},
+ {"bad.timestamp.verifying",
+ "\u6B64 jar \u5305\u542B\u5E26\u6709\u65E0\u6548\u65F6\u95F4\u6233\u7684\u7B7E\u540D\u3002\u5982\u679C\u6CA1\u6709\u6709\u6548\u65F6\u95F4\u6233, \u5219\u5728\u5176\u4E2D\u4EFB\u4E00\u7B7E\u540D\u8005\u8BC1\u4E66\u5230\u671F (\u6700\u65E9\u4E3A %1$tY-%1$tm-%1$td) \u4E4B\u540E, \u7528\u6237\u53EF\u80FD\u65E0\u6CD5\u9A8C\u8BC1\u6B64 jar\u3002\n\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u4F7F\u7528 -J-Djava.security.debug=jar \u91CD\u65B0\u8FD0\u884C jarsigner\u3002"},
{"Unknown.password.type.", "\u672A\u77E5\u53E3\u4EE4\u7C7B\u578B: "},
{"Cannot.find.environment.variable.",
"\u627E\u4E0D\u5230\u73AF\u5883\u53D8\u91CF: "},
diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/share/classes/sun/security/tools/keytool/Main.java
index 0730f4f..0c626b5 100644
--- a/jdk/src/share/classes/sun/security/tools/keytool/Main.java
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java
@@ -1352,7 +1352,7 @@
for (Certificate ca: keyStore.getCertificateChain(alias)) {
if (ca instanceof X509Certificate) {
X509Certificate xca = (X509Certificate)ca;
- if (!isSelfSigned(xca)) {
+ if (!KeyStoreUtil.isSelfSigned(xca)) {
dumpCert(xca, out);
}
}
@@ -2857,7 +2857,7 @@
// if certificate is self-signed, make sure it verifies
boolean selfSigned = false;
- if (isSelfSigned(cert)) {
+ if (KeyStoreUtil.isSelfSigned(cert)) {
cert.verify(cert.getPublicKey());
selfSigned = true;
}
@@ -3161,25 +3161,6 @@
}
/**
- * Returns true if the certificate is self-signed, false otherwise.
- */
- private boolean isSelfSigned(X509Certificate cert) {
- return signedBy(cert, cert);
- }
-
- private boolean signedBy(X509Certificate end, X509Certificate ca) {
- if (!ca.getSubjectDN().equals(end.getIssuerDN())) {
- return false;
- }
- try {
- end.verify(ca.getPublicKey());
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
- /**
* Locates a signer for a given certificate from a given keystore and
* returns the signer's certificate.
* @param cert the certificate whose signer is searched, not null
@@ -3519,7 +3500,7 @@
// find a cert in the reply who signs thisCert
int j;
for (j=i; j<replyCerts.length; j++) {
- if (signedBy(thisCert, (X509Certificate)replyCerts[j])) {
+ if (KeyStoreUtil.signedBy(thisCert, (X509Certificate)replyCerts[j])) {
tmpCert = replyCerts[i];
replyCerts[i] = replyCerts[j];
replyCerts[j] = tmpCert;
@@ -3677,7 +3658,7 @@
private boolean buildChain(Pair<String,X509Certificate> certToVerify,
Vector<Pair<String,X509Certificate>> chain,
Hashtable<Principal, Vector<Pair<String,X509Certificate>>> certs) {
- if (isSelfSigned(certToVerify.snd)) {
+ if (KeyStoreUtil.isSelfSigned(certToVerify.snd)) {
// reached self-signed root cert;
// no verification needed because it's trusted.
chain.addElement(certToVerify);
diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java
index 1f194ae..c2a3ac2 100644
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java
@@ -99,7 +99,7 @@
{"destination.alias",
"Zielalias"}, //-destalias
{"destination.key.password",
- "Zielschl\u00FCssel-Kennwort"}, //-destkeypass
+ "Zielschl\u00FCsselkennwort"}, //-destkeypass
{"destination.keystore.name",
"Ziel-Keystore-Name"}, //-destkeystore
{"destination.keystore.password.protected",
@@ -147,7 +147,7 @@
{"source.alias",
"Quellalias"}, //-srcalias
{"source.key.password",
- "Quellschl\u00FCssel-Kennwort"}, //-srckeypass
+ "Quellschl\u00FCsselkennwort"}, //-srckeypass
{"source.keystore.name",
"Quell-Keystore-Name"}, //-srckeystore
{"source.keystore.password.protected",
@@ -178,8 +178,8 @@
"Serielle ID des zu entziehenden Certs"}, //-id
// keytool: Running part
{"keytool.error.", "Keytool-Fehler: "},
- {"Illegal.option.", "Ung\u00FCltige Option: "},
- {"Illegal.value.", "Ung\u00FCltiger Wert: "},
+ {"Illegal.option.", "Unzul\u00E4ssige Option: "},
+ {"Illegal.value.", "Unzul\u00E4ssiger Wert: "},
{"Unknown.password.type.", "Unbekannter Kennworttyp: "},
{"Cannot.find.environment.variable.",
"Umgebungsvariable kann nicht gefunden werden: "},
@@ -205,7 +205,7 @@
"Wenn der Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -storepass, -keypass und -new nicht angegeben werden"},
{"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified",
"Wenn der Quell-Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -srcstorepass und -srckeypass nicht angegeben werden"},
- {"Illegal.startdate.value", "Ung\u00FCltiger Wert f\u00FCr Anfangsdatum"},
+ {"Illegal.startdate.value", "Unzul\u00E4ssiger Wert f\u00FCr Anfangsdatum"},
{"Validity.must.be.greater.than.zero",
"G\u00FCltigkeit muss gr\u00F6\u00DFer als null sein"},
{"provName.not.a.provider", "{0} kein Provider"},
diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java
index 4e5c923..92c7f6a 100644
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java
@@ -39,8 +39,8 @@
{"Warning.Class.not.found.class", "Warnung: Klasse nicht gefunden: {0}"},
{"Warning.Invalid.argument.s.for.constructor.arg",
"Warnung: Ung\u00FCltige(s) Argument(e) f\u00FCr Constructor: {0}"},
- {"Illegal.Principal.Type.type", "Ung\u00FCltiger Principal-Typ: {0}"},
- {"Illegal.option.option", "Ung\u00FCltige Option: {0}"},
+ {"Illegal.Principal.Type.type", "Unzul\u00E4ssiger Principal-Typ: {0}"},
+ {"Illegal.option.option", "Unzul\u00E4ssige Option: {0}"},
{"Usage.policytool.options.", "Verwendung: policytool [Optionen]"},
{".file.file.policy.file.location",
" [-file <Datei>] Policy-Dateiverzeichnis"},
diff --git a/jdk/src/share/classes/sun/security/util/AuthResources_sv.java b/jdk/src/share/classes/sun/security/util/AuthResources_sv.java
index 8e7e282..328260d 100644
--- a/jdk/src/share/classes/sun/security/util/AuthResources_sv.java
+++ b/jdk/src/share/classes/sun/security/util/AuthResources_sv.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@
{"Keystore.alias.","Nyckellageralias: "},
{"Keystore.password.","Nyckellagerl\u00F6senord: "},
{"Private.key.password.optional.",
- "L\u00F6senord f\u00F6r personlig nyckel (valfritt): "},
+ "L\u00F6senord f\u00F6r privat nyckel (valfritt): "},
// com.sun.security.auth.module.Krb5LoginModule
{"Kerberos.username.defUsername.",
diff --git a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java
index 0663f05..ee5c288 100644
--- a/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java
+++ b/jdk/src/share/classes/sun/security/util/SignatureFileVerifier.java
@@ -718,7 +718,8 @@
if (signers == null) {
signers = new ArrayList<>();
}
- // Append the new code signer
+ // Append the new code signer. If timestamp is invalid, this
+ // jar will be treated as unsigned.
signers.add(new CodeSigner(certChain, info.getTimestamp()));
if (debug != null) {
diff --git a/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java b/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java
index 4ca79f0..0ecdaa1 100644
--- a/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java
+++ b/jdk/src/share/classes/sun/security/validator/EndEntityChecker.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -132,26 +132,33 @@
return new EndEntityChecker(type, variant);
}
- void check(X509Certificate cert, Object parameter)
- throws CertificateException {
+ void check(X509Certificate cert, Object parameter,
+ boolean checkUnresolvedCritExts) throws CertificateException {
if (variant.equals(Validator.VAR_GENERIC)) {
- // no checks
- return;
- } else if (variant.equals(Validator.VAR_TLS_SERVER)) {
- checkTLSServer(cert, (String)parameter);
+ return; // no checks
+ }
+
+ Set<String> exts = getCriticalExtensions(cert);
+ if (variant.equals(Validator.VAR_TLS_SERVER)) {
+ checkTLSServer(cert, (String)parameter, exts);
} else if (variant.equals(Validator.VAR_TLS_CLIENT)) {
- checkTLSClient(cert);
+ checkTLSClient(cert, exts);
} else if (variant.equals(Validator.VAR_CODE_SIGNING)) {
- checkCodeSigning(cert);
+ checkCodeSigning(cert, exts);
} else if (variant.equals(Validator.VAR_JCE_SIGNING)) {
- checkCodeSigning(cert);
+ checkCodeSigning(cert, exts);
} else if (variant.equals(Validator.VAR_PLUGIN_CODE_SIGNING)) {
- checkCodeSigning(cert);
+ checkCodeSigning(cert, exts);
} else if (variant.equals(Validator.VAR_TSA_SERVER)) {
- checkTSAServer(cert);
+ checkTSAServer(cert, exts);
} else {
throw new CertificateException("Unknown variant: " + variant);
}
+
+ // if neither VAR_GENERIC variant nor unknown variant
+ if (checkUnresolvedCritExts) {
+ checkRemainingExtensions(exts);
+ }
}
/**
@@ -219,10 +226,8 @@
* authentication.
* @throws CertificateException if not.
*/
- private void checkTLSClient(X509Certificate cert)
+ private void checkTLSClient(X509Certificate cert, Set<String> exts)
throws CertificateException {
- Set<String> exts = getCriticalExtensions(cert);
-
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
@@ -245,8 +250,6 @@
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
-
- checkRemainingExtensions(exts);
}
/**
@@ -255,10 +258,8 @@
* specification for details.
* @throws CertificateException if not.
*/
- private void checkTLSServer(X509Certificate cert, String parameter)
- throws CertificateException {
- Set<String> exts = getCriticalExtensions(cert);
-
+ private void checkTLSServer(X509Certificate cert, String parameter,
+ Set<String> exts) throws CertificateException {
if (KU_SERVER_ENCRYPTION.contains(parameter)) {
if (checkKeyUsage(cert, KU_KEY_ENCIPHERMENT) == false) {
throw new ValidatorException
@@ -303,18 +304,14 @@
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
-
- checkRemainingExtensions(exts);
}
/**
* Check whether this certificate can be used for code signing.
* @throws CertificateException if not.
*/
- private void checkCodeSigning(X509Certificate cert)
+ private void checkCodeSigning(X509Certificate cert, Set<String> exts)
throws CertificateException {
- Set<String> exts = getCriticalExtensions(cert);
-
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
@@ -341,8 +338,6 @@
// remove extensions we checked
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
-
- checkRemainingExtensions(exts);
}
/**
@@ -350,10 +345,8 @@
* server (see RFC 3161, section 2.3).
* @throws CertificateException if not.
*/
- private void checkTSAServer(X509Certificate cert)
+ private void checkTSAServer(X509Certificate cert, Set<String> exts)
throws CertificateException {
- Set<String> exts = getCriticalExtensions(cert);
-
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
@@ -376,7 +369,5 @@
// remove extensions we checked
exts.remove(SimpleValidator.OID_KEY_USAGE);
exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);
-
- checkRemainingExtensions(exts);
}
}
diff --git a/jdk/src/share/classes/sun/security/validator/Validator.java b/jdk/src/share/classes/sun/security/validator/Validator.java
index 863566c..dd880a7 100644
--- a/jdk/src/share/classes/sun/security/validator/Validator.java
+++ b/jdk/src/share/classes/sun/security/validator/Validator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -143,6 +143,7 @@
*/
public final static String VAR_PLUGIN_CODE_SIGNING = "plugin code signing";
+ private final String type;
final EndEntityChecker endEntityChecker;
final String variant;
@@ -154,6 +155,7 @@
volatile Date validationDate;
Validator(String type, String variant) {
+ this.type = type;
this.variant = variant;
endEntityChecker = EndEntityChecker.getInstance(type, variant);
}
@@ -261,7 +263,16 @@
// omit EE extension check if EE cert is also trust anchor
if (chain.length > 1) {
- endEntityChecker.check(chain[0], parameter);
+ // EndEntityChecker does not need to check unresolved critical
+ // extensions when validating with a TYPE_PKIX Validator.
+ // A TYPE_PKIX Validator will already have run checks on all
+ // certs' extensions, including checks by any PKIXCertPathCheckers
+ // included in the PKIXParameters, so the extra checks would be
+ // redundant.
+ boolean checkUnresolvedCritExts =
+ (type == TYPE_PKIX) ? false : true;
+ endEntityChecker.check(chain[0], parameter,
+ checkUnresolvedCritExts);
}
return chain;
diff --git a/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties b/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties
index e1aa427..4ec040f 100644
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -24,7 +24,7 @@
#
error.cant.open=\u00D6ffnen nicht m\u00F6glich: {0}
-error.illegal.option=Ung\u00FCltige Option: {0}
+error.illegal.option=Unzul\u00E4ssige Option: {0}
error.bad.option=Eine der Optionen -{ctxu} muss angegeben werden.
error.bad.cflag=Kennzeichen "c" erfordert Angabe von Manifest oder Eingabedateien.
error.bad.uflag=Kennzeichen "u" erfordert Angabe von Manifest, Kennzeichen "e" oder Eingabedateien.
diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java
index d95927d..3e4a0da 100644
--- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java
+++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java
@@ -445,7 +445,7 @@
"Western Greenland Summer Time", "WGST",
"Western Greenland Time", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java b/jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java
index 058ae99..cb0b627 100644
--- a/jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java
+++ b/jdk/src/share/classes/sun/util/resources/de/TimeZoneNames_de.java
@@ -446,7 +446,7 @@
"Westgr\u00f6nl\u00e4ndische Sommerzeit", "WGST",
"Westgr\u00F6nl\u00E4ndische Zeit", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java b/jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java
index f21e0d9..10a85b6 100644
--- a/jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java
+++ b/jdk/src/share/classes/sun/util/resources/es/TimeZoneNames_es.java
@@ -446,7 +446,7 @@
"Hora de verano de Groenlandia Occidental", "WGST",
"Hora de Groenlandia Occidental", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java b/jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java
index 489838c..faf5795 100644
--- a/jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java
+++ b/jdk/src/share/classes/sun/util/resources/fr/TimeZoneNames_fr.java
@@ -446,7 +446,7 @@
"Heure d'\u00e9t\u00e9 du Groenland de l'Ouest", "WGST",
"Heure du Groenland de l'Ouest", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java b/jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java
index 14511c6..9325485 100644
--- a/jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java
+++ b/jdk/src/share/classes/sun/util/resources/it/TimeZoneNames_it.java
@@ -446,7 +446,7 @@
"Ora estiva della Groenlandia occidentale", "WGST",
"Ora della Groenlandia occidentale", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java b/jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java
index b02d441..1fb35f0 100644
--- a/jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java
+++ b/jdk/src/share/classes/sun/util/resources/ja/TimeZoneNames_ja.java
@@ -446,7 +446,7 @@
"\u897f\u30b0\u30ea\u30fc\u30f3\u30e9\u30f3\u30c9\u590f\u6642\u9593", "WGST",
"\u897F\u90E8\u30B0\u30EA\u30FC\u30F3\u30E9\u30F3\u30C9\u6642\u9593", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java b/jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java
index 99c14ee..a6970e0 100644
--- a/jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java
+++ b/jdk/src/share/classes/sun/util/resources/ko/TimeZoneNames_ko.java
@@ -446,7 +446,7 @@
"\uc11c\ubd80 \uadf8\ub9b0\ub79c\ub4dc \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "WGST",
"\uC11C\uBD80 \uADF8\uB9B0\uB780\uB4DC \uD45C\uC900\uC2DC", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java b/jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java
index 185b4a4..bcc610d 100644
--- a/jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java
+++ b/jdk/src/share/classes/sun/util/resources/pt/TimeZoneNames_pt_BR.java
@@ -446,7 +446,7 @@
"Fuso hor\u00e1rio de ver\u00e3o da Groenl\u00e2ndia Ocidental", "WGST",
"Hor\u00E1rio da Groenl\u00E2ndia Ocidental", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java b/jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java
index 400f75a..a4e8b7d 100644
--- a/jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java
+++ b/jdk/src/share/classes/sun/util/resources/sv/TimeZoneNames_sv.java
@@ -446,7 +446,7 @@
"V\u00e4stra Gr\u00f6nland, sommartid", "WGST",
"V\u00E4stgr\u00F6nl\u00E4ndsk tid", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java b/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java
index e45a470..4f6eebe 100644
--- a/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java
+++ b/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_CN.java
@@ -446,7 +446,7 @@
"\u897f\u683c\u6797\u5170\u5c9b\u590f\u4ee4\u65f6", "WGST",
"\u897F\u683C\u6797\u5170\u5C9B\u65F6\u95F4", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java b/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java
index da34e15..372bc9e 100644
--- a/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java
+++ b/jdk/src/share/classes/sun/util/resources/zh/TimeZoneNames_zh_TW.java
@@ -446,7 +446,7 @@
"\u897f\u683c\u6797\u862d\u5cf6\u590f\u4ee4\u6642\u9593", "WGST",
"\u897F\u683C\u9675\u862D\u6642\u9593", "WGT"}},
{"America/Goose_Bay", AST},
- {"America/Grand_Turk", AST},
+ {"America/Grand_Turk", EST},
{"America/Grenada", AST},
{"America/Guadeloupe", AST},
{"America/Guatemala", CST},
diff --git a/jdk/src/share/lib/security/java.security-aix b/jdk/src/share/lib/security/java.security-aix
index 5a6b9f3..ac6b586 100644
--- a/jdk/src/share/lib/security/java.security-aix
+++ b/jdk/src/share/lib/security/java.security-aix
@@ -619,8 +619,8 @@
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024, \
- EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
# processing in JSSE implementation.
diff --git a/jdk/src/share/lib/security/java.security-linux b/jdk/src/share/lib/security/java.security-linux
index 455eb97..9b26919 100644
--- a/jdk/src/share/lib/security/java.security-linux
+++ b/jdk/src/share/lib/security/java.security-linux
@@ -619,8 +619,8 @@
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024, \
- EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
# processing in JSSE implementation.
diff --git a/jdk/src/share/lib/security/java.security-macosx b/jdk/src/share/lib/security/java.security-macosx
index 6891bfb..205b13a 100644
--- a/jdk/src/share/lib/security/java.security-macosx
+++ b/jdk/src/share/lib/security/java.security-macosx
@@ -622,8 +622,8 @@
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024, \
- EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
# processing in JSSE implementation.
diff --git a/jdk/src/share/lib/security/java.security-solaris b/jdk/src/share/lib/security/java.security-solaris
index 5dcb584..1fb4c0e 100644
--- a/jdk/src/share/lib/security/java.security-solaris
+++ b/jdk/src/share/lib/security/java.security-solaris
@@ -621,8 +621,8 @@
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024, \
- EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
# processing in JSSE implementation.
diff --git a/jdk/src/share/lib/security/java.security-windows b/jdk/src/share/lib/security/java.security-windows
index 724b696..3d80302 100644
--- a/jdk/src/share/lib/security/java.security-windows
+++ b/jdk/src/share/lib/security/java.security-windows
@@ -622,8 +622,8 @@
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024, \
- EC keySize < 224, DES40_CBC, RC4_40, 3DES_EDE_CBC
+jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
+ EC keySize < 224, 3DES_EDE_CBC
# Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
# processing in JSSE implementation.
diff --git a/jdk/src/share/native/common/jni_util.h b/jdk/src/share/native/common/jni_util.h
index 7655eab..1356c8a 100644
--- a/jdk/src/share/native/common/jni_util.h
+++ b/jdk/src/share/native/common/jni_util.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -297,6 +297,22 @@
} \
} while (0) \
+#define CHECK_NULL_THROW_NPE(env, x, msg) \
+ do { \
+ if ((x) == NULL) { \
+ JNU_ThrowNullPointerException((env), (msg));\
+ return; \
+ } \
+ } while(0) \
+
+#define CHECK_NULL_THROW_NPE_RETURN(env, x, msg, z)\
+ do { \
+ if ((x) == NULL) { \
+ JNU_ThrowNullPointerException((env), (msg));\
+ return (z); \
+ } \
+ } while(0) \
+
#define CHECK_NULL_RETURN(x, y) \
do { \
if ((x) == NULL) { \
diff --git a/jdk/src/share/native/java/net/net_util.c b/jdk/src/share/native/java/net/net_util.c
index 2194e2e..b1b8223 100644
--- a/jdk/src/share/native/java/net/net_util.c
+++ b/jdk/src/share/native/java/net/net_util.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -168,32 +168,38 @@
void setInetAddress_addr(JNIEnv *env, jobject iaObj, int address) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE(env, holder, "InetAddress holder is null");
(*env)->SetIntField(env, holder, iac_addressID, address);
}
void setInetAddress_family(JNIEnv *env, jobject iaObj, int family) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE(env, holder, "InetAddress holder is null");
(*env)->SetIntField(env, holder, iac_familyID, family);
}
void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE(env, holder, "InetAddress holder is null");
(*env)->SetObjectField(env, holder, iac_hostNameID, host);
(*env)->SetObjectField(env, holder, iac_origHostNameID, host);
}
int getInetAddress_addr(JNIEnv *env, jobject iaObj) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE_RETURN(env, holder, "InetAddress holder is null", -1);
return (*env)->GetIntField(env, holder, iac_addressID);
}
int getInetAddress_family(JNIEnv *env, jobject iaObj) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE_RETURN(env, holder, "InetAddress holder is null", -1);
return (*env)->GetIntField(env, holder, iac_familyID);
}
jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) {
jobject holder = (*env)->GetObjectField(env, iaObj, ia_holderID);
+ CHECK_NULL_THROW_NPE_RETURN(env, holder, "InetAddress holder is null", NULL);
return (*env)->GetObjectField(env, holder, iac_hostNameID);
}
@@ -215,7 +221,9 @@
CHECK_NULL_RETURN(iaObj, NULL);
address = NET_IPv4MappedToIPv4(caddr);
setInetAddress_addr(env, iaObj, address);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
setInetAddress_family(env, iaObj, IPv4);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
} else {
jint scope;
int ret;
@@ -224,6 +232,7 @@
ret = setInet6Address_ipaddress(env, iaObj, (char *)&(him6->sin6_addr));
CHECK_NULL_RETURN(ret, NULL);
setInetAddress_family(env, iaObj, IPv6);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
scope = getScopeID(him);
setInet6Address_scopeid(env, iaObj, scope);
}
@@ -235,7 +244,9 @@
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
CHECK_NULL_RETURN(iaObj, NULL);
setInetAddress_family(env, iaObj, IPv4);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
*port = ntohs(him4->sin_port);
}
return iaObj;
@@ -248,6 +259,7 @@
#ifdef AF_INET6
family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
+ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE);
if (him->sa_family == AF_INET6) {
#ifdef WIN32
struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
@@ -263,6 +275,7 @@
}
addrNew = NET_IPv4MappedToIPv4(caddrNew);
addrCur = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE);
if (addrNew == addrCur) {
return JNI_TRUE;
} else {
@@ -294,6 +307,7 @@
}
addrNew = ntohl(him4->sin_addr.s_addr);
addrCur = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, JNI_FALSE);
if (addrNew == addrCur) {
return JNI_TRUE;
} else {
diff --git a/jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c b/jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c
index e51f53a..f90338e 100644
--- a/jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c
+++ b/jdk/src/share/native/sun/awt/image/BufImgSurfaceData.c
@@ -298,6 +298,10 @@
}
cData->img_clr_tbl = initCubemap(pRgb, bisdo->lutsize, 32);
+ if (cData->img_clr_tbl == NULL) {
+ free(cData);
+ return (ColorData*)NULL;
+ }
if (allGray == JNI_TRUE) {
initInverseGrayLut(pRgb, bisdo->lutsize, cData);
}
diff --git a/jdk/src/share/native/sun/awt/libpng/CHANGES b/jdk/src/share/native/sun/awt/libpng/CHANGES
index 0b5e944..0ed6a11 100644
--- a/jdk/src/share/native/sun/awt/libpng/CHANGES
+++ b/jdk/src/share/native/sun/awt/libpng/CHANGES
@@ -1,4 +1,3 @@
-#if 0
CHANGES - changes for libpng
version 0.1 [March 29, 1995]
@@ -833,7 +832,7 @@
Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes
which are no longer used.
Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is
- defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXT_SUPPORTED
+ defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXt_SUPPORTED
is defined.
Made PNG_NO_READ|WRITE_iTXt the default setting, to avoid memory
overrun when old applications fill the info_ptr->text structure directly.
@@ -1454,7 +1453,7 @@
sequential read support.
Added some "#if PNG_WRITE_SUPPORTED" blocks.
Added #ifdef to remove some redundancy in png_malloc_default().
- Use png_malloc instead of png_zalloc to allocate the pallete.
+ Use png_malloc instead of png_zalloc to allocate the palette.
Version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004]
Fixed buffer overflow vulnerability (CVE-2004-0597) in png_handle_tRNS().
@@ -3259,7 +3258,7 @@
Revised PNG_EXPORTA macro to not use an empty parameter, to accommodate the
old VisualC++ preprocessor.
Turned on interlace handling in png_read_png().
- Fixed gcc pendantic warnings.
+ Fixed gcc pedantic warnings.
Handle longjmp in Cygwin.
Fixed png_get_current_row_number() in the interlaced case.
Cleaned up ALPHA flags and transformations.
@@ -3359,7 +3358,7 @@
Pass "" instead of '\0' to png_default_error() in png_err(). This mistake
was introduced in libpng-1.2.20beta01. This fixes CVE-2011-2691.
Added PNG_WRITE_OPTIMIZE_CMF_SUPPORTED macro to make the zlib "CMF" byte
- optimization configureable.
+ optimization configurable.
IDAT compression failed if preceded by a compressed text chunk (bug
introduced in libpng-1.5.3beta01-02). This was because the attempt to
reset the zlib stream in png_write_IDAT happened after the first IDAT
@@ -3643,7 +3642,7 @@
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
Version 1.5.6beta06 [October 17, 2011]
- Removed two redundant tests for unitialized row.
+ Removed two redundant tests for uninitialized row.
Fixed a relatively harmless memory overwrite in compressed text writing
with a 1 byte zlib buffer.
Add ability to call png_read_update_info multiple times to pngvalid.c.
@@ -3689,7 +3688,7 @@
crash. The pngmem.c implementation of png_malloc() included a cast
to png_size_t which would fail on large allocations on 16-bit systems.
Fix for the preprocessor of the Intel C compiler. The preprocessor
- splits adjacent @ signs with a space; this changes the concatentation
+ splits adjacent @ signs with a space; this changes the concatenation
token from @-@-@ to PNG_JOIN; that should work with all compiler
preprocessors.
Paeth filter speed improvements from work by Siarhei Siamashka. This
@@ -3735,7 +3734,7 @@
gray (on palette) itself.
Fixes for C++ compilation using g++ When libpng source is compiled
using g++. The compiler imposes C++ rules on the C source; thus it
- is desireable to make the source work with either C or C++ rules
+ is desirable to make the source work with either C or C++ rules
without throwing away useful error information. This change adds
png_voidcast to allow C semantic (void*) cases or the corresponding
C++ static_cast operation, as appropriate.
@@ -4061,7 +4060,7 @@
possible to call png_inflate() incrementally. A warning is no longer
issued if the language tag or translated keyword in the iTXt chunk
has zero length.
- If benign errors are disabled use maximum window on ancilliary inflate.
+ If benign errors are disabled use maximum window on ancillary inflate.
This works round a bug introduced in 1.5.4 where compressed ancillary
chunks could end up with a too-small windowBits value in the deflate
header.
@@ -4176,7 +4175,7 @@
declared even though the functions are never actually defined. This
change provides a dummy definition so that the declarations work, yet any
implementation will fail to compile because of an incomplete type.
- Re-eliminated the use of strcpy() in pngtest.c. An unncessary use of
+ Re-eliminated the use of strcpy() in pngtest.c. An unnecessary use of
strcpy() was accidentally re-introduced in libpng16; this change replaces
it with strncpy().
Eliminated use of png_sizeof(); use sizeof() instead.
@@ -4309,7 +4308,7 @@
resulting in VS2010 having to update the files.
Removed non-working ICC profile support code that was mostly added to
libpng-1.6.0beta29 and beta30. There was too much code for too little
- gain; implementing full ICC color correction may be desireable but is left
+ gain; implementing full ICC color correction may be desirable but is left
up to applications.
Version 1.6.0beta32 [November 25, 2012]
@@ -4592,7 +4591,7 @@
the optimizations ('check' vs 'api') are exposed in the public header files
except that the new setting PNG_ARM_NEON_OPT documents how libpng makes the
decision about whether or not to use the optimizations.
- Protect symbol prefixing against CC/CPPFLAGS/CFLAGS useage.
+ Protect symbol prefixing against CC/CPPFLAGS/CFLAGS usage.
Previous iOS/Xcode fixes for the ARM NEON optimizations moved the test
on __ARM_NEON__ from configure time to compile time. This breaks symbol
prefixing because the definition of the special png_init_filter_functions
@@ -5635,7 +5634,7 @@
to All and adds a list of the warnings that need to be turned off. This is
semi-documentary; the intent is to tell libpng users which warnings have
been examined and judged non-fixable at present. The warning about
- structure padding is fixable, but it would be a signficant change (moving
+ structure padding is fixable, but it would be a significant change (moving
structure members around).
Version 1.6.24beta03 [July 4, 2016]
@@ -5761,7 +5760,9 @@
if built with zlib-1.2.8.1.
Version 1.6.27rc01 [December 27, 2016]
- Control ADLER32 checking with new PNG_IGNORE_ADLER32 option.
+ Control ADLER32 checking with new PNG_IGNORE_ADLER32 option. Fixes
+ an endless loop when handling erroneous ADLER32 checksums; bug
+ introduced in libpng-1.6.26.
Removed the use of a macro containing the pre-processor 'defined'
operator. It is unclear whether this is valid; a macro that
"generates" 'defined' is not permitted, but the use of the word
@@ -5779,7 +5780,7 @@
Added option to Cmake build allowing a custom location of zlib to be
specified in a scenario where libpng is being built as a subproject
alongside zlib by another project (Sam Serrels).
- Changed png_ptr->options from a png_byte to png_uint_32, to accomodate
+ Changed png_ptr->options from a png_byte to png_uint_32, to accommodate
up to 16 options.
Version 1.6.28rc02 [January 4, 2017]
@@ -5794,11 +5795,277 @@
Version 1.6.28 [January 5, 2017]
No changes.
+Version 1.6.29beta01 [January 12, 2017]
+ Readded "include(GNUInstallDirs)" to CMakeLists.txt (Gianfranco Costamagna).
+ Moved SSE2 optimization code into the main libpng source directory.
+ Configure libpng with "configure --enable-intel-sse" or compile
+ libpng with "-DPNG_INTEL_SSE" in CPPFLAGS to enable it.
+ Simplified conditional compilation in pngvalid.c, for AIX (Michael Felt).
+
+Version 1.6.29beta02 [February 22, 2017]
+ Avoid conditional directives that break statements in pngrutil.c (Romero
+ Malaquias)
+ The contrib/examples/pngtopng.c recovery code was in the wrong "if"
+ branches; the comments were correct.
+ Added code for PowerPC VSX optimisation (Vadim Barkov).
+
+Version 1.6.29beta03 [March 1, 2017]
+ Avoid potential overflow of shift operations in png_do_expand() (Aaron Boxer).
+ Change test ZLIB_VERNUM >= 0x1281 to ZLIB_VERNUM >= 0x1290 in pngrutil.c
+ because Solaris 11 distributes zlib-1.2.8.f that is older than 1.2.8.1,
+ as suggested in zlib FAQ, item 24.
+ Suppress clang warnings about implicit sign changes in png.c
+
+Version 1.6.29 [March 16, 2017]
+ No changes.
+
+Version 1.6.30beta01 [April 1, 2017]
+ Added missing "$(CPPFLAGS)" to the compile line for c.pic.o in
+ makefile.linux and makefile.solaris-x86 (Cosmin).
+ Revised documentation of png_get_error_ptr() in the libpng manual.
+ Silence clang -Wcomma and const drop warnings (Viktor Szakats).
+ Update Sourceforge URLs in documentation (https instead of http).
+
+Version 1.6.30beta02 [April 22, 2017]
+ Document need to check for integer overflow when allocating a pixel
+ buffer for multiple rows in contrib/gregbook, contrib/pngminus,
+ example.c, and in the manual (suggested by Jaeseung Choi). This
+ is similar to the bug reported against pngquant in CVE-2016-5735.
+ Removed reference to the obsolete PNG_SAFE_LIMITS macro in the documentation.
+
+Version 1.6.30beta03 [May 22, 2017]
+ Check for integer overflow in contrib/visupng and contrib/tools/genpng.
+ Do not double evaluate CMAKE_SYSTEM_PROCESSOR in CMakeLists.txt.
+ Test CMAKE_HOST_WIN32 instead of WIN32 in CMakeLists.txt.
+ Fix some URL in documentation.
+
+Version 1.6.30beta04 [June 7, 2017]
+ Avoid writing an empty IDAT when the last IDAT exactly fills the
+ compression buffer (bug report by Brian Baird). This bug was
+ introduced in libpng-1.6.0.
+
+Version 1.6.30rc01 [June 14, 2017]
+ No changes.
+
+Version 1.6.30rc02 [June 25, 2017]
+ Update copyright year in pnglibconf.h, make ltmain.sh executable.
+ Add a reference to the libpng.download site in README.
+
+Version 1.6.30 [June 28, 2017]
+ No changes.
+
+Version 1.6.31beta01 [July 5, 2017]
+ Guard the definition of _POSIX_SOURCE in pngpriv.h (AIX already defines it;
+ bug report by Michael Felt).
+ Revised pngpriv.h to work around failure to compile arm/filter_neon.S
+ ("typedef" directive is unrecognized by the assembler). The problem
+ was introduced in libpng-1.6.30beta01.
+ Added "Requires: zlib" to libpng.pc.in (Pieter Neerincx).
+ Added special case for FreeBSD in arm/filter_neon.S (Maya Rashish).
+
+Version 1.6.31beta02 [July 8, 2017]
+ Added instructions for disabling hardware optimizations in INSTALL.
+ Added "--enable-hardware-optimizations" configuration flag to enable
+ or disable all hardware optimizations with one flag.
+
+Version 1.6.31beta03 [July 9, 2017]
+ Updated CMakeLists.txt to add INTEL_SSE and MIPS_MSA platforms.
+ Changed "int" to "png_size_t" in intel/filter_sse2.c to prevent
+ possible integer overflow (Bug report by John Bowler).
+ Quieted "declaration after statement" warnings in intel/filter_sse2.c.
+ Added scripts/makefile-linux-opt, which has hardware optimizations enabled.
+
+Version 1.6.31beta04 [July 11, 2017]
+ Removed one of the GCC-7.1.0 'strict-overflow' warnings that result when
+ integers appear on both sides of a compare. Worked around the others by
+ forcing the strict-overflow setting in the relevant functions to a level
+ where they are not reported (John Bowler).
+ Changed "FALL THROUGH" comments to "FALLTHROUGH" because GCC doesn't like
+ the space.
+ Worked around some C-style casts from (void*) because g++ 5.4.0 objects
+ to them.
+ Increased the buffer size for 'sprint' to pass the gcc 7.1.0 'sprint
+ overflow' check that is on by default with -Wall -Wextra.
+
+Version 1.6.31beta05 [July 13, 2017]
+ Added eXIf chunk support.
+
+Version 1.6.31beta06 [July 17, 2017]
+ Added a minimal eXIf chunk (with Orientation and FocalLengthIn35mmFilm
+ tags) to pngtest.png.
+
+Version 1.6.31beta07 [July 18, 2017]
+ Revised the eXIf chunk in pngtest.png to fix "Bad IFD1 Directory" warning.
+
+Version 1.6.31rc01 [July 19, 2017]
+ No changes.
+
+Version 1.6.31rc02 [July 25, 2017]
+ Fixed typo in example.c (png_free_image should be png_image_free) (Bug
+ report by John Smith)
+
+Version 1.6.31 [July 27, 2017]
+ No changes.
+
+Version 1.6.32beta01 [July 31, 2017]
+ Avoid possible NULL dereference in png_handle_eXIf when benign_errors
+ are allowed. Avoid leaking the input buffer "eXIf_buf".
+ Eliminated png_ptr->num_exif member from pngstruct.h and added num_exif
+ to arguments for png_get_eXIf() and png_set_eXIf().
+ Added calls to png_handle_eXIf(() in pngread.c and png_write_eXIf() in
+ pngwrite.c, and made various other fixes to png_write_eXIf().
+ Changed name of png_get_eXIF and png_set_eXIf() to png_get_eXIf_1() and
+ png_set_eXIf_1(), respectively, to avoid breaking API compatibility
+ with libpng-1.6.31.
+
+Version 1.6.32beta02 [August 1, 2017]
+ Updated contrib/libtests/pngunknown.c with eXIf chunk.
+
+Version 1.6.32beta03 [August 2, 2017]
+ Initialized btoa[] in pngstest.c
+ Stop memory leak when returning from png_handle_eXIf() with an error
+ (Bug report from the OSS-fuzz project).
+
+Version 1.6.32beta04 [August 2, 2017]
+ Replaced local eXIf_buf with info_ptr-eXIf_buf in png_handle_eXIf().
+ Update libpng.3 and libpng-manual.txt about eXIf functions.
+
+Version 1.6.32beta05 [August 2, 2017]
+ Restored png_get_eXIf() and png_set_eXIf() to maintain API compatibility.
+
+Version 1.6.32beta06 [August 2, 2017]
+ Removed png_get_eXIf_1() and png_set_eXIf_1().
+
+Version 1.6.32beta07 [August 3, 2017]
+ Check length of all chunks except IDAT against user limit to fix an
+ OSS-fuzz issue (Fixes CVE-2017-12652).
+
+Version 1.6.32beta08 [August 3, 2017]
+ Check length of IDAT against maximum possible IDAT size, accounting
+ for height, rowbytes, interlacing and zlib/deflate overhead.
+ Restored png_get_eXIf_1() and png_set_eXIf_1(), because strlen(eXIf_buf)
+ does not work (the eXIf chunk data can contain zeroes).
+
+Version 1.6.32beta09 [August 3, 2017]
+ Require cmake-2.8.8 in CMakeLists.txt. Revised symlink creation,
+ no longer using deprecated cmake LOCATION feature (Clifford Yapp).
+ Fixed five-byte error in the calculation of IDAT maximum possible size.
+
+Version 1.6.32beta10 [August 5, 2017]
+ Moved chunk-length check into a png_check_chunk_length() private
+ function (Suggested by Max Stepin).
+ Moved bad pngs from tests to contrib/libtests/crashers
+ Moved testing of bad pngs into a separate tests/pngtest-badpngs script
+ Added the --xfail (expected FAIL) option to pngtest.c. It writes XFAIL
+ in the output but PASS for the libpng test.
+ Require cmake-3.0.2 in CMakeLists.txt (Clifford Yapp).
+ Fix "const" declaration info_ptr argument to png_get_eXIf_1() and the
+ num_exif argument to png_get_eXIf_1() (Github Issue 171).
+
+Version 1.6.32beta11 [August 7, 2017]
+ Added "eXIf" to "chunks_to_ignore[]" in png_set_keep_unknown_chunks().
+ Added huge_IDAT.png and empty_ancillary_chunks.png to testpngs/crashers.
+ Make pngtest --strict, --relax, --xfail options imply -m (multiple).
+ Removed unused chunk_name parameter from png_check_chunk_length().
+ Relocated setting free_me for eXIf data, to stop an OSS-fuzz leak.
+ Initialize profile_header[] in png_handle_iCCP() to fix OSS-fuzz issue.
+ Initialize png_ptr->row_buf[0] to 255 in png_read_row() to fix OSS-fuzz UMR.
+ Attempt to fix a UMR in png_set_text_2() to fix OSS-fuzz issue.
+ Increase minimum zlib stream from 9 to 14 in png_handle_iCCP(), to account
+ for the minimum 'deflate' stream, and relocate the test to a point
+ after the keyword has been read.
+ Check that the eXIf chunk has at least 2 bytes and begins with "II" or "MM".
+
+Version 1.6.32rc01 [August 18, 2017]
+ Added a set of "huge_xxxx_chunk.png" files to contrib/testpngs/crashers,
+ one for each known chunk type, with length = 2GB-1.
+ Check for 0 return from png_get_rowbytes() and added some (size_t) typecasts
+ in contrib/pngminus/*.c to stop some Coverity issues (162705, 162706,
+ and 162707).
+ Renamed chunks in contrib/testpngs/crashers to avoid having files whose
+ names differ only in case; this causes problems with some platforms
+ (github issue #172).
+
+Version 1.6.32rc02 [August 22, 2017]
+ Added contrib/oss-fuzz directory which contains files used by the oss-fuzz
+ project (https://github.com/google/oss-fuzz/tree/master/projects/libpng).
+
+Version 1.6.32 [August 24, 2017]
+ No changes.
+
+Version 1.6.33beta01 [August 28, 2017]
+ Added PNGMINUS_UNUSED macro to contrib/pngminus/p*.c and added missing
+ parenthesis in contrib/pngminus/pnm2png.c (bug report by Christian Hesse).
+ Fixed off-by-one error in png_do_check_palette_indexes() (Bug report
+ by Mick P., Source Forge Issue #269).
+
+Version 1.6.33beta02 [September 3, 2017]
+ Initialize png_handler.row_ptr in contrib/oss-fuzz/libpng_read_fuzzer.cc
+ to fix shortlived oss-fuzz issue 3234.
+ Compute a larger limit on IDAT because some applications write a deflate
+ buffer for each row (Bug report by Andrew Church).
+ Use current date (DATE) instead of release-date (RDATE) in last
+ changed date of contrib/oss-fuzz files.
+ Enabled ARM support in CMakeLists.txt (Bernd Kuhls).
+
+Version 1.6.33beta03 [September 14, 2017]
+ Fixed incorrect typecast of some arguments to png_malloc() and
+ png_calloc() that were png_uint_32 instead of png_alloc_size_t
+ (Bug report by "irwir" in Github libpng issue #175).
+ Use pnglibconf.h.prebuilt when building for ANDROID with cmake (Github
+ issue 162, by rcdailey).
+
+Version 1.6.33rc01 [September 20, 2017]
+ Initialize memory allocated by png_inflate to zero, using memset, to
+ stop an oss-fuzz "use of uninitialized value" detection in png_set_text_2()
+ due to truncated iTXt or zTXt chunk.
+ Initialize memory allocated by png_read_buffer to zero, using memset, to
+ stop an oss-fuzz "use of uninitialized value" detection in
+ png_icc_check_tag_table() due to truncated iCCP chunk.
+ Removed a redundant test (suggested by "irwir" in Github issue #180).
+
+Version 1.6.33rc02 [September 23, 2017]
+ Added an interlaced version of each file in contrib/pngsuite.
+ Relocate new memset() call in pngrutil.c.
+ Removed more redundant tests (suggested by "irwir" in Github issue #180).
+ Add support for loading images with associated alpha in the Simplified
+ API (Samuel Williams).
+
+Version 1.6.33 [September 28, 2017]
+ Revert contrib/oss-fuzz/libpng_read_fuzzer.cc to libpng-1.6.32 state.
+ Initialize png_handler.row_ptr in contrib/oss-fuzz/libpng_read_fuzzer.cc
+ Add end_info structure and png_read_end() to the libpng fuzzer.
+
+Version 1.6.34 [September 29, 2017]
+ Removed contrib/pngsuite/i*.png; some of them caused test failures.
+
+Version 1.6.35beta01 [March 6, 2018]
+ Restored 21 of the contrib/pngsuite/i*.png, which do not cause test
+ failures. Placed the remainder in contrib/pngsuite/interlaced/i*.png.
+ Added calls to png_set_*() transforms commonly used by browsers to
+ the fuzzer.
+ Removed some unnecessary brackets in pngrtran.c
+ Fixed miscellaneous typos (Patch by github user "luzpaz").
+ Change "ASM C" to "C ASM" in CMakeLists.txt
+ Fixed incorrect handling of bKGD chunk in sub-8-bit files (Cosmin)
+ Added hardware optimization directories to zip and 7z distributions.
+ Fixed incorrect bitmask for options.
+ Fixed many spelling typos.
+
+Version 1.6.35beta02 [March 28, 2018]
+ Make png_get_iCCP consistent with man page (allow compression-type argument
+ to be NULL, bug report by Lenard Szolnoki).
+
+Version 1.6.35 [July 15, 2018]
+ Replaced the remaining uses of png_size_t with size_t (Cosmin)
+ Fixed the calculation of row_factor in png_check_chunk_length
+ (reported by Thuan Pham in SourceForge issue #278)
+ Added missing parentheses to a macro definition
+ (suggested by "irwir" in GitHub issue #216)
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
-to subscribe)
-or to glennrp at users.sourceforge.net
+to subscribe).
Glenn R-P
-#endif
diff --git a/jdk/src/share/native/sun/awt/libpng/LICENSE b/jdk/src/share/native/sun/awt/libpng/LICENSE
index 912552e..6ee9c8f 100644
--- a/jdk/src/share/native/sun/awt/libpng/LICENSE
+++ b/jdk/src/share/native/sun/awt/libpng/LICENSE
@@ -10,8 +10,8 @@
This code is released under the libpng license.
-libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are
-Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
derived from libpng-1.0.6, and are distributed according to the same
disclaimer and license as libpng-1.0.6 with the following individuals
added to the list of Contributing Authors:
@@ -23,6 +23,8 @@
Gilles Vollant
James Yu
Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -128,4 +130,4 @@
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-January 5, 2017
+July 15, 2018
diff --git a/jdk/src/share/native/sun/awt/libpng/README b/jdk/src/share/native/sun/awt/libpng/README
index 67b579d..f098b27 100644
--- a/jdk/src/share/native/sun/awt/libpng/README
+++ b/jdk/src/share/native/sun/awt/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.6.28 - January 5, 2017 (shared library 16.0)
+README for libpng version 1.6.35 - July 15, 2018 (shared library 16.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
@@ -23,7 +23,7 @@
png_uint_32, which will affect shared-library applications that use
this function.
-To avoid problems with changes to the internals of png info_struct,
+To avoid problems with changes to the internals of the png info_struct,
new APIs have been made available in 0.95 to avoid direct application
access to info_ptr. These functions are the png_set_<chunk> and
png_get_<chunk> functions. These functions should be used when
@@ -88,11 +88,11 @@
You may also want a copy of the PNG specification. It is available
as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find
-these at http://www.libpng.org/pub/png/documents/
+these at http://www.libpng.org/pub/png/pngdocs.html .
-This code is currently being archived at libpng.sf.net in the
-[DOWNLOAD] area, and at ftp://ftp.simplesystems.org. If you can't find it
-in any of those places, e-mail me, and I'll help you find it.
+This code is currently being archived at libpng.sourceforge.io in the
+[DOWNLOAD] area, and at http://libpng.download/src . If you
+can't find it in any of those places, e-mail me, and I'll help you find it.
I am not a lawyer, but I believe that the Export Control Classification
Number (ECCN) for libpng is EAR99, which means not subject to export
@@ -118,7 +118,7 @@
Send comments/corrections/commendations to png-mng-implement at
lists.sourceforge.net (subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
-to subscribe) or to glennrp at users.sourceforge.net
+to subscribe).
You can't reach Guy, the original libpng author, at the addresses
given in previous versions of this document. He and Andreas will
@@ -179,14 +179,16 @@
pngwtran.c => Write data transformations
pngwutil.c => Write utility functions
arm => Contains optimized code for the ARM platform
+ powerpc => Contains optimized code for the PowerPC platform
contrib => Contributions
arm-neon => Optimized code for ARM-NEON platform
+ powerpc-vsx => Optimized code for POWERPC-VSX platform
examples => Example programs
gregbook => source code for PNG reading and writing, from
Greg Roelofs' "PNG: The Definitive Guide",
O'Reilly, 1999
- intel => Optimized code for INTEL-SSE2 platform
libtests => Test programs
+ mips-msa => Optimized code for MIPS-MSA platform
pngminim => Minimal decoder, encoder, and progressive decoder
programs demonstrating use of pngusr.dfa
pngminus => Simple pnm2png and png2pnm programs
@@ -194,6 +196,8 @@
testpngs
tools => Various tools
visupng => Contains a MSVC workspace for VisualPng
+ intel => Optimized code for INTEL-SSE2 platform
+ mips => Optimized code for MIPS platform
projects => Contains project files and workspaces for
building a DLL
owatcom => Contains a WATCOM project for building libpng
diff --git a/jdk/src/share/native/sun/awt/libpng/png.c b/jdk/src/share/native/sun/awt/libpng/png.c
index 48bbf4b..1a44c9c 100644
--- a/jdk/src/share/native/sun/awt/libpng/png.c
+++ b/jdk/src/share/native/sun/awt/libpng/png.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.28 [January 5, 2017]
- * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -42,7 +42,27 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_28 Your_png_h_is_not_version_1_6_28;
+typedef png_libpng_version_1_6_35 Your_png_h_is_not_version_1_6_35;
+
+#ifdef __GNUC__
+/* The version tests may need to be added to, but the problem warning has
+ * consistently been fixed in GCC versions which obtain wide-spread release.
+ * The problem is that many versions of GCC rearrange comparison expressions in
+ * the optimizer in such a way that the results of the comparison will change
+ * if signed integer overflow occurs. Such comparisons are not permitted in
+ * ANSI C90, however GCC isn't clever enough to work out that that do not occur
+ * below in png_ascii_from_fp and png_muldiv, so it produces a warning with
+ * -Wextra. Unfortunately this is highly dependent on the optimizer and the
+ * machine architecture so the warning comes and goes unpredictably and is
+ * impossible to "fix", even were that a good idea.
+ */
+#if __GNUC__ == 7 && __GNUC_MINOR__ == 1
+#define GCC_STRICT_OVERFLOW 1
+#endif /* GNU 7.1.x */
+#endif /* GNU */
+#ifndef GCC_STRICT_OVERFLOW
+#define GCC_STRICT_OVERFLOW 0
+#endif
/* Tells libpng that we have already handled the first "num_bytes" bytes
* of the PNG file signature. If the PNG data is embedded into another
@@ -79,7 +99,7 @@
* PNG signature (this is the same behavior as strcmp, memcmp, etc).
*/
int PNGAPI
-png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
+png_sig_cmp(png_const_bytep sig, size_t start, size_t num_to_check)
{
png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
@@ -144,7 +164,7 @@
* trouble of calculating it.
*/
void /* PRIVATE */
-png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length)
+png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, size_t length)
{
int need_crc = 1;
@@ -429,7 +449,7 @@
* those cases where it does anything other than a memset.
*/
PNG_FUNCTION(void,PNGAPI
-png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
+png_info_init_3,(png_infopp ptr_ptr, size_t png_info_struct_size),
PNG_DEPRECATED)
{
png_inforp info_ptr = *ptr_ptr;
@@ -623,6 +643,26 @@
}
#endif
+#ifdef PNG_eXIf_SUPPORTED
+ /* Free any eXIf entry */
+ if (((mask & PNG_FREE_EXIF) & info_ptr->free_me) != 0)
+ {
+# ifdef PNG_READ_eXIf_SUPPORTED
+ if (info_ptr->eXIf_buf)
+ {
+ png_free(png_ptr, info_ptr->eXIf_buf);
+ info_ptr->eXIf_buf = NULL;
+ }
+# endif
+ if (info_ptr->exif)
+ {
+ png_free(png_ptr, info_ptr->exif);
+ info_ptr->exif = NULL;
+ }
+ info_ptr->valid &= ~PNG_INFO_eXIf;
+ }
+#endif
+
#ifdef PNG_hIST_SUPPORTED
/* Free any hIST entry */
if (((mask & PNG_FREE_HIST) & info_ptr->free_me) != 0)
@@ -804,15 +844,15 @@
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.6.28 - January 5, 2017" PNG_STRING_NEWLINE \
- "Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson" \
+ "libpng version 1.6.35 - July 15, 2018" PNG_STRING_NEWLINE \
+ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.6.28 - January 5, 2017\
- Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson\
+ return "libpng version 1.6.35 - July 15, 2018\
+ Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
# endif
@@ -930,7 +970,7 @@
/* The code is the fifth byte after each four byte string. Historically this
* code was always searched from the end of the list, this is no longer
- * necessary because the 'set' routine handles duplicate entries correcty.
+ * necessary because the 'set' routine handles duplicate entries correctly.
*/
do /* num_chunk_list > 0, so at least one */
{
@@ -1901,12 +1941,12 @@
*/
if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
- (unsigned)intent, "invalid sRGB rendering intent");
+ (png_alloc_size_t)intent, "invalid sRGB rendering intent");
if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
colorspace->rendering_intent != intent)
return png_icc_profile_error(png_ptr, colorspace, "sRGB",
- (unsigned)intent, "inconsistent rendering intents");
+ (png_alloc_size_t)intent, "inconsistent rendering intents");
if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0)
{
@@ -1967,7 +2007,6 @@
if (profile_length < 132)
return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
"too short");
-
return 1;
}
@@ -2056,7 +2095,7 @@
*/
/* Data checks (could be skipped). These checks must be independent of the
- * version number; however, the version number doesn't accomodate changes in
+ * version number; however, the version number doesn't accommodate changes in
* the header fields (just the known tags and the interpretation of the
* data.)
*/
@@ -2212,15 +2251,6 @@
* being in range. All defined tag types have an 8 byte header - a 4 byte
* type signature then 0.
*/
- if ((tag_start & 3) != 0)
- {
- /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is
- * only a warning here because libpng does not care about the
- * alignment.
- */
- (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
- "ICC profile tag start not a multiple of 4");
- }
/* This is a hard error; potentially it can cause read outside the
* profile.
@@ -2228,6 +2258,16 @@
if (tag_start > profile_length || tag_length > profile_length - tag_start)
return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
"ICC profile tag outside profile");
+
+ if ((tag_start & 3) != 0)
+ {
+ /* CNHP730S.icc shipped with Microsoft Windows 64 violates this; it is
+ * only a warning here because libpng does not care about the
+ * alignment.
+ */
+ (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
+ "ICC profile tag start not a multiple of 4");
+ }
}
return 1; /* success, maybe with warnings */
@@ -2695,7 +2735,7 @@
#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED)
/* ASCII to fp functions */
-/* Check an ASCII formated floating point value, see the more detailed
+/* Check an ASCII formatted floating point value, see the more detailed
* comments in pngpriv.h
*/
/* The following is used internally to preserve the sticky flags */
@@ -2703,11 +2743,11 @@
#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))
int /* PRIVATE */
-png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
+png_check_fp_number(png_const_charp string, size_t size, int *statep,
png_size_tp whereami)
{
int state = *statep;
- png_size_t i = *whereami;
+ size_t i = *whereami;
while (i < size)
{
@@ -2830,10 +2870,10 @@
/* The same but for a complete string. */
int
-png_check_fp_string(png_const_charp string, png_size_t size)
+png_check_fp_string(png_const_charp string, size_t size)
{
int state=0;
- png_size_t char_index=0;
+ size_t char_index=0;
if (png_check_fp_number(string, size, &state, &char_index) != 0 &&
(char_index == size || string[char_index] == 0))
@@ -2860,7 +2900,7 @@
if (power < 0)
{
if (power < DBL_MIN_10_EXP) return 0;
- recip = 1, power = -power;
+ recip = 1; power = -power;
}
if (power > 0)
@@ -2885,8 +2925,16 @@
/* Function to format a floating point value in ASCII with a given
* precision.
*/
+#if GCC_STRICT_OVERFLOW
+#pragma GCC diagnostic push
+/* The problem arises below with exp_b10, which can never overflow because it
+ * comes, originally, from frexp and is therefore limited to a range which is
+ * typically +/-710 (log2(DBL_MAX)/log2(DBL_MIN)).
+ */
+#pragma GCC diagnostic warning "-Wstrict-overflow=2"
+#endif /* GCC_STRICT_OVERFLOW */
void /* PRIVATE */
-png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
+png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, size_t size,
double fp, unsigned int precision)
{
/* We use standard functions from math.h, but not printf because
@@ -2938,7 +2986,9 @@
double test = png_pow10(exp_b10+1);
if (test <= DBL_MAX)
- ++exp_b10, base = test;
+ {
+ ++exp_b10; base = test;
+ }
else
break;
@@ -2952,7 +3002,10 @@
* test on DBL_MAX above.
*/
fp /= base;
- while (fp >= 1) fp /= 10, ++exp_b10;
+ while (fp >= 1)
+ {
+ fp /= 10; ++exp_b10;
+ }
/* Because of the code above fp may, at this point, be
* less than .1, this is ok because the code below can
@@ -2969,7 +3022,7 @@
*/
if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */
{
- czero = (unsigned int)(-exp_b10); /* PLUS 2 digits: TOTAL 3 */
+ czero = 0U-exp_b10; /* PLUS 2 digits: TOTAL 3 */
exp_b10 = 0; /* Dot added below before first output. */
}
else
@@ -3003,7 +3056,7 @@
/* Rounding up to 10, handle that here. */
if (czero > 0)
{
- --czero, d = 1;
+ --czero; d = 1;
if (cdigits == 0) --clead;
}
else
@@ -3017,7 +3070,7 @@
else if (ch == 46)
{
- ch = *--ascii, ++size;
+ ch = *--ascii; ++size;
/* Advance exp_b10 to '1', so that the
* decimal point happens after the
* previous digit.
@@ -3044,7 +3097,9 @@
int ch = *--ascii;
if (ch == 46)
- ++size, exp_b10 = 1;
+ {
+ ++size; exp_b10 = 1;
+ }
/* Else lost a leading zero, so 'exp_b10' is
* still ok at (-1)
@@ -3080,21 +3135,26 @@
*/
if (exp_b10 != (-1))
{
- if (exp_b10 == 0) *ascii++ = 46, --size;
+ if (exp_b10 == 0)
+ {
+ *ascii++ = 46; --size;
+ }
/* PLUS 1: TOTAL 4 */
--exp_b10;
}
- *ascii++ = 48, --czero;
+ *ascii++ = 48; --czero;
}
if (exp_b10 != (-1))
{
if (exp_b10 == 0)
- *ascii++ = 46, --size; /* counted above */
+ {
+ *ascii++ = 46; --size; /* counted above */
+ }
--exp_b10;
}
- *ascii++ = (char)(48 + (int)d), ++cdigits;
+ *ascii++ = (char)(48 + (int)d); ++cdigits;
}
}
while (cdigits+czero < precision+clead && fp > DBL_MIN);
@@ -3103,7 +3163,7 @@
/* Check for an exponent, if we don't need one we are
* done and just need to terminate the string. At
- * this point exp_b10==(-1) is effectively if flag - it got
+ * this point exp_b10==(-1) is effectively a flag - it got
* to '-1' because of the decrement after outputting
* the decimal point above (the exponent required is
* *not* -1!)
@@ -3117,7 +3177,7 @@
* zeros were *not* output, so this doesn't increase
* the output count.
*/
- while (--exp_b10 >= 0) *ascii++ = 48;
+ while (exp_b10-- > 0) *ascii++ = 48;
*ascii = 0;
@@ -3135,7 +3195,7 @@
*/
size -= cdigits;
- *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision */
+ *ascii++ = 69; --size; /* 'E': PLUS 1 TOTAL 2+precision */
/* The following use of an unsigned temporary avoids ambiguities in
* the signed arithmetic on exp_b10 and permits GCC at least to do
@@ -3146,12 +3206,12 @@
if (exp_b10 < 0)
{
- *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
- uexp_b10 = (unsigned int)(-exp_b10);
+ *ascii++ = 45; --size; /* '-': PLUS 1 TOTAL 3+precision */
+ uexp_b10 = 0U-exp_b10;
}
else
- uexp_b10 = (unsigned int)exp_b10;
+ uexp_b10 = 0U+exp_b10;
cdigits = 0;
@@ -3194,6 +3254,9 @@
/* Here on buffer too small. */
png_error(png_ptr, "ASCII conversion buffer too small");
}
+#if GCC_STRICT_OVERFLOW
+#pragma GCC diagnostic pop
+#endif /* GCC_STRICT_OVERFLOW */
# endif /* FLOATING_POINT */
@@ -3202,7 +3265,7 @@
*/
void /* PRIVATE */
png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,
- png_size_t size, png_fixed_point fp)
+ size_t size, png_fixed_point fp)
{
/* Require space for 10 decimal digits, a decimal point, a minus sign and a
* trailing \0, 13 characters:
@@ -3213,7 +3276,9 @@
/* Avoid overflow here on the minimum integer. */
if (fp < 0)
- *ascii++ = 45, num = (png_uint_32)(-fp);
+ {
+ *ascii++ = 45; num = (png_uint_32)(-fp);
+ }
else
num = (png_uint_32)fp;
@@ -3251,7 +3316,10 @@
* then ndigits digits to first:
*/
i = 5;
- while (ndigits < i) *ascii++ = 48, --i;
+ while (ndigits < i)
+ {
+ *ascii++ = 48; --i;
+ }
while (ndigits >= first) *ascii++ = digits[--ndigits];
/* Don't output the trailing zeros! */
}
@@ -3302,6 +3370,15 @@
* the nearest .00001). Overflow and divide by zero are signalled in
* the result, a boolean - true on success, false on overflow.
*/
+#if GCC_STRICT_OVERFLOW /* from above */
+/* It is not obvious which comparison below gets optimized in such a way that
+ * signed overflow would change the result; looking through the code does not
+ * reveal any tests which have the form GCC complains about, so presumably the
+ * optimizer is moving an add or subtract into the 'if' somewhere.
+ */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic warning "-Wstrict-overflow=2"
+#endif /* GCC_STRICT_OVERFLOW */
int
png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times,
png_int_32 divisor)
@@ -3416,6 +3493,9 @@
return 0;
}
+#if GCC_STRICT_OVERFLOW
+#pragma GCC diagnostic pop
+#endif /* GCC_STRICT_OVERFLOW */
#endif /* READ_GAMMA || INCH_CONVERSIONS */
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED)
@@ -3709,7 +3789,7 @@
* of getting this accuracy in practice.
*
* To deal with this the following exp() function works out the exponent of the
- * frational part of the logarithm by using an accurate 32-bit value from the
+ * fractional part of the logarithm by using an accurate 32-bit value from the
* top four fractional bits then multiplying in the remaining bits.
*/
static const png_uint_32
@@ -4288,13 +4368,13 @@
if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&
(option & 1) == 0)
{
- png_uint_32 mask = 3 << option;
- png_uint_32 setting = (2 + (onoff != 0)) << option;
+ png_uint_32 mask = 3U << option;
+ png_uint_32 setting = (2U + (onoff != 0)) << option;
png_uint_32 current = png_ptr->options;
- png_ptr->options = (png_uint_32)(((current & ~mask) | setting) & 0xff);
+ png_ptr->options = (png_uint_32)((current & ~mask) | setting);
- return (current & mask) >> option;
+ return (int)(current & mask) >> option;
}
return PNG_OPTION_INVALID;
@@ -4306,7 +4386,7 @@
defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
/* sRGB conversion tables; these are machine generated with the code in
* contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the
- * specification (see the article at http://en.wikipedia.org/wiki/SRGB)
+ * specification (see the article at https://en.wikipedia.org/wiki/SRGB)
* is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
* The sRGB to linear table is exact (to the nearest 16-bit linear fraction).
* The inverse (linear to sRGB) table has accuracies as follows:
diff --git a/jdk/src/share/native/sun/awt/libpng/png.h b/jdk/src/share/native/sun/awt/libpng/png.h
index d2feaef..d3beb21 100644
--- a/jdk/src/share/native/sun/awt/libpng/png.h
+++ b/jdk/src/share/native/sun/awt/libpng/png.h
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.28, January 5, 2017
+ * libpng version 1.6.35, July 15, 2018
*
- * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -40,7 +40,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.6.28, January 5, 2017:
+ * libpng versions 0.97, January 1998, through 1.6.35, July 15, 2018:
* Glenn Randers-Pehrson.
* See also "Contributing Authors", below.
*/
@@ -53,8 +53,8 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.0.7, July 1, 2000 through 1.6.28, January 5, 2017 are
- * Copyright (c) 2000-2002, 2004, 2006-2017 Glenn Randers-Pehrson, are
+ * libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+ * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
* derived from libpng-1.0.6, and are distributed according to the same
* disclaimer and license as libpng-1.0.6 with the following individuals
* added to the list of Contributing Authors:
@@ -66,6 +66,8 @@
* Gilles Vollant
* James Yu
* Mandar Sahastrabuddhe
+ * Google Inc.
+ * Vadim Barkov
*
* and with the following additions to the disclaimer:
*
@@ -90,9 +92,6 @@
* Glenn Randers-Pehrson
* Willem van Schaik
*
- * Some files in the "scripts" directory have different copyright owners
- * but are also released under this license.
- *
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
* and are distributed according to the same disclaimer and license as
@@ -238,11 +237,11 @@
* ...
* 1.0.19 10 10019 10.so.0.19[.0]
* ...
- * 1.2.57 13 10257 12.so.0.57[.0]
+ * 1.2.59 13 10257 12.so.0.59[.0]
* ...
- * 1.5.28 15 10527 15.so.15.28[.0]
+ * 1.5.30 15 10527 15.so.15.30[.0]
* ...
- * 1.6.28 16 10628 16.so.16.28[.0]
+ * 1.6.35 16 10635 16.so.16.35[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -263,20 +262,20 @@
*
* See libpng.txt or libpng.3 for more information. The PNG specification
* is available as a W3C Recommendation and as an ISO Specification,
- * <http://www.w3.org/TR/2003/REC-PNG-20031110/
+ * <https://www.w3.org/TR/2003/REC-PNG-20031110/
*/
/*
* Y2K compliance in libpng:
* =========================
*
- * January 5, 2017
+ * July 15, 2018
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.6.28 are Y2K compliant. It is my belief that
+ * upward through 1.6.35 are Y2K compliant. It is my belief that
* earlier versions were also Y2K compliant.
*
* Libpng only has two year fields. One is a 2-byte unsigned integer
@@ -338,8 +337,8 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.28"
-#define PNG_HEADER_VERSION_STRING " libpng version 1.6.28 - January 5, 2017\n"
+#define PNG_LIBPNG_VER_STRING "1.6.35"
+#define PNG_HEADER_VERSION_STRING " libpng version 1.6.35 - July 15, 2018\n"
#define PNG_LIBPNG_VER_SONUM 16
#define PNG_LIBPNG_VER_DLLNUM 16
@@ -347,13 +346,13 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 6
-#define PNG_LIBPNG_VER_RELEASE 28
+#define PNG_LIBPNG_VER_RELEASE 35
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
*/
-#define PNG_LIBPNG_VER_BUILD 0
+#define PNG_LIBPNG_VER_BUILD 02
/* Release Status */
#define PNG_LIBPNG_BUILD_ALPHA 1
@@ -370,7 +369,7 @@
#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with
PNG_LIBPNG_BUILD_PRIVATE */
-#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE
+#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_BETA
/* Careful here. At one time, Guy wanted to use 082, but that would be octal.
* We must not include leading zeros.
@@ -378,7 +377,7 @@
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
*/
-#define PNG_LIBPNG_VER 10628 /* 1.6.28 */
+#define PNG_LIBPNG_VER 10635 /* 1.6.35 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -488,7 +487,7 @@
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_6_28;
+typedef char* png_libpng_version_1_6_35;
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
*
@@ -629,8 +628,8 @@
png_charp key; /* keyword, 1-79 character description of "text" */
png_charp text; /* comment, may be an empty string (ie "")
or a NULL pointer */
- png_size_t text_length; /* length of the text string */
- png_size_t itxt_length; /* length of the itxt string */
+ size_t text_length; /* length of the text string */
+ size_t itxt_length; /* length of the itxt string */
png_charp lang; /* language code, 0-79 characters
or a NULL pointer */
png_charp lang_key; /* keyword translated UTF-8 string, 0 or more
@@ -683,7 +682,7 @@
{
png_byte name[5]; /* Textual chunk name with '\0' terminator */
png_byte *data; /* Data, should not be modified on read! */
- png_size_t size;
+ size_t size;
/* On write 'location' must be set using the flag values listed below.
* Notice that on read it is set by libpng however the values stored have
@@ -708,7 +707,7 @@
/* Maximum positive integer used in PNG is (2^31)-1 */
#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL)
#define PNG_UINT_32_MAX ((png_uint_32)(-1))
-#define PNG_SIZE_MAX ((png_size_t)(-1))
+#define PNG_SIZE_MAX ((size_t)(-1))
/* These are constants for fixed point values encoded in the
* PNG specification manner (x100000)
@@ -805,6 +804,7 @@
#define PNG_INFO_sPLT 0x2000U /* ESR, 1.0.6 */
#define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */
#define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */
+#define PNG_INFO_eXIf 0x10000U /* GR-P, 1.6.31 */
/* This is used for the transformation routines, as some of them
* change these values for the row. It also should enable using
@@ -813,7 +813,7 @@
typedef struct png_row_info_struct
{
png_uint_32 width; /* width of row */
- png_size_t rowbytes; /* number of bytes in row */
+ size_t rowbytes; /* number of bytes in row */
png_byte color_type; /* color type of row */
png_byte bit_depth; /* bit depth of row */
png_byte channels; /* number of channels (1, 2, 3, or 4) */
@@ -832,7 +832,7 @@
* expected to return the read data in the buffer.
*/
typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp));
-typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t));
+typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, size_t));
typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp));
typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32,
int));
@@ -969,8 +969,8 @@
* signature, and non-zero otherwise. Having num_to_check == 0 or
* start > 7 will always fail (ie return non-zero).
*/
-PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start,
- png_size_t num_to_check));
+PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, size_t start,
+ size_t num_to_check));
/* Simple signature checking function. This is the same as calling
* png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
@@ -989,11 +989,11 @@
png_error_ptr warn_fn),
PNG_ALLOCATED);
-PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size,
+PNG_EXPORT(6, size_t, png_get_compression_buffer_size,
(png_const_structrp png_ptr));
PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr,
- png_size_t size));
+ size_t size));
/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp
* match up.
@@ -1046,7 +1046,7 @@
/* Write a PNG chunk - size, type, (optional) data, CRC. */
PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep
- chunk_name, png_const_bytep data, png_size_t length));
+ chunk_name, png_const_bytep data, size_t length));
/* Write the start of a PNG chunk - length and chunk name. */
PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr,
@@ -1054,7 +1054,7 @@
/* Write the data of a PNG chunk started with png_write_chunk_start(). */
PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr,
- png_const_bytep data, png_size_t length));
+ png_const_bytep data, size_t length));
/* Finish a chunk started with png_write_chunk_start() (includes CRC). */
PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr));
@@ -1068,7 +1068,7 @@
* the API will be removed in the future.
*/
PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr,
- png_size_t png_info_struct_size), PNG_DEPRECATED);
+ size_t png_info_struct_size), PNG_DEPRECATED);
/* Writes all the PNG information before the image. */
PNG_EXPORT(20, void, png_write_info_before_PLTE,
@@ -1165,7 +1165,7 @@
* corresponding composited pixel, and the color channels are unassociated
* (not premultiplied). The gamma encoded color channels must be scaled
* according to the contribution and to do this it is necessary to undo
- * the encoding, scale the color values, perform the composition and reencode
+ * the encoding, scale the color values, perform the composition and re-encode
* the values. This is the 'PNG' mode.
*
* The alternative is to 'associate' the alpha with the color information by
@@ -1221,7 +1221,7 @@
*
* png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC);
* In this case the output is assumed to be something like an sRGB conformant
- * display preceeded by a power-law lookup table of power 1.45. This is how
+ * display preceded by a power-law lookup table of power 1.45. This is how
* early Mac systems behaved.
*
* png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR);
@@ -1268,7 +1268,7 @@
*
* When the default gamma of PNG files doesn't match the output gamma.
* If you have PNG files with no gamma information png_set_alpha_mode allows
- * you to provide a default gamma, but it also sets the ouput gamma to the
+ * you to provide a default gamma, but it also sets the output gamma to the
* matching value. If you know your PNG files have a gamma that doesn't
* match the output you can take advantage of the fact that
* png_set_alpha_mode always sets the output gamma but only sets the PNG
@@ -1719,7 +1719,7 @@
* chunk will cause an error at this point unless it is to be saved.
* positive: The chunk was handled, libpng will ignore/discard it.
*
- * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about
+ * See "INTERACTION WITH USER CHUNK CALLBACKS" below for important notes about
* how this behavior will change in libpng 1.7
*/
PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr,
@@ -1744,7 +1744,7 @@
/* Function to be called when data becomes available */
PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr,
- png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size));
+ png_inforp info_ptr, png_bytep buffer, size_t buffer_size));
/* A function which may be called *only* within png_process_data to stop the
* processing of any more data. The function returns the number of bytes
@@ -1753,7 +1753,7 @@
* 'save' is set to true the routine will first save all the pending data and
* will always return 0.
*/
-PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save));
+PNG_EXPORT(219, size_t, png_process_data_pause, (png_structrp, int save));
/* A function which may be called *only* outside (after) a call to
* png_process_data. It returns the number of bytes of data to skip in the
@@ -1817,7 +1817,8 @@
#define PNG_FREE_PLTE 0x1000U
#define PNG_FREE_TRNS 0x2000U
#define PNG_FREE_TEXT 0x4000U
-#define PNG_FREE_ALL 0x7fffU
+#define PNG_FREE_EXIF 0x8000U /* Added at libpng-1.6.31 */
+#define PNG_FREE_ALL 0xffffU
#define PNG_FREE_MUL 0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
#ifdef PNG_USER_MEM_SUPPORTED
@@ -1897,7 +1898,7 @@
png_const_inforp info_ptr, png_uint_32 flag));
/* Returns number of bytes needed to hold a transformed row. */
-PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr,
+PNG_EXPORT(111, size_t, png_get_rowbytes, (png_const_structrp png_ptr,
png_const_inforp info_ptr));
#ifdef PNG_INFO_IMAGE_SUPPORTED
@@ -2036,6 +2037,18 @@
png_fixed_point int_blue_Z))
#endif
+#ifdef PNG_eXIf_SUPPORTED
+PNG_EXPORT(246, png_uint_32, png_get_eXIf, (png_const_structrp png_ptr,
+ png_inforp info_ptr, png_bytep *exif));
+PNG_EXPORT(247, void, png_set_eXIf, (png_const_structrp png_ptr,
+ png_inforp info_ptr, const png_bytep exif));
+
+PNG_EXPORT(248, png_uint_32, png_get_eXIf_1, (png_const_structrp png_ptr,
+ png_const_inforp info_ptr, png_uint_32 *num_exif, png_bytep *exif));
+PNG_EXPORT(249, void, png_set_eXIf_1, (png_const_structrp png_ptr,
+ png_inforp info_ptr, const png_uint_32 num_exif, const png_bytep exif));
+#endif
+
#ifdef PNG_gAMA_SUPPORTED
PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr,
png_const_inforp info_ptr, double *file_gamma))
@@ -2054,9 +2067,6 @@
#ifdef PNG_hIST_SUPPORTED
PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr,
png_inforp info_ptr, png_uint_16p *hist));
-#endif
-
-#ifdef PNG_hIST_SUPPORTED
PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr,
png_inforp info_ptr, png_const_uint_16p hist));
#endif
@@ -2257,7 +2267,7 @@
* to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks
* it simply resets the behavior to the libpng default.
*
- * INTERACTION WTIH USER CHUNK CALLBACKS:
+ * INTERACTION WITH USER CHUNK CALLBACKS:
* The per-chunk handling is always used when there is a png_user_chunk_ptr
* callback and the callback returns 0; the chunk is then always stored *unless*
* it is critical and the per-chunk setting is other than ALWAYS. Notice that
@@ -2676,7 +2686,7 @@
* The simplified API hides the details of both libpng and the PNG file format
* itself. It allows PNG files to be read into a very limited number of
* in-memory bitmap formats or to be written from the same formats. If these
- * formats do not accomodate your needs then you can, and should, use the more
+ * formats do not accommodate your needs then you can, and should, use the more
* sophisticated APIs above - these support a wide variety of in-memory formats
* and a wide variety of sophisticated transformations to those formats as well
* as a wide variety of APIs to manipulate ancillary information.
@@ -2782,7 +2792,7 @@
*
* When the simplified API needs to convert between sRGB and linear colorspaces,
* the actual sRGB transfer curve defined in the sRGB specification (see the
- * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
+ * article at https://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2
* approximation used elsewhere in libpng.
*
* When an alpha channel is present it is expected to denote pixel coverage
@@ -2837,6 +2847,8 @@
# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */
#endif
+#define PNG_FORMAT_FLAG_ASSOCIATED_ALPHA 0x40U /* alpha channel is associated */
+
/* Commonly used formats have predefined macros.
*
* First the single byte (sRGB) formats:
@@ -3036,7 +3048,7 @@
#endif /* STDIO */
PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image,
- png_const_voidp memory, png_size_t size));
+ png_const_voidp memory, size_t size));
/* The PNG header is read from the given memory buffer. */
PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image,
@@ -3149,7 +3161,7 @@
* than or equal to the original value.
*
* If the function returns false and *memory_bytes was not changed an error
- * occured during write. If *memory_bytes was changed, or is not 0 if
+ * occurred during write. If *memory_bytes was changed, or is not 0 if
* 'memory' was NULL, the write would have succeeded but for the memory
* buffer being too small. *memory_bytes contains the required number of
* bytes and will be bigger that the original value.
@@ -3233,7 +3245,7 @@
* option and 'onoff' is 0 (off) or non-0 (on). The value returned is given
* by the PNG_OPTION_ defines below.
*
- * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions,
+ * HARDWARE: normally hardware capabilities, such as the Intel SSE instructions,
* are detected at run time, however sometimes it may be impossible
* to do this in user mode, in which case it is necessary to discover
* the capabilities in an OS specific way. Such capabilities are
@@ -3255,7 +3267,10 @@
# define PNG_MIPS_MSA 6 /* HARDWARE: MIPS Msa SIMD instructions supported */
#endif
#define PNG_IGNORE_ADLER32 8
-#define PNG_OPTION_NEXT 10 /* Next option - numbers must be even */
+#ifdef PNG_POWERPC_VSX_API_SUPPORTED
+# define PNG_POWERPC_VSX 10 /* HARDWARE: PowerPC VSX SIMD instructions supported */
+#endif
+#define PNG_OPTION_NEXT 12 /* Next option - numbers must be even */
/* Return values: NOTE: there are four values and 'off' is *not* zero */
#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */
@@ -3279,7 +3294,7 @@
* one to use is one more than this.)
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(245);
+ PNG_EXPORT_LAST_ORDINAL(249);
#endif
#ifdef __cplusplus
diff --git a/jdk/src/share/native/sun/awt/libpng/pngconf.h b/jdk/src/share/native/sun/awt/libpng/pngconf.h
index a0b44a5..b010164 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngconf.h
+++ b/jdk/src/share/native/sun/awt/libpng/pngconf.h
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.28, January 5, 2017
+ * libpng version 1.6.35, July 15, 2018
*
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -155,7 +155,7 @@
*
* These cases only differ if the operating system does not use the C
* calling convention, at present this just means the above cases
- * (x86 DOS/Windows sytems) and, even then, this does not apply to
+ * (x86 DOS/Windows systems) and, even then, this does not apply to
* Cygwin running on those systems.
*
* Note that the value must be defined in pnglibconf.h so that what
@@ -543,8 +543,10 @@
# error "libpng requires an unsigned 32-bit (or more) type"
#endif
-/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however,
- * requires an ISOC90 compiler and relies on consistent behavior of sizeof.
+/* Prior to 1.6.0, it was possible to disable the use of size_t and ptrdiff_t.
+ * From 1.6.0 onwards, an ISO C90 compiler, as well as a standard-compliant
+ * behavior of sizeof and ptrdiff_t are required.
+ * The legacy typedefs are provided here for backwards compatibility.
*/
typedef size_t png_size_t;
typedef ptrdiff_t png_ptrdiff_t;
@@ -565,13 +567,12 @@
# endif
#endif
-/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no
- * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to
- * png_alloc_size_t are not necessary; in fact, it is recommended not to use
- * them at all so that the compiler can complain when something turns out to be
- * problematic.
+/* png_alloc_size_t is guaranteed to be no smaller than size_t, and no smaller
+ * than png_uint_32. Casts from size_t or png_uint_32 to png_alloc_size_t are
+ * not necessary; in fact, it is recommended not to use them at all, so that
+ * the compiler can complain when something turns out to be problematic.
*
- * Casts in the other direction (from png_alloc_size_t to png_size_t or
+ * Casts in the other direction (from png_alloc_size_t to size_t or
* png_uint_32) should be explicitly applied; however, we do not expect to
* encounter practical situations that require such conversions.
*
@@ -581,7 +582,7 @@
#ifdef PNG_SMALL_SIZE_T
typedef png_uint_32 png_alloc_size_t;
#else
- typedef png_size_t png_alloc_size_t;
+ typedef size_t png_alloc_size_t;
#endif
/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler
@@ -617,8 +618,8 @@
typedef const char * png_const_charp;
typedef png_fixed_point * png_fixed_point_p;
typedef const png_fixed_point * png_const_fixed_point_p;
-typedef png_size_t * png_size_tp;
-typedef const png_size_t * png_const_size_tp;
+typedef size_t * png_size_tp;
+typedef const size_t * png_const_size_tp;
#ifdef PNG_STDIO_SUPPORTED
typedef FILE * png_FILE_p;
diff --git a/jdk/src/share/native/sun/awt/libpng/pngerror.c b/jdk/src/share/native/sun/awt/libpng/pngerror.c
index 6172082..672fb35 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngerror.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngerror.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.31 [July 27, 2017]
+ * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -191,7 +191,7 @@
case PNG_NUMBER_FORMAT_02u:
/* Expects at least 2 digits. */
mincount = 2;
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case PNG_NUMBER_FORMAT_u:
*--end = digits[number % 10];
@@ -201,7 +201,7 @@
case PNG_NUMBER_FORMAT_02x:
/* This format expects at least two digits */
mincount = 2;
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case PNG_NUMBER_FORMAT_x:
*--end = digits[number & 0xf];
diff --git a/jdk/src/share/native/sun/awt/libpng/pngget.c b/jdk/src/share/native/sun/awt/libpng/pngget.c
index 7026a1c..79a036c 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngget.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngget.c
@@ -28,9 +28,9 @@
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
-
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ *
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -54,7 +54,7 @@
return(0);
}
-png_size_t PNGAPI
+size_t PNGAPI
png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
@@ -395,7 +395,7 @@
static png_fixed_point
png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns)
{
- /* Convert from metres * 1,000,000 to inches * 100,000, meters to
+ /* Convert from meters * 1,000,000 to inches * 100,000, meters to
* inches is simply *(100/2.54), so we want *(10/2.54) == 500/127.
* Notice that this can overflow - a warning is output and 0 is
* returned.
@@ -769,8 +769,7 @@
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_iCCP) != 0 &&
- name != NULL && compression_type != NULL && profile != NULL &&
- proflen != NULL)
+ name != NULL && profile != NULL && proflen != NULL)
{
*name = info_ptr->iccp_name;
*profile = info_ptr->iccp_profile;
@@ -778,11 +777,13 @@
/* This is somewhat irrelevant since the profile data returned has
* actually been uncompressed.
*/
- *compression_type = PNG_COMPRESSION_TYPE_BASE;
+ if (compression_type != NULL)
+ *compression_type = PNG_COMPRESSION_TYPE_BASE;
return (PNG_INFO_iCCP);
}
return (0);
+
}
#endif
@@ -801,6 +802,35 @@
}
#endif
+#ifdef PNG_eXIf_SUPPORTED
+png_uint_32 PNGAPI
+png_get_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
+ png_bytep *exif)
+{
+ png_warning(png_ptr, "png_get_eXIf does not work; use png_get_eXIf_1");
+ PNG_UNUSED(info_ptr)
+ PNG_UNUSED(exif)
+ return 0;
+}
+
+png_uint_32 PNGAPI
+png_get_eXIf_1(png_const_structrp png_ptr, png_const_inforp info_ptr,
+ png_uint_32 *num_exif, png_bytep *exif)
+{
+ png_debug1(1, "in %s retrieval function", "eXIf");
+
+ if (png_ptr != NULL && info_ptr != NULL &&
+ (info_ptr->valid & PNG_INFO_eXIf) != 0 && exif != NULL)
+ {
+ *num_exif = info_ptr->num_exif;
+ *exif = info_ptr->exif;
+ return (PNG_INFO_eXIf);
+ }
+
+ return (0);
+}
+#endif
+
#ifdef PNG_hIST_SUPPORTED
png_uint_32 PNGAPI
png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr,
@@ -1163,7 +1193,7 @@
}
#endif
-png_size_t PNGAPI
+size_t PNGAPI
png_get_compression_buffer_size(png_const_structrp png_ptr)
{
if (png_ptr == NULL)
diff --git a/jdk/src/share/native/sun/awt/libpng/pnginfo.h b/jdk/src/share/native/sun/awt/libpng/pnginfo.h
index 1dbf785..4317f2a 100644
--- a/jdk/src/share/native/sun/awt/libpng/pnginfo.h
+++ b/jdk/src/share/native/sun/awt/libpng/pnginfo.h
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.1 [March 28, 2013]
- * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2013,2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -83,10 +83,10 @@
struct png_info_def
{
/* The following are necessary for every PNG file */
- png_uint_32 width; /* width of image in pixels (from IHDR) */
- png_uint_32 height; /* height of image in pixels (from IHDR) */
- png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
- png_size_t rowbytes; /* bytes needed to hold an untransformed row */
+ png_uint_32 width; /* width of image in pixels (from IHDR) */
+ png_uint_32 height; /* height of image in pixels (from IHDR) */
+ png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
+ size_t rowbytes; /* bytes needed to hold an untransformed row */
png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */
png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */
png_uint_16 num_trans; /* number of transparent palette color (tRNS) */
@@ -213,6 +213,14 @@
png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */
#endif
+#ifdef PNG_eXIf_SUPPORTED
+ int num_exif; /* Added at libpng-1.6.31 */
+ png_bytep exif;
+# ifdef PNG_READ_eXIf_SUPPORTED
+ png_bytep eXIf_buf; /* Added at libpng-1.6.32 */
+# endif
+#endif
+
#ifdef PNG_hIST_SUPPORTED
/* The hIST chunk contains the relative frequency or importance of the
* various palette entries, so that a viewer can intelligently select a
@@ -267,7 +275,7 @@
/* The sCAL chunk describes the actual physical dimensions of the
* subject matter of the graphic. The chunk contains a unit specification
* a byte value, and two ASCII strings representing floating-point
- * values. The values are width and height corresponsing to one pixel
+ * values. The values are width and height corresponding to one pixel
* in the image. Data values are valid if (valid & PNG_INFO_sCAL) is
* non-zero.
*/
diff --git a/jdk/src/share/native/sun/awt/libpng/pnglibconf.h b/jdk/src/share/native/sun/awt/libpng/pnglibconf.h
index 6a54eb3..ab13415 100644
--- a/jdk/src/share/native/sun/awt/libpng/pnglibconf.h
+++ b/jdk/src/share/native/sun/awt/libpng/pnglibconf.h
@@ -1,6 +1,11 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file and, per its terms, should not be removed:
+ *
* 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
@@ -33,9 +38,9 @@
* file and, per its terms, should not be removed:
*/
-/* libpng version 1.6.28, January 5, 2017 */
+/* libpng version 1.6.35, July 15, 2018 */
-/* Copyright (c) 1998-2016 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2018 Glenn Randers-Pehrson */
/* This code is released under the libpng license. */
/* For conditions of distribution and use, see the disclaimer */
diff --git a/jdk/src/share/native/sun/awt/libpng/pngpread.c b/jdk/src/share/native/sun/awt/libpng/pngpread.c
index 23e5867..7506ff9 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngpread.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngpread.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.24 [August 4, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -62,7 +62,7 @@
void PNGAPI
png_process_data(png_structrp png_ptr, png_inforp info_ptr,
- png_bytep buffer, png_size_t buffer_size)
+ png_bytep buffer, size_t buffer_size)
{
if (png_ptr == NULL || info_ptr == NULL)
return;
@@ -75,7 +75,7 @@
}
}
-png_size_t PNGAPI
+size_t PNGAPI
png_process_data_pause(png_structrp png_ptr, int save)
{
if (png_ptr != NULL)
@@ -88,7 +88,7 @@
else
{
/* This includes any pending saved bytes: */
- png_size_t remaining = png_ptr->buffer_size;
+ size_t remaining = png_ptr->buffer_size;
png_ptr->buffer_size = 0;
/* So subtract the saved buffer size, unless all the data
@@ -161,8 +161,8 @@
void /* PRIVATE */
png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr)
{
- png_size_t num_checked = png_ptr->sig_bytes, /* SAFE, does not exceed 8 */
- num_to_check = 8 - num_checked;
+ size_t num_checked = png_ptr->sig_bytes; /* SAFE, does not exceed 8 */
+ size_t num_to_check = 8 - num_checked;
if (png_ptr->buffer_size < num_to_check)
{
@@ -217,6 +217,7 @@
png_crc_read(png_ptr, chunk_tag, 4);
png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag);
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
+ png_check_chunk_length(png_ptr, png_ptr->push_length);
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
}
@@ -445,7 +446,7 @@
}
void PNGCBAPI
-png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
+png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, size_t length)
{
png_bytep ptr;
@@ -455,7 +456,7 @@
ptr = buffer;
if (png_ptr->save_buffer_size != 0)
{
- png_size_t save_size;
+ size_t save_size;
if (length < png_ptr->save_buffer_size)
save_size = length;
@@ -472,7 +473,7 @@
}
if (length != 0 && png_ptr->current_buffer_size != 0)
{
- png_size_t save_size;
+ size_t save_size;
if (length < png_ptr->current_buffer_size)
save_size = length;
@@ -494,7 +495,7 @@
{
if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
{
- png_size_t i, istop;
+ size_t i, istop;
png_bytep sp;
png_bytep dp;
@@ -509,7 +510,7 @@
if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
png_ptr->save_buffer_max)
{
- png_size_t new_max;
+ size_t new_max;
png_bytep old_buffer;
if (png_ptr->save_buffer_size > PNG_SIZE_MAX -
@@ -521,7 +522,7 @@
new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
old_buffer = png_ptr->save_buffer;
png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr,
- (png_size_t)new_max);
+ (size_t)new_max);
if (png_ptr->save_buffer == NULL)
{
@@ -549,7 +550,7 @@
void /* PRIVATE */
png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer,
- png_size_t buffer_length)
+ size_t buffer_length)
{
png_ptr->current_buffer = buffer;
png_ptr->current_buffer_size = buffer_length;
@@ -589,7 +590,7 @@
if (png_ptr->idat_size != 0 && png_ptr->save_buffer_size != 0)
{
- png_size_t save_size = png_ptr->save_buffer_size;
+ size_t save_size = png_ptr->save_buffer_size;
png_uint_32 idat_size = png_ptr->idat_size;
/* We want the smaller of 'idat_size' and 'current_buffer_size', but they
@@ -599,7 +600,7 @@
* will break on either 16-bit or 64-bit platforms.
*/
if (idat_size < save_size)
- save_size = (png_size_t)idat_size;
+ save_size = (size_t)idat_size;
else
idat_size = (png_uint_32)save_size;
@@ -616,7 +617,7 @@
if (png_ptr->idat_size != 0 && png_ptr->current_buffer_size != 0)
{
- png_size_t save_size = png_ptr->current_buffer_size;
+ size_t save_size = png_ptr->current_buffer_size;
png_uint_32 idat_size = png_ptr->idat_size;
/* We want the smaller of 'idat_size' and 'current_buffer_size', but they
@@ -625,7 +626,7 @@
* larger - this cannot overflow.
*/
if (idat_size < save_size)
- save_size = (png_size_t)idat_size;
+ save_size = (size_t)idat_size;
else
idat_size = (png_uint_32)save_size;
@@ -652,7 +653,7 @@
void /* PRIVATE */
png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer,
- png_size_t buffer_length)
+ size_t buffer_length)
{
/* The caller checks for a non-zero buffer length. */
if (!(buffer_length > 0) || buffer == NULL)
diff --git a/jdk/src/share/native/sun/awt/libpng/pngpriv.h b/jdk/src/share/native/sun/awt/libpng/pngpriv.h
index b84c595..b1f9994 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngpriv.h
+++ b/jdk/src/share/native/sun/awt/libpng/pngpriv.h
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -63,7 +63,9 @@
* Windows/Visual Studio) there is no effect; the OS specific tests below are
* still required (as of 2011-05-02.)
*/
-#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
+#ifndef _POSIX_SOURCE
+# define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */
+#endif
#ifndef PNG_VERSION_INFO_ONLY
/* Standard library headers not required by png.h: */
@@ -218,6 +220,56 @@
# endif
#endif
+#ifndef PNG_POWERPC_VSX_OPT
+# if defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__)
+# define PNG_POWERPC_VSX_OPT 2
+# else
+# define PNG_POWERPC_VSX_OPT 0
+# endif
+#endif
+
+#ifndef PNG_INTEL_SSE_OPT
+# ifdef PNG_INTEL_SSE
+ /* Only check for SSE if the build configuration has been modified to
+ * enable SSE optimizations. This means that these optimizations will
+ * be off by default. See contrib/intel for more details.
+ */
+# if defined(__SSE4_1__) || defined(__AVX__) || defined(__SSSE3__) || \
+ defined(__SSE2__) || defined(_M_X64) || defined(_M_AMD64) || \
+ (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
+# define PNG_INTEL_SSE_OPT 1
+# else
+# define PNG_INTEL_SSE_OPT 0
+# endif
+# else
+# define PNG_INTEL_SSE_OPT 0
+# endif
+#endif
+
+#if PNG_INTEL_SSE_OPT > 0
+# ifndef PNG_INTEL_SSE_IMPLEMENTATION
+# if defined(__SSE4_1__) || defined(__AVX__)
+ /* We are not actually using AVX, but checking for AVX is the best
+ way we can detect SSE4.1 and SSSE3 on MSVC.
+ */
+# define PNG_INTEL_SSE_IMPLEMENTATION 3
+# elif defined(__SSSE3__)
+# define PNG_INTEL_SSE_IMPLEMENTATION 2
+# elif defined(__SSE2__) || defined(_M_X64) || defined(_M_AMD64) || \
+ (defined(_M_IX86_FP) && _M_IX86_FP >= 2)
+# define PNG_INTEL_SSE_IMPLEMENTATION 1
+# else
+# define PNG_INTEL_SSE_IMPLEMENTATION 0
+# endif
+# endif
+
+# if PNG_INTEL_SSE_IMPLEMENTATION > 0
+# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_sse2
+# endif
+#else
+# define PNG_INTEL_SSE_IMPLEMENTATION 0
+#endif
+
#if PNG_MIPS_MSA_OPT > 0
# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_msa
# ifndef PNG_MIPS_MSA_IMPLEMENTATION
@@ -238,6 +290,13 @@
# endif
#endif /* PNG_MIPS_MSA_OPT > 0 */
+#ifdef PNG_POWERPC_VSX_API_SUPPORTED
+#if PNG_POWERPC_VSX_OPT > 0
+# define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_vsx
+# define PNG_POWERPC_VSX_IMPLEMENTATION 1
+#endif
+#endif
+
/* Is this a build of a DLL where compilation of the object modules requires
* different preprocessor settings to those required for a simple library? If
@@ -431,25 +490,6 @@
# define png_fixed_error(s1,s2) png_err(s1)
#endif
-/* C allows up-casts from (void*) to any pointer and (const void*) to any
- * pointer to a const object. C++ regards this as a type error and requires an
- * explicit, static, cast and provides the static_cast<> rune to ensure that
- * const is not cast away.
- */
-#ifdef __cplusplus
-# define png_voidcast(type, value) static_cast<type>(value)
-# define png_constcast(type, value) const_cast<type>(value)
-# define png_aligncast(type, value) \
- static_cast<type>(static_cast<void*>(value))
-# define png_aligncastconst(type, value) \
- static_cast<type>(static_cast<const void*>(value))
-#else
-# define png_voidcast(type, value) (value)
-# define png_constcast(type, value) ((type)(value))
-# define png_aligncast(type, value) ((void*)(value))
-# define png_aligncastconst(type, value) ((const void*)(value))
-#endif /* __cplusplus */
-
/* Some fixed point APIs are still required even if not exported because
* they get used by the corresponding floating point APIs. This magic
* deals with this:
@@ -464,6 +504,35 @@
/* Other defines specific to compilers can go here. Try to keep
* them inside an appropriate ifdef/endif pair for portability.
*/
+
+/* C allows up-casts from (void*) to any pointer and (const void*) to any
+ * pointer to a const object. C++ regards this as a type error and requires an
+ * explicit, static, cast and provides the static_cast<> rune to ensure that
+ * const is not cast away.
+ */
+#ifdef __cplusplus
+# define png_voidcast(type, value) static_cast<type>(value)
+# define png_constcast(type, value) const_cast<type>(value)
+# define png_aligncast(type, value) \
+ static_cast<type>(static_cast<void*>(value))
+# define png_aligncastconst(type, value) \
+ static_cast<type>(static_cast<const void*>(value))
+#else
+# define png_voidcast(type, value) (value)
+# ifdef _WIN64
+# ifdef __GNUC__
+ typedef unsigned long long png_ptruint;
+# else
+ typedef unsigned __int64 png_ptruint;
+# endif
+# else
+ typedef unsigned long png_ptruint;
+# endif
+# define png_constcast(type, value) ((type)(png_ptruint)(const void*)(value))
+# define png_aligncast(type, value) ((void*)(value))
+# define png_aligncastconst(type, value) ((const void*)(value))
+#endif /* __cplusplus */
+
#if defined(PNG_FLOATING_POINT_SUPPORTED) ||\
defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)
/* png.c requires the following ANSI-C constants if the conversion of
@@ -695,8 +764,8 @@
/* Added to libpng-1.2.6 JB */
#define PNG_ROWBYTES(pixel_bits, width) \
((pixel_bits) >= 8 ? \
- ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \
- (( ((png_size_t)(width) * ((png_size_t)(pixel_bits))) + 7) >> 3) )
+ ((size_t)(width) * (((size_t)(pixel_bits)) >> 3)) : \
+ (( ((size_t)(width) * ((size_t)(pixel_bits))) + 7) >> 3) )
/* This returns the number of trailing bits in the last byte of a row, 0 if the
* last byte is completely full of pixels. It is, in principle, (pixel_bits x
@@ -809,6 +878,7 @@
#define png_PLTE PNG_U32( 80, 76, 84, 69)
#define png_bKGD PNG_U32( 98, 75, 71, 68)
#define png_cHRM PNG_U32( 99, 72, 82, 77)
+#define png_eXIf PNG_U32(101, 88, 73, 102) /* registered July 2017 */
#define png_fRAc PNG_U32(102, 82, 65, 99) /* registered, not defined */
#define png_gAMA PNG_U32(103, 65, 77, 65)
#define png_gIFg PNG_U32(103, 73, 70, 103)
@@ -883,7 +953,7 @@
* PNG files the -I directives must match.
*
* The most likely explanation is that you passed a -I in CFLAGS. This will
- * not work; all the preprocessor directories and in particular all the -I
+ * not work; all the preprocessor directives and in particular all the -I
* directives must be in CPPFLAGS.
*/
#endif
@@ -1012,15 +1082,15 @@
*/
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr,
- png_bytep data, png_size_t length),PNG_EMPTY);
+ png_bytep data, size_t length),PNG_EMPTY);
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_push_fill_buffer,(png_structp png_ptr,
- png_bytep buffer, png_size_t length),PNG_EMPTY);
+ png_bytep buffer, size_t length),PNG_EMPTY);
#endif
PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr,
- png_bytep data, png_size_t length),PNG_EMPTY);
+ png_bytep data, size_t length),PNG_EMPTY);
#ifdef PNG_WRITE_FLUSH_SUPPORTED
# ifdef PNG_STDIO_SUPPORTED
@@ -1034,7 +1104,7 @@
/* Write the "data" buffer to whatever output you are using */
PNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr,
- png_const_bytep data, png_size_t length),PNG_EMPTY);
+ png_const_bytep data, size_t length),PNG_EMPTY);
/* Read and check the PNG file signature */
PNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr,
@@ -1046,7 +1116,7 @@
/* Read data from whatever input you are using into the "data" buffer */
PNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_bytep data,
- png_size_t length),PNG_EMPTY);
+ size_t length),PNG_EMPTY);
/* Read bytes into buf, and update png_ptr->crc */
PNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_bytep buf,
@@ -1064,7 +1134,7 @@
* since this is the maximum buffer size we can specify.
*/
PNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr,
- png_const_bytep ptr, png_size_t length),PNG_EMPTY);
+ png_const_bytep ptr, size_t length),PNG_EMPTY);
#ifdef PNG_WRITE_FLUSH_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_flush,(png_structrp png_ptr),PNG_EMPTY);
@@ -1109,6 +1179,11 @@
int intent),PNG_EMPTY);
#endif
+#ifdef PNG_WRITE_eXIf_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_write_eXIf,(png_structrp png_ptr,
+ png_bytep exif, int num_exif),PNG_EMPTY);
+#endif
+
#ifdef PNG_WRITE_iCCP_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr,
png_const_charp name, png_const_bytep profile), PNG_EMPTY);
@@ -1142,7 +1217,7 @@
/* Chunks that have keywords */
#ifdef PNG_WRITE_tEXt_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr,
- png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY);
+ png_const_charp key, png_const_charp text, size_t text_len),PNG_EMPTY);
#endif
#ifdef PNG_WRITE_zTXt_SUPPORTED
@@ -1284,6 +1359,38 @@
row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
#endif
+#if PNG_POWERPC_VSX_OPT > 0
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_vsx,(png_row_infop row_info,
+ png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_vsx,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+#endif
+
+#if PNG_INTEL_SSE_IMPLEMENTATION > 0
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_sse2,(png_row_infop
+ row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY);
+#endif
+
/* Choose the best filter to use and filter the row data */
PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr,
png_row_infop row_info),PNG_EMPTY);
@@ -1376,6 +1483,11 @@
png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
+#ifdef PNG_READ_eXIf_SUPPORTED
+PNG_INTERNAL_FUNCTION(void,png_handle_eXIf,(png_structrp png_ptr,
+ png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
+#endif
+
#ifdef PNG_READ_gAMA_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_handle_gAMA,(png_structrp png_ptr,
png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
@@ -1451,8 +1563,11 @@
png_inforp info_ptr, png_uint_32 length),PNG_EMPTY);
#endif
-PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr,
- png_uint_32 chunk_name),PNG_EMPTY);
+PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_const_structrp png_ptr,
+ const png_uint_32 chunk_name),PNG_EMPTY);
+
+PNG_INTERNAL_FUNCTION(void,png_check_chunk_length,(png_const_structrp png_ptr,
+ const png_uint_32 chunk_length),PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr,
png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY);
@@ -1495,10 +1610,10 @@
PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr),
PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr,
- png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
+ png_bytep buffer, size_t buffer_length),PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_push_read_IDAT,(png_structrp png_ptr),PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_process_IDAT_data,(png_structrp png_ptr,
- png_bytep buffer, png_size_t buffer_length),PNG_EMPTY);
+ png_bytep buffer, size_t buffer_length),PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_push_process_row,(png_structrp png_ptr),
PNG_EMPTY);
PNG_INTERNAL_FUNCTION(void,png_push_handle_unknown,(png_structrp png_ptr,
@@ -1768,13 +1883,13 @@
#ifdef PNG_FLOATING_POINT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr,
- png_charp ascii, png_size_t size, double fp, unsigned int precision),
+ png_charp ascii, size_t size, double fp, unsigned int precision),
PNG_EMPTY);
#endif /* FLOATING_POINT */
#ifdef PNG_FIXED_POINT_SUPPORTED
PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,
- png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY);
+ png_charp ascii, size_t size, png_fixed_point fp),PNG_EMPTY);
#endif /* FIXED_POINT */
#endif /* sCAL */
@@ -1867,7 +1982,7 @@
* the problem character.) This has not been tested within libpng.
*/
PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,
- png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);
+ size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);
/* This is the same but it checks a complete string and returns true
* only if it just contains a floating point number. As of 1.5.4 this
@@ -1876,7 +1991,7 @@
* for negative or zero values using the sticky flag.
*/
PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string,
- png_size_t size),PNG_EMPTY);
+ size_t size),PNG_EMPTY);
#endif /* pCAL || sCAL */
#if defined(PNG_GAMMA_SUPPORTED) ||\
@@ -1951,7 +2066,7 @@
png_voidp error_buf; /* Always a jmp_buf at present. */
png_const_bytep memory; /* Memory buffer. */
- png_size_t size; /* Size of the memory buffer. */
+ size_t size; /* Size of the memory buffer. */
unsigned int for_write :1; /* Otherwise it is a read structure */
unsigned int owned_file :1; /* We own the file in io_ptr */
@@ -2019,6 +2134,11 @@
PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_msa,
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
#endif
+
+# if PNG_INTEL_SSE_IMPLEMENTATION > 0
+PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_sse2,
+ (png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
+# endif
#endif
PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
diff --git a/jdk/src/share/native/sun/awt/libpng/pngread.c b/jdk/src/share/native/sun/awt/libpng/pngread.c
index e00a74d..6955be0 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngread.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngread.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -203,6 +203,11 @@
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
+#ifdef PNG_READ_eXIf_SUPPORTED
+ else if (chunk_name == png_eXIf)
+ png_handle_eXIf(png_ptr, info_ptr, length);
+#endif
+
#ifdef PNG_READ_gAMA_SUPPORTED
else if (chunk_name == png_gAMA)
png_handle_gAMA(png_ptr, info_ptr, length);
@@ -562,6 +567,7 @@
png_error(png_ptr, "Invalid attempt to read row data");
/* Fill the row with IDAT data: */
+ png_ptr->row_buf[0]=255; /* to force error if no data was found */
png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1);
if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE)
@@ -870,6 +876,11 @@
png_handle_cHRM(png_ptr, info_ptr, length);
#endif
+#ifdef PNG_READ_eXIf_SUPPORTED
+ else if (chunk_name == png_eXIf)
+ png_handle_eXIf(png_ptr, info_ptr, length);
+#endif
+
#ifdef PNG_READ_gAMA_SUPPORTED
else if (chunk_name == png_gAMA)
png_handle_gAMA(png_ptr, info_ptr, length);
@@ -1549,7 +1560,7 @@
#endif /* STDIO */
static void PNGCBAPI
-png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need)
+png_image_memory_read(png_structp png_ptr, png_bytep out, size_t need)
{
if (png_ptr != NULL)
{
@@ -1560,7 +1571,7 @@
if (cp != NULL)
{
png_const_bytep memory = cp->memory;
- png_size_t size = cp->size;
+ size_t size = cp->size;
if (memory != NULL && size >= need)
{
@@ -1579,7 +1590,7 @@
}
int PNGAPI png_image_begin_read_from_memory(png_imagep image,
- png_const_voidp memory, png_size_t size)
+ png_const_voidp memory, size_t size)
{
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
@@ -1911,7 +1922,7 @@
{
case 4:
entry[afirst ? 0 : 3] = (png_uint_16)alpha;
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case 3:
if (alpha < 65535)
@@ -1933,7 +1944,7 @@
case 2:
entry[1 ^ afirst] = (png_uint_16)alpha;
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case 1:
if (alpha < 65535)
@@ -1962,6 +1973,7 @@
{
case 4:
entry[afirst ? 0 : 3] = (png_byte)alpha;
+ /* FALLTHROUGH */
case 3:
entry[afirst + (2 ^ bgr)] = (png_byte)blue;
entry[afirst + 1] = (png_byte)green;
@@ -1970,6 +1982,7 @@
case 2:
entry[1 ^ afirst] = (png_byte)alpha;
+ /* FALLTHROUGH */
case 1:
entry[afirst] = (png_byte)green;
break;
@@ -2889,7 +2902,7 @@
case P_sRGB:
/* Change to 8-bit sRGB */
png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB);
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case P_FILE:
if (png_ptr->bit_depth > 8)
@@ -3207,8 +3220,7 @@
image->colormap_entries == 244 /* 216 + 1 + 27 */)
break;
- /* goto bad_output; */
- /* FALL THROUGH */
+ goto bad_output;
default:
bad_output:
@@ -3776,6 +3788,12 @@
output_gamma = PNG_DEFAULT_sRGB;
}
+ if ((change & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0)
+ {
+ mode = PNG_ALPHA_OPTIMIZED;
+ change &= ~PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
+ }
+
/* If 'do_local_background' is set check for the presence of gamma
* correction; this is part of the work-round for the libpng bug
* described above.
@@ -4001,6 +4019,10 @@
else if (do_local_compose != 0) /* internal error */
png_error(png_ptr, "png_image_read: alpha channel lost");
+ if ((format & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0) {
+ info_format |= PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
+ }
+
if (info_ptr->bit_depth == 16)
info_format |= PNG_FORMAT_FLAG_LINEAR;
@@ -4156,7 +4178,7 @@
*
* NOTE: this will be changed in 1.7 because PNG_IMAGE_BUFFER_SIZE
* will be changed to use png_alloc_size_t; bigger images can be
- * accomodated on 64-bit systems.
+ * accommodated on 64-bit systems.
*/
if (image->height <=
0xffffffffU/PNG_IMAGE_PIXEL_COMPONENT_SIZE(image->format)/check)
diff --git a/jdk/src/share/native/sun/awt/libpng/pngrio.c b/jdk/src/share/native/sun/awt/libpng/pngrio.c
index 1d39b76..90d3abd 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngrio.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngrio.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.24 [August 4, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -57,7 +57,7 @@
* to read more than 64K on a 16-bit machine.
*/
void /* PRIVATE */
-png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)
+png_read_data(png_structrp png_ptr, png_bytep data, size_t length)
{
png_debug1(4, "reading %d bytes", (int)length);
@@ -75,14 +75,14 @@
* than changing the library.
*/
void PNGCBAPI
-png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
+png_default_read_data(png_structp png_ptr, png_bytep data, size_t length)
{
- png_size_t check;
+ size_t check;
if (png_ptr == NULL)
return;
- /* fread() returns 0 on error, so it is OK to store this in a png_size_t
+ /* fread() returns 0 on error, so it is OK to store this in a size_t
* instead of an int, which is what fread() actually returns.
*/
check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));
diff --git a/jdk/src/share/native/sun/awt/libpng/pngrtran.c b/jdk/src/share/native/sun/awt/libpng/pngrtran.c
index 7decb39..e12d32d 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngrtran.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngrtran.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.24 [August 4, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -77,6 +77,7 @@
case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */
png_warning(png_ptr,
"Can't discard critical data on CRC error");
+ /* FALLTHROUGH */
case PNG_CRC_ERROR_QUIT: /* Error/quit */
case PNG_CRC_DEFAULT:
@@ -319,7 +320,7 @@
* who use the inverse of the gamma value accidentally! Since some of these
* values are reasonable this may have to be changed:
*
- * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit
+ * 1.6.x: changed from 0.07..3 to 0.01..100 (to accommodate the optimal 16-bit
* gamma of 36, and its reciprocal.)
*/
if (output_gamma < 1000 || output_gamma > 10000000)
@@ -457,7 +458,7 @@
int i;
png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
+ (png_alloc_size_t)((png_uint_32)num_palette * (sizeof (png_byte))));
for (i = 0; i < num_palette; i++)
png_ptr->quantize_index[i] = (png_byte)i;
}
@@ -474,7 +475,7 @@
/* Initialize an array to sort colors */
png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
+ (png_alloc_size_t)((png_uint_32)num_palette * (sizeof (png_byte))));
/* Initialize the quantize_sort array */
for (i = 0; i < num_palette; i++)
@@ -608,9 +609,11 @@
/* Initialize palette index arrays */
png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
+ (png_alloc_size_t)((png_uint_32)num_palette *
+ (sizeof (png_byte))));
png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)((png_uint_32)num_palette * (sizeof (png_byte))));
+ (png_alloc_size_t)((png_uint_32)num_palette *
+ (sizeof (png_byte))));
/* Initialize the sort array */
for (i = 0; i < num_palette; i++)
@@ -619,7 +622,7 @@
png_ptr->palette_to_index[i] = (png_byte)i;
}
- hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 *
+ hash = (png_dsortpp)png_calloc(png_ptr, (png_alloc_size_t)(769 *
(sizeof (png_dsortp))));
num_new_palette = num_palette;
@@ -650,7 +653,7 @@
{
t = (png_dsortp)png_malloc_warn(png_ptr,
- (png_uint_32)(sizeof (png_dsort)));
+ (png_alloc_size_t)(sizeof (png_dsort)));
if (t == NULL)
break;
@@ -772,12 +775,12 @@
int num_red = (1 << PNG_QUANTIZE_RED_BITS);
int num_green = (1 << PNG_QUANTIZE_GREEN_BITS);
int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS);
- png_size_t num_entries = ((png_size_t)1 << total_bits);
+ size_t num_entries = ((size_t)1 << total_bits);
png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
- (png_uint_32)(num_entries * (sizeof (png_byte))));
+ (png_alloc_size_t)(num_entries * (sizeof (png_byte))));
- distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *
+ distance = (png_bytep)png_malloc(png_ptr, (png_alloc_size_t)(num_entries *
(sizeof (png_byte))));
memset(distance, 0xff, num_entries * (sizeof (png_byte)));
@@ -1281,7 +1284,7 @@
default:
case 8:
- /* FALL THROUGH (Already 8 bits) */
+ /* FALLTHROUGH */ /* (Already 8 bits) */
case 16:
/* Already a full 16 bits */
@@ -1342,7 +1345,7 @@
else if (png_ptr->screen_gamma != 0)
/* The converse - assume the file matches the screen, note that this
- * perhaps undesireable default can (from 1.5.4) be changed by calling
+ * perhaps undesirable default can (from 1.5.4) be changed by calling
* png_set_alpha_mode (even if the alpha handling mode isn't required
* or isn't changed from the default.)
*/
@@ -1910,7 +1913,7 @@
png_ptr->transformations &= ~PNG_SHIFT;
- /* significant bits can be in the range 1 to 7 for a meaninful result, if
+ /* significant bits can be in the range 1 to 7 for a meaningful result, if
* the number of significant bits is 0 then no shift is done (this is an
* error condition which is silently ignored.)
*/
@@ -2176,8 +2179,8 @@
{
case 1:
{
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);
- png_bytep dp = row + (png_size_t)row_width - 1;
+ png_bytep sp = row + (size_t)((row_width - 1) >> 3);
+ png_bytep dp = row + (size_t)row_width - 1;
png_uint_32 shift = 7U - ((row_width + 7U) & 0x07);
for (i = 0; i < row_width; i++)
{
@@ -2200,8 +2203,8 @@
case 2:
{
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);
- png_bytep dp = row + (png_size_t)row_width - 1;
+ png_bytep sp = row + (size_t)((row_width - 1) >> 2);
+ png_bytep dp = row + (size_t)row_width - 1;
png_uint_32 shift = ((3U - ((row_width + 3U) & 0x03)) << 1);
for (i = 0; i < row_width; i++)
{
@@ -2223,8 +2226,8 @@
case 4:
{
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
- png_bytep dp = row + (png_size_t)row_width - 1;
+ png_bytep sp = row + (size_t)((row_width - 1) >> 1);
+ png_bytep dp = row + (size_t)row_width - 1;
png_uint_32 shift = ((1U - ((row_width + 1U) & 0x01)) << 2);
for (i = 0; i < row_width; i++)
{
@@ -2488,95 +2491,94 @@
static void
png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
{
+ png_uint_32 row_width = row_info->width;
+
png_debug(1, "in png_do_read_swap_alpha");
+ if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{
- png_uint_32 row_width = row_info->width;
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
+ /* This converts from RGBA to ARGB */
+ if (row_info->bit_depth == 8)
{
- /* This converts from RGBA to ARGB */
- if (row_info->bit_depth == 8)
+ png_bytep sp = row + row_info->rowbytes;
+ png_bytep dp = sp;
+ png_byte save;
+ png_uint_32 i;
+
+ for (i = 0; i < row_width; i++)
{
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save;
- }
+ save = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save;
}
-
-#ifdef PNG_READ_16BIT_SUPPORTED
- /* This converts from RRGGBBAA to AARRGGBB */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save[2];
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save[0] = *(--sp);
- save[1] = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save[0];
- *(--dp) = save[1];
- }
- }
-#endif
}
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+#ifdef PNG_READ_16BIT_SUPPORTED
+ /* This converts from RRGGBBAA to AARRGGBB */
+ else
{
- /* This converts from GA to AG */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save;
- png_uint_32 i;
+ png_bytep sp = row + row_info->rowbytes;
+ png_bytep dp = sp;
+ png_byte save[2];
+ png_uint_32 i;
- for (i = 0; i < row_width; i++)
- {
- save = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save;
- }
+ for (i = 0; i < row_width; i++)
+ {
+ save[0] = *(--sp);
+ save[1] = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save[0];
+ *(--dp) = save[1];
}
+ }
+#endif
+ }
+
+ else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ {
+ /* This converts from GA to AG */
+ if (row_info->bit_depth == 8)
+ {
+ png_bytep sp = row + row_info->rowbytes;
+ png_bytep dp = sp;
+ png_byte save;
+ png_uint_32 i;
+
+ for (i = 0; i < row_width; i++)
+ {
+ save = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save;
+ }
+ }
#ifdef PNG_READ_16BIT_SUPPORTED
- /* This converts from GGAA to AAGG */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save[2];
- png_uint_32 i;
+ /* This converts from GGAA to AAGG */
+ else
+ {
+ png_bytep sp = row + row_info->rowbytes;
+ png_bytep dp = sp;
+ png_byte save[2];
+ png_uint_32 i;
- for (i = 0; i < row_width; i++)
- {
- save[0] = *(--sp);
- save[1] = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save[0];
- *(--dp) = save[1];
- }
+ for (i = 0; i < row_width; i++)
+ {
+ save[0] = *(--sp);
+ save[1] = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = *(--sp);
+ *(--dp) = save[0];
+ *(--dp) = save[1];
}
-#endif
}
+#endif
}
}
#endif
@@ -2706,8 +2708,8 @@
if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from G to GX */
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
+ png_bytep sp = row + (size_t)row_width;
+ png_bytep dp = sp + (size_t)row_width;
for (i = 1; i < row_width; i++)
{
*(--dp) = lo_filler;
@@ -2722,8 +2724,8 @@
else
{
/* This changes the data from G to XG */
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
+ png_bytep sp = row + (size_t)row_width;
+ png_bytep dp = sp + (size_t)row_width;
for (i = 0; i < row_width; i++)
{
*(--dp) = *(--sp);
@@ -2741,8 +2743,8 @@
if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from GG to GGXX */
- png_bytep sp = row + (png_size_t)row_width * 2;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width * 2;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 1; i < row_width; i++)
{
*(--dp) = lo_filler;
@@ -2760,8 +2762,8 @@
else
{
/* This changes the data from GG to XXGG */
- png_bytep sp = row + (png_size_t)row_width * 2;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width * 2;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 0; i < row_width; i++)
{
*(--dp) = *(--sp);
@@ -2783,8 +2785,8 @@
if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from RGB to RGBX */
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
+ png_bytep sp = row + (size_t)row_width * 3;
+ png_bytep dp = sp + (size_t)row_width;
for (i = 1; i < row_width; i++)
{
*(--dp) = lo_filler;
@@ -2801,8 +2803,8 @@
else
{
/* This changes the data from RGB to XRGB */
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
+ png_bytep sp = row + (size_t)row_width * 3;
+ png_bytep dp = sp + (size_t)row_width;
for (i = 0; i < row_width; i++)
{
*(--dp) = *(--sp);
@@ -2822,8 +2824,8 @@
if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
{
/* This changes the data from RRGGBB to RRGGBBXX */
- png_bytep sp = row + (png_size_t)row_width * 6;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width * 6;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 1; i < row_width; i++)
{
*(--dp) = lo_filler;
@@ -2845,8 +2847,8 @@
else
{
/* This changes the data from RRGGBB to XXRRGGBB */
- png_bytep sp = row + (png_size_t)row_width * 6;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width * 6;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 0; i < row_width; i++)
{
*(--dp) = *(--sp);
@@ -2887,8 +2889,8 @@
if (row_info->bit_depth == 8)
{
/* This changes G to RGB */
- png_bytep sp = row + (png_size_t)row_width - 1;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width - 1;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 0; i < row_width; i++)
{
*(dp--) = *sp;
@@ -2900,8 +2902,8 @@
else
{
/* This changes GG to RRGGBB */
- png_bytep sp = row + (png_size_t)row_width * 2 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 4;
+ png_bytep sp = row + (size_t)row_width * 2 - 1;
+ png_bytep dp = sp + (size_t)row_width * 4;
for (i = 0; i < row_width; i++)
{
*(dp--) = *sp;
@@ -2919,8 +2921,8 @@
if (row_info->bit_depth == 8)
{
/* This changes GA to RGBA */
- png_bytep sp = row + (png_size_t)row_width * 2 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 2;
+ png_bytep sp = row + (size_t)row_width * 2 - 1;
+ png_bytep dp = sp + (size_t)row_width * 2;
for (i = 0; i < row_width; i++)
{
*(dp--) = *(sp--);
@@ -2933,8 +2935,8 @@
else
{
/* This changes GGAA to RRGGBBAA */
- png_bytep sp = row + (png_size_t)row_width * 4 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 4;
+ png_bytep sp = row + (size_t)row_width * 4 - 1;
+ png_bytep dp = sp + (size_t)row_width * 4;
for (i = 0; i < row_width; i++)
{
*(dp--) = *(sp--);
@@ -2962,7 +2964,7 @@
* using the equation given in Poynton's ColorFAQ of 1998-01-04 at
* <http://www.inforamp.net/~poynton/> (THIS LINK IS DEAD June 2008 but
* versions dated 1998 through November 2002 have been archived at
- * http://web.archive.org/web/20000816232553/http://www.inforamp.net/
+ * https://web.archive.org/web/20000816232553/www.inforamp.net/
* ~poynton/notes/colour_and_gamma/ColorFAQ.txt )
* Charles Poynton poynton at poynton.com
*
@@ -3005,7 +3007,7 @@
* values this results in an implicit assumption that the original PNG RGB
* values were linear.
*
- * Other integer coefficents can be used via png_set_rgb_to_gray(). Because
+ * Other integer coefficients can be used via png_set_rgb_to_gray(). Because
* the API takes just red and green coefficients the blue coefficient is
* calculated to make the sum 32768. This will result in different rounding
* to that used above.
@@ -3234,419 +3236,229 @@
png_debug(1, "in png_do_compose");
+ switch (row_info->color_type)
{
- switch (row_info->color_type)
+ case PNG_COLOR_TYPE_GRAY:
{
- case PNG_COLOR_TYPE_GRAY:
+ switch (row_info->bit_depth)
{
- switch (row_info->bit_depth)
+ case 1:
{
- case 1:
+ sp = row;
+ shift = 7;
+ for (i = 0; i < row_width; i++)
{
- sp = row;
- shift = 7;
- for (i = 0; i < row_width; i++)
+ if ((png_uint_16)((*sp >> shift) & 0x01)
+ == png_ptr->trans_color.gray)
{
- if ((png_uint_16)((*sp >> shift) & 0x01)
- == png_ptr->trans_color.gray)
- {
- unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
- tmp |=
- (unsigned int)(png_ptr->background.gray << shift);
- *sp = (png_byte)(tmp & 0xff);
- }
-
- if (shift == 0)
- {
- shift = 7;
- sp++;
- }
-
- else
- shift--;
+ unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
+ tmp |=
+ (unsigned int)(png_ptr->background.gray << shift);
+ *sp = (png_byte)(tmp & 0xff);
}
- break;
- }
- case 2:
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_table != NULL)
+ if (shift == 0)
{
- sp = row;
- shift = 6;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x03)
- == png_ptr->trans_color.gray)
- {
- unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
- tmp |=
- (unsigned int)png_ptr->background.gray << shift;
- *sp = (png_byte)(tmp & 0xff);
- }
-
- else
- {
- unsigned int p = (*sp >> shift) & 0x03;
- unsigned int g = (gamma_table [p | (p << 2) |
- (p << 4) | (p << 6)] >> 6) & 0x03;
- unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
- tmp |= (unsigned int)(g << shift);
- *sp = (png_byte)(tmp & 0xff);
- }
-
- if (shift == 0)
- {
- shift = 6;
- sp++;
- }
-
- else
- shift -= 2;
- }
+ shift = 7;
+ sp++;
}
else
-#endif
- {
- sp = row;
- shift = 6;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x03)
- == png_ptr->trans_color.gray)
- {
- unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
- tmp |=
- (unsigned int)png_ptr->background.gray << shift;
- *sp = (png_byte)(tmp & 0xff);
- }
-
- if (shift == 0)
- {
- shift = 6;
- sp++;
- }
-
- else
- shift -= 2;
- }
- }
- break;
+ shift--;
}
-
- case 4:
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_table != NULL)
- {
- sp = row;
- shift = 4;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x0f)
- == png_ptr->trans_color.gray)
- {
- unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
- tmp |=
- (unsigned int)(png_ptr->background.gray << shift);
- *sp = (png_byte)(tmp & 0xff);
- }
-
- else
- {
- unsigned int p = (*sp >> shift) & 0x0f;
- unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
- 0x0f;
- unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
- tmp |= (unsigned int)(g << shift);
- *sp = (png_byte)(tmp & 0xff);
- }
-
- if (shift == 0)
- {
- shift = 4;
- sp++;
- }
-
- else
- shift -= 4;
- }
- }
-
- else
-#endif
- {
- sp = row;
- shift = 4;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x0f)
- == png_ptr->trans_color.gray)
- {
- unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
- tmp |=
- (unsigned int)(png_ptr->background.gray << shift);
- *sp = (png_byte)(tmp & 0xff);
- }
-
- if (shift == 0)
- {
- shift = 4;
- sp++;
- }
-
- else
- shift -= 4;
- }
- }
- break;
- }
-
- case 8:
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_table != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp++)
- {
- if (*sp == png_ptr->trans_color.gray)
- *sp = (png_byte)png_ptr->background.gray;
-
- else
- *sp = gamma_table[*sp];
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp++)
- {
- if (*sp == png_ptr->trans_color.gray)
- *sp = (png_byte)png_ptr->background.gray;
- }
- }
- break;
- }
-
- case 16:
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_16 != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 2)
- {
- png_uint_16 v;
-
- v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
-
- if (v == png_ptr->trans_color.gray)
- {
- /* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.gray >> 8)
- & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray
- & 0xff);
- }
-
- else
- {
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 2)
- {
- png_uint_16 v;
-
- v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
-
- if (v == png_ptr->trans_color.gray)
- {
- *sp = (png_byte)((png_ptr->background.gray >> 8)
- & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray
- & 0xff);
- }
- }
- }
- break;
- }
-
- default:
- break;
+ break;
}
- break;
- }
- case PNG_COLOR_TYPE_RGB:
- {
- if (row_info->bit_depth == 8)
+ case 2:
{
#ifdef PNG_READ_GAMMA_SUPPORTED
if (gamma_table != NULL)
{
sp = row;
- for (i = 0; i < row_width; i++, sp += 3)
+ shift = 6;
+ for (i = 0; i < row_width; i++)
{
- if (*sp == png_ptr->trans_color.red &&
- *(sp + 1) == png_ptr->trans_color.green &&
- *(sp + 2) == png_ptr->trans_color.blue)
+ if ((png_uint_16)((*sp >> shift) & 0x03)
+ == png_ptr->trans_color.gray)
{
- *sp = (png_byte)png_ptr->background.red;
- *(sp + 1) = (png_byte)png_ptr->background.green;
- *(sp + 2) = (png_byte)png_ptr->background.blue;
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |=
+ (unsigned int)png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
}
else
{
- *sp = gamma_table[*sp];
- *(sp + 1) = gamma_table[*(sp + 1)];
- *(sp + 2) = gamma_table[*(sp + 2)];
+ unsigned int p = (*sp >> shift) & 0x03;
+ unsigned int g = (gamma_table [p | (p << 2) |
+ (p << 4) | (p << 6)] >> 6) & 0x03;
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |= (unsigned int)(g << shift);
+ *sp = (png_byte)(tmp & 0xff);
}
+
+ if (shift == 0)
+ {
+ shift = 6;
+ sp++;
+ }
+
+ else
+ shift -= 2;
+ }
+ }
+
+ else
+#endif
+ {
+ sp = row;
+ shift = 6;
+ for (i = 0; i < row_width; i++)
+ {
+ if ((png_uint_16)((*sp >> shift) & 0x03)
+ == png_ptr->trans_color.gray)
+ {
+ unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
+ tmp |=
+ (unsigned int)png_ptr->background.gray << shift;
+ *sp = (png_byte)(tmp & 0xff);
+ }
+
+ if (shift == 0)
+ {
+ shift = 6;
+ sp++;
+ }
+
+ else
+ shift -= 2;
+ }
+ }
+ break;
+ }
+
+ case 4:
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_table != NULL)
+ {
+ sp = row;
+ shift = 4;
+ for (i = 0; i < row_width; i++)
+ {
+ if ((png_uint_16)((*sp >> shift) & 0x0f)
+ == png_ptr->trans_color.gray)
+ {
+ unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
+ tmp |=
+ (unsigned int)(png_ptr->background.gray << shift);
+ *sp = (png_byte)(tmp & 0xff);
+ }
+
+ else
+ {
+ unsigned int p = (*sp >> shift) & 0x0f;
+ unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
+ 0x0f;
+ unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
+ tmp |= (unsigned int)(g << shift);
+ *sp = (png_byte)(tmp & 0xff);
+ }
+
+ if (shift == 0)
+ {
+ shift = 4;
+ sp++;
+ }
+
+ else
+ shift -= 4;
+ }
+ }
+
+ else
+#endif
+ {
+ sp = row;
+ shift = 4;
+ for (i = 0; i < row_width; i++)
+ {
+ if ((png_uint_16)((*sp >> shift) & 0x0f)
+ == png_ptr->trans_color.gray)
+ {
+ unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
+ tmp |=
+ (unsigned int)(png_ptr->background.gray << shift);
+ *sp = (png_byte)(tmp & 0xff);
+ }
+
+ if (shift == 0)
+ {
+ shift = 4;
+ sp++;
+ }
+
+ else
+ shift -= 4;
+ }
+ }
+ break;
+ }
+
+ case 8:
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_table != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp++)
+ {
+ if (*sp == png_ptr->trans_color.gray)
+ *sp = (png_byte)png_ptr->background.gray;
+
+ else
+ *sp = gamma_table[*sp];
}
}
else
#endif
{
sp = row;
- for (i = 0; i < row_width; i++, sp += 3)
+ for (i = 0; i < row_width; i++, sp++)
{
- if (*sp == png_ptr->trans_color.red &&
- *(sp + 1) == png_ptr->trans_color.green &&
- *(sp + 2) == png_ptr->trans_color.blue)
- {
- *sp = (png_byte)png_ptr->background.red;
- *(sp + 1) = (png_byte)png_ptr->background.green;
- *(sp + 2) = (png_byte)png_ptr->background.blue;
- }
+ if (*sp == png_ptr->trans_color.gray)
+ *sp = (png_byte)png_ptr->background.gray;
}
}
+ break;
}
- else /* if (row_info->bit_depth == 16) */
+
+ case 16:
{
#ifdef PNG_READ_GAMMA_SUPPORTED
if (gamma_16 != NULL)
{
sp = row;
- for (i = 0; i < row_width; i++, sp += 6)
- {
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
-
- png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
-
- png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
- + *(sp + 5));
-
- if (r == png_ptr->trans_color.red &&
- g == png_ptr->trans_color.green &&
- b == png_ptr->trans_color.blue)
- {
- /* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
- & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green
- & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
- & 0xff);
- *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
- }
-
- else
- {
- png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
-
- v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
- *(sp + 2) = (png_byte)((v >> 8) & 0xff);
- *(sp + 3) = (png_byte)(v & 0xff);
-
- v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
- *(sp + 4) = (png_byte)((v >> 8) & 0xff);
- *(sp + 5) = (png_byte)(v & 0xff);
- }
- }
- }
-
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 6)
- {
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
-
- png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
-
- png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
- + *(sp + 5));
-
- if (r == png_ptr->trans_color.red &&
- g == png_ptr->trans_color.green &&
- b == png_ptr->trans_color.blue)
- {
- *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
- & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green
- & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
- & 0xff);
- *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
- }
- }
- }
- }
- break;
- }
-
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
- gamma_table != NULL)
- {
- sp = row;
for (i = 0; i < row_width; i++, sp += 2)
{
- png_uint_16 a = *(sp + 1);
+ png_uint_16 v;
- if (a == 0xff)
- *sp = gamma_table[*sp];
+ v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- else if (a == 0)
+ if (v == png_ptr->trans_color.gray)
{
/* Background is already in screen gamma */
- *sp = (png_byte)png_ptr->background.gray;
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
+ & 0xff);
}
else
{
- png_byte v, w;
-
- v = gamma_to_1[*sp];
- png_composite(w, v, a, png_ptr->background_1.gray);
- if (optimize == 0)
- w = gamma_from_1[w];
- *sp = w;
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
}
}
}
@@ -3656,298 +3468,486 @@
sp = row;
for (i = 0; i < row_width; i++, sp += 2)
{
- png_byte a = *(sp + 1);
+ png_uint_16 v;
- if (a == 0)
- *sp = (png_byte)png_ptr->background.gray;
+ v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- else if (a < 0xff)
- png_composite(*sp, *sp, a, png_ptr->background.gray);
- }
- }
- }
- else /* if (png_ptr->bit_depth == 16) */
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
- gamma_16_to_1 != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 4)
- {
- png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
-
- if (a == (png_uint_16)0xffff)
- {
- png_uint_16 v;
-
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- }
-
- else if (a == 0)
- {
- /* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.gray >> 8)
- & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
- }
-
- else
- {
- png_uint_16 g, v, w;
-
- g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(v, g, a, png_ptr->background_1.gray);
- if (optimize != 0)
- w = v;
- else
- w = gamma_16_from_1[(v & 0xff) >>
- gamma_shift][v >> 8];
- *sp = (png_byte)((w >> 8) & 0xff);
- *(sp + 1) = (png_byte)(w & 0xff);
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 4)
- {
- png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
-
- if (a == 0)
+ if (v == png_ptr->trans_color.gray)
{
*sp = (png_byte)((png_ptr->background.gray >> 8)
- & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
- }
-
- else if (a < 0xffff)
- {
- png_uint_16 g, v;
-
- g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_composite_16(v, g, a, png_ptr->background.gray);
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray
+ & 0xff);
}
}
}
+ break;
}
- break;
+
+ default:
+ break;
}
-
- case PNG_COLOR_TYPE_RGB_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
- gamma_table != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 4)
- {
- png_byte a = *(sp + 3);
-
- if (a == 0xff)
- {
- *sp = gamma_table[*sp];
- *(sp + 1) = gamma_table[*(sp + 1)];
- *(sp + 2) = gamma_table[*(sp + 2)];
- }
-
- else if (a == 0)
- {
- /* Background is already in screen gamma */
- *sp = (png_byte)png_ptr->background.red;
- *(sp + 1) = (png_byte)png_ptr->background.green;
- *(sp + 2) = (png_byte)png_ptr->background.blue;
- }
-
- else
- {
- png_byte v, w;
-
- v = gamma_to_1[*sp];
- png_composite(w, v, a, png_ptr->background_1.red);
- if (optimize == 0) w = gamma_from_1[w];
- *sp = w;
-
- v = gamma_to_1[*(sp + 1)];
- png_composite(w, v, a, png_ptr->background_1.green);
- if (optimize == 0) w = gamma_from_1[w];
- *(sp + 1) = w;
-
- v = gamma_to_1[*(sp + 2)];
- png_composite(w, v, a, png_ptr->background_1.blue);
- if (optimize == 0) w = gamma_from_1[w];
- *(sp + 2) = w;
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 4)
- {
- png_byte a = *(sp + 3);
-
- if (a == 0)
- {
- *sp = (png_byte)png_ptr->background.red;
- *(sp + 1) = (png_byte)png_ptr->background.green;
- *(sp + 2) = (png_byte)png_ptr->background.blue;
- }
-
- else if (a < 0xff)
- {
- png_composite(*sp, *sp, a, png_ptr->background.red);
-
- png_composite(*(sp + 1), *(sp + 1), a,
- png_ptr->background.green);
-
- png_composite(*(sp + 2), *(sp + 2), a,
- png_ptr->background.blue);
- }
- }
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
-#ifdef PNG_READ_GAMMA_SUPPORTED
- if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
- gamma_16_to_1 != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 8)
- {
- png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
- << 8) + (png_uint_16)(*(sp + 7)));
-
- if (a == (png_uint_16)0xffff)
- {
- png_uint_16 v;
-
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
-
- v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
- *(sp + 2) = (png_byte)((v >> 8) & 0xff);
- *(sp + 3) = (png_byte)(v & 0xff);
-
- v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
- *(sp + 4) = (png_byte)((v >> 8) & 0xff);
- *(sp + 5) = (png_byte)(v & 0xff);
- }
-
- else if (a == 0)
- {
- /* Background is already in screen gamma */
- *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
- & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green
- & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
- & 0xff);
- *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
- }
-
- else
- {
- png_uint_16 v, w;
-
- v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(w, v, a, png_ptr->background_1.red);
- if (optimize == 0)
- w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
- 8];
- *sp = (png_byte)((w >> 8) & 0xff);
- *(sp + 1) = (png_byte)(w & 0xff);
-
- v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
- png_composite_16(w, v, a, png_ptr->background_1.green);
- if (optimize == 0)
- w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
- 8];
-
- *(sp + 2) = (png_byte)((w >> 8) & 0xff);
- *(sp + 3) = (png_byte)(w & 0xff);
-
- v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
- png_composite_16(w, v, a, png_ptr->background_1.blue);
- if (optimize == 0)
- w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
- 8];
-
- *(sp + 4) = (png_byte)((w >> 8) & 0xff);
- *(sp + 5) = (png_byte)(w & 0xff);
- }
- }
- }
-
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 8)
- {
- png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
- << 8) + (png_uint_16)(*(sp + 7)));
-
- if (a == 0)
- {
- *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
- *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
- & 0xff);
- *(sp + 3) = (png_byte)(png_ptr->background.green
- & 0xff);
- *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
- & 0xff);
- *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
- }
-
- else if (a < 0xffff)
- {
- png_uint_16 v;
-
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
- png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
- + *(sp + 5));
-
- png_composite_16(v, r, a, png_ptr->background.red);
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
-
- png_composite_16(v, g, a, png_ptr->background.green);
- *(sp + 2) = (png_byte)((v >> 8) & 0xff);
- *(sp + 3) = (png_byte)(v & 0xff);
-
- png_composite_16(v, b, a, png_ptr->background.blue);
- *(sp + 4) = (png_byte)((v >> 8) & 0xff);
- *(sp + 5) = (png_byte)(v & 0xff);
- }
- }
- }
- }
- break;
- }
-
- default:
- break;
+ break;
}
+
+ case PNG_COLOR_TYPE_RGB:
+ {
+ if (row_info->bit_depth == 8)
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_table != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 3)
+ {
+ if (*sp == png_ptr->trans_color.red &&
+ *(sp + 1) == png_ptr->trans_color.green &&
+ *(sp + 2) == png_ptr->trans_color.blue)
+ {
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
+ }
+
+ else
+ {
+ *sp = gamma_table[*sp];
+ *(sp + 1) = gamma_table[*(sp + 1)];
+ *(sp + 2) = gamma_table[*(sp + 2)];
+ }
+ }
+ }
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 3)
+ {
+ if (*sp == png_ptr->trans_color.red &&
+ *(sp + 1) == png_ptr->trans_color.green &&
+ *(sp + 2) == png_ptr->trans_color.blue)
+ {
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
+ }
+ }
+ }
+ }
+ else /* if (row_info->bit_depth == 16) */
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_16 != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 6)
+ {
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
+
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
+ + *(sp + 3));
+
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ + *(sp + 5));
+
+ if (r == png_ptr->trans_color.red &&
+ g == png_ptr->trans_color.green &&
+ b == png_ptr->trans_color.blue)
+ {
+ /* Background is already in screen gamma */
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
+ }
+
+ else
+ {
+ png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
+
+ v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(v & 0xff);
+
+ v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(v & 0xff);
+ }
+ }
+ }
+
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 6)
+ {
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
+
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
+ + *(sp + 3));
+
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ + *(sp + 5));
+
+ if (r == png_ptr->trans_color.red &&
+ g == png_ptr->trans_color.green &&
+ b == png_ptr->trans_color.blue)
+ {
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ case PNG_COLOR_TYPE_GRAY_ALPHA:
+ {
+ if (row_info->bit_depth == 8)
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
+ gamma_table != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 2)
+ {
+ png_uint_16 a = *(sp + 1);
+
+ if (a == 0xff)
+ *sp = gamma_table[*sp];
+
+ else if (a == 0)
+ {
+ /* Background is already in screen gamma */
+ *sp = (png_byte)png_ptr->background.gray;
+ }
+
+ else
+ {
+ png_byte v, w;
+
+ v = gamma_to_1[*sp];
+ png_composite(w, v, a, png_ptr->background_1.gray);
+ if (optimize == 0)
+ w = gamma_from_1[w];
+ *sp = w;
+ }
+ }
+ }
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 2)
+ {
+ png_byte a = *(sp + 1);
+
+ if (a == 0)
+ *sp = (png_byte)png_ptr->background.gray;
+
+ else if (a < 0xff)
+ png_composite(*sp, *sp, a, png_ptr->background.gray);
+ }
+ }
+ }
+ else /* if (png_ptr->bit_depth == 16) */
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
+ gamma_16_to_1 != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 4)
+ {
+ png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
+ + *(sp + 3));
+
+ if (a == (png_uint_16)0xffff)
+ {
+ png_uint_16 v;
+
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
+ }
+
+ else if (a == 0)
+ {
+ /* Background is already in screen gamma */
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
+ }
+
+ else
+ {
+ png_uint_16 g, v, w;
+
+ g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
+ png_composite_16(v, g, a, png_ptr->background_1.gray);
+ if (optimize != 0)
+ w = v;
+ else
+ w = gamma_16_from_1[(v & 0xff) >>
+ gamma_shift][v >> 8];
+ *sp = (png_byte)((w >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(w & 0xff);
+ }
+ }
+ }
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 4)
+ {
+ png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
+ + *(sp + 3));
+
+ if (a == 0)
+ {
+ *sp = (png_byte)((png_ptr->background.gray >> 8)
+ & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
+ }
+
+ else if (a < 0xffff)
+ {
+ png_uint_16 g, v;
+
+ g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
+ png_composite_16(v, g, a, png_ptr->background.gray);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ {
+ if (row_info->bit_depth == 8)
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
+ gamma_table != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 4)
+ {
+ png_byte a = *(sp + 3);
+
+ if (a == 0xff)
+ {
+ *sp = gamma_table[*sp];
+ *(sp + 1) = gamma_table[*(sp + 1)];
+ *(sp + 2) = gamma_table[*(sp + 2)];
+ }
+
+ else if (a == 0)
+ {
+ /* Background is already in screen gamma */
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
+ }
+
+ else
+ {
+ png_byte v, w;
+
+ v = gamma_to_1[*sp];
+ png_composite(w, v, a, png_ptr->background_1.red);
+ if (optimize == 0) w = gamma_from_1[w];
+ *sp = w;
+
+ v = gamma_to_1[*(sp + 1)];
+ png_composite(w, v, a, png_ptr->background_1.green);
+ if (optimize == 0) w = gamma_from_1[w];
+ *(sp + 1) = w;
+
+ v = gamma_to_1[*(sp + 2)];
+ png_composite(w, v, a, png_ptr->background_1.blue);
+ if (optimize == 0) w = gamma_from_1[w];
+ *(sp + 2) = w;
+ }
+ }
+ }
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 4)
+ {
+ png_byte a = *(sp + 3);
+
+ if (a == 0)
+ {
+ *sp = (png_byte)png_ptr->background.red;
+ *(sp + 1) = (png_byte)png_ptr->background.green;
+ *(sp + 2) = (png_byte)png_ptr->background.blue;
+ }
+
+ else if (a < 0xff)
+ {
+ png_composite(*sp, *sp, a, png_ptr->background.red);
+
+ png_composite(*(sp + 1), *(sp + 1), a,
+ png_ptr->background.green);
+
+ png_composite(*(sp + 2), *(sp + 2), a,
+ png_ptr->background.blue);
+ }
+ }
+ }
+ }
+ else /* if (row_info->bit_depth == 16) */
+ {
+#ifdef PNG_READ_GAMMA_SUPPORTED
+ if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
+ gamma_16_to_1 != NULL)
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 8)
+ {
+ png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
+ << 8) + (png_uint_16)(*(sp + 7)));
+
+ if (a == (png_uint_16)0xffff)
+ {
+ png_uint_16 v;
+
+ v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
+
+ v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(v & 0xff);
+
+ v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(v & 0xff);
+ }
+
+ else if (a == 0)
+ {
+ /* Background is already in screen gamma */
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
+ }
+
+ else
+ {
+ png_uint_16 v, w;
+
+ v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
+ png_composite_16(w, v, a, png_ptr->background_1.red);
+ if (optimize == 0)
+ w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
+ 8];
+ *sp = (png_byte)((w >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(w & 0xff);
+
+ v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
+ png_composite_16(w, v, a, png_ptr->background_1.green);
+ if (optimize == 0)
+ w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
+ 8];
+
+ *(sp + 2) = (png_byte)((w >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(w & 0xff);
+
+ v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
+ png_composite_16(w, v, a, png_ptr->background_1.blue);
+ if (optimize == 0)
+ w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
+ 8];
+
+ *(sp + 4) = (png_byte)((w >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(w & 0xff);
+ }
+ }
+ }
+
+ else
+#endif
+ {
+ sp = row;
+ for (i = 0; i < row_width; i++, sp += 8)
+ {
+ png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
+ << 8) + (png_uint_16)(*(sp + 7)));
+
+ if (a == 0)
+ {
+ *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
+ *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
+ & 0xff);
+ *(sp + 3) = (png_byte)(png_ptr->background.green
+ & 0xff);
+ *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
+ & 0xff);
+ *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
+ }
+
+ else if (a < 0xffff)
+ {
+ png_uint_16 v;
+
+ png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
+ png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
+ + *(sp + 3));
+ png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
+ + *(sp + 5));
+
+ png_composite_16(v, r, a, png_ptr->background.red);
+ *sp = (png_byte)((v >> 8) & 0xff);
+ *(sp + 1) = (png_byte)(v & 0xff);
+
+ png_composite_16(v, g, a, png_ptr->background.green);
+ *(sp + 2) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 3) = (png_byte)(v & 0xff);
+
+ png_composite_16(v, b, a, png_ptr->background.blue);
+ *(sp + 4) = (png_byte)((v >> 8) & 0xff);
+ *(sp + 5) = (png_byte)(v & 0xff);
+ }
+ }
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
}
}
#endif /* READ_BACKGROUND || READ_ALPHA_MODE */
@@ -4245,8 +4245,8 @@
{
case 1:
{
- sp = row + (png_size_t)((row_width - 1) >> 3);
- dp = row + (png_size_t)row_width - 1;
+ sp = row + (size_t)((row_width - 1) >> 3);
+ dp = row + (size_t)row_width - 1;
shift = 7 - (int)((row_width + 7) & 0x07);
for (i = 0; i < row_width; i++)
{
@@ -4272,8 +4272,8 @@
case 2:
{
- sp = row + (png_size_t)((row_width - 1) >> 2);
- dp = row + (png_size_t)row_width - 1;
+ sp = row + (size_t)((row_width - 1) >> 2);
+ dp = row + (size_t)row_width - 1;
shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
for (i = 0; i < row_width; i++)
{
@@ -4295,8 +4295,8 @@
case 4:
{
- sp = row + (png_size_t)((row_width - 1) >> 1);
- dp = row + (png_size_t)row_width - 1;
+ sp = row + (size_t)((row_width - 1) >> 1);
+ dp = row + (size_t)row_width - 1;
shift = (int)((row_width & 0x01) << 2);
for (i = 0; i < row_width; i++)
{
@@ -4329,8 +4329,8 @@
{
if (num_trans > 0)
{
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width << 2) - 1;
+ sp = row + (size_t)row_width - 1;
+ dp = row + ((size_t)row_width << 2) - 1;
for (i = 0; i < row_width; i++)
{
@@ -4354,8 +4354,8 @@
else
{
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width * 3) - 1;
+ sp = row + (size_t)row_width - 1;
+ dp = row + (size_t)(row_width * 3) - 1;
for (i = 0; i < row_width; i++)
{
@@ -4390,195 +4390,130 @@
png_debug(1, "in png_do_expand");
+ if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
- if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
+ unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
+
+ if (row_info->bit_depth < 8)
{
- unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
-
- if (row_info->bit_depth < 8)
+ switch (row_info->bit_depth)
{
- switch (row_info->bit_depth)
+ case 1:
{
- case 1:
- {
- gray = (gray & 0x01) * 0xff;
- sp = row + (png_size_t)((row_width - 1) >> 3);
- dp = row + (png_size_t)row_width - 1;
- shift = 7 - (int)((row_width + 7) & 0x07);
- for (i = 0; i < row_width; i++)
- {
- if ((*sp >> shift) & 0x01)
- *dp = 0xff;
-
- else
- *dp = 0;
-
- if (shift == 7)
- {
- shift = 0;
- sp--;
- }
-
- else
- shift++;
-
- dp--;
- }
- break;
- }
-
- case 2:
- {
- gray = (gray & 0x03) * 0x55;
- sp = row + (png_size_t)((row_width - 1) >> 2);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x03;
- *dp = (png_byte)(value | (value << 2) | (value << 4) |
- (value << 6));
- if (shift == 6)
- {
- shift = 0;
- sp--;
- }
-
- else
- shift += 2;
-
- dp--;
- }
- break;
- }
-
- case 4:
- {
- gray = (gray & 0x0f) * 0x11;
- sp = row + (png_size_t)((row_width - 1) >> 1);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x0f;
- *dp = (png_byte)(value | (value << 4));
- if (shift == 4)
- {
- shift = 0;
- sp--;
- }
-
- else
- shift = 4;
-
- dp--;
- }
- break;
- }
-
- default:
- break;
- }
-
- row_info->bit_depth = 8;
- row_info->pixel_depth = 8;
- row_info->rowbytes = row_width;
- }
-
- if (trans_color != NULL)
- {
- if (row_info->bit_depth == 8)
- {
- gray = gray & 0xff;
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width << 1) - 1;
-
+ gray = (gray & 0x01) * 0xff;
+ sp = row + (size_t)((row_width - 1) >> 3);
+ dp = row + (size_t)row_width - 1;
+ shift = 7 - (int)((row_width + 7) & 0x07);
for (i = 0; i < row_width; i++)
{
- if ((*sp & 0xffU) == gray)
- *dp-- = 0;
+ if ((*sp >> shift) & 0x01)
+ *dp = 0xff;
else
- *dp-- = 0xff;
+ *dp = 0;
- *dp-- = *sp--;
- }
- }
-
- else if (row_info->bit_depth == 16)
- {
- unsigned int gray_high = (gray >> 8) & 0xff;
- unsigned int gray_low = gray & 0xff;
- sp = row + row_info->rowbytes - 1;
- dp = row + (row_info->rowbytes << 1) - 1;
- for (i = 0; i < row_width; i++)
- {
- if ((*(sp - 1) & 0xffU) == gray_high &&
- (*(sp) & 0xffU) == gray_low)
+ if (shift == 7)
{
- *dp-- = 0;
- *dp-- = 0;
+ shift = 0;
+ sp--;
}
else
- {
- *dp-- = 0xff;
- *dp-- = 0xff;
- }
+ shift++;
- *dp-- = *sp--;
- *dp-- = *sp--;
+ dp--;
}
+ break;
}
- row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
- row_info->channels = 2;
- row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
- row_width);
+ case 2:
+ {
+ gray = (gray & 0x03) * 0x55;
+ sp = row + (size_t)((row_width - 1) >> 2);
+ dp = row + (size_t)row_width - 1;
+ shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
+ for (i = 0; i < row_width; i++)
+ {
+ value = (*sp >> shift) & 0x03;
+ *dp = (png_byte)(value | (value << 2) | (value << 4) |
+ (value << 6));
+ if (shift == 6)
+ {
+ shift = 0;
+ sp--;
+ }
+
+ else
+ shift += 2;
+
+ dp--;
+ }
+ break;
+ }
+
+ case 4:
+ {
+ gray = (gray & 0x0f) * 0x11;
+ sp = row + (size_t)((row_width - 1) >> 1);
+ dp = row + (size_t)row_width - 1;
+ shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
+ for (i = 0; i < row_width; i++)
+ {
+ value = (*sp >> shift) & 0x0f;
+ *dp = (png_byte)(value | (value << 4));
+ if (shift == 4)
+ {
+ shift = 0;
+ sp--;
+ }
+
+ else
+ shift = 4;
+
+ dp--;
+ }
+ break;
+ }
+
+ default:
+ break;
}
+
+ row_info->bit_depth = 8;
+ row_info->pixel_depth = 8;
+ row_info->rowbytes = row_width;
}
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
- trans_color != NULL)
+
+ if (trans_color != NULL)
{
if (row_info->bit_depth == 8)
{
- png_byte red = (png_byte)(trans_color->red & 0xff);
- png_byte green = (png_byte)(trans_color->green & 0xff);
- png_byte blue = (png_byte)(trans_color->blue & 0xff);
- sp = row + (png_size_t)row_info->rowbytes - 1;
- dp = row + (png_size_t)(row_width << 2) - 1;
+ gray = gray & 0xff;
+ sp = row + (size_t)row_width - 1;
+ dp = row + ((size_t)row_width << 1) - 1;
+
for (i = 0; i < row_width; i++)
{
- if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)
+ if ((*sp & 0xffU) == gray)
*dp-- = 0;
else
*dp-- = 0xff;
*dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
}
}
+
else if (row_info->bit_depth == 16)
{
- png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
- png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
- png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
- png_byte red_low = (png_byte)(trans_color->red & 0xff);
- png_byte green_low = (png_byte)(trans_color->green & 0xff);
- png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
+ unsigned int gray_high = (gray >> 8) & 0xff;
+ unsigned int gray_low = gray & 0xff;
sp = row + row_info->rowbytes - 1;
- dp = row + (png_size_t)(row_width << 3) - 1;
+ dp = row + (row_info->rowbytes << 1) - 1;
for (i = 0; i < row_width; i++)
{
- if (*(sp - 5) == red_high &&
- *(sp - 4) == red_low &&
- *(sp - 3) == green_high &&
- *(sp - 2) == green_low &&
- *(sp - 1) == blue_high &&
- *(sp ) == blue_low)
+ if ((*(sp - 1) & 0xffU) == gray_high &&
+ (*(sp) & 0xffU) == gray_low)
{
*dp-- = 0;
*dp-- = 0;
@@ -4592,18 +4527,81 @@
*dp-- = *sp--;
*dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
}
}
- row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
- row_info->channels = 4;
- row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
- row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
+
+ row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
+ row_info->channels = 2;
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
+ row_width);
}
}
+ else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
+ trans_color != NULL)
+ {
+ if (row_info->bit_depth == 8)
+ {
+ png_byte red = (png_byte)(trans_color->red & 0xff);
+ png_byte green = (png_byte)(trans_color->green & 0xff);
+ png_byte blue = (png_byte)(trans_color->blue & 0xff);
+ sp = row + (size_t)row_info->rowbytes - 1;
+ dp = row + ((size_t)row_width << 2) - 1;
+ for (i = 0; i < row_width; i++)
+ {
+ if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)
+ *dp-- = 0;
+
+ else
+ *dp-- = 0xff;
+
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ }
+ }
+ else if (row_info->bit_depth == 16)
+ {
+ png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
+ png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
+ png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
+ png_byte red_low = (png_byte)(trans_color->red & 0xff);
+ png_byte green_low = (png_byte)(trans_color->green & 0xff);
+ png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
+ sp = row + row_info->rowbytes - 1;
+ dp = row + ((size_t)row_width << 3) - 1;
+ for (i = 0; i < row_width; i++)
+ {
+ if (*(sp - 5) == red_high &&
+ *(sp - 4) == red_low &&
+ *(sp - 3) == green_high &&
+ *(sp - 2) == green_low &&
+ *(sp - 1) == blue_high &&
+ *(sp ) == blue_low)
+ {
+ *dp-- = 0;
+ *dp-- = 0;
+ }
+
+ else
+ {
+ *dp-- = 0xff;
+ *dp-- = 0xff;
+ }
+
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ *dp-- = *sp--;
+ }
+ }
+ row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+ row_info->channels = 4;
+ row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
+ row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
+ }
}
#endif
@@ -4629,7 +4627,9 @@
png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */
png_byte *dp = sp + row_info->rowbytes; /* destination, end + 1 */
while (dp > sp)
- dp[-2] = dp[-1] = *--sp, dp -= 2;
+ {
+ dp[-2] = dp[-1] = *--sp; dp -= 2;
+ }
row_info->rowbytes *= 2;
row_info->bit_depth = 16;
@@ -4783,8 +4783,7 @@
&(png_ptr->trans_color));
else
- png_do_expand(row_info, png_ptr->row_buf + 1,
- NULL);
+ png_do_expand(row_info, png_ptr->row_buf + 1, NULL);
}
}
#endif
@@ -5008,7 +5007,7 @@
(png_ptr, /* png_ptr */
row_info, /* row_info: */
/* png_uint_32 width; width of row */
- /* png_size_t rowbytes; number of bytes in row */
+ /* size_t rowbytes; number of bytes in row */
/* png_byte color_type; color type of pixels */
/* png_byte bit_depth; bit depth of samples */
/* png_byte channels; number of channels (1-4) */
diff --git a/jdk/src/share/native/sun/awt/libpng/pngrutil.c b/jdk/src/share/native/sun/awt/libpng/pngrutil.c
index 59f5fde..bf316ef 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngrutil.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngrutil.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.27 [January 5, 2017]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -130,7 +130,7 @@
png_uint_16 (PNGAPI
png_get_uint_16)(png_const_bytep buf)
{
- /* ANSI-C requires an int value to accomodate at least 16 bits so this
+ /* ANSI-C requires an int value to accommodate at least 16 bits so this
* works and allows the compiler not to worry about possible narrowing
* on 32-bit systems. (Pre-ANSI systems did not make integers smaller
* than 16 bits either.)
@@ -148,7 +148,7 @@
void /* PRIVATE */
png_read_sig(png_structrp png_ptr, png_inforp info_ptr)
{
- png_size_t num_checked, num_to_check;
+ size_t num_checked, num_to_check;
/* Exit if the user application does not expect a signature. */
if (png_ptr->sig_bytes >= 8)
@@ -209,6 +209,9 @@
/* Check to see if chunk name is valid. */
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
+ /* Check for too-large chunk length */
+ png_check_chunk_length(png_ptr, length);
+
#ifdef PNG_IO_STATE_SUPPORTED
png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA;
#endif
@@ -339,6 +342,7 @@
if (buffer != NULL)
{
+ memset(buffer, 0, new_size); /* just in case */
png_ptr->read_buffer = buffer;
png_ptr->read_buffer_size = new_size;
}
@@ -446,7 +450,7 @@
png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED;
}
-#if ZLIB_VERNUM >= 0x1281 && \
+#if ZLIB_VERNUM >= 0x1290 && \
defined(PNG_SET_OPTION_SUPPORTED) && defined(PNG_IGNORE_ADLER32)
if (((png_ptr->options >> PNG_IGNORE_ADLER32) & 3) == PNG_OPTION_ON)
/* Turn off validation of the ADLER32 checksum in IDAT chunks */
@@ -698,6 +702,8 @@
if (text != NULL)
{
+ memset(text, 0, buffer_size);
+
ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/,
png_ptr->read_buffer + prefix_size, &lzsize,
text + prefix_size, newlength);
@@ -761,9 +767,7 @@
{
/* inflateReset failed, store the error message */
png_zstream_error(png_ptr, ret);
-
- if (ret == Z_STREAM_END)
- ret = PNG_UNEXPECTED_ZLIB_RETURN;
+ ret = PNG_UNEXPECTED_ZLIB_RETURN;
}
}
@@ -1405,11 +1409,13 @@
* chunk is just ignored, so does not invalidate the color space. An
* alternative is to set the 'invalid' flags at the start of this routine
* and only clear them in they were not set before and all the tests pass.
- * The minimum 'deflate' stream is assumed to be just the 2 byte header and
- * 4 byte checksum. The keyword must be at least one character and there is
- * a terminator (0) byte and the compression method.
*/
- if (length < 9)
+
+ /* The keyword must be at least one character and there is a
+ * terminator (0) byte and the compression method byte, and the
+ * 'zlib' datastream is at least 11 bytes.
+ */
+ if (length < 14)
{
png_crc_finish(png_ptr, length);
png_chunk_benign_error(png_ptr, "too short");
@@ -1441,6 +1447,16 @@
png_crc_read(png_ptr, (png_bytep)keyword, read_length);
length -= read_length;
+ /* The minimum 'zlib' stream is assumed to be just the 2 byte header,
+ * 5 bytes minimum 'deflate' stream, and the 4 byte checksum.
+ */
+ if (length < 11)
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "too short");
+ return;
+ }
+
keyword_length = 0;
while (keyword_length < 80 && keyword_length < read_length &&
keyword[keyword_length] != 0)
@@ -1459,7 +1475,7 @@
if (png_inflate_claim(png_ptr, png_iCCP) == Z_OK)
{
- Byte profile_header[132];
+ Byte profile_header[132]={0};
Byte local_buffer[PNG_INFLATE_BUF_SIZE];
png_alloc_size_t size = (sizeof profile_header);
@@ -1489,7 +1505,7 @@
/* Now read the tag table; a variable size buffer is
* needed at this point, allocate one for the whole
* profile. The header check has already validated
- * that none of these stuff will overflow.
+ * that none of this stuff will overflow.
*/
const png_uint_32 tag_count = png_get_uint_32(
profile_header+128);
@@ -1596,19 +1612,11 @@
return;
}
}
-
- else if (size > 0)
- errmsg = "truncated";
-
-#ifndef __COVERITY__
- else
+ if (errmsg == NULL)
errmsg = png_ptr->zstream.msg;
-#endif
}
-
/* else png_icc_check_tag_table output an error */
}
-
else /* profile truncated */
errmsg = png_ptr->zstream.msg;
}
@@ -1668,7 +1676,7 @@
int entry_size, i;
png_uint_32 skip = 0;
png_uint_32 dl;
- png_size_t max_dl;
+ size_t max_dl;
png_debug(1, "in png_handle_sPLT");
@@ -2017,6 +2025,15 @@
else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) == 0) /* GRAY */
{
+ if (png_ptr->bit_depth <= 8)
+ {
+ if (buf[0] != 0 || buf[1] >= (unsigned int)(1 << png_ptr->bit_depth))
+ {
+ png_chunk_benign_error(png_ptr, "invalid gray level");
+ return;
+ }
+ }
+
background.index = 0;
background.red =
background.green =
@@ -2026,6 +2043,15 @@
else
{
+ if (png_ptr->bit_depth <= 8)
+ {
+ if (buf[0] != 0 || buf[2] != 0 || buf[4] != 0)
+ {
+ png_chunk_benign_error(png_ptr, "invalid color");
+ return;
+ }
+ }
+
background.index = 0;
background.red = png_get_uint_16(buf);
background.green = png_get_uint_16(buf + 2);
@@ -2037,6 +2063,69 @@
}
#endif
+#ifdef PNG_READ_eXIf_SUPPORTED
+void /* PRIVATE */
+png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
+{
+ unsigned int i;
+
+ png_debug(1, "in png_handle_eXIf");
+
+ if ((png_ptr->mode & PNG_HAVE_IHDR) == 0)
+ png_chunk_error(png_ptr, "missing IHDR");
+
+ if (length < 2)
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "too short");
+ return;
+ }
+
+ else if (info_ptr == NULL || (info_ptr->valid & PNG_INFO_eXIf) != 0)
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "duplicate");
+ return;
+ }
+
+ info_ptr->free_me |= PNG_FREE_EXIF;
+
+ info_ptr->eXIf_buf = png_voidcast(png_bytep,
+ png_malloc_warn(png_ptr, length));
+
+ if (info_ptr->eXIf_buf == NULL)
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "out of memory");
+ return;
+ }
+
+ for (i = 0; i < length; i++)
+ {
+ png_byte buf[1];
+ png_crc_read(png_ptr, buf, 1);
+ info_ptr->eXIf_buf[i] = buf[0];
+ if (i == 1 && buf[0] != 'M' && buf[0] != 'I'
+ && info_ptr->eXIf_buf[0] != buf[0])
+ {
+ png_crc_finish(png_ptr, length);
+ png_chunk_benign_error(png_ptr, "incorrect byte-order specifier");
+ png_free(png_ptr, info_ptr->eXIf_buf);
+ info_ptr->eXIf_buf = NULL;
+ return;
+ }
+ }
+
+ if (png_crc_finish(png_ptr, 0) != 0)
+ return;
+
+ png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf);
+
+ png_free(png_ptr, info_ptr->eXIf_buf);
+ info_ptr->eXIf_buf = NULL;
+}
+#endif
+
#ifdef PNG_READ_hIST_SUPPORTED
void /* PRIVATE */
png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
@@ -2316,7 +2405,7 @@
png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
{
png_bytep buffer;
- png_size_t i;
+ size_t i;
int state;
png_debug(1, "in png_handle_sCAL");
@@ -2386,7 +2475,7 @@
else
{
- png_size_t heighti = i;
+ size_t heighti = i;
state = 0;
if (png_check_fp_number((png_const_charp)buffer, length,
@@ -2565,6 +2654,9 @@
if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
png_ptr->mode |= PNG_AFTER_IDAT;
+ /* Note, "length" is sufficient here; we won't be adding
+ * a null terminator later.
+ */
buffer = png_read_buffer(png_ptr, length, 2/*silent*/);
if (buffer == NULL)
@@ -2611,23 +2703,28 @@
{
png_text text;
- /* It worked; png_ptr->read_buffer now looks like a tEXt chunk except
- * for the extra compression type byte and the fact that it isn't
- * necessarily '\0' terminated.
- */
- buffer = png_ptr->read_buffer;
- buffer[uncompressed_length+(keyword_length+2)] = 0;
+ if (png_ptr->read_buffer == NULL)
+ errmsg="Read failure in png_handle_zTXt";
+ else
+ {
+ /* It worked; png_ptr->read_buffer now looks like a tEXt chunk
+ * except for the extra compression type byte and the fact that
+ * it isn't necessarily '\0' terminated.
+ */
+ buffer = png_ptr->read_buffer;
+ buffer[uncompressed_length+(keyword_length+2)] = 0;
- text.compression = PNG_TEXT_COMPRESSION_zTXt;
- text.key = (png_charp)buffer;
- text.text = (png_charp)(buffer + keyword_length+2);
- text.text_length = uncompressed_length;
- text.itxt_length = 0;
- text.lang = NULL;
- text.lang_key = NULL;
+ text.compression = PNG_TEXT_COMPRESSION_zTXt;
+ text.key = (png_charp)buffer;
+ text.text = (png_charp)(buffer + keyword_length+2);
+ text.text_length = uncompressed_length;
+ text.itxt_length = 0;
+ text.lang = NULL;
+ text.lang_key = NULL;
- if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
- errmsg = "insufficient memory";
+ if (png_set_text_2(png_ptr, info_ptr, &text, 1) != 0)
+ errmsg = "insufficient memory";
+ }
}
else
@@ -2816,7 +2913,7 @@
{
PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name);
/* The following is safe because of the PNG_SIZE_MAX init above */
- png_ptr->unknown_chunk.size = (png_size_t)length/*SAFE*/;
+ png_ptr->unknown_chunk.size = (size_t)length/*SAFE*/;
/* 'mode' is a flag array, only the bottom four bits matter here */
png_ptr->unknown_chunk.location = (png_byte)png_ptr->mode/*SAFE*/;
@@ -3003,7 +3100,7 @@
case 2:
png_ptr->user_chunk_cache_max = 1;
png_chunk_benign_error(png_ptr, "no space in chunk cache");
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case 1:
/* NOTE: prior to 1.6.0 this case resulted in an unknown critical
* chunk being skipped, now there will be a hard error below.
@@ -3012,7 +3109,7 @@
default: /* not at limit */
--(png_ptr->user_chunk_cache_max);
- /* FALL THROUGH */
+ /* FALLTHROUGH */
case 0: /* no limit */
# endif /* USER_LIMITS */
/* Here when the limit isn't reached or when limits are compiled
@@ -3063,20 +3160,61 @@
*/
void /* PRIVATE */
-png_check_chunk_name(png_structrp png_ptr, png_uint_32 chunk_name)
+png_check_chunk_name(png_const_structrp png_ptr, const png_uint_32 chunk_name)
{
int i;
+ png_uint_32 cn=chunk_name;
png_debug(1, "in png_check_chunk_name");
for (i=1; i<=4; ++i)
{
- int c = chunk_name & 0xff;
+ int c = cn & 0xff;
if (c < 65 || c > 122 || (c > 90 && c < 97))
png_chunk_error(png_ptr, "invalid chunk type");
- chunk_name >>= 8;
+ cn >>= 8;
+ }
+}
+
+void /* PRIVATE */
+png_check_chunk_length(png_const_structrp png_ptr, const png_uint_32 length)
+{
+ png_alloc_size_t limit = PNG_UINT_31_MAX;
+
+# ifdef PNG_SET_USER_LIMITS_SUPPORTED
+ if (png_ptr->user_chunk_malloc_max > 0 &&
+ png_ptr->user_chunk_malloc_max < limit)
+ limit = png_ptr->user_chunk_malloc_max;
+# elif PNG_USER_CHUNK_MALLOC_MAX > 0
+ if (PNG_USER_CHUNK_MALLOC_MAX < limit)
+ limit = PNG_USER_CHUNK_MALLOC_MAX;
+# endif
+ if (png_ptr->chunk_name == png_IDAT)
+ {
+ png_alloc_size_t idat_limit = PNG_UINT_31_MAX;
+ size_t row_factor =
+ (size_t)png_ptr->width
+ * (size_t)png_ptr->channels
+ * (png_ptr->bit_depth > 8? 2: 1)
+ + 1
+ + (png_ptr->interlaced? 6: 0);
+ if (png_ptr->height > PNG_UINT_32_MAX/row_factor)
+ idat_limit = PNG_UINT_31_MAX;
+ else
+ idat_limit = png_ptr->height * row_factor;
+ row_factor = row_factor > 32566? 32566 : row_factor;
+ idat_limit += 6 + 5*(idat_limit/row_factor+1); /* zlib+deflate overhead */
+ idat_limit=idat_limit < PNG_UINT_31_MAX? idat_limit : PNG_UINT_31_MAX;
+ limit = limit < idat_limit? idat_limit : limit;
+ }
+
+ if (length > limit)
+ {
+ png_debug2(0," length = %lu, limit = %lu",
+ (unsigned long)length,(unsigned long)limit);
+ png_chunk_error(png_ptr, "chunk data is too large");
}
}
@@ -3405,7 +3543,7 @@
*/
do
{
- dp[0] = sp[0], dp[1] = sp[1];
+ dp[0] = sp[0]; dp[1] = sp[1];
if (row_width <= bytes_to_jump)
return;
@@ -3426,7 +3564,7 @@
*/
for (;;)
{
- dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2];
+ dp[0] = sp[0]; dp[1] = sp[1]; dp[2] = sp[2];
if (row_width <= bytes_to_jump)
return;
@@ -3590,8 +3728,8 @@
{
case 1:
{
- png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3);
- png_bytep dp = row + (png_size_t)((final_width - 1) >> 3);
+ png_bytep sp = row + (size_t)((row_info->width - 1) >> 3);
+ png_bytep dp = row + (size_t)((final_width - 1) >> 3);
unsigned int sshift, dshift;
unsigned int s_start, s_end;
int s_inc;
@@ -3717,8 +3855,8 @@
case 4:
{
- png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1);
- png_bytep dp = row + (png_size_t)((final_width - 1) >> 1);
+ png_bytep sp = row + (size_t)((row_info->width - 1) >> 1);
+ png_bytep dp = row + (size_t)((final_width - 1) >> 1);
unsigned int sshift, dshift;
unsigned int s_start, s_end;
int s_inc;
@@ -3780,12 +3918,12 @@
default:
{
- png_size_t pixel_bytes = (row_info->pixel_depth >> 3);
+ size_t pixel_bytes = (row_info->pixel_depth >> 3);
- png_bytep sp = row + (png_size_t)(row_info->width - 1)
+ png_bytep sp = row + (size_t)(row_info->width - 1)
* pixel_bytes;
- png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;
+ png_bytep dp = row + (size_t)(final_width - 1) * pixel_bytes;
int jstop = (int)png_pass_inc[pass];
png_uint_32 i;
@@ -3822,8 +3960,8 @@
png_read_filter_row_sub(png_row_infop row_info, png_bytep row,
png_const_bytep prev_row)
{
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ size_t i;
+ size_t istop = row_info->rowbytes;
unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
png_bytep rp = row + bpp;
@@ -3840,8 +3978,8 @@
png_read_filter_row_up(png_row_infop row_info, png_bytep row,
png_const_bytep prev_row)
{
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ size_t i;
+ size_t istop = row_info->rowbytes;
png_bytep rp = row;
png_const_bytep pp = prev_row;
@@ -3856,11 +3994,11 @@
png_read_filter_row_avg(png_row_infop row_info, png_bytep row,
png_const_bytep prev_row)
{
- png_size_t i;
+ size_t i;
png_bytep rp = row;
png_const_bytep pp = prev_row;
unsigned int bpp = (row_info->pixel_depth + 7) >> 3;
- png_size_t istop = row_info->rowbytes - bpp;
+ size_t istop = row_info->rowbytes - bpp;
for (i = 0; i < bpp; i++)
{
@@ -3915,7 +4053,10 @@
/* Find the best predictor, the least of pa, pb, pc favoring the earlier
* ones in the case of a tie.
*/
- if (pb < pa) pa = pb, a = b;
+ if (pb < pa)
+ {
+ pa = pb; a = b;
+ }
if (pc < pa) a = c;
/* Calculate the current pixel in a, and move the previous row pixel to c
@@ -3967,7 +4108,10 @@
pc = (p + pc) < 0 ? -(p + pc) : p + pc;
#endif
- if (pb < pa) pa = pb, a = b;
+ if (pb < pa)
+ {
+ pa = pb; a = b;
+ }
if (pc < pa) a = c;
a += *row;
@@ -4290,7 +4434,7 @@
static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
unsigned int max_pixel_depth;
- png_size_t row_bytes;
+ size_t row_bytes;
png_debug(1, "in png_read_start_row");
diff --git a/jdk/src/share/native/sun/awt/libpng/pngset.c b/jdk/src/share/native/sun/awt/libpng/pngset.c
index 987fe87..6802034 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngset.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngset.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -162,6 +162,53 @@
#endif /* cHRM */
+#ifdef PNG_eXIf_SUPPORTED
+void PNGAPI
+png_set_eXIf(png_const_structrp png_ptr, png_inforp info_ptr,
+ const png_bytep eXIf_buf)
+{
+ png_warning(png_ptr, "png_set_eXIf does not work; use png_set_eXIf_1");
+ PNG_UNUSED(info_ptr)
+ PNG_UNUSED(eXIf_buf)
+}
+
+void PNGAPI
+png_set_eXIf_1(png_const_structrp png_ptr, png_inforp info_ptr,
+ const png_uint_32 num_exif, const png_bytep eXIf_buf)
+{
+ int i;
+
+ png_debug1(1, "in %s storage function", "eXIf");
+
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
+
+ if (info_ptr->exif)
+ {
+ png_free(png_ptr, info_ptr->exif);
+ info_ptr->exif = NULL;
+ }
+
+ info_ptr->num_exif = num_exif;
+
+ info_ptr->exif = png_voidcast(png_bytep, png_malloc_warn(png_ptr,
+ info_ptr->num_exif));
+
+ if (info_ptr->exif == NULL)
+ {
+ png_warning(png_ptr, "Insufficient memory for eXIf chunk data");
+ return;
+ }
+
+ info_ptr->free_me |= PNG_FREE_EXIF;
+
+ for (i = 0; i < (int) info_ptr->num_exif; i++)
+ info_ptr->exif[i] = eXIf_buf[i];
+
+ info_ptr->valid |= PNG_INFO_eXIf;
+}
+#endif /* eXIf */
+
#ifdef PNG_gAMA_SUPPORTED
void PNGFAPI
png_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr,
@@ -294,7 +341,7 @@
png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
int nparams, png_const_charp units, png_charpp params)
{
- png_size_t length;
+ size_t length;
int i;
png_debug1(1, "in %s storage function", "pCAL");
@@ -371,7 +418,7 @@
memcpy(info_ptr->pcal_units, units, length);
info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr,
- (png_size_t)(((unsigned int)nparams + 1) * (sizeof (png_charp)))));
+ (size_t)(((unsigned int)nparams + 1) * (sizeof (png_charp)))));
if (info_ptr->pcal_params == NULL)
{
@@ -411,7 +458,7 @@
png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr,
int unit, png_const_charp swidth, png_const_charp sheight)
{
- png_size_t lengthw = 0, lengthh = 0;
+ size_t lengthw = 0, lengthh = 0;
png_debug1(1, "in %s storage function", "sCAL");
@@ -672,7 +719,7 @@
{
png_charp new_iccp_name;
png_bytep new_iccp_profile;
- png_size_t length;
+ size_t length;
png_debug1(1, "in %s storage function", "iCCP");
@@ -999,7 +1046,7 @@
/* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
info_ptr->trans_alpha = png_voidcast(png_bytep,
png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
- memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
+ memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans);
}
png_ptr->trans_alpha = info_ptr->trans_alpha;
}
@@ -1079,7 +1126,7 @@
do
{
- png_size_t length;
+ size_t length;
/* Skip invalid input entries */
if (entries->name == NULL || entries->entries == NULL)
@@ -1130,8 +1177,9 @@
info_ptr->valid |= PNG_INFO_sPLT;
++(info_ptr->splt_palettes_num);
++np;
+ ++entries;
}
- while (++entries, --nentries);
+ while (--nentries);
if (nentries > 0)
png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR);
@@ -1382,6 +1430,7 @@
static PNG_CONST png_byte chunks_to_ignore[] = {
98, 75, 71, 68, '\0', /* bKGD */
99, 72, 82, 77, '\0', /* cHRM */
+ 101, 88, 73, 102, '\0', /* eXIf */
103, 65, 77, 65, '\0', /* gAMA */
104, 73, 83, 84, '\0', /* hIST */
105, 67, 67, 80, '\0', /* iCCP */
@@ -1542,7 +1591,7 @@
#endif
void PNGAPI
-png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size)
+png_set_compression_buffer_size(png_structrp png_ptr, size_t size)
{
if (png_ptr == NULL)
return;
@@ -1724,14 +1773,16 @@
png_byte ch = (png_byte)*key++;
if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
- *new_key++ = ch, ++key_len, space = 0;
+ {
+ *new_key++ = ch; ++key_len; space = 0;
+ }
else if (space == 0)
{
/* A space or an invalid character when one wasn't seen immediately
* before; output just a space.
*/
- *new_key++ = 32, ++key_len, space = 1;
+ *new_key++ = 32; ++key_len; space = 1;
/* If the character was not a space then it is invalid. */
if (ch != 32)
@@ -1744,7 +1795,7 @@
if (key_len > 0 && space != 0) /* trailing space */
{
- --key_len, --new_key;
+ --key_len; --new_key;
if (bad_character == 0)
bad_character = 32;
}
diff --git a/jdk/src/share/native/sun/awt/libpng/pngstruct.h b/jdk/src/share/native/sun/awt/libpng/pngstruct.h
index 9631fde..62f12690 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngstruct.h
+++ b/jdk/src/share/native/sun/awt/libpng/pngstruct.h
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.28 [January 5, 2017]
- * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -75,7 +75,7 @@
/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib
* can handle at once. This type need be no larger than 16 bits (so maximum of
* 65535), this define allows us to discover how big it is, but limited by the
- * maximuum for png_size_t. The value can be overriden in a library build
+ * maximum for size_t. The value can be overridden in a library build
* (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably
* lower value (e.g. 255 works). A lower value may help memory usage (slightly)
* and may even improve performance on some systems (and degrade it on others.)
@@ -242,7 +242,7 @@
png_uint_32 height; /* height of image in pixels */
png_uint_32 num_rows; /* number of rows in current pass */
png_uint_32 usr_width; /* width of row at start of write */
- png_size_t rowbytes; /* size of row in bytes */
+ size_t rowbytes; /* size of row in bytes */
png_uint_32 iwidth; /* width of current interlaced row in pixels */
png_uint_32 row_number; /* current row in interlace pass */
png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */
@@ -260,7 +260,7 @@
png_bytep try_row; /* buffer to save trial row when filtering */
png_bytep tst_row; /* buffer to save best trial row when filtering */
#endif
- png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
+ size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */
png_uint_32 idat_size; /* current IDAT size for read */
png_uint_32 crc; /* current chunk CRC value */
@@ -335,7 +335,7 @@
#endif
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
- png_color_8 shift; /* shift for significant bit tranformation */
+ png_color_8 shift; /* shift for significant bit transformation */
#endif
#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \
@@ -356,10 +356,10 @@
png_bytep current_buffer; /* buffer for recently used data */
png_uint_32 push_length; /* size of current input chunk */
png_uint_32 skip_length; /* bytes to skip in input data */
- png_size_t save_buffer_size; /* amount of data now in save_buffer */
- png_size_t save_buffer_max; /* total size of save_buffer */
- png_size_t buffer_size; /* total amount of available input data */
- png_size_t current_buffer_size; /* amount of data now in current_buffer */
+ size_t save_buffer_size; /* amount of data now in save_buffer */
+ size_t save_buffer_max; /* total size of save_buffer */
+ size_t buffer_size; /* total amount of available input data */
+ size_t current_buffer_size; /* amount of data now in current_buffer */
int process_mode; /* what push library is currently doing */
int cur_palette; /* current push library palette index */
@@ -479,7 +479,7 @@
#endif
/* New member added in libpng-1.2.26 */
- png_size_t old_big_row_buf_size;
+ size_t old_big_row_buf_size;
#ifdef PNG_READ_SUPPORTED
/* New member added in libpng-1.2.30 */
diff --git a/jdk/src/share/native/sun/awt/libpng/pngtrans.c b/jdk/src/share/native/sun/awt/libpng/pngtrans.c
index af8ef1f..2da23c8 100644
--- a/jdk/src/share/native/sun/awt/libpng/pngtrans.c
+++ b/jdk/src/share/native/sun/awt/libpng/pngtrans.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.26 [October 20, 2016]
- * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.35 [July 15, 2018]
+ * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -297,8 +297,8 @@
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
png_bytep rp = row;
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ size_t i;
+ size_t istop = row_info->rowbytes;
for (i = 0; i < istop; i++)
{
@@ -311,8 +311,8 @@
row_info->bit_depth == 8)
{
png_bytep rp = row;
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ size_t i;
+ size_t istop = row_info->rowbytes;
for (i = 0; i < istop; i += 2)
{
@@ -326,8 +326,8 @@
row_info->bit_depth == 16)
{
png_bytep rp = row;
- png_size_t i;
- png_size_t istop = row_info->rowbytes;
+ size_t i;
+ size_t istop = row_info->rowbytes;
for (i = 0; i < istop; i += 4)
{
@@ -542,11 +542,15 @@
if (at_start != 0) /* Skip initial filler */
++sp;
else /* Skip initial channel and, for sp, the filler */
- sp += 2, ++dp;
+ {
+ sp += 2; ++dp;
+ }
/* For a 1 pixel wide image there is nothing to do */
while (sp < ep)
- *dp++ = *sp, sp += 2;
+ {
+ *dp++ = *sp; sp += 2;
+ }
row_info->pixel_depth = 8;
}
@@ -556,10 +560,14 @@
if (at_start != 0) /* Skip initial filler */
sp += 2;
else /* Skip initial channel and, for sp, the filler */
- sp += 4, dp += 2;
+ {
+ sp += 4; dp += 2;
+ }
while (sp < ep)
- *dp++ = *sp++, *dp++ = *sp, sp += 3;
+ {
+ *dp++ = *sp++; *dp++ = *sp; sp += 3;
+ }
row_info->pixel_depth = 16;
}
@@ -582,11 +590,15 @@
if (at_start != 0) /* Skip initial filler */
++sp;
else /* Skip initial channels and, for sp, the filler */
- sp += 4, dp += 3;
+ {
+ sp += 4; dp += 3;
+ }
/* Note that the loop adds 3 to dp and 4 to sp each time. */
while (sp < ep)
- *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
+ {
+ *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp; sp += 2;
+ }
row_info->pixel_depth = 24;
}
@@ -596,14 +608,16 @@
if (at_start != 0) /* Skip initial filler */
sp += 2;
else /* Skip initial channels and, for sp, the filler */
- sp += 8, dp += 6;
+ {
+ sp += 8; dp += 6;
+ }
while (sp < ep)
{
/* Copy 6 bytes, skip 2 */
- *dp++ = *sp++, *dp++ = *sp++;
- *dp++ = *sp++, *dp++ = *sp++;
- *dp++ = *sp++, *dp++ = *sp, sp += 3;
+ *dp++ = *sp++; *dp++ = *sp++;
+ *dp++ = *sp++; *dp++ = *sp++;
+ *dp++ = *sp++; *dp++ = *sp; sp += 3;
}
row_info->pixel_depth = 48;
@@ -623,7 +637,7 @@
return; /* The filler channel has gone already */
/* Fix the rowbytes value. */
- row_info->rowbytes = (unsigned int)(dp-row);
+ row_info->rowbytes = (size_t)(dp-row);
}
#endif
@@ -722,7 +736,7 @@
* forms produced on either GCC or MSVC.
*/
int padding = PNG_PADBITS(row_info->pixel_depth, row_info->width);
- png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
+ png_bytep rp = png_ptr->row_buf + row_info->rowbytes - 1;
switch (row_info->bit_depth)
{
diff --git a/jdk/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java b/jdk/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java
index 3b88948..d0b4531 100644
--- a/jdk/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java
+++ b/jdk/src/solaris/classes/sun/nio/ch/FileDispatcherImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -80,6 +80,10 @@
return truncate0(fd, size);
}
+ int allocate(FileDescriptor fd, long size) throws IOException {
+ return allocate0(fd, size);
+ }
+
long size(FileDescriptor fd) throws IOException {
return size0(fd);
}
@@ -142,6 +146,9 @@
static native int truncate0(FileDescriptor fd, long size)
throws IOException;
+ static native int allocate0(FileDescriptor fd, long size)
+ throws IOException;
+
static native long size0(FileDescriptor fd) throws IOException;
static native int lock0(FileDescriptor fd, boolean blocking, long pos,
diff --git a/jdk/src/solaris/native/java/io/io_util_md.c b/jdk/src/solaris/native/java/io/io_util_md.c
index f8fdc46..6a85a0f 100644
--- a/jdk/src/solaris/native/java/io/io_util_md.c
+++ b/jdk/src/solaris/native/java/io/io_util_md.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,10 @@
* questions.
*/
+#if defined(__linux__)
+#define _FILE_OFFSET_BITS 64
+#endif
+
#include "jni.h"
#include "jni_util.h"
#include "jvm.h"
@@ -208,6 +212,25 @@
handleSetLength(FD fd, jlong length)
{
int result;
+#if defined(__linux__)
+ /*
+ * On Linux, if the file size is being increased, then ftruncate64()
+ * will modify the metadata value of the size without actually allocating
+ * any blocks which can cause a SIGBUS error if the file is subsequently
+ * memory-mapped.
+ */
+ struct stat64 sb;
+
+ if (fstat64(fd, &sb) == 0 && length > sb.st_blocks*512) {
+ RESTARTABLE(posix_fallocate(fd, 0, length), result);
+ // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS
+ if (result == 0) {
+ return 0;
+ } else if (errno != EOPNOTSUPP && errno != ENOSYS) {
+ return result;
+ }
+ }
+#endif
RESTARTABLE(ftruncate64(fd, length), result);
return result;
}
diff --git a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c
index ec4f97d..426a2b2 100644
--- a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c
+++ b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -236,7 +236,11 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)(iterator->ai_addr))->sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
setInetAddress_hostName(env, iaObj, name);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, retLen - i -1, iaObj);
i++;
iterator = iterator->ai_next;
@@ -479,7 +483,11 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, i++, iaObj);
iterator = iterator->ai_next;
}
diff --git a/jdk/src/solaris/native/java/net/Inet6AddressImpl.c b/jdk/src/solaris/native/java/net/Inet6AddressImpl.c
index e29a25d..46b2e5c 100644
--- a/jdk/src/solaris/native/java/net/Inet6AddressImpl.c
+++ b/jdk/src/solaris/native/java/net/Inet6AddressImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -221,6 +221,8 @@
return NULL;
}
setInetAddress_hostName(env, o, name);
+ if ((*env)->ExceptionCheck(env))
+ goto done;
(*env)->SetObjectArrayElement(env, result, index, o);
(*env)->DeleteLocalRef(env, o);
}
@@ -411,7 +413,11 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
inetIndex++;
} else if (iterator->ai_family == AF_INET6) {
@@ -433,6 +439,8 @@
setInet6Address_scopeid(env, iaObj, scope);
}
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
inet6Index++;
}
diff --git a/jdk/src/solaris/native/java/net/NetworkInterface.c b/jdk/src/solaris/native/java/net/NetworkInterface.c
index 9db36ae..f71da7b 100644
--- a/jdk/src/solaris/native/java/net/NetworkInterface.c
+++ b/jdk/src/solaris/native/java/net/NetworkInterface.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -332,14 +332,22 @@
(JNIEnv *env, jclass cls, jobject iaObj)
{
netif *ifs, *curr;
-#if defined(AF_INET6)
- int family = (getInetAddress_family(env, iaObj) == IPv4) ? AF_INET : AF_INET6;
-#else
- int family = AF_INET;
-#endif
jobject obj = NULL;
jboolean match = JNI_FALSE;
+#if defined(AF_INET6)
+ int family = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
+ if (family == IPv4) {
+ family = AF_INET;
+ } else if (family == IPv6) {
+ family = AF_INET6;
+ } else {
+ return NULL; // Invalid family
+ }
+#else
+ int family = AF_INET;
+#endif
ifs = enumInterfaces(env);
if (ifs == NULL) {
return NULL;
@@ -357,7 +365,9 @@
int address1 = htonl(
((struct sockaddr_in *)addrP->addr)->sin_addr.s_addr);
int address2 = getInetAddress_addr(env, iaObj);
-
+ if ((*env)->ExceptionCheck(env)) {
+ goto cleanup;
+ }
if (address1 == address2) {
match = JNI_TRUE;
break;
@@ -402,6 +412,7 @@
obj = createNetworkInterface(env, curr);
}
+cleanup:
// release the interface list
freeif(ifs);
@@ -703,6 +714,7 @@
if (iaObj) {
setInetAddress_addr(env, iaObj, htonl(
((struct sockaddr_in*)addrP->addr)->sin_addr.s_addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
} else {
return NULL;
}
@@ -715,6 +727,7 @@
if (ia2Obj) {
setInetAddress_addr(env, ia2Obj, htonl(
((struct sockaddr_in*)addrP->brdcast)->sin_addr.s_addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
(*env)->SetObjectField(env, ibObj, ni_ib4broadcastID, ia2Obj);
} else {
return NULL;
diff --git a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c
index c48d115..a53c289 100644
--- a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c
+++ b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -569,12 +569,15 @@
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&remote_addr, &port);
#ifdef AF_INET6
family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
#else
family = AF_INET;
#endif
if (family == AF_INET) { /* this API can't handle IPV6 addresses */
int address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
setInetAddress_addr(env, addressObj, address);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
}
return port;
}
@@ -1078,6 +1081,7 @@
struct in_addr in;
jobjectArray addrArray;
jsize len;
+ jint family;
jobject addr;
int i;
@@ -1107,8 +1111,12 @@
*/
for (i = 0; i < len; i++) {
addr = (*env)->GetObjectArrayElement(env, addrArray, i);
- if (getInetAddress_family(env, addr) == IPv4) {
+ family = getInetAddress_family(env, addr);
+ JNU_CHECK_EXCEPTION(env);
+ if (family == IPv4) {
+ JNU_CHECK_EXCEPTION(env);
in.s_addr = htonl(getInetAddress_addr(env, addr));
+ JNU_CHECK_EXCEPTION(env);
break;
}
}
@@ -1162,6 +1170,7 @@
in.s_addr = htonl( getInetAddress_addr(env, value) );
+ JNU_CHECK_EXCEPTION(env);
if (JVM_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
@@ -1528,6 +1537,7 @@
CHECK_NULL_RETURN(addr, NULL);
setInetAddress_addr(env, addr, ntohl(in.s_addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
/*
* For IP_MULTICAST_IF return InetAddress
@@ -1968,6 +1978,7 @@
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
jint fd;
+ jint family;
jint ipv6_join_leave;
if (IS_NULL(fdObj)) {
@@ -1989,7 +2000,10 @@
ipv6_join_leave = ipv6_available();
#ifdef __linux__
- if (getInetAddress_family(env, iaObj) == IPv4) {
+ family = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION(env);
+ if (family == IPv4) {
+ JNU_CHECK_EXCEPTION(env);
ipv6_join_leave = JNI_FALSE;
}
#endif
@@ -2037,6 +2051,7 @@
}
mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ JNU_CHECK_EXCEPTION(env);
mname.imr_address.s_addr = 0;
mname.imr_ifindex = (*env)->GetIntField(env, niObj, ni_indexID);
mname_len = sizeof(struct ip_mreqn);
@@ -2055,10 +2070,13 @@
addr = (*env)->GetObjectArrayElement(env, addrArray, 0);
mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ JNU_CHECK_EXCEPTION(env);
#ifdef __linux__
mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr));
+ JNU_CHECK_EXCEPTION(env);
#else
mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr));
+ JNU_CHECK_EXCEPTION(env);
#endif
mname_len = sizeof(struct ip_mreq);
}
@@ -2094,6 +2112,7 @@
}
mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ JNU_CHECK_EXCEPTION(env);
mname.imr_address.s_addr = 0 ;
mname.imr_ifindex = index;
mname_len = sizeof(struct ip_mreqn);
@@ -2116,6 +2135,7 @@
mname.imr_interface.s_addr = in.s_addr;
#endif
mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
+ JNU_CHECK_EXCEPTION(env);
mname_len = sizeof(struct ip_mreq);
}
}
@@ -2181,10 +2201,12 @@
jint family;
jint address;
family = getInetAddress_family(env, iaObj) == IPv4? AF_INET : AF_INET6;
+ JNU_CHECK_EXCEPTION(env);
if (family == AF_INET) { /* will convert to IPv4-mapped address */
memset((char *) caddr, 0, 16);
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION(env);
caddr[10] = 0xff;
caddr[11] = 0xff;
diff --git a/jdk/src/solaris/native/java/net/net_util_md.c b/jdk/src/solaris/native/java/net/net_util_md.c
index eae347c..7436d52 100644
--- a/jdk/src/solaris/native/java/net/net_util_md.c
+++ b/jdk/src/solaris/native/java/net/net_util_md.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -786,6 +786,7 @@
int *len, jboolean v4MappedAddress) {
jint family;
family = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
#ifdef AF_INET6
/* needs work. 1. family 2. clean up him6 etc deallocate memory */
if (ipv6_available() && !(family == IPv4 && v4MappedAddress == JNI_FALSE)) {
@@ -797,6 +798,7 @@
if (family == IPv4) { /* will convert to IPv4-mapped address */
memset((char *) caddr, 0, 16);
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
if (address == INADDR_ANY) {
/* we would always prefer IPv6 wildcard address
caddr[10] = 0xff;
@@ -905,6 +907,7 @@
}
memset((char *) him4, 0, sizeof(struct sockaddr_in));
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
him4->sin_port = htons((short) port);
him4->sin_addr.s_addr = (uint32_t) htonl(address);
him4->sin_family = AF_INET;
diff --git a/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c b/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c
index 403c15c..b301b53 100644
--- a/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c
+++ b/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,10 @@
* questions.
*/
+#if defined(__linux__)
+#define _FILE_OFFSET_BITS 64
+#endif
+
#include "jni.h"
#include "jni_util.h"
#include "jvm.h"
@@ -178,6 +182,30 @@
"Truncation failed");
}
+JNIEXPORT jint JNICALL
+Java_sun_nio_ch_FileDispatcherImpl_allocate0(JNIEnv *env, jobject this,
+ jobject fdo, jlong size)
+{
+#if defined(__linux__)
+ /*
+ * On Linux, if the file size is being increased, then ftruncate64()
+ * will modify the metadata value of the size without actually allocating
+ * any blocks which can cause a SIGBUS error if the file is subsequently
+ * memory-mapped.
+ */
+ // Return on success or if errno is neither EOPNOTSUPP nor ENOSYS
+ int result = posix_fallocate(fdval(env, fdo), 0, size);
+ if (result == 0) {
+ return 0;
+ } else if (errno != EOPNOTSUPP && errno != ENOSYS) {
+ return handle(env, result, "Allocation failed");
+ }
+#endif
+ return handle(env,
+ ftruncate64(fdval(env, fdo), size),
+ "Truncation failed");
+}
+
JNIEXPORT jlong JNICALL
Java_sun_nio_ch_FileDispatcherImpl_size0(JNIEnv *env, jobject this, jobject fdo)
{
diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java
index 0070bd4..f4a8fa9 100644
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -677,7 +677,7 @@
}
try {
- return invoke(new Callable<File[]>() {
+ File[] files = invoke(new Callable<File[]>() {
public File[] call() throws InterruptedException {
if (!isDirectory()) {
return null;
@@ -732,6 +732,9 @@
: list.toArray(new ShellFolder[list.size()]);
}
}, InterruptedException.class);
+
+ return Win32ShellFolderManager2.checkFiles(files);
+
} catch (InterruptedException e) {
return new File[0];
}
diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
index 0a0c3fb..add8f73 100644
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -379,21 +379,30 @@
return null;
}
- private File checkFile(File file) {
+ private static File checkFile(File file) {
SecurityManager sm = System.getSecurityManager();
return (sm == null || file == null) ? file : checkFile(file, sm);
}
- private File checkFile(File file, SecurityManager sm) {
+ private static File checkFile(File file, SecurityManager sm) {
try {
sm.checkRead(file.getPath());
+
+ if (file instanceof Win32ShellFolder2) {
+ Win32ShellFolder2 f = (Win32ShellFolder2)file;
+ if (f.isLink()) {
+ Win32ShellFolder2 link = (Win32ShellFolder2)f.getLinkLocation();
+ if (link != null)
+ sm.checkRead(link.getPath());
+ }
+ }
return file;
} catch (SecurityException se) {
return null;
}
}
- private File[] checkFiles(File[] files) {
+ static File[] checkFiles(File[] files) {
SecurityManager sm = System.getSecurityManager();
if (sm == null || files == null || files.length == 0) {
return files;
@@ -401,7 +410,7 @@
return checkFiles(Arrays.stream(files), sm);
}
- private File[] checkFiles(List<File> files) {
+ private static File[] checkFiles(List<File> files) {
SecurityManager sm = System.getSecurityManager();
if (sm == null || files.isEmpty()) {
return files.toArray(new File[files.size()]);
@@ -409,7 +418,7 @@
return checkFiles(files.stream(), sm);
}
- private File[] checkFiles(Stream<File> filesStream, SecurityManager sm) {
+ private static File[] checkFiles(Stream<File> filesStream, SecurityManager sm) {
return filesStream.filter((file) -> checkFile(file, sm) != null)
.toArray(File[]::new);
}
diff --git a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java
index 4792306..058fb2e 100644
--- a/jdk/src/windows/classes/sun/awt/windows/WToolkit.java
+++ b/jdk/src/windows/classes/sun/awt/windows/WToolkit.java
@@ -37,6 +37,7 @@
import java.awt.TextComponent;
import java.awt.TrayIcon;
import java.beans.PropertyChangeListener;
+import java.lang.ref.WeakReference;
import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.swing.text.JTextComponent;
@@ -1111,47 +1112,59 @@
// The following code is used for support of automatic showing of the touch
// keyboard for text components and is accessed only from EDT.
///////////////////////////////////////////////////////////////////////////
- private volatile Component compOnTouchDownEvent;
- private volatile Component compOnMousePressedEvent;
+ private static final WeakReference<Component> NULL_COMPONENT_WR =
+ new WeakReference<>(null);
+ private volatile WeakReference<Component> compOnTouchDownEvent =
+ NULL_COMPONENT_WR;
+ private volatile WeakReference<Component> compOnMousePressedEvent =
+ NULL_COMPONENT_WR;
+
+ private boolean isComponentValidForTouchKeyboard(Component comp) {
+ if ((comp != null) && comp.isEnabled() && comp.isFocusable() &&
+ (((comp instanceof TextComponent) &&
+ ((TextComponent) comp).isEditable()) ||
+ ((comp instanceof JTextComponent) &&
+ ((JTextComponent) comp).isEditable()))) {
+ return true;
+ }
+ return false;
+ }
@Override
public void showOrHideTouchKeyboard(Component comp, AWTEvent e) {
- if ((comp == null) || (e == null) ||
- (!(comp instanceof TextComponent) &&
- !(comp instanceof JTextComponent))) {
+ if (!(comp instanceof TextComponent) &&
+ !(comp instanceof JTextComponent)) {
return;
}
- if ((e instanceof MouseEvent) && comp.isEnabled() &&
- (((comp instanceof TextComponent) &&
- ((TextComponent)comp).isEditable()) ||
- ((comp instanceof JTextComponent) &&
- ((JTextComponent)comp).isEditable()))) {
- MouseEvent me = (MouseEvent)e;
+ if ((e instanceof MouseEvent) && isComponentValidForTouchKeyboard(comp)) {
+ MouseEvent me = (MouseEvent) e;
if (me.getID() == MouseEvent.MOUSE_PRESSED) {
- if (AWTAccessor.getMouseEventAccessor()
- .isCausedByTouchEvent(me)) {
- compOnTouchDownEvent = comp;
+ if (AWTAccessor.getMouseEventAccessor().isCausedByTouchEvent(me)) {
+ compOnTouchDownEvent = new WeakReference<>(comp);
} else {
- compOnMousePressedEvent = comp;
+ compOnMousePressedEvent = new WeakReference<>(comp);
}
} else if (me.getID() == MouseEvent.MOUSE_RELEASED) {
- if (AWTAccessor.getMouseEventAccessor()
- .isCausedByTouchEvent(me)) {
- if (compOnTouchDownEvent == comp) {
+ if (AWTAccessor.getMouseEventAccessor().isCausedByTouchEvent(me)) {
+ if (compOnTouchDownEvent.get() == comp) {
showTouchKeyboard(true);
}
- compOnTouchDownEvent = null;
+ compOnTouchDownEvent = NULL_COMPONENT_WR;
} else {
- if (compOnMousePressedEvent == comp) {
+ if (compOnMousePressedEvent.get() == comp) {
showTouchKeyboard(false);
}
- compOnMousePressedEvent = null;
+ compOnMousePressedEvent = NULL_COMPONENT_WR;
}
}
} else if (e instanceof FocusEvent) {
- if (e.getID() == FocusEvent.FOCUS_LOST) {
- hideTouchKeyboard();
+ FocusEvent fe = (FocusEvent) e;
+ if (fe.getID() == FocusEvent.FOCUS_LOST) {
+ // Hide the touch keyboard, if not a text component gains focus.
+ if (!isComponentValidForTouchKeyboard(fe.getOppositeComponent())) {
+ hideTouchKeyboard();
+ }
}
}
}
diff --git a/jdk/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java b/jdk/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java
index f2b962e..3c383ed 100644
--- a/jdk/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java
+++ b/jdk/src/windows/classes/sun/nio/ch/FileDispatcherImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* 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,6 +93,11 @@
return truncate0(fd, size);
}
+ int allocate(FileDescriptor fd, long size) throws IOException {
+ // truncate0() works for extending and truncating file size
+ return truncate0(fd, size);
+ }
+
long size(FileDescriptor fd) throws IOException {
return size0(fd);
}
diff --git a/jdk/src/windows/native/java/net/Inet4AddressImpl.c b/jdk/src/windows/native/java/net/Inet4AddressImpl.c
index 9e7097e..eaeb1f0 100644
--- a/jdk/src/windows/native/java/net/Inet4AddressImpl.c
+++ b/jdk/src/windows/native/java/net/Inet4AddressImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -195,6 +195,8 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl(address));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, 0, iaObj);
JNU_ReleaseStringPlatformChars(env, host, hostname);
return ret;
@@ -228,7 +230,11 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl((*addrp)->s_addr));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, i, iaObj);
addrp++;
i++;
diff --git a/jdk/src/windows/native/java/net/Inet6AddressImpl.c b/jdk/src/windows/native/java/net/Inet6AddressImpl.c
index 0ebd061..bf3df11 100644
--- a/jdk/src/windows/native/java/net/Inet6AddressImpl.c
+++ b/jdk/src/windows/native/java/net/Inet6AddressImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -219,7 +219,11 @@
goto cleanupAndReturn;
}
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
inetIndex ++;
} else if (iterator->ai_family == AF_INET6) {
@@ -240,6 +244,8 @@
setInet6Address_scopeid(env, iaObj, scope);
}
setInetAddress_hostName(env, iaObj, host);
+ if ((*env)->ExceptionCheck(env))
+ goto cleanupAndReturn;
(*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
inet6Index ++;
}
diff --git a/jdk/src/windows/native/java/net/NetworkInterface.c b/jdk/src/windows/native/java/net/NetworkInterface.c
index 4dc22a0..4c6561e 100644
--- a/jdk/src/windows/native/java/net/NetworkInterface.c
+++ b/jdk/src/windows/native/java/net/NetworkInterface.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -287,6 +287,7 @@
if (curr->name == NULL || curr->displayName == NULL) {
if (curr->name) free(curr->name);
if (curr->displayName) free(curr->displayName);
+ free(curr);
curr = NULL;
}
}
@@ -593,6 +594,10 @@
/* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrP);
+ return NULL;
+ }
if (addrs->mask != -1) {
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
@@ -606,6 +611,10 @@
return NULL;
}
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrP);
+ return NULL;
+ }
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@@ -616,6 +625,7 @@
if (iaObj) {
int ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.him6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) {
+ free_netaddr(netaddrP);
return NULL;
}
@@ -761,8 +771,9 @@
(JNIEnv *env, jclass cls, jobject iaObj)
{
netif *ifList, *curr;
- jint addr = getInetAddress_addr(env, iaObj);
jobject netifObj = NULL;
+ jint addr = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
// Retained for now to support IPv4 only stack, java.net.preferIPv4Stack
if (ipv6_available()) {
diff --git a/jdk/src/windows/native/java/net/NetworkInterface_winXP.c b/jdk/src/windows/native/java/net/NetworkInterface_winXP.c
index d4d8c51..81dfd1f 100644
--- a/jdk/src/windows/native/java/net/NetworkInterface_winXP.c
+++ b/jdk/src/windows/native/java/net/NetworkInterface_winXP.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -488,8 +488,9 @@
jobjectArray addrArr, bindsArr, childArr;
netaddr *addrs;
jint addr_index;
- int netaddrCount=ifs->naddrs;
- netaddr *netaddrP=ifs->addrs;
+ int netaddrCount = ifs->naddrs;
+ netaddr *netaddrP = ifs->addrs;
+ netaddr *netaddrPToFree = NULL;
jint bind_index;
/*
@@ -520,21 +521,23 @@
* Note that 0 is a valid number of addresses.
*/
if (netaddrCount < 0) {
- netaddrCount = enumAddresses_win(env, ifs, &netaddrP);
+ netaddrCount = enumAddresses_win(env, ifs, &netaddrPToFree);
if (netaddrCount == -1) {
return NULL;
}
+ netaddrP = netaddrPToFree;
}
addrArr = (*env)->NewObjectArray(env, netaddrCount, ia_class, NULL);
if (addrArr == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
bindsArr = (*env)->NewObjectArray(env, netaddrCount, ni_ibcls, NULL);
if (bindsArr == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
addrs = netaddrP;
@@ -546,24 +549,32 @@
if (addrs->addr.him.sa_family == AF_INET) {
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (iaObj == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
/* default ctor will set family to AF_INET */
setInetAddress_addr(env, iaObj, ntohl(addrs->addr.him4.sin_addr.s_addr));
-
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrPToFree);
+ return NULL;
+ }
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
ia2Obj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
if (ia2Obj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
setInetAddress_addr(env, ia2Obj, ntohl(addrs->brdcast.him4.sin_addr.s_addr));
+ if ((*env)->ExceptionCheck(env)) {
+ free_netaddr(netaddrPToFree);
+ return NULL;
+ }
(*env)->SetObjectField(env, ibObj, ni_ibbroadcastID, ia2Obj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
(*env)->SetObjectArrayElement(env, bindsArr, bind_index++, ibObj);
@@ -572,10 +583,12 @@
int ret;
iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
if (iaObj == NULL) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
ret = setInet6Address_ipaddress(env, iaObj, (jbyte *)&(addrs->addr.him6.sin6_addr.s6_addr));
if (ret == JNI_FALSE) {
+ free_netaddr(netaddrPToFree);
return NULL;
}
scope = addrs->addr.him6.sin6_scope_id;
@@ -585,8 +598,8 @@
}
ibObj = (*env)->NewObject(env, ni_ibcls, ni_ibctrID);
if (ibObj == NULL) {
- free_netaddr(netaddrP);
- return NULL;
+ free_netaddr(netaddrPToFree);
+ return NULL;
}
(*env)->SetObjectField(env, ibObj, ni_ibaddressID, iaObj);
(*env)->SetShortField(env, ibObj, ni_ibmaskID, addrs->mask);
@@ -599,6 +612,8 @@
(*env)->SetObjectField(env, netifObj, ni_addrsID, addrArr);
(*env)->SetObjectField(env, netifObj, ni_bindsID, bindsArr);
+ free_netaddr(netaddrPToFree);
+
/*
* Windows doesn't have virtual interfaces, so child array
* is always empty.
@@ -638,7 +653,7 @@
}
/* if found create a NetworkInterface */
- if (curr != NULL) {;
+ if (curr != NULL) {
netifObj = createNetworkInterfaceXP(env, curr);
}
@@ -765,6 +780,7 @@
/* allocate a NetworkInterface array */
netIFArr = (*env)->NewObjectArray(env, count, cls, NULL);
if (netIFArr == NULL) {
+ free_netif(ifList);
return NULL;
}
@@ -779,6 +795,7 @@
netifObj = createNetworkInterfaceXP(env, curr);
if (netifObj == NULL) {
+ free_netif(ifList);
return NULL;
}
diff --git a/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c b/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
index e7f1f58..5069949 100644
--- a/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
+++ b/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -439,12 +439,12 @@
memset((char *)&lcladdr, 0, sizeof(lcladdr));
family = getInetAddress_family(env, addressObj);
+ JNU_CHECK_EXCEPTION(env);
if (family == IPv6 && !ipv6_supported) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Protocol family not supported");
return;
}
-
if (IS_NULL(fdObj) || (ipv6_supported && IS_NULL(fd1Obj))) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "socket closed");
return;
@@ -459,6 +459,7 @@
return;
} else {
address = getInetAddress_addr(env, addressObj);
+ JNU_CHECK_EXCEPTION(env);
}
if (NET_InetAddressToSockaddr(env, addressObj, port, (struct sockaddr *)&lcladdr, &lcladdrlen, JNI_FALSE) != 0) {
@@ -562,8 +563,9 @@
}
addr = getInetAddress_addr(env, address);
-
+ JNU_CHECK_EXCEPTION(env);
family = getInetAddress_family(env, address);
+ JNU_CHECK_EXCEPTION(env);
if (family == IPv6 && !ipv6_supported) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"Protocol family not supported");
@@ -681,6 +683,7 @@
}
family = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION(env);
if (family == IPv4) {
fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
} else {
@@ -731,6 +734,7 @@
* Check is not necessary on these OSes */
if (connected) {
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION(env);
} else {
address = ntohl(rmtaddr.him4.sin_addr.s_addr);
}
@@ -841,6 +845,7 @@
return -1;
} else {
address = getInetAddress_addr(env, addressObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
/* We only handle IPv4 for now. Will support IPv6 once its in the os */
family = AF_INET;
}
@@ -923,7 +928,9 @@
return 0;
}
setInetAddress_addr(env, addressObj, ntohl(remote_addr.sin_addr.s_addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
setInetAddress_family(env, addressObj, IPv4);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
/* return port */
return ntohs(remote_addr.sin_port);
@@ -1630,6 +1637,7 @@
int fam;
addr = (*env)->GetObjectArrayElement(env, addrArray, i);
fam = getInetAddress_family(env, addr);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
if (fam == family) {
*iaddr = addr;
return 0;
@@ -1648,6 +1656,7 @@
}
iaddr->s_addr = htonl(getInetAddress_addr(env, addr));
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
return 0;
}
@@ -1752,6 +1761,7 @@
struct in_addr in;
in.s_addr = htonl(getInetAddress_addr(env, value));
+ JNU_CHECK_EXCEPTION(env);
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
@@ -1993,7 +2003,7 @@
CHECK_NULL_RETURN(addr, NULL);
setInetAddress_addr(env, addr, ntohl(in.s_addr));
-
+ JNU_CHECK_EXCEPTION_RETURN(env, NULL);
/*
* For IP_MULTICAST_IF return InetAddress
*/
diff --git a/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c b/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
index 6e7ea71..bf7c047 100644
--- a/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
+++ b/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -414,6 +414,7 @@
fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID);
family = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION(env);
if (family == IPv6 && !ipv6_supported) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
@@ -731,7 +732,9 @@
}
setInetAddress_addr(env, socketAddressObj, ntohl(him.him4.sin_addr.s_addr));
+ JNU_CHECK_EXCEPTION(env);
setInetAddress_family(env, socketAddressObj, IPv4);
+ JNU_CHECK_EXCEPTION(env);
(*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
} else {
/* AF_INET6 -> Inet6Address */
@@ -758,6 +761,7 @@
}
setInet6Address_ipaddress(env, socketAddressObj, (const char *)&him.him6.sin6_addr);
setInetAddress_family(env, socketAddressObj, IPv6);
+ JNU_CHECK_EXCEPTION(env);
setInet6Address_scopeid(env, socketAddressObj, him.him6.sin6_scope_id);
}
diff --git a/jdk/src/windows/native/java/net/net_util_md.c b/jdk/src/windows/native/java/net/net_util_md.c
index 7d990bf..4721e03 100644
--- a/jdk/src/windows/native/java/net/net_util_md.c
+++ b/jdk/src/windows/native/java/net/net_util_md.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -875,6 +875,7 @@
int *len, jboolean v4MappedAddress) {
jint family, iafam;
iafam = getInetAddress_family(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
family = (iafam == IPv4)? AF_INET : AF_INET6;
if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) {
struct SOCKADDR_IN6 *him6 = (struct SOCKADDR_IN6 *)him;
@@ -885,6 +886,7 @@
if (family == AF_INET) { /* will convert to IPv4-mapped address */
memset((char *) caddr, 0, 16);
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
if (address == INADDR_ANY) {
/* we would always prefer IPv6 wildcard address
caddr[10] = 0xff;
@@ -923,6 +925,7 @@
}
memset((char *) him4, 0, sizeof(struct sockaddr_in));
address = getInetAddress_addr(env, iaObj);
+ JNU_CHECK_EXCEPTION_RETURN(env, -1);
him4->sin_port = htons((short) port);
him4->sin_addr.s_addr = (u_long) htonl(address);
him4->sin_family = AF_INET;
diff --git a/jdk/src/windows/native/sun/security/mscapi/security.cpp b/jdk/src/windows/native/sun/security/mscapi/security.cpp
index 5796c30..9d54815 100644
--- a/jdk/src/windows/native/sun/security/mscapi/security.cpp
+++ b/jdk/src/windows/native/sun/security/mscapi/security.cpp
@@ -159,7 +159,6 @@
{
HCRYPTPROV hCryptProv = NULL;
- BYTE* pbData = NULL;
jbyte* reseedBytes = NULL;
jbyte* seedBytes = NULL;
jbyteArray result = NULL;
@@ -203,25 +202,17 @@
result = NULL;
- } else if (length > 0) {
+ } else {
- pbData = new BYTE[length];
-
- if (::CryptGenRandom(
- hCryptProv,
- length,
- pbData) == FALSE) {
-
- ThrowException(env, PROVIDER_EXCEPTION, GetLastError());
- __leave;
+ if (length > 0) {
+ seed = env->NewByteArray(length);
+ if (seed == NULL) {
+ __leave;
+ }
+ } else {
+ length = env->GetArrayLength(seed);
}
- result = env->NewByteArray(length);
- env->SetByteArrayRegion(result, 0, length, (jbyte*) pbData);
-
- } else { // length == 0
-
- length = env->GetArrayLength(seed);
if ((seedBytes = env->GetByteArrayElements(seed, 0)) == NULL) {
__leave;
}
@@ -246,9 +237,6 @@
if (reseedBytes)
env->ReleaseByteArrayElements(seed, reseedBytes, JNI_ABORT);
- if (pbData)
- delete [] pbData;
-
if (seedBytes)
env->ReleaseByteArrayElements(seed, seedBytes, 0); // update orig
diff --git a/jdk/src/windows/native/sun/windows/awt_Component.cpp b/jdk/src/windows/native/sun/windows/awt_Component.cpp
index 58993b4..2b4430e 100644
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp
@@ -1815,6 +1815,7 @@
"new = 0x%08X",
GetHWnd(), GetClassName(), (UINT)lParam);
mr = WmInputLangChange(static_cast<UINT>(wParam), reinterpret_cast<HKL>(lParam));
+ g_bUserHasChangedInputLang = TRUE;
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
// should return non-zero if we process this message
retValue = 1;
diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp
index 2027cab..f43b1d5 100644
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp
@@ -490,8 +490,7 @@
HWND AwtToolkit::GetTouchKeyboardWindow() {
const TCHAR wndClassName[] = _T("IPTip_Main_Window");
HWND hwnd = ::FindWindow(wndClassName, NULL);
- if ((hwnd != NULL) && ::IsWindow(hwnd) && ::IsWindowEnabled(hwnd) &&
- ::IsWindowVisible(hwnd)) {
+ if ((hwnd != NULL) && ::IsWindow(hwnd) && ::IsWindowEnabled(hwnd)) {
return hwnd;
}
return NULL;
diff --git a/jdk/test/java/awt/image/BufferedImage/ICMColorDataTest/ICMColorDataTest.java b/jdk/test/java/awt/image/BufferedImage/ICMColorDataTest/ICMColorDataTest.java
new file mode 100644
index 0000000..575bfba
--- /dev/null
+++ b/jdk/test/java/awt/image/BufferedImage/ICMColorDataTest/ICMColorDataTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.IndexColorModel;
+import java.awt.image.MultiPixelPackedSampleModel;
+import java.awt.image.Raster;
+import java.awt.image.SampleModel;
+import java.awt.image.WritableRaster;
+
+/*
+ * @test
+ * @bug 8201433
+ * @summary This test may throw OOME or NPE from native code,
+ * it should not crash
+ * @requires os.maxMemory >= 2G
+ * @run main/othervm/timeout=300000 -Xms1000m -Xmx1000m ICMColorDataTest
+ */
+public class ICMColorDataTest {
+ private static final int WIDTH = 90;
+ private static final int HEIGHT = 90;
+ private static final int BITS_PER_PIXEL = 1;
+ private static final int PIXELS_IN_BYTE = 8;
+
+ // Color model components
+ private static final byte[] RED = { (byte) 255, 0 };
+ private static final byte[] GREEN = { (byte) 255, 0 };
+ private static final byte[] BLUE = { (byte) 255, 0 };
+
+ public static void main(String[] args) {
+ try {
+ for (long i = 0; i < 300_000; i++) {
+ makeImage();
+ }
+ } catch (OutOfMemoryError | NullPointerException e) {
+ System.err.println("Caught expected exception:\n" +
+ e.getClass() + ": " + e.getMessage());
+ }
+ System.err.println("Test passed");
+ }
+
+ private static void makeImage() {
+ int scanLineBytes = WIDTH / PIXELS_IN_BYTE;
+ if ((WIDTH & (PIXELS_IN_BYTE - 1)) != 0) {
+ // Make sure all the pixels in a scan line fit
+ scanLineBytes += 1;
+ }
+
+ byte[] bits = new byte[scanLineBytes * HEIGHT];
+ DataBuffer dataBuf = new DataBufferByte(bits, bits.length, 0);
+ SampleModel sampleModel = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
+ WIDTH, HEIGHT, BITS_PER_PIXEL);
+ WritableRaster raster = Raster.createWritableRaster(sampleModel, dataBuf, null);
+ IndexColorModel indexModel = new IndexColorModel(2, 2, RED, GREEN, BLUE);
+ BufferedImage bufImage = new BufferedImage(indexModel, raster,
+ indexModel.isAlphaPremultiplied(), null);
+
+ Graphics g = bufImage.getGraphics();
+ g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
+ g.dispose();
+ }
+}
diff --git a/jdk/test/java/io/Serializable/serialFilter/CheckArrayTest.java b/jdk/test/java/io/Serializable/serialFilter/CheckArrayTest.java
new file mode 100644
index 0000000..e75a368
--- /dev/null
+++ b/jdk/test/java/io/Serializable/serialFilter/CheckArrayTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.InvalidClassException;
+
+import java.util.Hashtable;
+
+import sun.misc.ObjectInputFilter;
+import sun.misc.SharedSecrets;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.testng.Assert;
+
+/* @test
+ * @build CheckArrayTest SerialFilterTest
+ * @bug 8203368
+ * @modules java.base/jdk.internal.misc
+ * @run testng CheckArrayTest
+ *
+ * @summary Test the SharedSecret access to ObjectInputStream.checkArray works
+ * with overridden subclasses.
+ */
+
+/**
+ * Verify that the SharedSecret access to the OIS checkAccess method
+ * does not fail with NPE in the case where ObjectInputStream is subclassed.
+ * The checkAccess method is called from various aggregate types in java.util
+ * to check array sizes during deserialization via the ObjectInputFilter attached the stream.
+ * The filterCheck must be resilent to an InputStream not being available (only the subclass knows).
+ */
+public class CheckArrayTest {
+
+ @DataProvider(name = "Patterns")
+ Object[][] patterns() {
+ return new Object[][]{
+ new Object[]{"maxarray=10", 10, new String[10]}, // successful
+ new Object[]{"maxarray=10", 11, new String[11]}, // exception expected
+ };
+ }
+
+ /**
+ * Test SharedSecrets checkArray with unmodified ObjectInputStream.
+ */
+ @Test(dataProvider = "Patterns")
+ public void normalOIS(String pattern, int arraySize, Object[] array) throws IOException {
+ ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(pattern);
+ byte[] bytes = SerialFilterTest.writeObjects(array);
+ try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ ObjectInputStream ois = new ObjectInputStream(bais)) {
+ // Check the arraysize against the filter
+ try {
+ ObjectInputFilter.Config.setObjectInputFilter(ois, filter);
+ SharedSecrets.getJavaOISAccess()
+ .checkArray(ois, array.getClass(), arraySize);
+ Assert.assertTrue(array.length >= arraySize,
+ "Should have thrown InvalidClassException due to array size");
+ } catch (InvalidClassException ice) {
+ Assert.assertFalse(array.length > arraySize,
+ "Should NOT have thrown InvalidClassException due to array size");
+ }
+ }
+ }
+
+ /**
+ * Test SharedSecrets checkArray with an ObjectInputStream subclassed to
+ * handle all input stream functions.
+ */
+ @Test(dataProvider = "Patterns")
+ public void subclassedOIS(String pattern, int arraySize, Object[] array) throws IOException {
+ byte[] bytes = SerialFilterTest.writeObjects(array);
+ try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+ ObjectInputStream ois = new MyInputStream(bais)) {
+ // Check the arraysize against the filter
+ ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(pattern);
+ ObjectInputFilter.Config.setObjectInputFilter(ois, filter);
+ SharedSecrets.getJavaOISAccess()
+ .checkArray(ois, array.getClass(), arraySize);
+ Assert.assertTrue(array.length >= arraySize,
+ "Should have thrown InvalidClassException due to array size");
+ } catch (InvalidClassException ice) {
+ Assert.assertFalse(array.length > arraySize,
+ "Should NOT have thrown InvalidClassException due to array size");
+ }
+ }
+
+ /**
+ * Subclass OIS to disable all input stream functions of the OIS.
+ */
+ static class MyInputStream extends ObjectInputStream {
+ MyInputStream(InputStream is) throws IOException {
+ super();
+ }
+
+ public void close() {
+ }
+ }
+}
diff --git a/jdk/test/java/nio/channels/FileChannel/FileExtensionAndMap.java b/jdk/test/java/nio/channels/FileChannel/FileExtensionAndMap.java
new file mode 100644
index 0000000..00669d1
--- /dev/null
+++ b/jdk/test/java/nio/channels/FileChannel/FileExtensionAndMap.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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
+ * @ignore This test has huge disk space requirements
+ * @bug 8168628
+ * @summary Test extending files to very large sizes without hitting a SIGBUS
+ * @requires (os.family == "linux")
+ * @run main/othervm/timeout=600 -Xms4g -Xmx4g FileExtensionAndMap
+ * @run main/othervm/timeout=600 -Xms4g -Xmx4g FileExtensionAndMap true
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileChannel.MapMode;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.Semaphore;
+import java.util.stream.IntStream;
+
+public class FileExtensionAndMap {
+
+ private static final ExecutorService CACHED_EXECUTORSERVICE =
+ Executors.newCachedThreadPool();
+
+ private static final String TMPDIR = System.getProperty("test.dir", ".");
+
+ private static boolean useRaf = false;
+
+ public static void main(String args[]) throws Exception {
+ if (args.length > 2) {
+ throw new IllegalArgumentException
+ ("Arguments: [true|false [targetFolder]]");
+ }
+
+ String defaultFolder = TMPDIR + File.separator + "target";
+ if (args.length > 0) {
+ useRaf = Boolean.valueOf(args[0]);
+ if (args.length > 1) {
+ defaultFolder = args[1];
+ }
+ }
+ final String targetFolder = defaultFolder;
+ Path p = Paths.get(targetFolder);
+ boolean targetExists = Files.exists(p);
+ if (!targetExists) {
+ Files.createDirectory(p);
+ }
+
+ System.out.printf("Using RandomAccessFile: %s; target folder: %s%n",
+ useRaf, targetFolder);
+
+ ForkJoinPool fjPool = new ForkJoinPool(3);
+ fjPool.submit(() -> {
+ IntStream.range(0, 20).parallel().forEach((index) -> {
+ String fileName = "testBigFile_" + index + ".dat";
+ Path source = null;
+ Path target = null;
+ try {
+ source = Paths.get(TMPDIR, fileName);
+ testCreateBigFile(source);
+ target = Paths.get(targetFolder, fileName);
+ testFileCopy(source, target);
+ } catch (Throwable th) {
+ System.err.println("Error copying file with fileName: "
+ + fileName + " : " + th.getMessage());
+ th.printStackTrace(System.err);
+ } finally {
+ try {
+ if (source != null) {
+ Files.deleteIfExists(source);
+ }
+ } catch (Throwable ignored) {
+ }
+ try {
+ if (target != null) {
+ Files.deleteIfExists(target);
+ }
+ } catch (Throwable ignored) {
+ }
+ }
+ });
+ }).join();
+
+ if (!targetExists) {
+ Files.delete(p);
+ }
+ }
+
+ private static void testFileCopy(Path source, Path target)
+ throws IOException {
+ Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
+ System.out.println("Finished copying file with fileName: "
+ + source.getFileName());
+ }
+
+ private static void testCreateBigFile(Path segmentFile)
+ throws IOException {
+ final Semaphore concurrencySemaphore = new Semaphore(5);
+ long fileSize = 3L * 1024L * 1024L * 1024L;
+ int blockSize = 10 * 1024 * 1024;
+ int loopCount = (int) Math.floorDiv(fileSize, blockSize);
+
+ String fileName = segmentFile.getFileName().toString();
+ if (useRaf) {
+ try (RandomAccessFile raf
+ = new RandomAccessFile(segmentFile.toFile(), "rw")) {
+ raf.setLength(fileSize);
+ try (FileChannel fc = raf.getChannel()) {
+ for (int i = 0; i < loopCount; i++) {
+ final long startPosition = 1L * blockSize * i;
+ concurrencySemaphore.acquireUninterruptibly();
+ CACHED_EXECUTORSERVICE.submit(() -> {
+ writeTemplateData(fileName, fc, startPosition,
+ blockSize, concurrencySemaphore);
+ });
+ }
+ } finally {
+ concurrencySemaphore.acquireUninterruptibly(5);
+ }
+ }
+ } else {
+ Path file = Files.createFile(segmentFile);
+ try (FileChannel fc = FileChannel.open(file,
+ StandardOpenOption.READ, StandardOpenOption.WRITE)) {
+ for (int i = 0; i < loopCount; i++) {
+ final long startPosition = 1L * blockSize * i;
+ concurrencySemaphore.acquireUninterruptibly();
+ CACHED_EXECUTORSERVICE.submit(() -> {
+ writeTemplateData(fileName, fc, startPosition,
+ blockSize, concurrencySemaphore);
+ });
+ }
+ }
+ }
+ }
+
+ private static void writeTemplateData(String fileName,
+ FileChannel fc, long startPosition, int blockSize,
+ Semaphore concurrencySemaphore) {
+ try {
+ byte[] EMPTY_RECORD = new byte[blockSize / 256];
+
+ MappedByteBuffer mappedByteBuffer = fc.map(MapMode.READ_WRITE,
+ startPosition, blockSize);
+ IntStream.range(0, 256).forEach((recordIndex) -> {
+ try {
+ mappedByteBuffer.position((int) (recordIndex *
+ EMPTY_RECORD.length));
+ mappedByteBuffer.put(EMPTY_RECORD, 0, EMPTY_RECORD.length);
+ } catch (Throwable th) {
+ System.err.println
+ ("Error in FileExtensionAndMap.writeTemplateData empty record for fileName: "
+ + fileName + ", startPosition: " + startPosition + ", recordIndex: "
+ + recordIndex + " : " + th.getMessage());
+ th.printStackTrace(System.err);
+ }
+ });
+
+ mappedByteBuffer.force();
+ } catch (Throwable th) {
+ if (!(th instanceof ClosedChannelException)) {
+ System.err.println
+ ("Error in FileExtensionAndMap.writeTemplateData empty record for fileName: "
+ + fileName + ", startPosition: " + startPosition + " : "
+ + th.getMessage());
+ th.printStackTrace(System.err);
+ }
+ } finally {
+ concurrencySemaphore.release();
+ }
+ }
+}
diff --git a/jdk/test/java/security/SignedObject/Chain.java b/jdk/test/java/security/SignedObject/Chain.java
index f5ad1b1..3c9bad3 100644
--- a/jdk/test/java/security/SignedObject/Chain.java
+++ b/jdk/test/java/security/SignedObject/Chain.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -142,8 +142,17 @@
PrivateKey[] privKeys = new PrivateKey[N];
PublicKey[] pubKeys = new PublicKey[N];
PublicKey[] anotherPubKeys = new PublicKey[N];
- KeyPairGenerator kpg = KeyPairGenerator.getInstance(
- test.keyAlg.name);
+ Signature signature;
+ KeyPairGenerator kpg;
+ if (test.provider != Provider.Default) {
+ signature = Signature.getInstance(test.sigAlg.name,
+ test.provider.name);
+ kpg = KeyPairGenerator.getInstance(
+ test.keyAlg.name, test.provider.name);
+ } else {
+ signature = Signature.getInstance(test.sigAlg.name);
+ kpg = KeyPairGenerator.getInstance(test.keyAlg.name);
+ }
for (int j=0; j < N; j++) {
if (test.keySize != -1) {
kpg.initialize(test.keySize);
@@ -162,14 +171,6 @@
}
}
- Signature signature;
- if (test.provider != Provider.Default) {
- signature = Signature.getInstance(test.sigAlg.name,
- test.provider.name);
- } else {
- signature = Signature.getInstance(test.sigAlg.name);
- }
-
// Create a chain of signed objects
SignedObject[] objects = new SignedObject[N];
objects[0] = new SignedObject(str, privKeys[0], signature);
diff --git a/jdk/test/java/util/zip/InflateIn_DeflateOut.java b/jdk/test/java/util/zip/InflateIn_DeflateOut.java
index 2c9adab..8cb73f7 100644
--- a/jdk/test/java/util/zip/InflateIn_DeflateOut.java
+++ b/jdk/test/java/util/zip/InflateIn_DeflateOut.java
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4206909 4813885 8189789
+ * @bug 4206909 4813885 8189789 8196854
* @summary Test basic functionality of DeflaterOutputStream/InflaterInputStream and GZIPOutputStream/GZIPInputStream, including flush
*/
@@ -153,7 +153,6 @@
OutputStream output = new FlushableGZIPOutputStream(byteOutStream);
byte[] data = new byte[random.nextInt(1024 * 1024)];
- byte[] buf = new byte[data.length];
random.nextBytes(data);
output.write(data);
@@ -175,7 +174,7 @@
int numRead;
byte[] b = new byte[4 * 1024];
try {
- while ((numRead = gzis.read(buf)) >= 0) {
+ while ((numRead = gzis.read(b)) >= 0) {
baos.write(b, 0, numRead);
}
} finally {
diff --git a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java
index 2e1afd7..e4aaef6 100644
--- a/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java
+++ b/jdk/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java
@@ -27,9 +27,8 @@
import java.io.File;
import java.io.FileInputStream;
-import javax.sound.sampled.*;
-
-import com.sun.media.sound.*;
+import com.sun.media.sound.RIFFReader;
+import com.sun.media.sound.RIFFWriter;
public class Skip {
@@ -40,6 +39,11 @@
}
public static void main(String[] args) throws Exception {
+ test(false);
+ test(true);
+ }
+
+ private static void test(boolean customStream) throws Exception {
RIFFWriter writer = null;
RIFFReader reader = null;
File tempfile = File.createTempFile("test",".riff");
@@ -51,7 +55,17 @@
chunk.write((byte)44);
writer.close();
writer = null;
- FileInputStream fis = new FileInputStream(tempfile);
+ final FileInputStream fis;
+ if (customStream) {
+ fis = new FileInputStream(tempfile);
+ } else {
+ fis = new FileInputStream(tempfile) {
+ @Override
+ public long skip(long n) {
+ return 0;
+ }
+ };
+ }
reader = new RIFFReader(fis);
RIFFReader readchunk = reader.nextChunk();
reader.skip(1);
diff --git a/jdk/test/javax/xml/ws/8172297/Main.java b/jdk/test/javax/xml/ws/8172297/Main.java
index 14b376c..6577071 100644
--- a/jdk/test/javax/xml/ws/8172297/Main.java
+++ b/jdk/test/javax/xml/ws/8172297/Main.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8172297
+ * @bug 8172297 8196491
* @summary Test that carriage-return and new-line characters
* are preserved in webservice parameters
* @compile ws/HelloWorld.java ws/HelloWorldImpl.java Main.java
@@ -33,13 +33,21 @@
import java.io.IOException;
import java.net.ServerSocket;
import java.net.URL;
+import java.util.Collections;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPMessage;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Service;
+import javax.xml.ws.handler.Handler;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.testng.Assert;
+import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import ws.HelloWorld;
@@ -47,9 +55,8 @@
public class Main {
- @Test
- public void runTest() throws Exception {
- //
+ @Test(dataProvider="callHandlerDataProvider")
+ public void runTest(boolean callGetMessageInHandler) throws Exception {
CountDownLatch serverInitSignal = new CountDownLatch(1);
CountDownLatch testDoneSignal = new CountDownLatch(1);
@@ -58,23 +65,31 @@
serverInitSignal.await();
- boolean paramModified = runClientCode(serverThread.getPort());
+ boolean paramModified = runClientCode(serverThread.getPort(), callGetMessageInHandler);
testDoneSignal.countDown();
- Assert.assertFalse(paramModified, "WS parameter was modified during round trip.");
+ Assert.assertEquals(callGetMessageInHandler, paramModified,
+ "WS parameter has not been processed as expected");
+ }
+
+ @DataProvider
+ public Object[][] callHandlerDataProvider() {
+ return new Object[][]{{true}, {false}};
}
/*
* Connects to launched web service endpoint, sends message with CR/NL symbols and
* checks if it was modified during the round trip client/server communication.
*/
- private boolean runClientCode(int port) throws Exception {
+ private boolean runClientCode(int port, boolean callGetMessage) throws Exception {
System.out.println("Launching WS client connection on " + port + " port");
URL url = new URL("http://localhost:" + port + "/ws/hello?wsdl");
QName qname = new QName("http://ws/", "HelloWorldImplService");
Service service = Service.create(url, qname);
+ registerHandler(service, callGetMessage);
+
HelloWorld hello = (HelloWorld) service.getPort(HelloWorld.class);
logStringContent("Client input parameter", WS_PARAM_VALUE);
@@ -86,6 +101,45 @@
}
/*
+ * Register message handler and call SOAPMessageContext.getMessage
+ * to emulate issue reported in JDK-8196491
+ */
+ private void registerHandler(Service service, final boolean callGetMessage) {
+ System.out.printf( "Client %s call getMessage inside message handler%n",
+ callGetMessage ? "will" : "will not" );
+ // Set custom SOAP message handler resolver
+ service.setHandlerResolver(portInfo -> {
+ Handler h = new SOAPHandler<SOAPMessageContext>() {
+
+ @Override
+ public boolean handleMessage(SOAPMessageContext context) {
+ if (callGetMessage) {
+ // Trigger exception from JDK-8196491
+ SOAPMessage msg = context.getMessage();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean handleFault(SOAPMessageContext context) {
+ return true;
+ }
+
+ @Override
+ public void close(MessageContext context) {
+ }
+
+ @Override
+ public Set<QName> getHeaders() {
+ return null;
+ }
+
+ };
+ return Collections.singletonList(h);
+ });
+ }
+
+ /*
* Outputs the parameter value with newline and carriage-return symbols
* replaced with #CR and #NL text abbreviations.
*/
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/InMemoryJavaCompiler.java b/jdk/test/lib/testlibrary/jdk/testlibrary/InMemoryJavaCompiler.java
new file mode 100644
index 0000000..b07c1f2
--- /dev/null
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/InMemoryJavaCompiler.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.net.URI;
+import java.util.Arrays;
+
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.FileObject;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+
+/**
+ * {@code InMemoryJavaCompiler} can be used for compiling a {@link
+ * CharSequence} to a {@code byte[]}.
+ *
+ * The compiler will not use the file system at all, instead using a {@link
+ * ByteArrayOutputStream} for storing the byte code. For the source code, any
+ * kind of {@link CharSequence} can be used, e.g. {@link String}, {@link
+ * StringBuffer} or {@link StringBuilder}.
+ *
+ * The {@code InMemoryCompiler} can easily be used together with a {@code
+ * ByteClassLoader} to easily compile and load source code in a {@link String}:
+ *
+ * <pre>
+ * {@code
+ * import com.oracle.java.testlibrary.InMemoryJavaCompiler;
+ * import com.oracle.java.testlibrary.ByteClassLoader;
+ *
+ * class Example {
+ * public static void main(String[] args) {
+ * String className = "Foo";
+ * String sourceCode = "public class " + className + " {" +
+ * " public void bar() {" +
+ * " System.out.println("Hello from bar!");" +
+ * " }" +
+ * "}";
+ * byte[] byteCode = InMemoryJavaCompiler.compile(className, sourceCode);
+ * Class fooClass = ByteClassLoader.load(className, byteCode);
+ * }
+ * }
+ * }
+ * </pre>
+ */
+public class InMemoryJavaCompiler {
+ private static class MemoryJavaFileObject extends SimpleJavaFileObject {
+ private final String className;
+ private final CharSequence sourceCode;
+ private final ByteArrayOutputStream byteCode;
+
+ public MemoryJavaFileObject(String className, CharSequence sourceCode) {
+ super(URI.create("string:///" + className.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
+ this.className = className;
+ this.sourceCode = sourceCode;
+ this.byteCode = new ByteArrayOutputStream();
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return sourceCode;
+ }
+
+ @Override
+ public OutputStream openOutputStream() throws IOException {
+ return byteCode;
+ }
+
+ public byte[] getByteCode() {
+ return byteCode.toByteArray();
+ }
+
+ public String getClassName() {
+ return className;
+ }
+ }
+
+ private static class FileManagerWrapper extends ForwardingJavaFileManager {
+ private MemoryJavaFileObject file;
+
+ public FileManagerWrapper(MemoryJavaFileObject file) {
+ super(getCompiler().getStandardFileManager(null, null, null));
+ this.file = file;
+ }
+
+ @Override
+ public JavaFileObject getJavaFileForOutput(Location location, String className,
+ Kind kind, FileObject sibling)
+ throws IOException {
+ if (!file.getClassName().equals(className)) {
+ throw new IOException("Expected class with name " + file.getClassName() +
+ ", but got " + className);
+ }
+ return file;
+ }
+ }
+
+ /**
+ * Compiles the class with the given name and source code.
+ *
+ * @param className The name of the class
+ * @param sourceCode The source code for the class with name {@code className}
+ * @throws RuntimeException if the compilation did not succeed
+ * @return The resulting byte code from the compilation
+ */
+ public static byte[] compile(String className, CharSequence sourceCode) {
+ MemoryJavaFileObject file = new MemoryJavaFileObject(className, sourceCode);
+ CompilationTask task = getCompilationTask(file);
+
+ if(!task.call()) {
+ throw new RuntimeException("Could not compile " + className + " with source code " + sourceCode);
+ }
+
+ return file.getByteCode();
+ }
+
+ private static JavaCompiler getCompiler() {
+ return ToolProvider.getSystemJavaCompiler();
+ }
+
+ private static CompilationTask getCompilationTask(MemoryJavaFileObject file) {
+ return getCompiler().getTask(null, new FileManagerWrapper(file), null, null, null, Arrays.asList(file));
+ }
+}
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/JarUtils.java b/jdk/test/lib/testlibrary/jdk/testlibrary/JarUtils.java
index 1be66e5..8d1e9ef 100644
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/JarUtils.java
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/JarUtils.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,16 +23,21 @@
package jdk.testlibrary;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -45,6 +50,72 @@
public final class JarUtils {
/**
+ * Creates a JAR file.
+ *
+ * Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...}
+ *
+ * The input files are resolved against the given directory. Any input
+ * files that are directories are processed recursively.
+ */
+ public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... file)
+ throws IOException
+ {
+ // create the target directory
+ Path parent = jarfile.getParent();
+ if (parent != null)
+ Files.createDirectories(parent);
+
+ List<Path> entries = new ArrayList<>();
+ for (Path entry : file) {
+ Files.find(dir.resolve(entry), Integer.MAX_VALUE,
+ (p, attrs) -> attrs.isRegularFile())
+ .map(e -> dir.relativize(e))
+ .forEach(entries::add);
+ }
+
+ try (OutputStream out = Files.newOutputStream(jarfile);
+ JarOutputStream jos = new JarOutputStream(out))
+ {
+ if (man != null) {
+ JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
+ jos.putNextEntry(je);
+ man.write(jos);
+ jos.closeEntry();
+ }
+
+ for (Path entry : entries) {
+ String name = toJarEntryName(entry);
+ jos.putNextEntry(new JarEntry(name));
+ Files.copy(dir.resolve(entry), jos);
+ jos.closeEntry();
+ }
+ }
+ }
+
+ /**
+ * Creates a JAR file.
+ *
+ * Equivalent to {@code jar cf <jarfile> -C <dir> file...}
+ *
+ * The input files are resolved against the given directory. Any input
+ * files that are directories are processed recursively.
+ */
+ public static void createJarFile(Path jarfile, Path dir, Path... file)
+ throws IOException
+ {
+ createJarFile(jarfile, null, dir, file);
+ }
+
+ /**
+ * Creates a JAR file from the contents of a directory.
+ *
+ * Equivalent to {@code jar cf <jarfile> -C <dir> .}
+ */
+ public static void createJarFile(Path jarfile, Path dir) throws IOException {
+ createJarFile(jarfile, dir, Paths.get("."));
+ }
+
+ /**
* Create jar file with specified files. If a specified file does not exist,
* a new jar entry will be created with the file name itself as the content.
*/
@@ -126,6 +197,11 @@
changes = new HashMap<>(changes);
System.out.printf("Creating %s from %s...\n", dest, src);
+
+ if (dest.equals(src)) {
+ throw new IOException("src and dest cannot be the same");
+ }
+
try (JarOutputStream jos = new JarOutputStream(
new FileOutputStream(dest))) {
@@ -153,6 +229,24 @@
System.out.println();
}
+ /**
+ * Update the Manifest inside a jar.
+ *
+ * @param src the original jar file name
+ * @param dest the new jar file name
+ * @param man the Manifest
+ *
+ * @throws IOException
+ */
+ public static void updateManifest(String src, String dest, Manifest man)
+ throws IOException {
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ man.write(bout);
+ Map<String, Object> map = new HashMap<>();
+ map.put(JarFile.MANIFEST_NAME, bout.toByteArray());
+ updateJar(src, dest, map);
+ }
+
private static void updateEntry(JarOutputStream jos, String name, Object content)
throws IOException {
if (content instanceof Boolean) {
@@ -172,4 +266,14 @@
}
}
}
+
+ /**
+ * Map a file path to the equivalent name in a JAR file
+ */
+ private static String toJarEntryName(Path file) {
+ Path normalized = file.normalize();
+ return normalized.subpath(0, normalized.getNameCount()) // drop root
+ .toString()
+ .replace(File.separatorChar, '/');
+ }
}
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java b/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java
index 7731220..77b4cdb 100644
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java
@@ -39,7 +39,7 @@
private final String stdout;
private final String stderr;
- private final int exitValue;
+ private final int exitValue; // useless now. output contains exit value.
/**
* Create an OutputAnalyzer, a utility class for verifying output and exit
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java
index 5050e15..5edbefc 100644
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
@@ -353,9 +354,31 @@
* @return The output from the process.
*/
public static OutputAnalyzer executeProcess(ProcessBuilder pb) throws Throwable {
+ return executeProcess(pb, null);
+ }
+
+ /**
+ * Executes a process, pipe some text into its STDIN, waits for it
+ * to finish and returns the process output. The process will have exited
+ * before this method returns.
+ * @param pb The ProcessBuilder to execute.
+ * @param input The text to pipe into STDIN. Can be null.
+ * @return The {@linkplain OutputAnalyzer} instance wrapping the process.
+ */
+ public static OutputAnalyzer executeProcess(ProcessBuilder pb, String input)
+ throws Throwable {
OutputAnalyzer output = null;
+ Process p = null;
try {
- output = new OutputAnalyzer(pb.start());
+ p = pb.start();
+ if (input != null) {
+ try (OutputStream os = p.getOutputStream();
+ PrintStream ps = new PrintStream(os)) {
+ ps.print(input);
+ ps.flush();
+ }
+ }
+ output = new OutputAnalyzer(p);
return output;
} catch (Throwable t) {
System.out.println("executeProcess() failed: " + t);
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/SecurityTools.java b/jdk/test/lib/testlibrary/jdk/testlibrary/SecurityTools.java
index 6eca88d..71a4b85 100644
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/SecurityTools.java
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/SecurityTools.java
@@ -49,10 +49,7 @@
launcher.addToolArg(arg);
}
}
- String[] cmds = launcher.getCommand();
- String cmdLine = Arrays.stream(cmds).collect(Collectors.joining(" "));
- System.out.println("Command line: [" + cmdLine + "]");
- return new ProcessBuilder(cmds);
+ return new ProcessBuilder(launcher.getCommand());
}
// keytool
@@ -69,7 +66,7 @@
pb.redirectInput(ProcessBuilder.Redirect.from(new File(RESPONSE_FILE)));
try {
- return ProcessTools.executeProcess(pb);
+ return execute(pb);
} catch (Throwable t) {
throw new RuntimeException("keytool failure: " + t);
} finally {
@@ -101,11 +98,20 @@
public static OutputAnalyzer jarsigner(List<String> args)
throws Exception {
+ return execute(getProcessBuilder("jarsigner", args));
+ }
+
+ private static OutputAnalyzer execute(ProcessBuilder pb) throws Exception {
try {
- return ProcessTools.executeProcess(
- getProcessBuilder("jarsigner", args));
+ OutputAnalyzer oa = ProcessTools.executeCommand(pb);
+ System.out.println("Exit value: " + oa.getExitValue());
+ return oa;
} catch (Throwable t) {
- throw new RuntimeException("jarsigner error: " + t);
+ if (t instanceof Exception) {
+ throw (Exception) t;
+ } else {
+ throw new Exception(t);
+ }
}
}
diff --git a/jdk/test/lib/testlibrary/jdk/testlibrary/testkeys b/jdk/test/lib/testlibrary/jdk/testlibrary/testkeys
new file mode 100644
index 0000000..4673898
--- /dev/null
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/testkeys
Binary files differ
diff --git a/jdk/test/sun/rmi/transport/tcp/DisableRMIOverHttp/DisableRMIOverHTTPTest.java b/jdk/test/sun/rmi/transport/tcp/DisableRMIOverHttp/DisableRMIOverHTTPTest.java
index 723597b..2f5761f 100644
--- a/jdk/test/sun/rmi/transport/tcp/DisableRMIOverHttp/DisableRMIOverHTTPTest.java
+++ b/jdk/test/sun/rmi/transport/tcp/DisableRMIOverHttp/DisableRMIOverHTTPTest.java
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 8193833
+ * @bug 8158963
*
* @summary Disable RMI over HTTP by default
*
diff --git a/jdk/test/sun/security/krb5/auto/UnboundSSL.java b/jdk/test/sun/security/krb5/auto/UnboundSSL.java
index 063729b..5519779 100644
--- a/jdk/test/sun/security/krb5/auto/UnboundSSL.java
+++ b/jdk/test/sun/security/krb5/auto/UnboundSSL.java
@@ -26,12 +26,13 @@
import java.security.PrivilegedActionException;
import java.util.HashMap;
import java.util.Map;
+import java.security.Security;
import javax.security.auth.login.LoginException;
/*
* @test
- * @bug 8025123
+ * @bug 8025123 8208350
* @summary Checks if an unbound server can handle connections
* only for allowed service principals
* @run main/othervm/java.security.policy=unbound.ssl.policy -Dsun.net.spi.nameservice.provider.1=ns,mock UnboundSSL
@@ -44,6 +45,7 @@
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException,LoginException, PrivilegedActionException,
InterruptedException {
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
UnboundSSL test = new UnboundSSL();
test.start(args[0], args[1]);
}
diff --git a/jdk/test/sun/security/krb5/auto/UnboundSSLMultipleKeys.java b/jdk/test/sun/security/krb5/auto/UnboundSSLMultipleKeys.java
index a3c209d..d4f98d2 100644
--- a/jdk/test/sun/security/krb5/auto/UnboundSSLMultipleKeys.java
+++ b/jdk/test/sun/security/krb5/auto/UnboundSSLMultipleKeys.java
@@ -26,12 +26,13 @@
import java.security.PrivilegedActionException;
import java.util.HashMap;
import java.util.Map;
+import java.security.Security;
import javax.security.auth.login.LoginException;
/*
* @test
- * @bug 8025123
+ * @bug 8025123 8208350
* @summary Checks if an unbound server pick up a correct key from keytab
* @run main/othervm -Dsun.net.spi.nameservice.provider.1=ns,mock UnboundSSLMultipleKeys
* unbound.ssl.jaas.conf server_star
@@ -43,6 +44,7 @@
public static void main(String[] args)
throws IOException, NoSuchAlgorithmException, LoginException,
PrivilegedActionException, InterruptedException {
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
UnboundSSLMultipleKeys test = new UnboundSSLMultipleKeys();
test.start(args[0], args[1]);
}
diff --git a/jdk/test/sun/security/krb5/auto/UnboundSSLPrincipalProperty.java b/jdk/test/sun/security/krb5/auto/UnboundSSLPrincipalProperty.java
index 9f78493..856d2c3 100644
--- a/jdk/test/sun/security/krb5/auto/UnboundSSLPrincipalProperty.java
+++ b/jdk/test/sun/security/krb5/auto/UnboundSSLPrincipalProperty.java
@@ -27,10 +27,11 @@
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.login.LoginException;
+import java.security.Security;
/*
* @test
- * @bug 8025123
+ * @bug 8025123 8208350
* @summary Checks if an unbound server uses a service principal
* from sun.security.krb5.principal system property if specified
* @run main/othervm -Dsun.net.spi.nameservice.provider.1=ns,mock UnboundSSLPrincipalProperty
@@ -43,6 +44,7 @@
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException,LoginException, PrivilegedActionException,
InterruptedException {
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
UnboundSSLPrincipalProperty test = new UnboundSSLPrincipalProperty();
test.start(args[0], args[1]);
}
diff --git a/jdk/test/sun/security/krb5/auto/unbound.ssl.policy b/jdk/test/sun/security/krb5/auto/unbound.ssl.policy
index 0df839c..6fea096 100644
--- a/jdk/test/sun/security/krb5/auto/unbound.ssl.policy
+++ b/jdk/test/sun/security/krb5/auto/unbound.ssl.policy
@@ -26,4 +26,6 @@
// permission to use SunJCE provider
permission java.security.SecurityPermission "putProviderProperty.SunJCE";
+ // permission to reset the tls disabledalgos
+ permission "java.security.SecurityPermission" "setProperty.jdk.tls.disabledAlgorithms";
};
diff --git a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java
index 8311b8d..82b7f4a 100644
--- a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java
+++ b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 6405536 6414980
+ * @bug 6405536 6414980 8051972
* @summary Make sure that we can parse certificates using various named curves
* and verify their signatures
* @author Andreas Sterbenz
@@ -153,8 +153,14 @@
signer = getRandomCert(certList);
} while (cert.getIssuerX500Principal().equals(signer.getSubjectX500Principal()));
try {
- cert.verify(signer.getPublicKey());
- throw new Exception("Verified invalid signature");
+ PublicKey signerPublicKey = signer.getPublicKey();
+ cert.verify(signerPublicKey);
+ // Ignore false positives
+ if (cert.getPublicKey().equals(signerPublicKey)) {
+ System.out.println("OK: self-signed certificate detected");
+ } else {
+ throw new Exception("Verified invalid signature");
+ }
} catch (SignatureException e) {
System.out.println("OK: " + e);
} catch (InvalidKeyException e) {
diff --git a/jdk/test/sun/security/provider/DSA/SupportedDSAParamGen.java b/jdk/test/sun/security/provider/DSA/SupportedDSAParamGen.java
index 04dd5be..b420450 100644
--- a/jdk/test/sun/security/provider/DSA/SupportedDSAParamGen.java
+++ b/jdk/test/sun/security/provider/DSA/SupportedDSAParamGen.java
@@ -29,7 +29,7 @@
* @run main/timeout=300 SupportedDSAParamGen 1024 160
* @run main/timeout=300 SupportedDSAParamGen 2048 224
* @run main/timeout=300 SupportedDSAParamGen 2048 256
- * @run main/timeout=450 SupportedDSAParamGen 3072 256
+ * @run main/timeout=700 SupportedDSAParamGen 3072 256
*/
import java.security.*;
import java.security.spec.*;
diff --git a/jdk/test/sun/security/ssl/CipherSuite/NoDesRC4CiphSuite.java b/jdk/test/sun/security/ssl/CipherSuite/NoDesRC4CiphSuite.java
new file mode 100644
index 0000000..22238d3
--- /dev/null
+++ b/jdk/test/sun/security/ssl/CipherSuite/NoDesRC4CiphSuite.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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 8208350
+ * @summary Disable all DES cipher suites
+ * @run main/othervm NoDesRC4CiphSuite
+ */
+
+/*
+ * SunJSSE does not support dynamic system properties, no way to re-use
+ * system properties in samevm/agentvm mode.
+ */
+
+import java.security.Security;
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.HandshakeStatus;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.security.GeneralSecurityException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class NoDesRC4CiphSuite {
+
+ private static final boolean DEBUG = false;
+
+ private static final byte RECTYPE_HS = 0x16;
+ private static final byte HSMSG_CLIHELLO = 0x01;
+
+ // These are some groups of Cipher Suites by names and IDs
+ private static final List<Integer> DES_CS_LIST = Arrays.asList(
+ 0x0009, 0x0015, 0x0012, 0x001A, 0x0008, 0x0014, 0x0011, 0x0019
+ );
+ private static final String[] DES_CS_LIST_NAMES = new String[] {
+ "SSL_RSA_WITH_DES_CBC_SHA",
+ "SSL_DHE_RSA_WITH_DES_CBC_SHA",
+ "SSL_DHE_DSS_WITH_DES_CBC_SHA",
+ "SSL_DH_anon_WITH_DES_CBC_SHA",
+ "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"
+ };
+ private static final List<Integer> RC4_CS_LIST = Arrays.asList(
+ 0xC007, 0xC011, 0x0005, 0xC002, 0xC00C, 0x0004, 0xC016, 0x0018,
+ 0x0003, 0x0017
+ );
+ private static final String[] RC4_CS_LIST_NAMES = new String[] {
+ "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
+ "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
+ "SSL_RSA_WITH_RC4_128_SHA",
+ "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
+ "TLS_ECDH_RSA_WITH_RC4_128_SHA",
+ "SSL_RSA_WITH_RC4_128_MD5",
+ "TLS_ECDH_anon_WITH_RC4_128_SHA",
+ "SSL_DH_anon_WITH_RC4_128_MD5",
+ "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
+ "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"
+ };
+
+ private static final ByteBuffer CLIOUTBUF =
+ ByteBuffer.wrap("Client Side".getBytes());
+
+ public static void main(String[] args) throws Exception {
+ boolean allGood = true;
+ String disAlg = Security.getProperty("jdk.tls.disabledAlgorithms");
+ System.err.println("Disabled Algs: " + disAlg);
+
+ // Disabled DES tests
+ allGood &= testDefaultCase(DES_CS_LIST);
+ allGood &= testEngAddDisabled(DES_CS_LIST_NAMES, DES_CS_LIST);
+ allGood &= testEngOnlyDisabled(DES_CS_LIST_NAMES);
+
+ // Disabled RC4 tests
+ allGood &= testDefaultCase(RC4_CS_LIST);
+ allGood &= testEngAddDisabled(RC4_CS_LIST_NAMES, RC4_CS_LIST);
+ allGood &= testEngOnlyDisabled(RC4_CS_LIST_NAMES);
+
+ if (allGood) {
+ System.err.println("All tests passed");
+ } else {
+ throw new RuntimeException("One or more tests failed");
+ }
+ }
+
+ /**
+ * Create an engine with the default set of cipher suites enabled and make
+ * sure none of the disabled suites are present in the client hello.
+ *
+ * @param disabledSuiteIds the {@code List} of disabled cipher suite IDs
+ * to be checked for.
+ *
+ * @return true if the test passed (No disabled suites), false otherwise
+ */
+ private static boolean testDefaultCase(List<Integer> disabledSuiteIds)
+ throws Exception {
+ System.err.println("\nTest: Default SSLEngine suite set");
+ SSLEngine ssle = makeEngine();
+ if (DEBUG) {
+ listCiphers("Suite set upon creation", ssle);
+ }
+ SSLEngineResult clientResult;
+ ByteBuffer cTOs = makeClientBuf(ssle);
+ clientResult = ssle.wrap(CLIOUTBUF, cTOs);
+ if (DEBUG) {
+ dumpResult("ClientHello: ", clientResult);
+ }
+ cTOs.flip();
+ boolean foundSuite = areSuitesPresentCH(cTOs, disabledSuiteIds);
+ if (foundSuite) {
+ System.err.println("FAIL: Found disabled suites!");
+ return false;
+ } else {
+ System.err.println("PASS: No disabled suites found.");
+ return true;
+ }
+ }
+
+ /**
+ * Create an engine and set only disabled cipher suites.
+ * The engine should not create the client hello message since the only
+ * available suites to assert in the client hello are disabled ones.
+ *
+ * @param disabledSuiteNames an array of cipher suite names that
+ * should be disabled cipher suites.
+ *
+ * @return true if the engine throws SSLHandshakeException during client
+ * hello creation, false otherwise.
+ */
+ private static boolean testEngOnlyDisabled(String[] disabledSuiteNames)
+ throws Exception {
+ System.err.println(
+ "\nTest: SSLEngine configured with only disabled suites");
+ try {
+ SSLEngine ssle = makeEngine();
+ ssle.setEnabledCipherSuites(disabledSuiteNames);
+ if (DEBUG) {
+ listCiphers("Suite set upon creation", ssle);
+ }
+ SSLEngineResult clientResult;
+ ByteBuffer cTOs = makeClientBuf(ssle);
+ clientResult = ssle.wrap(CLIOUTBUF, cTOs);
+ if (DEBUG) {
+ dumpResult("ClientHello: ", clientResult);
+ }
+ cTOs.flip();
+ } catch (SSLHandshakeException shse) {
+ System.err.println("PASS: Caught expected exception: " + shse);
+ return true;
+ }
+ System.err.println("FAIL: Expected SSLHandshakeException not thrown");
+ return false;
+ }
+
+ /**
+ * Create an engine and add some disabled suites to the default
+ * set of cipher suites. Make sure none of the disabled suites show up
+ * in the client hello even though they were explicitly added.
+ *
+ * @param disabledSuiteNames an array of cipher suite names that
+ * should be disabled cipher suites.
+ * @param disabledIds the {@code List} of disabled cipher suite IDs
+ * to be checked for.
+ *
+ * @return true if the test passed (No disabled suites), false otherwise
+ */
+ private static boolean testEngAddDisabled(String[] disabledNames,
+ List<Integer> disabledIds) throws Exception {
+ System.err.println("\nTest: SSLEngine with disabled suites added");
+ SSLEngine ssle = makeEngine();
+
+ // Add disabled suites to the existing engine's set of enabled suites
+ String[] initialSuites = ssle.getEnabledCipherSuites();
+ String[] plusDisSuites = Arrays.copyOf(initialSuites,
+ initialSuites.length + disabledNames.length);
+ System.arraycopy(disabledNames, 0, plusDisSuites,
+ initialSuites.length, disabledNames.length);
+ ssle.setEnabledCipherSuites(plusDisSuites);
+
+ if (DEBUG) {
+ listCiphers("Suite set upon creation", ssle);
+ }
+ SSLEngineResult clientResult;
+ ByteBuffer cTOs = makeClientBuf(ssle);
+ clientResult = ssle.wrap(CLIOUTBUF, cTOs);
+ if (DEBUG) {
+ dumpResult("ClientHello: ", clientResult);
+ }
+ cTOs.flip();
+ boolean foundDisabled = areSuitesPresentCH(cTOs, disabledIds);
+ if (foundDisabled) {
+ System.err.println("FAIL: Found disabled suites!");
+ return false;
+ } else {
+ System.err.println("PASS: No disabled suites found.");
+ return true;
+ }
+ }
+
+ private static SSLEngine makeEngine() throws GeneralSecurityException {
+ SSLContext ctx = SSLContext.getInstance("TLSv1.2");
+ ctx.init(null, null, null);
+ return ctx.createSSLEngine();
+ }
+
+ private static ByteBuffer makeClientBuf(SSLEngine ssle) {
+ ssle.setUseClientMode(true);
+ ssle.setNeedClientAuth(false);
+ SSLSession sess = ssle.getSession();
+ ByteBuffer cTOs = ByteBuffer.allocateDirect(sess.getPacketBufferSize());
+ return cTOs;
+ }
+
+ private static void listCiphers(String prefix, SSLEngine ssle) {
+ System.err.println(prefix + "\n---------------");
+ String[] suites = ssle.getEnabledCipherSuites();
+ for (String suite : suites) {
+ System.err.println(suite);
+ }
+ System.err.println("---------------");
+ }
+
+ /**
+ * Walk a TLS 1.2 or earlier ClientHello looking for any of the suites
+ * in the suiteIdList.
+ *
+ * @param clientHello a ByteBuffer containing the ClientHello message as
+ * a complete TLS record. The position of the buffer should be
+ * at the first byte of the TLS record header.
+ * @param suiteIdList a List of integer values corresponding to
+ * TLS cipher suite identifiers.
+ *
+ * @return true if at least one of the suites in {@code suiteIdList}
+ * is found in the ClientHello's cipher suite list
+ *
+ * @throws IOException if the data in the {@code clientHello}
+ * buffer is not a TLS handshake message or is not a client hello.
+ */
+ private static boolean areSuitesPresentCH(ByteBuffer clientHello,
+ List<Integer> suiteIdList) throws IOException {
+ byte val;
+
+ // Process the TLS Record
+ val = clientHello.get();
+ if (val != RECTYPE_HS) {
+ throw new IOException(
+ "Not a handshake record, type = " + val);
+ }
+
+ // Just skip over the version and length
+ clientHello.position(clientHello.position() + 4);
+
+ // Check the handshake message type
+ val = clientHello.get();
+ if (val != HSMSG_CLIHELLO) {
+ throw new IOException(
+ "Not a ClientHello handshake message, type = " + val);
+ }
+
+ // Skip over the length
+ clientHello.position(clientHello.position() + 3);
+
+ // Skip over the protocol version (2) and random (32);
+ clientHello.position(clientHello.position() + 34);
+
+ // Skip past the session ID (variable length <= 32)
+ int len = Byte.toUnsignedInt(clientHello.get());
+ if (len > 32) {
+ throw new IOException("Session ID is too large, len = " + len);
+ }
+ clientHello.position(clientHello.position() + len);
+
+ // Finally, we are at the cipher suites. Walk the list and place them
+ // into a List.
+ int csLen = Short.toUnsignedInt(clientHello.getShort());
+ if (csLen % 2 != 0) {
+ throw new IOException("CipherSuite length is invalid, len = " +
+ csLen);
+ }
+ int csCount = csLen / 2;
+ List<Integer> csSuiteList = new ArrayList<>(csCount);
+ log("Found following suite IDs in hello:");
+ for (int i = 0; i < csCount; i++) {
+ int curSuite = Short.toUnsignedInt(clientHello.getShort());
+ log(String.format("Suite ID: 0x%04x", curSuite));
+ csSuiteList.add(curSuite);
+ }
+
+ // Now check to see if any of the suites passed in match what is in
+ // the suite list.
+ boolean foundMatch = false;
+ for (Integer cs : suiteIdList) {
+ if (csSuiteList.contains(cs)) {
+ System.err.format("Found match for suite ID 0x%04x\n", cs);
+ foundMatch = true;
+ break;
+ }
+ }
+
+ // We don't care about the rest of the ClientHello message.
+ // Rewind and return whether we found a match or not.
+ clientHello.rewind();
+ return foundMatch;
+ }
+
+ private static void dumpResult(String str, SSLEngineResult result) {
+ System.err.println("The format of the SSLEngineResult is: \n" +
+ "\t\"getStatus() / getHandshakeStatus()\" +\n" +
+ "\t\"bytesConsumed() / bytesProduced()\"\n");
+ HandshakeStatus hsStatus = result.getHandshakeStatus();
+ System.err.println(str + result.getStatus() + "/" + hsStatus + ", " +
+ result.bytesConsumed() + "/" + result.bytesProduced() + " bytes");
+ if (hsStatus == HandshakeStatus.FINISHED) {
+ System.err.println("\t...ready for application data");
+ }
+ }
+
+ private static void log(String str) {
+ if (DEBUG) {
+ System.err.println(str);
+ }
+ }
+}
diff --git a/jdk/test/sun/security/ssl/HandshakeHash/DigestBase.java b/jdk/test/sun/security/ssl/HandshakeHash/DigestBase.java
new file mode 100644
index 0000000..a92de6f
--- /dev/null
+++ b/jdk/test/sun/security/ssl/HandshakeHash/DigestBase.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.*;
+
+class DigestBase extends MessageDigestSpi {
+
+ private MessageDigest digest = null;
+
+ public DigestBase(String alg, String provider) throws Exception {
+ digest = MessageDigest.getInstance(alg, provider);
+ }
+
+ @Override
+ protected void engineUpdate(byte input) {
+ digest.update(input);
+ }
+
+ @Override
+ protected void engineUpdate(byte[] input, int offset, int len) {
+ digest.update(input, offset, len);
+ }
+
+ @Override
+ protected byte[] engineDigest() {
+ return digest.digest();
+ }
+
+ @Override
+ protected void engineReset() {
+ digest.reset();
+ }
+
+ public static final class MD5 extends DigestBase {
+ public MD5() throws Exception {
+ super("MD5", "SUN");
+ }
+ }
+
+ public static final class SHA extends DigestBase {
+ public SHA() throws Exception {
+ super("SHA", "SUN");
+ }
+ }
+
+ public static final class SHA256 extends DigestBase {
+ public SHA256() throws Exception {
+ super("SHA-256", "SUN");
+ }
+ }
+}
diff --git a/jdk/test/sun/security/ssl/HandshakeHash/HandshakeHashCloneExhaustion.java b/jdk/test/sun/security/ssl/HandshakeHash/HandshakeHashCloneExhaustion.java
new file mode 100644
index 0000000..73e7c2a
--- /dev/null
+++ b/jdk/test/sun/security/ssl/HandshakeHash/HandshakeHashCloneExhaustion.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
+ * 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.
+ */
+
+//
+// Please run in othervm mode. SunJSSE does not support dynamic system
+// properties, no way to re-use system properties in samevm/agentvm mode.
+//
+
+/*
+ * @test
+ * @bug 8148421 8193683
+ * @summary Transport Layer Security (TLS) Session Hash and Extended
+ * Master Secret Extension
+ * @summary Increase the number of clones in the CloneableDigest
+ * @library /javax/net/ssl/templates
+ * @compile DigestBase.java
+ * @run main/othervm HandshakeHashCloneExhaustion
+ * TLSv1.2 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
+ * @run main/othervm HandshakeHashCloneExhaustion
+ * TLSv1.1 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
+ */
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.MessageDigest;
+import java.security.Security;
+import javax.net.ssl.SSLSocket;
+
+public class HandshakeHashCloneExhaustion extends SSLSocketTemplate {
+
+ private static String[] protocol;
+ private static String[] ciphersuite;
+ private static String[] mds = { "SHA", "MD5", "SHA-256" };
+
+ /*
+ * ==================
+ * Run the test case.
+ */
+ public static void main(String[] args) throws Exception {
+ // Add in a non-cloneable MD5/SHA1/SHA-256 implementation
+ Security.insertProviderAt(new MyProvider(), 1);
+ // make sure our provider is functioning
+ for (String s : mds) {
+ MessageDigest md = MessageDigest.getInstance(s);
+ String p = md.getProvider().getName();
+ if (!p.equals("MyProvider")) {
+ throw new RuntimeException("Unexpected provider: " + p);
+ }
+ }
+
+ if (args.length != 2) {
+ throw new Exception(
+ "Usage: HandshakeHashCloneExhaustion protocol ciphersuite");
+ }
+
+ System.out.println("Testing: " + args[0] + " " + args[1]);
+ protocol = new String [] { args[0] };
+ ciphersuite = new String[] { args[1] };
+
+ (new HandshakeHashCloneExhaustion()).run();
+ }
+
+ @Override
+ protected void runServerApplication(SSLSocket socket) throws Exception {
+ socket.setNeedClientAuth(true);
+ socket.setEnabledProtocols(protocol);
+ socket.setEnabledCipherSuites(ciphersuite);
+
+ // here comes the test logic
+ InputStream sslIS = socket.getInputStream();
+ OutputStream sslOS = socket.getOutputStream();
+
+ sslIS.read();
+ sslOS.write(85);
+ sslOS.flush();
+ }
+
+ @Override
+ protected void runClientApplication(SSLSocket socket) throws Exception {
+ InputStream sslIS = socket.getInputStream();
+ OutputStream sslOS = socket.getOutputStream();
+
+ sslOS.write(280);
+ sslOS.flush();
+ sslIS.read();
+ }
+}
diff --git a/jdk/test/sun/security/ssl/HandshakeHash/MyProvider.java b/jdk/test/sun/security/ssl/HandshakeHash/MyProvider.java
new file mode 100644
index 0000000..325a0b8
--- /dev/null
+++ b/jdk/test/sun/security/ssl/HandshakeHash/MyProvider.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.*;
+
+public final class MyProvider extends Provider {
+
+ public MyProvider() {
+ super("MyProvider", 1.0d,
+ "Test Provider: SHA1/MD5/SHA256 exhaustion testing");
+ put("MessageDigest.SHA", "DigestBase$SHA");
+ put("MessageDigest.MD5", "DigestBase$MD5");
+ put("MessageDigest.SHA-256", "DigestBase$SHA256");
+ }
+}
diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/LengthCheckTest.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/LengthCheckTest.java
index 38122d7..f4e71a6 100644
--- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/LengthCheckTest.java
+++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/LengthCheckTest.java
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8044860
+ * @bug 8044860 8074462
* @summary Vectors and fixed length fields should be verified
* for allowed sizes.
* @run main/othervm LengthCheckTest
@@ -231,7 +231,7 @@
// sent back to the server.
if (gotException == false ||
!isTlsMessage(cTOs, TLS_RECTYPE_ALERT, TLS_ALERT_LVL_FATAL,
- TLS_ALERT_INTERNAL_ERROR)) {
+ TLS_ALERT_UNEXPECTED_MSG)) {
throw new SSLException(
"Client failed to throw Alert:fatal:internal_error");
}
@@ -283,7 +283,7 @@
// sent back to the client.
if (gotException == false ||
!isTlsMessage(sTOc, TLS_RECTYPE_ALERT, TLS_ALERT_LVL_FATAL,
- TLS_ALERT_INTERNAL_ERROR)) {
+ TLS_ALERT_UNEXPECTED_MSG)) {
throw new SSLException(
"Server failed to throw Alert:fatal:internal_error");
}
diff --git a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java
index 2d47602..ab11a8d 100644
--- a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java
+++ b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,6 +22,8 @@
*/
import com.sun.net.httpserver.*;
+
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -36,16 +38,18 @@
import java.security.PrivateKey;
import java.security.Signature;
import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.List;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import sun.misc.IOUtils;
-import jdk.testlibrary.*;
+import jdk.testlibrary.SecurityTools;
+import jdk.testlibrary.OutputAnalyzer;
import jdk.testlibrary.JarUtils;
import sun.security.pkcs.ContentInfo;
import sun.security.pkcs.PKCS7;
@@ -58,9 +62,12 @@
import sun.security.x509.AlgorithmId;
import sun.security.x509.X500Name;
+import jdk.testlibrary.Utils;
+
/*
* @test
* @bug 6543842 6543440 6939248 8009636 8024302 8163304 8169911 8169688 8171121
+ * 8180289
* @summary checking response of timestamp
* @modules java.base/sun.security.pkcs
* java.base/sun.security.timestamp
@@ -68,7 +75,7 @@
* java.base/sun.security.util
* java.base/sun.security.tools.keytool
* @library /lib/testlibrary
- * @run main/timeout=600 TimestampCheck
+ * @run main/othervm/timeout=600 TimestampCheck
*/
public class TimestampCheck {
@@ -114,12 +121,12 @@
*/
byte[] sign(byte[] input, String path) throws Exception {
DerValue value = new DerValue(input);
- System.err.println("\nIncoming Request\n===================");
- System.err.println("Version: " + value.data.getInteger());
+ System.out.println("\nIncoming Request\n===================");
+ System.out.println("Version: " + value.data.getInteger());
DerValue messageImprint = value.data.getDerValue();
AlgorithmId aid = AlgorithmId.parse(
messageImprint.data.getDerValue());
- System.err.println("AlgorithmId: " + aid);
+ System.out.println("AlgorithmId: " + aid);
ObjectIdentifier policyId = new ObjectIdentifier(defaultPolicyId);
BigInteger nonce = null;
@@ -127,25 +134,24 @@
DerValue v = value.data.getDerValue();
if (v.tag == DerValue.tag_Integer) {
nonce = v.getBigInteger();
- System.err.println("nonce: " + nonce);
+ System.out.println("nonce: " + nonce);
} else if (v.tag == DerValue.tag_Boolean) {
- System.err.println("certReq: " + v.getBoolean());
+ System.out.println("certReq: " + v.getBoolean());
} else if (v.tag == DerValue.tag_ObjectId) {
policyId = v.getOID();
- System.err.println("PolicyID: " + policyId);
+ System.out.println("PolicyID: " + policyId);
}
}
- System.err.println("\nResponse\n===================");
+ System.out.println("\nResponse\n===================");
FileInputStream is = new FileInputStream(keystore);
KeyStore ks = KeyStore.getInstance("JCEKS");
ks.load(is, "changeit".toCharArray());
is.close();
- String alias = "ts";
- if (path.startsWith("bad") || path.equals("weak")) {
- alias = "ts" + path;
- }
+ // If path starts with "ts", use the TSA it points to.
+ // Otherwise, always use "ts".
+ String alias = path.startsWith("ts") ? path : "ts";
if (path.equals("diffpolicy")) {
policyId = new ObjectIdentifier(defaultPolicyId);
@@ -192,8 +198,11 @@
tst.putInteger(1);
- Calendar cal = Calendar.getInstance();
- tst.putGeneralizedTime(cal.getTime());
+ Instant instant = Instant.now();
+ if (path.equals("tsold")) {
+ instant = instant.minus(20, ChronoUnit.DAYS);
+ }
+ tst.putGeneralizedTime(Date.from(instant));
if (path.equals("diffnonce")) {
tst.putInteger(1234);
@@ -220,10 +229,10 @@
"1.2.840.113549.1.9.16.1.4"),
new DerValue(tstInfo2.toByteArray()));
- System.err.println("Signing...");
- System.err.println(new X500Name(signer
+ System.out.println("Signing...");
+ System.out.println(new X500Name(signer
.getIssuerX500Principal().getName()));
- System.err.println(signer.getSerialNumber());
+ System.out.println(signer.getSerialNumber());
SignerInfo signerInfo = new SignerInfo(
new X500Name(signer.getIssuerX500Principal().getName()),
@@ -296,24 +305,52 @@
prepare();
- try (Handler tsa = Handler.init(0, "tsks");) {
+ try (Handler tsa = Handler.init(0, "ks");) {
tsa.start();
int port = tsa.getPort();
host = "http://localhost:" + port + "/";
if (args.length == 0) { // Run this test
- sign("none")
+
+ sign("normal")
+ .shouldNotContain("Warning")
+ .shouldHaveExitValue(0);
+
+ verify("normal.jar")
+ .shouldNotContain("Warning")
+ .shouldHaveExitValue(0);
+
+ // Simulate signing at a previous date:
+ // 1. tsold will create a timestamp of 20 days ago.
+ // 2. oldsigner expired 10 days ago.
+ // jarsigner will show a warning at signing.
+ signVerbose("tsold", "unsigned.jar", "tsold.jar", "oldsigner")
+ .shouldHaveExitValue(4);
+
+ // It verifies perfectly.
+ verify("tsold.jar", "-verbose", "-certs")
+ .shouldNotContain("Warning")
+ .shouldHaveExitValue(0);
+
+ signVerbose(null, "unsigned.jar", "none.jar", "signer")
.shouldContain("is not timestamped")
.shouldHaveExitValue(0);
- sign("badku")
- .shouldHaveExitValue(0);
+ signVerbose(null, "unsigned.jar", "badku.jar", "badku")
+ .shouldHaveExitValue(8);
checkBadKU("badku.jar");
- sign("normal")
- .shouldNotContain("is not timestamped")
- .shouldHaveExitValue(0);
+ // 8180289: unvalidated TSA cert chain
+ sign("tsnoca")
+ .shouldContain("TSA certificate chain is invalid")
+ .shouldHaveExitValue(64);
+
+ verify("tsnoca.jar", "-verbose", "-certs")
+ .shouldHaveExitValue(64)
+ .shouldContain("jar verified")
+ .shouldContain("Invalid TSA certificate chain")
+ .shouldContain("TSA certificate chain is invalid");
sign("nononce")
.shouldHaveExitValue(1);
@@ -325,11 +362,11 @@
.shouldHaveExitValue(1);
sign("fullchain")
.shouldHaveExitValue(0); // Success, 6543440 solved.
- sign("bad1")
+ sign("tsbad1")
.shouldHaveExitValue(1);
- sign("bad2")
+ sign("tsbad2")
.shouldHaveExitValue(1);
- sign("bad3")
+ sign("tsbad3")
.shouldHaveExitValue(1);
sign("nocert")
.shouldHaveExitValue(1);
@@ -341,119 +378,171 @@
sign("diffpolicy", "-tsapolicyid", "1.2.3")
.shouldHaveExitValue(1);
- sign("tsaalg", "-tsadigestalg", "SHA")
+ sign("sha1alg", "-tsadigestalg", "SHA")
.shouldHaveExitValue(0);
- checkTimestamp("tsaalg.jar", defaultPolicyId, "SHA-1");
+ checkTimestamp("sha1alg.jar", defaultPolicyId, "SHA-1");
- sign("weak", "-digestalg", "MD5",
+ sign("tsweak", "-digestalg", "MD5",
"-sigalg", "MD5withRSA", "-tsadigestalg", "MD5")
- .shouldHaveExitValue(0);
- checkWeak("weak.jar");
+ .shouldHaveExitValue(68);
+ checkWeak("tsweak.jar");
- signWithAliasAndTsa("halfWeak", "old.jar", "old", "-digestalg", "MD5")
- .shouldHaveExitValue(0);
+ signVerbose("tsweak", "unsigned.jar", "tsweak2.jar", "signer")
+ .shouldHaveExitValue(64)
+ .shouldContain("TSA certificate chain is invalid");
+
+ // Weak timestamp is an error and jar treated unsigned
+ verify("tsweak2.jar", "-verbose")
+ .shouldHaveExitValue(16)
+ .shouldContain("treated as unsigned")
+ .shouldMatch("Timestamp.*512.*weak");
+
+ signVerbose("normal", "unsigned.jar", "halfWeak.jar", "signer",
+ "-digestalg", "MD5")
+ .shouldHaveExitValue(4);
checkHalfWeak("halfWeak.jar");
// sign with DSA key
- signWithAliasAndTsa("sign1", "old.jar", "dsakey")
+ signVerbose("normal", "unsigned.jar", "sign1.jar", "dsakey")
.shouldHaveExitValue(0);
// sign with RSAkeysize < 1024
- signWithAliasAndTsa("sign2", "sign1.jar", "weakkeysize")
- .shouldHaveExitValue(0);
+ signVerbose("normal", "sign1.jar", "sign2.jar", "weakkeysize")
+ .shouldHaveExitValue(4);
checkMultiple("sign2.jar");
// When .SF or .RSA is missing or invalid
checkMissingOrInvalidFiles("normal.jar");
+
+ if (Files.exists(Paths.get("ts2.cert"))) {
+ checkInvalidTsaCertKeyUsage();
+ }
} else { // Run as a standalone server
- System.err.println("Press Enter to quit server");
+ System.out.println("Press Enter to quit server");
System.in.read();
}
}
}
+ private static void checkInvalidTsaCertKeyUsage() throws Exception {
+
+ // Hack: Rewrite the TSA cert inside normal.jar into ts2.jar.
+
+ // Both the cert and the serial number must be rewritten.
+ byte[] tsCert = Files.readAllBytes(Paths.get("ts.cert"));
+ byte[] ts2Cert = Files.readAllBytes(Paths.get("ts2.cert"));
+ byte[] tsSerial = getCert(tsCert)
+ .getSerialNumber().toByteArray();
+ byte[] ts2Serial = getCert(ts2Cert)
+ .getSerialNumber().toByteArray();
+
+ byte[] oldBlock;
+ try (JarFile normal = new JarFile("normal.jar")) {
+ oldBlock = Utils.readAllBytes(normal.getInputStream(
+ normal.getJarEntry("META-INF/SIGNER.RSA")));
+ }
+
+ JarUtils.updateJar("normal.jar", "ts2.jar",
+ mapOf("META-INF/SIGNER.RSA",
+ updateBytes(updateBytes(oldBlock, tsCert, ts2Cert),
+ tsSerial, ts2Serial)));
+
+ verify("ts2.jar", "-verbose", "-certs")
+ .shouldHaveExitValue(64)
+ .shouldContain("jar verified")
+ .shouldContain("Invalid TSA certificate chain: Extended key usage does not permit use for TSA server");
+ }
+
+ public static X509Certificate getCert(byte[] data)
+ throws CertificateException, IOException {
+ return (X509Certificate)
+ CertificateFactory.getInstance("X.509")
+ .generateCertificate(new ByteArrayInputStream(data));
+ }
+
+ private static byte[] updateBytes(byte[] old, byte[] from, byte[] to) {
+ int pos = 0;
+ while (true) {
+ if (pos + from.length > old.length) {
+ return null;
+ }
+ if (Arrays.equals(Arrays.copyOfRange(old, pos, pos+from.length), from)) {
+ byte[] result = old.clone();
+ System.arraycopy(to, 0, result, pos, from.length);
+ return result;
+ }
+ pos++;
+ }
+ }
+
private static void checkMissingOrInvalidFiles(String s)
throws Throwable {
- JarUtils.updateJar(s, "1.jar", "-", "META-INF/OLD.SF");
+
+ JarUtils.updateJar(s, "1.jar", mapOf("META-INF/SIGNER.SF", Boolean.FALSE));
verify("1.jar", "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
- .shouldContain("Missing signature-related file META-INF/OLD.SF");
- JarUtils.updateJar(s, "2.jar", "-", "META-INF/OLD.RSA");
+ .shouldContain("Missing signature-related file META-INF/SIGNER.SF");
+ JarUtils.updateJar(s, "2.jar", mapOf("META-INF/SIGNER.RSA", Boolean.FALSE));
verify("2.jar", "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
- .shouldContain("Missing block file for signature-related file META-INF/OLD.SF");
- JarUtils.updateJar(s, "3.jar", "META-INF/OLD.SF");
+ .shouldContain("Missing block file for signature-related file META-INF/SIGNER.SF");
+ JarUtils.updateJar(s, "3.jar", mapOf("META-INF/SIGNER.SF", "dummy"));
verify("3.jar", "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
- .shouldContain("Unparsable signature-related file META-INF/OLD.SF");
- JarUtils.updateJar(s, "4.jar", "META-INF/OLD.RSA");
+ .shouldContain("Unparsable signature-related file META-INF/SIGNER.SF");
+ JarUtils.updateJar(s, "4.jar", mapOf("META-INF/SIGNER.RSA", "dummy"));
verify("4.jar", "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
- .shouldContain("Unparsable signature-related file META-INF/OLD.RSA");
+ .shouldContain("Unparsable signature-related file META-INF/SIGNER.RSA");
}
static OutputAnalyzer jarsigner(List<String> extra)
- throws Throwable {
- JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jarsigner")
- .addVMArg("-Duser.language=en")
- .addVMArg("-Duser.country=US")
- .addToolArg("-keystore")
- .addToolArg("tsks")
- .addToolArg("-storepass")
- .addToolArg("changeit");
- for (String s : extra) {
- if (s.startsWith("-J")) {
- launcher.addVMArg(s.substring(2));
- } else {
- launcher.addToolArg(s);
- }
- }
- System.err.println("COMMAND: ");
- for (String cmd : launcher.getCommand()) {
- System.err.print(cmd + " ");
- }
- System.err.println();
- return ProcessTools.executeCommand(launcher.getCommand());
+ throws Exception {
+ List<String> args = new ArrayList<>(
+ listOf("-keystore", "ks", "-storepass", "changeit"));
+ args.addAll(extra);
+ return SecurityTools.jarsigner(args);
}
static OutputAnalyzer verify(String file, String... extra)
- throws Throwable {
+ throws Exception {
List<String> args = new ArrayList<>();
args.add("-verify");
+ args.add("-strict");
args.add(file);
args.addAll(Arrays.asList(extra));
return jarsigner(args);
}
- static void checkBadKU(String file) throws Throwable {
+ static void checkBadKU(String file) throws Exception {
System.err.println("BadKU: " + file);
verify(file)
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
.shouldContain("re-run jarsigner with debug enabled");
verify(file, "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("Signed by")
.shouldContain("treated as unsigned")
.shouldContain("re-run jarsigner with debug enabled");
verify(file, "-J-Djava.security.debug=jar")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("SignatureException: Key usage restricted")
.shouldContain("treated as unsigned")
.shouldContain("re-run jarsigner with debug enabled");
}
- static void checkWeak(String file) throws Throwable {
+ static void checkWeak(String file) throws Exception {
verify(file)
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
.shouldMatch("weak algorithm that is now disabled.")
.shouldMatch("Re-run jarsigner with the -verbose option for more details");
verify(file, "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
.shouldMatch("weak algorithm that is now disabled by")
.shouldMatch("Digest algorithm: .*weak")
@@ -462,18 +551,18 @@
.shouldNotMatch("Timestamp signature algorithm: .*weak.*weak")
.shouldMatch("Timestamp signature algorithm: .*key.*weak");
verify(file, "-J-Djava.security.debug=jar")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldMatch("SignatureException:.*disabled");
}
- static void checkHalfWeak(String file) throws Throwable {
+ static void checkHalfWeak(String file) throws Exception {
verify(file)
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
.shouldMatch("weak algorithm that is now disabled.")
.shouldMatch("Re-run jarsigner with the -verbose option for more details");
verify(file, "-verbose")
- .shouldHaveExitValue(0)
+ .shouldHaveExitValue(16)
.shouldContain("treated as unsigned")
.shouldMatch("weak algorithm that is now disabled by")
.shouldMatch("Digest algorithm: .*weak")
@@ -483,7 +572,7 @@
.shouldNotMatch("Timestamp signature algorithm: .*key.*weak");
}
- static void checkMultiple(String file) throws Throwable {
+ static void checkMultiple(String file) throws Exception {
verify(file)
.shouldHaveExitValue(0)
.shouldContain("jar verified");
@@ -500,7 +589,7 @@
static void checkTimestamp(String file, String policyId, String digestAlg)
throws Exception {
try (JarFile jf = new JarFile(file)) {
- JarEntry je = jf.getJarEntry("META-INF/OLD.RSA");
+ JarEntry je = jf.getJarEntry("META-INF/SIGNER.RSA");
try (InputStream is = jf.getInputStream(je)) {
byte[] content = IOUtils.readFully(is, -1, true);
PKCS7 p7 = new PKCS7(content);
@@ -526,26 +615,38 @@
static int which = 0;
/**
+ * Sign with a TSA path. Always use alias "signer" to sign "unsigned.jar".
+ * The signed jar name is always path.jar.
+ *
* @param extra more args given to jarsigner
*/
static OutputAnalyzer sign(String path, String... extra)
- throws Throwable {
- String alias = path.equals("badku") ? "badku" : "old";
- return signWithAliasAndTsa(path, "old.jar", alias, extra);
+ throws Exception {
+ return signVerbose(
+ path,
+ "unsigned.jar",
+ path + ".jar",
+ "signer",
+ extra);
}
- static OutputAnalyzer signWithAliasAndTsa (String path, String jar,
- String alias, String...extra) throws Throwable {
+ static OutputAnalyzer signVerbose(
+ String path, // TSA URL path
+ String oldJar,
+ String newJar,
+ String alias, // signer
+ String...extra) throws Exception {
which++;
- System.err.println("\n>> Test #" + which + ": " + Arrays.toString(extra));
+ System.out.println("\n>> Test #" + which);
List<String> args = new ArrayList<>();
- args.add("-J-Djava.security.egd=file:/dev/./urandom");
+ args.add("-strict");
+ args.add("-verbose");
args.add("-debug");
args.add("-signedjar");
- args.add(path + ".jar");
- args.add(jar);
+ args.add(newJar);
+ args.add(oldJar);
args.add(alias);
- if (!path.equals("none") && !path.equals("badku")) {
+ if (path != null) {
args.add("-tsa");
args.add(host + path);
}
@@ -554,24 +655,54 @@
}
static void prepare() throws Exception {
- jdk.testlibrary.JarUtils.createJar("old.jar", "A");
- Files.deleteIfExists(Paths.get("tsks"));
- keytool("-alias ca -genkeypair -ext bc -dname CN=CA");
- keytool("-alias old -genkeypair -dname CN=old");
+ JarUtils.createJar("unsigned.jar", "A");
+ Files.deleteIfExists(Paths.get("ks"));
+ keytool("-alias signer -genkeypair -ext bc -dname CN=signer");
+ keytool("-alias oldsigner -genkeypair -dname CN=oldsigner");
keytool("-alias dsakey -genkeypair -keyalg DSA -dname CN=dsakey");
keytool("-alias weakkeysize -genkeypair -keysize 512 -dname CN=weakkeysize");
keytool("-alias badku -genkeypair -dname CN=badku");
keytool("-alias ts -genkeypair -dname CN=ts");
- keytool("-alias tsweak -genkeypair -keysize 512 -dname CN=tsbad1");
+ keytool("-alias tsold -genkeypair -dname CN=tsold");
+ keytool("-alias tsweak -genkeypair -keysize 512 -dname CN=tsweak");
keytool("-alias tsbad1 -genkeypair -dname CN=tsbad1");
keytool("-alias tsbad2 -genkeypair -dname CN=tsbad2");
keytool("-alias tsbad3 -genkeypair -dname CN=tsbad3");
+ keytool("-alias tsnoca -genkeypair -dname CN=tsnoca");
- gencert("old");
+ // tsnoca's issuer will be removed from keystore later
+ keytool("-alias ca -genkeypair -ext bc -dname CN=CA");
+ gencert("tsnoca", "-ext eku:critical=ts");
+ keytool("-delete -alias ca");
+ keytool("-alias ca -genkeypair -ext bc -dname CN=CA -startdate -40d");
+
+ gencert("signer");
+ gencert("oldsigner", "-startdate -30d -validity 20");
gencert("dsakey");
gencert("weakkeysize");
gencert("badku", "-ext ku:critical=keyAgreement");
gencert("ts", "-ext eku:critical=ts");
+
+
+ for (int i = 0; i < 5; i++) {
+ // Issue another cert for "ts" with a different EKU.
+ // Length might be different because serial number is
+ // random. Try several times until a cert with the same
+ // length is generated so we can substitute ts.cert
+ // embedded in the PKCS7 block with ts2.cert.
+ // If cannot create one, related test will be ignored.
+ keytool("-gencert -alias ca -infile ts.req -outfile ts2.cert " +
+ "-ext eku:critical=1.3.6.1.5.5.7.3.9");
+ if (Files.size(Paths.get("ts.cert")) != Files.size(Paths.get("ts2.cert"))) {
+ Files.delete(Paths.get("ts2.cert"));
+ System.out.println("Warning: cannot create same length");
+ } else {
+ break;
+ }
+ }
+
+ gencert("tsold", "-ext eku:critical=ts -startdate -40d -validity 45");
+
gencert("tsweak", "-ext eku:critical=ts");
gencert("tsbad1");
gencert("tsbad2", "-ext eku=ts");
@@ -590,8 +721,16 @@
}
static void keytool(String cmd) throws Exception {
- cmd = "-keystore tsks -storepass changeit -keypass changeit " +
+ cmd = "-keystore ks -storepass changeit -keypass changeit " +
"-keyalg rsa -validity 200 " + cmd;
sun.security.tools.keytool.Main.main(cmd.split(" "));
}
+
+ static <K,V> Map<K,V> mapOf(K k1, V v1) {
+ return Collections.singletonMap(k1, v1);
+ }
+
+ static <E> List<E> listOf(E... elements) {
+ return Arrays.asList(elements);
+ }
}
diff --git a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java
index 811ffd9..96116e1 100644
--- a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java
+++ b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java
@@ -46,6 +46,7 @@
+ ".txt";
private static final String PASSWORD = "changeit";
private static final String KEYSTORE = "ks.jks";
+ private static final String CA_KEY_ALIAS = "ca";
private static final String SIGNING_KEY_ALIAS = "sign_alias";
private static final String TSA_KEY_ALIAS = "ts";
private static final String KEY_ALG = "RSA";
@@ -73,20 +74,52 @@
// look for free network port for TSA service
int port = jdk.testlibrary.Utils.getFreePort();
- String host = jdk.testlibrary.Utils.getHostname();
+ String host = "127.0.0.1";
String tsaUrl = "http://" + host + ":" + port;
// create key pair for jar signing
ProcessTools.executeCommand(KEYTOOL,
"-genkey",
+ "-alias", CA_KEY_ALIAS,
+ "-keyalg", KEY_ALG,
+ "-keysize", Integer.toString(KEY_SIZE),
+ "-keystore", KEYSTORE,
+ "-storepass", PASSWORD,
+ "-keypass", PASSWORD,
+ "-dname", "CN=CA",
+ "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0);
+ ProcessTools.executeCommand(KEYTOOL,
+ "-genkey",
"-alias", SIGNING_KEY_ALIAS,
"-keyalg", KEY_ALG,
"-keysize", Integer.toString(KEY_SIZE),
"-keystore", KEYSTORE,
"-storepass", PASSWORD,
"-keypass", PASSWORD,
- "-dname", "CN=Test",
- "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0);
+ "-dname", "CN=Test").shouldHaveExitValue(0);
+ ProcessTools.executeCommand(KEYTOOL,
+ "-certreq",
+ "-alias", SIGNING_KEY_ALIAS,
+ "-keystore", KEYSTORE,
+ "-storepass", PASSWORD,
+ "-keypass", PASSWORD,
+ "-file", "certreq").shouldHaveExitValue(0);
+ ProcessTools.executeCommand(KEYTOOL,
+ "-gencert",
+ "-alias", CA_KEY_ALIAS,
+ "-keystore", KEYSTORE,
+ "-storepass", PASSWORD,
+ "-keypass", PASSWORD,
+ "-validity", Integer.toString(VALIDITY),
+ "-infile", "certreq",
+ "-outfile", "cert").shouldHaveExitValue(0);
+ ProcessTools.executeCommand(KEYTOOL,
+ "-importcert",
+ "-alias", SIGNING_KEY_ALIAS,
+ "-keystore", KEYSTORE,
+ "-storepass", PASSWORD,
+ "-keypass", PASSWORD,
+ "-file", "cert").shouldHaveExitValue(0);
// create key pair for TSA service
// SubjectInfoAccess extension contains URL to TSA service
diff --git a/jdk/test/sun/security/tools/jarsigner/Warning.java b/jdk/test/sun/security/tools/jarsigner/Warning.java
new file mode 100644
index 0000000..095d205
--- /dev/null
+++ b/jdk/test/sun/security/tools/jarsigner/Warning.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * 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 jdk.testlibrary.JDKToolLauncher;
+import jdk.testlibrary.JarUtils;
+import jdk.testlibrary.OutputAnalyzer;
+import jdk.testlibrary.ProcessTools;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8024302 8026037 8130132
+ * @summary warnings, errors and -strict
+ * @library /lib/testlibrary
+ */
+public class Warning {
+
+ public static void main(String[] args) throws Throwable {
+
+ Files.deleteIfExists(Paths.get("ks"));
+
+ newCert("ca", "-validity 365000");
+
+ recreateJar();
+
+ newCert("a");
+ run("jarsigner", "a.jar a")
+ .shouldContain("is self-signed");
+ run("jarsigner", "a.jar a -strict")
+ .shouldContain("is self-signed")
+ .shouldHaveExitValue(4);
+ // Trusted entry can be self-signed without a warning
+ run("jarsigner", "-verify a.jar")
+ .shouldNotContain("is self-signed")
+ .shouldNotContain("not signed by alias in this keystore");
+ run("keytool", "-delete -alias a");
+ // otherwise a warning will be shown
+ run("jarsigner", "-verify a.jar")
+ .shouldContain("is self-signed")
+ .shouldContain("not signed by alias in this keystore");
+
+ recreateJar();
+
+ newCert("b");
+ issueCert("b");
+ run("jarsigner", "a.jar b")
+ .shouldNotContain("is self-signed");
+ run("jarsigner", "-verify a.jar")
+ .shouldNotContain("is self-signed");
+
+ run("jarsigner", "a.jar b -digestalg MD5")
+ .shouldContain("-digestalg option is considered a security risk.");
+ run("jarsigner", "a.jar b -digestalg MD5 -strict")
+ .shouldHaveExitValue(4)
+ .shouldContain("-digestalg option is considered a security risk.");
+ run("jarsigner", "a.jar b -sigalg MD5withRSA")
+ .shouldContain("-sigalg option is considered a security risk");
+
+ issueCert("b", "-sigalg MD5withRSA");
+ run("jarsigner", "a.jar b")
+ .shouldMatch("chain is invalid. Reason:.*MD5withRSA");
+
+ recreateJar();
+
+ newCert("c", "-keysize 512");
+ issueCert("c");
+ run("jarsigner", "a.jar c")
+ .shouldContain("chain is invalid. " +
+ "Reason: Algorithm constraints check failed");
+
+ recreateJar();
+
+ newCert("s1"); issueCert("s1", "-startdate 2000/01/01 -validity 36525");
+ run("jarsigner", "a.jar s1")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp").shouldContain("2100-01-01")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s1 -strict")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp").shouldContain("2100-01-01")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s1 -verify")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp").shouldContain("2100-01-01")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s1 -verify -strict")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp").shouldContain("2100-01-01")
+ .shouldNotContain("with signer errors");
+
+ recreateJar();
+
+ newCert("s2"); issueCert("s2", "-validity 100");
+ run("jarsigner", "a.jar s2")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp")
+ .shouldContain("will expire")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s2 -strict")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp")
+ .shouldContain("will expire")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s2 -verify")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp")
+ .shouldContain("will expire")
+ .shouldNotContain("with signer errors");
+ run("jarsigner", "a.jar s2 -verify -strict")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("Error:")
+ .shouldContain("timestamp")
+ .shouldContain("will expire")
+ .shouldNotContain("with signer errors");
+
+ recreateJar();
+
+ newCert("s3"); issueCert("s3", "-startdate -200d -validity 100");
+ run("jarsigner", "a.jar s3")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldContain("has expired")
+ .shouldNotContain("with signer errors")
+ .shouldNotContain("Error:");
+ run("jarsigner", "a.jar s3 -strict")
+ .shouldHaveExitValue(4)
+ .shouldContain("with signer errors")
+ .shouldMatch("(?s).*Error:.*has expired.*Warning:.*");
+ run("jarsigner", "a.jar s3 -verify")
+ .shouldHaveExitValue(0)
+ .shouldContain("Warning:")
+ .shouldNotContain("with signer errors")
+ .shouldNotContain("Error:");
+ run("jarsigner", "a.jar s3 -verify -strict")
+ .shouldHaveExitValue(4)
+ .shouldContain("with signer errors")
+ .shouldMatch("(?s).*Error:.*has expired.*Warning:.*");
+ }
+
+ // Creates a new jar without signature
+ static void recreateJar() throws Exception {
+ JarUtils.createJar("a.jar", "ks");
+ }
+
+ // Creates a self-signed cert for alias with zero or more -genkey options
+ static void newCert(String alias, String... more) throws Throwable {
+ String args = "-genkeypair -alias " + alias + " -dname CN=" + alias;
+ for (String s: more) {
+ args += " " + s;
+ }
+ run("keytool", args).shouldHaveExitValue(0);
+ }
+
+ // Asks ca to issue a cert to alias with zero or more -gencert options
+ static void issueCert(String alias, String...more) throws Throwable {
+ String req = run("keytool", "-certreq -alias " + alias)
+ .shouldHaveExitValue(0).getStdout();
+ String args = "-gencert -alias ca -rfc";
+ for (String s: more) {
+ args += " " + s;
+ }
+ String cert = run("keytool", args, req)
+ .shouldHaveExitValue(0).getStdout();
+ run("keytool", "-import -alias " + alias, cert).shouldHaveExitValue(0);
+ }
+
+ // Runs a java tool with command line arguments
+ static OutputAnalyzer run(String command, String args)
+ throws Throwable {
+ return run(command, args, null);
+ }
+
+ // Runs a java tool with command line arguments and an optional input block
+ static OutputAnalyzer run(String command, String args, String input)
+ throws Throwable {
+ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK(command);
+ launcher.addVMArg("-Duser.language=en").addVMArg("-Duser.country=US");
+ switch (command) {
+ case "keytool":
+ for (String s: new String[] {
+ "-keystore", "ks", "-storepass", "changeit",
+ "-storetype", "jks",
+ "-keypass", "changeit", "-keyalg", "rsa", "-debug"}) {
+ launcher.addToolArg(s);
+ }
+ break;
+ case "jarsigner":
+ for (String s: new String[] {
+ "-keystore", "ks", "-storepass", "changeit",
+ "-storetype", "jks"}) {
+ launcher.addToolArg(s);
+ }
+ break;
+ }
+ for (String arg: args.split(" ")) {
+ launcher.addToolArg(arg);
+ }
+ String[] cmd = launcher.getCommand();
+ ProcessBuilder pb = new ProcessBuilder(cmd);
+ OutputAnalyzer out = ProcessTools.executeProcess(pb, input);
+ System.out.println("======================");
+ System.out.println(Arrays.toString(cmd));
+ String msg = " stdout: [" + out.getStdout() + "];\n"
+ + " stderr: [" + out.getStderr() + "]\n"
+ + " exitValue = " + out.getExitValue() + "\n";
+ System.out.println(msg);
+ return out;
+ }
+}
+
diff --git a/jdk/test/sun/security/tools/jarsigner/checkusage.sh b/jdk/test/sun/security/tools/jarsigner/checkusage.sh
index ff2d1c5..5debcc0 100644
--- a/jdk/test/sun/security/tools/jarsigner/checkusage.sh
+++ b/jdk/test/sun/security/tools/jarsigner/checkusage.sh
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -91,7 +91,7 @@
#[ $RESULT = 0 ] || exit 2
# Test 3: When no keystore is specified, the error is only
-# "chain not validated"
+# "chain invalid"
$JARSIGNER -strict -verify a.jar
RESULT=$?
@@ -99,7 +99,7 @@
#[ $RESULT = 4 ] || exit 3
# Test 4: When unrelated keystore is specified, the error is
-# "chain not validated" and "not alias in keystore"
+# "chain invalid" and "not alias in keystore"
$JARSIGNER -keystore unrelated.jks -strict -verify a.jar
RESULT=$?
diff --git a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh
index 34e7b32..b9ec9e8 100644
--- a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh
+++ b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009, 2012, 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
@@ -22,10 +22,10 @@
#
# @test
-# @bug 6802846
+# @bug 6802846 8172529
# @summary jarsigner needs enhanced cert validation(options)
#
-# @run shell concise_jarsigner.sh
+# @run shell/timeout=240 concise_jarsigner.sh
#
if [ "${TESTJAVA}" = "" ] ; then
@@ -47,12 +47,15 @@
# Choose 1024-bit RSA to make sure it runs fine and fast on all platforms. In
# fact, every keyalg/keysize combination is OK for this test.
-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit -keystore js.jks -keyalg rsa -keysize 1024"
-JAR=$TESTJAVA${FS}bin${FS}jar
-JARSIGNER=$TESTJAVA${FS}bin${FS}jarsigner
-JAVAC=$TESTJAVA${FS}bin${FS}javac
+TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US"
-rm js.jks
+KS=js.ks
+KT="$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -storepass changeit -keypass changeit -keystore $KS -keyalg rsa -keysize 1024"
+JAR="$TESTJAVA${FS}bin${FS}jar ${TESTTOOLVMOPTS}"
+JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner ${TESTTOOLVMOPTS} -debug"
+JAVAC="$TESTJAVA${FS}bin${FS}javac ${TESTTOOLVMOPTS} ${TESTJAVACOPTS}"
+
+rm $KS
echo class A1 {} > A1.java
echo class A2 {} > A2.java
@@ -68,14 +71,14 @@
# First part: output format
# ==========================================================
-$KT -genkeypair -alias a1 -dname CN=a1 -validity 365
-$KT -genkeypair -alias a2 -dname CN=a2 -validity 365
+$KT -genkeypair -alias a1 -dname CN=a1 -validity 366
+$KT -genkeypair -alias a2 -dname CN=a2 -validity 366
# a.jar includes 8 unsigned, 2 signed by a1 and a2, 2 signed by a3
$JAR cvf a.jar A1.class A2.class
-$JARSIGNER -keystore js.jks -storepass changeit a.jar a1
+$JARSIGNER -keystore $KS -storepass changeit a.jar a1
$JAR uvf a.jar A3.class A4.class
-$JARSIGNER -keystore js.jks -storepass changeit a.jar a2
+$JARSIGNER -keystore $KS -storepass changeit a.jar a2
$JAR uvf a.jar A5.class A6.class
# Verify OK
@@ -87,15 +90,15 @@
[ $? = 20 ] || exit $LINENO
# 16(hasUnsignedEntry)
-$JARSIGNER -verify a.jar -strict -keystore js.jks
+$JARSIGNER -verify a.jar -strict -keystore $KS -storepass changeit
[ $? = 16 ] || exit $LINENO
# 16(hasUnsignedEntry)+32(notSignedByAlias)
-$JARSIGNER -verify a.jar a1 -strict -keystore js.jks
+$JARSIGNER -verify a.jar a1 -strict -keystore $KS -storepass changeit
[ $? = 48 ] || exit $LINENO
# 16(hasUnsignedEntry)
-$JARSIGNER -verify a.jar a1 a2 -strict -keystore js.jks
+$JARSIGNER -verify a.jar a1 a2 -strict -keystore $KS -storepass changeit
[ $? = 16 ] || exit $LINENO
# 12 entries all together
@@ -135,43 +138,52 @@
[ $LINES = 4 ] || exit $LINENO
# ==========================================================
-# Second part: exit code 2, 4, 8
+# Second part: exit code 2, 4, 8.
# 16 and 32 already covered in the first part
# ==========================================================
-$KT -genkeypair -alias expired -dname CN=expired -startdate -10m
-$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid -startdate +1m
-$KT -genkeypair -alias badku -dname CN=badku -ext KU=cRLSign -validity 365
-$KT -genkeypair -alias badeku -dname CN=badeku -ext EKU=sa -validity 365
-$KT -genkeypair -alias goodku -dname CN=goodku -ext KU=dig -validity 365
-$KT -genkeypair -alias goodeku -dname CN=goodeku -ext EKU=codesign -validity 365
-
-# badchain signed by ca, but ca is removed later
-$KT -genkeypair -alias badchain -dname CN=badchain -validity 365
$KT -genkeypair -alias ca -dname CN=ca -ext bc -validity 365
-$KT -certreq -alias badchain | $KT -gencert -alias ca -validity 365 | \
+$KT -genkeypair -alias expired -dname CN=expired
+$KT -certreq -alias expired | $KT -gencert -alias ca -startdate -10m | $KT -import -alias expired
+$KT -genkeypair -alias notyetvalid -dname CN=notyetvalid
+$KT -certreq -alias notyetvalid | $KT -gencert -alias ca -startdate +1m | $KT -import -alias notyetvalid
+$KT -genkeypair -alias badku -dname CN=badku
+$KT -certreq -alias badku | $KT -gencert -alias ca -ext KU=cRLSign -validity 365 | $KT -import -alias badku
+$KT -genkeypair -alias badeku -dname CN=badeku
+$KT -certreq -alias badeku | $KT -gencert -alias ca -ext EKU=sa -validity 365 | $KT -import -alias badeku
+$KT -genkeypair -alias goodku -dname CN=goodku
+$KT -certreq -alias goodku | $KT -gencert -alias ca -ext KU=dig -validity 365 | $KT -import -alias goodku
+$KT -genkeypair -alias goodeku -dname CN=goodeku
+$KT -certreq -alias goodeku | $KT -gencert -alias ca -ext EKU=codesign -validity 365 | $KT -import -alias goodeku
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar expired
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar notyetvalid
+[ $? = 4 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badku
+[ $? = 8 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badeku
+[ $? = 8 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar goodku
+[ $? = 0 ] || exit $LINENO
+
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar goodeku
+[ $? = 0 ] || exit $LINENO
+
+# badchain signed by ca1, but ca1 is removed later
+$KT -genkeypair -alias badchain -dname CN=badchain -validity 365
+$KT -genkeypair -alias ca1 -dname CN=ca1 -ext bc -validity 365
+$KT -certreq -alias badchain | $KT -gencert -alias ca1 -validity 365 | \
$KT -importcert -alias badchain
-$KT -delete -alias ca
+# save ca1.cert for easy replay
+$KT -exportcert -file ca1.cert -alias ca1
+$KT -delete -alias ca1
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar expired
-[ $? = 4 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar notyetvalid
-[ $? = 4 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badku
-[ $? = 8 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badeku
-[ $? = 8 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodku
-[ $? = 0 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar goodeku
-[ $? = 0 ] || exit $LINENO
-
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar badchain
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar badchain
[ $? = 4 ] || exit $LINENO
$JARSIGNER -verify a.jar
@@ -181,23 +193,55 @@
# Third part: -certchain test
# ==========================================================
-# altchain signed by ca2, but ca2 is removed later
+# altchain signed by ca2
$KT -genkeypair -alias altchain -dname CN=altchain -validity 365
$KT -genkeypair -alias ca2 -dname CN=ca2 -ext bc -validity 365
$KT -certreq -alias altchain | $KT -gencert -alias ca2 -validity 365 -rfc > certchain
$KT -exportcert -alias ca2 -rfc >> certchain
-$KT -delete -alias ca2
-# Now altchain is still self-signed
-$JARSIGNER -strict -keystore js.jks -storepass changeit a.jar altchain
+# Self-signed cert does not work
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar altchain
+[ $? = 4 ] || exit $LINENO
+
+# -certchain works
+$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
[ $? = 0 ] || exit $LINENO
-# If -certchain is used, then it's bad
-$JARSIGNER -strict -keystore js.jks -storepass changeit -certchain certchain a.jar altchain
+# if ca2 is removed, -certchain still work because altchain is a self-signed entry and
+# it is trusted by jarsigner
+# save ca2.cert for easy replay
+$KT -exportcert -file ca2.cert -alias ca2
+$KT -delete -alias ca2
+$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
+[ $? = 0 ] || exit $LINENO
+
+# if cert is imported, -certchain won't work because this certificate entry is not trusted
+$KT -importcert -file certchain -alias altchain -noprompt
+$JARSIGNER -strict -keystore $KS -storepass changeit -certchain certchain a.jar altchain
[ $? = 4 ] || exit $LINENO
$JARSIGNER -verify a.jar
[ $? = 0 ] || exit $LINENO
+# ==========================================================
+# 8172529
+# ==========================================================
+
+$KT -genkeypair -alias ee -dname CN=ee
+$KT -genkeypair -alias caone -dname CN=caone
+$KT -genkeypair -alias catwo -dname CN=catwo
+
+$KT -certreq -alias ee | $KT -gencert -alias catwo -rfc > ee.cert
+$KT -certreq -alias catwo | $KT -gencert -alias caone -sigalg MD5withRSA -rfc > catwo.cert
+
+# This certchain contains a cross-signed weak catwo.cert
+cat ee.cert catwo.cert | $KT -importcert -alias ee
+
+$JAR cvf a.jar A1.class
+$JARSIGNER -strict -keystore $KS -storepass changeit a.jar ee
+[ $? = 0 ] || exit $LINENO
+$JARSIGNER -strict -keystore $KS -storepass changeit -verify a.jar
+[ $? = 0 ] || exit $LINENO
+
echo OK
exit 0
diff --git a/jdk/test/sun/security/tools/jarsigner/ec.sh b/jdk/test/sun/security/tools/jarsigner/ec.sh
index fc66bbc..442e854 100644
--- a/jdk/test/sun/security/tools/jarsigner/ec.sh
+++ b/jdk/test/sun/security/tools/jarsigner/ec.sh
@@ -53,11 +53,20 @@
echo A > A
$JAR cvf $JFILE A
-$KT -alias a -dname CN=a -keyalg ec -genkey -validity 300 || exit 11
-$KT -alias b -dname CN=b -keyalg ec -genkey -validity 300 || exit 12
+$KT -alias ca -dname CN=ca -keyalg ec -genkey -validity 300 || exit 11
+
+$KT -alias a -dname CN=a -keyalg ec -genkey || exit 11
+$KT -alias a -certreq | $KT -gencert -alias ca -validity 300 | $KT -import -alias a || exit 111
+
+$KT -alias b -dname CN=b -keyalg ec -genkey || exit 12
+$KT -alias b -certreq | $KT -gencert -alias ca -validity 300 | $KT -import -alias b || exit 121
+
# Ensure that key length is sufficient for the intended hash (SHA512withECDSA)
-$KT -alias c -dname CN=c -keyalg ec -genkey -validity 300 -keysize 521 || exit 13
+$KT -alias c -dname CN=c -keyalg ec -genkey -keysize 521 || exit 13
+$KT -alias c -certreq | $KT -gencert -alias ca -validity 300 | $KT -import -alias c || exit 131
+
$KT -alias x -dname CN=x -keyalg ec -genkey -validity 300 || exit 14
+$KT -alias x -certreq | $KT -gencert -alias ca -validity 300 | $KT -import -alias x || exit 141
$JARSIGNER -keystore $KS -storepass changeit $JFILE a -debug -strict || exit 21
$JARSIGNER -keystore $KS -storepass changeit $JFILE b -debug -strict -sigalg SHA1withECDSA || exit 22
diff --git a/jdk/test/sun/security/tools/jarsigner/onlymanifest.sh b/jdk/test/sun/security/tools/jarsigner/onlymanifest.sh
index 37551a8..bbc90a1 100644
--- a/jdk/test/sun/security/tools/jarsigner/onlymanifest.sh
+++ b/jdk/test/sun/security/tools/jarsigner/onlymanifest.sh
@@ -57,12 +57,14 @@
echo "Key: Value" > manifest
$JAR cvfm $JFILE manifest
-$KT -alias a -dname CN=a -genkey -validity 300 || exit 1
-$JARSIGNER -keystore $KS -storepass changeit $JFILE a -debug -strict || exit 2
+$KT -alias ca -dname CN=ca -genkey -validity 300 || exit 1
+$KT -alias a -dname CN=a -genkey -validity 300 || exit 2
+$KT -alias a -certreq | $KT -gencert -alias ca -validity 300 | $KT -import -alias a || exit 3
+$JARSIGNER -keystore $KS -storepass changeit $JFILE a -debug -strict || exit 4
$JARSIGNER -keystore $KS -storepass changeit -verify $JFILE a -debug -strict \
- > onlymanifest.out || exit 3
+ > onlymanifest.out || exit 5
-grep unsigned onlymanifest.out && exit 4
+grep unsigned onlymanifest.out && exit 6
exit 0
diff --git a/jdk/test/sun/security/tools/jarsigner/warnings.sh b/jdk/test/sun/security/tools/jarsigner/warnings.sh
deleted file mode 100644
index fbe7455..0000000
--- a/jdk/test/sun/security/tools/jarsigner/warnings.sh
+++ /dev/null
@@ -1,119 +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.
-#
-
-# @test
-# @bug 8024302
-# @bug 8026037
-# @summary Clarify jar verifications
-#
-
-if [ "${TESTJAVA}" = "" ] ; then
- JAVAC_CMD=`which javac`
- TESTJAVA=`dirname $JAVAC_CMD`/..
-fi
-
-# set platform-dependent variables
-OS=`uname -s`
-case "$OS" in
- Windows_* )
- FS="\\"
- ;;
- * )
- FS="/"
- ;;
-esac
-
-KS=warnings.jks
-JFILE=warnings.jar
-
-KT="$TESTJAVA${FS}bin${FS}keytool -storepass changeit -keypass changeit \
- -keystore $KS"
-JAR=$TESTJAVA${FS}bin${FS}jar
-JARSIGNER="$TESTJAVA${FS}bin${FS}jarsigner -keystore $KS -storepass changeit"
-
-rm $KS 2> /dev/null
-
-LANG=C
-export LANG
-
-echo 12345 > file
-
-ERR=""
-
-# Normal signer expiring on 2100-01-01
-$KT -alias s1 -dname CN=s1 -genkey -startdate 2000/01/01 -validity 36525 || ERR="$ERR keytool s1,"
-# Cert expiring soon, informational warning
-$KT -alias s2 -dname CN=s2 -genkey -validity 100 || ERR="$ERR keytool s2,"
-# Cert expired, severe warning
-$KT -alias s3 -dname CN=s3 -genkey -startdate -200d -validity 100 || ERR="$ERR keytool s3,"
-
-# noTimestamp is informatiional warning and includes a date
-$JAR cvf $JFILE file
-$JARSIGNER $JFILE s1 > output1 || ERR="$ERR jarsigner s1,"
-$JARSIGNER -strict $JFILE s1 >> output1 || ERR="$ERR jarsigner s1 strict,"
-$JARSIGNER -verify $JFILE s1 >> output1 || ERR="$ERR jarsigner s1,"
-$JARSIGNER -verify -strict $JFILE s1 >> output1 || ERR="$ERR jarsigner s1 strict,"
-
-cat output1 | grep Warning || ERR="$ERR s1 warning,"
-cat output1 | grep Error && ERR="$ERR s1 error,"
-cat output1 | grep timestamp | grep 2100-01-01 || ERR="$ERR s1 timestamp,"
-cat output1 | grep "with signer errors" && ERR="$ERR s1 err,"
-
-# hasExpiringCert is informatiional warning
-$JAR cvf $JFILE file
-$JARSIGNER $JFILE s2 > output2 || ERR="$ERR jarsigner s2,"
-$JARSIGNER -strict $JFILE s2 >> output2 || ERR="$ERR jarsigner s2 strict,"
-$JARSIGNER -verify $JFILE s2 >> output2 || ERR="$ERR jarsigner s2,"
-$JARSIGNER -verify -strict $JFILE s2 >> output2 || ERR="$ERR jarsigner s2 strict,"
-
-cat output2 | grep Warning || ERR="$ERR s2 warning,"
-cat output2 | grep Error && ERR="$ERR s2 error,"
-cat output2 | grep timestamp || ERR="$ERR s2 timestamp,"
-cat output2 | grep "will expire" || ERR="$ERR s2 expiring,"
-cat output2 | grep "with signer errors" && ERR="$ERR s2 err,"
-
-# hasExpiredCert is severe warning
-$JAR cvf $JFILE file
-$JARSIGNER $JFILE s3 > output3 || ERR="$ERR jarsigner s3,"
-$JARSIGNER -strict $JFILE s3 > output3s && ERR="$ERR jarsigner s3 strict,"
-$JARSIGNER -verify $JFILE s3 >> output3 || ERR="$ERR jarsigner s3,"
-$JARSIGNER -verify -strict $JFILE s3 >> output3s && ERR="$ERR jarsigner s3 strict,"
-
-# warning without -strict
-cat output3 | grep Warning || ERR="$ERR s3 warning,"
-cat output3 | grep Error && ERR="$ERR s3 error,"
-cat output3 | grep "with signer errors" && ERR="$ERR s3 err,"
-
-# error with -strict
-cat output3s | grep Warning || ERR="$ERR s3s warning,"
-cat output3s | grep Error || ERR="$ERR s3s error,"
-cat output3s | grep "with signer errors" || ERR="$ERR s3 err,"
-
-if [ "$ERR" = "" ]; then
- exit 0
-else
- echo "ERR is $ERR"
- exit 1
-fi
-
-
diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/Test.java b/jdk/test/sun/security/tools/jarsigner/warnings/Test.java
index 999789a..5688d61 100644
--- a/jdk/test/sun/security/tools/jarsigner/warnings/Test.java
+++ b/jdk/test/sun/security/tools/jarsigner/warnings/Test.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -63,7 +63,7 @@
static final String CHAIN_NOT_VALIDATED_VERIFYING_WARNING
= "This jar contains entries "
- + "whose certificate chain is not validated.";
+ + "whose certificate chain is invalid.";
static final String ALIAS_NOT_IN_STORE_VERIFYING_WARNING
= "This jar contains signed entries "
@@ -95,7 +95,7 @@
+ "doesn't allow code signing.";
static final String CHAIN_NOT_VALIDATED_SIGNING_WARNING
- = "The signer's certificate chain is not validated.";
+ = "The signer's certificate chain is invalid.";
static final String HAS_EXPIRING_CERT_SIGNING_WARNING
= "The signer certificate will expire within six months.";
diff --git a/jdk/test/sun/security/tools/jarsigner/weaksize.sh b/jdk/test/sun/security/tools/jarsigner/weaksize.sh
new file mode 100644
index 0000000..28aad3d
--- /dev/null
+++ b/jdk/test/sun/security/tools/jarsigner/weaksize.sh
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+# 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 8044755
+# @summary Add a test for algorithm constraints check in jarsigner
+#
+
+if [ "${TESTJAVA}" = "" ] ; then
+ JAVAC_CMD=`which javac`
+ TESTJAVA=`dirname $JAVAC_CMD`/..
+fi
+
+# The sigalg used is MD2withRSA, which is obsolete.
+
+KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks
+ -storepass changeit -keypass changeit
+ -keyalg rsa -sigalg MD2withRSA -debug"
+JS="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS} -keystore ks
+ -storepass changeit -strict -debug"
+JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}"
+
+rm ks 2> /dev/null
+
+$KT -genkeypair -alias ca -dname CN=CA -ext bc
+$KT -genkeypair -alias signer -dname CN=Signer
+
+$KT -certreq -alias signer | \
+ $KT -gencert -alias ca -ext ku=dS -rfc | \
+ $KT -importcert -alias signer
+
+$JAR cvf a.jar ks
+
+# We always trust a TrustedCertificateEntry
+$JS a.jar ca | grep "chain is invalid" && exit 1
+
+# An end-entity cert must follow algorithm constraints
+$JS a.jar signer | grep "chain is invalid" || exit 2
+
+exit 0
diff --git a/jdk/test/sun/security/validator/EndEntityExtensionCheck.java b/jdk/test/sun/security/validator/EndEntityExtensionCheck.java
new file mode 100644
index 0000000..122bae2
--- /dev/null
+++ b/jdk/test/sun/security/validator/EndEntityExtensionCheck.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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 8076117
+ * @summary EndEntityChecker should not process custom extensions
+ * after PKIX validation
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.security.cert.CertPathValidatorException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.PKIXBuilderParameters;
+import java.security.cert.PKIXCertPathChecker;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import sun.security.validator.KeyStores;
+import sun.security.validator.Validator;
+
+
+public class EndEntityExtensionCheck {
+
+ /*
+ * Owner: CN=TestCA
+ * Issuer: CN=TestCA
+ */
+ private static final String CA =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIICgDCCAj2gAwIBAgIEC18hWjALBgcqhkjOOAQDBQAwETEPMA0GA1UEAxMGVGVz\n" +
+ "dENBMB4XDTE1MDQwNzIyMzUyMFoXDTI1MDQwNjIyMzUyMFowETEPMA0GA1UEAxMG\n" +
+ "VGVzdENBMIIBuDCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2\n" +
+ "EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdr\n" +
+ "mVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXz\n" +
+ "rith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+Gghdab\n" +
+ "Pd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6Ewo\n" +
+ "FhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhR\n" +
+ "kImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYUAAoGBAJOWy2hVy4iNwsi/idWG\n" +
+ "oksr9IZxQIFR2YavoUmD+rIgfYUpiCihzftDLMMaNYqp9PPxuOyoIPGPbwmKpAs5\n" +
+ "nq6gLwH2lSsN+EwyV2SJ0J26PHiMuRNZWWfKR3cpEqbQVb0CmvqSpj8zYfamPzp7\n" +
+ "eXSWwahzgLCGJM3SgCfDFC0uoyEwHzAdBgNVHQ4EFgQU7tLD8FnWM+r6jBr+mCXs\n" +
+ "8G5yBpgwCwYHKoZIzjgEAwUAAzAAMC0CFQCHCtzC3S0ST0EZBucikVui4WXD8QIU\n" +
+ "L3Oxy6989/FhZlZWJlhqc1ungEQ=\n" +
+ "-----END CERTIFICATE-----";
+
+ /*
+ * Owner: CN=TestEE
+ * Issuer: CN=TestCA
+ * Contains a custom critical extension with OID 1.2.3.4:
+ * #1: ObjectId: 1.2.3.4 Criticality=true
+ * 0000: 00 00
+ */
+ private static final String EE =
+ "-----BEGIN CERTIFICATE-----\n" +
+ "MIICrTCCAmugAwIBAgIELjciKzALBgcqhkjOOAQDBQAwETEPMA0GA1UEAxMGVGVz\n" +
+ "dENBMB4XDTE1MDQwNzIzMDA1OFoXDTE1MDcwNjIzMDA1OFowETEPMA0GA1UEAxMG\n" +
+ "VGVzdEVFMIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2\n" +
+ "EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdr\n" +
+ "mVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXz\n" +
+ "rith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+Gghdab\n" +
+ "Pd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6Ewo\n" +
+ "FhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhR\n" +
+ "kImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAN97otrAJEuUg/O97vScI\n" +
+ "01xs1jqTz5o0PGpKiDDJNB3tCCUbLqXoBQBvSefQ8vYL3mmlEJLxlwfbajRmJQp0\n" +
+ "tUy5SUCZHk3MdoKxSvrqYnVpYwJHFXKWs6lAawxfuWbkm9SREuepOWnVzy2ecf5z\n" +
+ "hvy9mgEBfi4E9Cy8Byq2TpyjUDBOMAwGAyoDBAEB/wQCAAAwHwYDVR0jBBgwFoAU\n" +
+ "7tLD8FnWM+r6jBr+mCXs8G5yBpgwHQYDVR0OBBYEFNRVqt5F+EAuJ5x1IZLDkoMs\n" +
+ "mDj4MAsGByqGSM44BAMFAAMvADAsAhQyNGhxIp5IshN1zqLs4pUY214IMAIUMmTL\n" +
+ "3ZMpMAjITbuHHlFNUqZ7A9s=\n" +
+ "-----END CERTIFICATE-----";
+
+ public static void main(String[] args) throws Exception {
+ X509Certificate[] chain = createChain();
+
+ /* Test 1: Test SimpleValidator
+ * SimpleValidator doesn't check for unsupported critical
+ * extensions in the end entity certificate, and leaves that up
+ * to EndEntityChecker, which should catch such extensions.
+ */
+ KeyStore ks = KeyStore.getInstance("JKS");
+ ks.load(null, null);
+ ks.setCertificateEntry("testca", chain[chain.length - 1]);
+
+ Validator v = Validator.getInstance(Validator.TYPE_SIMPLE,
+ Validator.VAR_TLS_CLIENT,
+ KeyStores.getTrustedCerts(ks));
+ try {
+ v.validate(chain);
+ throw new Exception("Chain should not have validated " +
+ "successfully.");
+ } catch (CertificateException ex) {
+ // EE cert has an unsupported critical extension that is not
+ // checked by SimpleValidator's extension checks, so this
+ // failure is expected
+ }
+
+ /* Test 2: Test PKIXValidator without custom checker
+ * PKIXValidator accepts PKIXParameters that can contain
+ * custom PKIXCertPathCheckers, which would be run against
+ * each cert in the chain, including EE certs.
+ * Check that if PKIXValidator is not provided a custom
+ * PKIXCertPathChecker for an unknown critical extension in
+ * the EE cert, chain validation will fail.
+ */
+ TrustAnchor ta = new TrustAnchor(chain[chain.length - 1], null);
+ Set<TrustAnchor> tas = new HashSet<>();
+ tas.add(ta);
+ PKIXBuilderParameters params = new PKIXBuilderParameters(tas, null);
+ params.setDate(new Date(115, 5, 1)); // 2015-05-01
+ params.setRevocationEnabled(false);
+
+ v = Validator.getInstance(Validator.TYPE_PKIX,
+ Validator.VAR_TLS_CLIENT,
+ params);
+ try {
+ v.validate(chain);
+ throw new Exception("Chain should not have validated " +
+ "successfully.");
+ } catch (CertificateException ex) {
+ // EE cert has an unsupported critical extension and
+ // PKIXValidator was not provided any custom checker
+ // for it, so this failure ie expected.
+ }
+
+ /* Test 3: Test PKIXValidator with custom checker
+ * Check that PKIXValidator will successfully validate a chain
+ * containing an EE cert with a critical custom extension, given
+ * a corresponding PKIXCertPathChecker for the extension.
+ */
+ params = new PKIXBuilderParameters(tas, null);
+ params.addCertPathChecker(new CustomChecker());
+ params.setDate(new Date(115, 5, 1)); // 2015-05-01
+ params.setRevocationEnabled(false);
+
+ v = Validator.getInstance(Validator.TYPE_PKIX,
+ Validator.VAR_TLS_CLIENT,
+ params);
+ v.validate(chain); // This should validate successfully
+
+ System.out.println("Tests passed.");
+ }
+
+ public static X509Certificate[] createChain() throws Exception {
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate ee = (X509Certificate)
+ cf.generateCertificate((new ByteArrayInputStream(EE.getBytes())));
+ X509Certificate ca = (X509Certificate)
+ cf.generateCertificate((new ByteArrayInputStream(CA.getBytes())));
+
+ X509Certificate[] chain = {ee, ca};
+ return chain;
+ }
+
+ /*
+ * A custom PKIXCertPathChecker. Looks for a critical extension
+ * in an end entity certificate with the OID 1.2.3.4.
+ */
+ static class CustomChecker extends PKIXCertPathChecker {
+
+ @Override
+ public void init(boolean forward) throws CertPathValidatorException {
+ // nothing to do
+ }
+
+ @Override
+ public boolean isForwardCheckingSupported() {
+ return false;
+ }
+
+ @Override
+ public Set<String> getSupportedExtensions() {
+ Set<String> exts = new HashSet<>();
+ exts.add("1.2.3.4");
+ return exts;
+ }
+
+ @Override
+ public void check(Certificate cert,
+ Collection<String> unresolvedCritExts)
+ throws CertPathValidatorException {
+ X509Certificate currCert = (X509Certificate)cert;
+ // check that this is an EE cert
+ if (currCert.getBasicConstraints() == -1) {
+ if (unresolvedCritExts != null &&
+ !unresolvedCritExts.isEmpty()) {
+ unresolvedCritExts.remove("1.2.3.4");
+ }
+ }
+ }
+
+ }
+}
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/VERSION b/jdk/test/sun/util/calendar/zi/tzdata/VERSION
index 561bd27..22002be 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION
+++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION
@@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
-tzdata2018c
+tzdata2018e
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/africa b/jdk/test/sun/util/calendar/zi/tzdata/africa
index 92c0b43ec..1c305f8 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/africa
+++ b/jdk/test/sun/util/calendar/zi/tzdata/africa
@@ -29,7 +29,7 @@
# tz@iana.org for general use in the future). For more, please see
# the file CONTRIBUTING in the tz distribution.
-# From Paul Eggert (2017-02-20):
+# From Paul Eggert (2017-04-09):
#
# Unless otherwise specified, the source for data through 1990 is:
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
@@ -75,7 +75,7 @@
# cannot now come up with solid citations.
#
# I invented the following abbreviations; corrections are welcome!
-# +02 WAST West Africa Summer Time
+# +02 WAST West Africa Summer Time (no longer used)
# +03 CAST Central Africa Summer Time (no longer used)
# +03 SAST South Africa Summer Time (no longer used)
# +03 EAT East Africa Time
@@ -138,13 +138,13 @@
# Cape Verde / Cabo Verde
#
+# From Paul Eggert (2018-02-16):
# Shanks gives 1907 for the transition to +02.
-# Perhaps the 1911-05-26 Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# merely made it official?
+# For now, ignore that and follow the 1911-05-26 Portuguese decree
+# (see Europe/Lisbon).
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Atlantic/Cape_Verde -1:34:04 - LMT 1907 # Praia
+Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
-2:00 - -02 1942 Sep
-2:00 1:00 -01 1945 Oct 15
-2:00 - -02 1975 Nov 25 2:00
@@ -393,15 +393,34 @@
# See Africa/Abidjan.
# Ghana
-# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+
+# From Paul Eggert (2018-01-30):
# Whitman says DST was observed from 1931 to "the present";
-# Shanks & Pottenger say 1936 to 1942;
-# and September 1 to January 1 is given by:
-# Scott Keltie J, Epstein M (eds), The Statesman's Year-Book,
-# 57th ed. Macmillan, London (1920), OCLC 609408015, pp xxviii.
-# For lack of better info, assume DST was observed from 1920 to 1942.
-Rule Ghana 1920 1942 - Sep 1 0:00 0:20 GHST
-Rule Ghana 1920 1942 - Dec 31 0:00 0 GMT
+# Shanks & Pottenger say 1936 to 1942 with 20 minutes of DST,
+# with transitions on 09-01 and 12-31 at 00:00.
+# Page 33 of Parish GCB, Colonial Reports - Annual. No. 1066. Gold
+# Coast. Report for 1919. (March 1921), OCLC 784024077
+# http://libsysdigi.library.illinois.edu/ilharvest/africana/books2011-05/5530214/5530214_1919/5530214_1919_opt.pdf
+# lists the Determination of the Time Ordinance, 1919, No. 18,
+# "to advance the time observed locally by the space of twenty minutes
+# during the last four months of each year; the object in view being
+# to extend during those months the period of daylight-time available
+# for evening recreation after office hours."
+# Vanessa Ogle, The Global Transformation of Time, 1870-1950 (2015), p 33,
+# writes "In 1919, the Gold Coast (Ghana as of 1957) made Greenwich
+# time its legal time and simultaneously legalized a summer time of
+# UTC - 00:20 minutes from March to October."; a footnote lists
+# the ordinance as being dated 1919-11-24.
+# The Crown Colonist, Volume 12 (1942), p 176, says "the Government
+# intend advancing Gold Coast time half an hour ahead of G.M.T.
+# The actual date of the alteration has not yet been announced."
+# These sources are incomplete and contradictory. Possibly what is
+# now Ghana observed different DST regimes in different years. For
+# lack of better info, use Shanks except treat the minus sign as a
+# typo, and assume DST started in 1920 not 1936.
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Ghana 1920 1942 - Sep 1 0:00 0:20 -
+Rule Ghana 1920 1942 - Dec 31 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Accra -0:00:52 - LMT 1918
0:00 Ghana GMT/+0020
@@ -411,13 +430,13 @@
# Guinea-Bissau
#
+# From Paul Eggert (2018-02-16):
# Shanks gives 1911-05-26 for the transition to WAT,
# evidently confusing the date of the Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# with the date that it took effect, namely 1912-01-01.
+# (see Europe/Lisbon) with the date that it took effect.
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1
+Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
-1:00 - -01 1975
0:00 - GMT
@@ -613,9 +632,9 @@
# at 2am (or 02:00) local time..."
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Mauritius 1982 only - Oct 10 0:00 1:00 S
+Rule Mauritius 1982 only - Oct 10 0:00 1:00 -
Rule Mauritius 1983 only - Mar 21 0:00 0 -
-Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 S
+Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
@@ -971,6 +990,10 @@
# commence at OOhOO on Monday 21 March 1994 and shall end at 02h00 on
# Sunday 4 September 1994.
+# From Michael Deckers (2017-04-06):
+# ... both summer and winter time are called "standard"
+# (which differs from the use in Ireland) ...
+
# From Petronella Sibeene (2007-03-30):
# http://allafrica.com/stories/200703300178.html
# While the entire country changes its time, Katima Mulilo and other
@@ -996,19 +1019,42 @@
# the same time they would normally start DST, the first Sunday in September:
# https://www.timeanddate.com/news/time/namibia-new-time-zone.html
+# From Paul Eggert (2017-04-09):
+# Before the change, summer and winter time were both standard time legally.
+# However in common parlance, winter time was considered to be DST. See, e.g.:
+# http://www.nbc.na/news/namibias-winter-time-could-be-scrapped.2706
+# https://zone.my.na/news/times-are-changing-in-namibia
+# https://www.newera.com.na/2017/02/23/namibias-winter-time-might-be-repealed/
+# Use plain "WAT" and "CAT" for the time zone abbreviations, to be compatible
+# with Namibia's neighbors.
+
# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Namibia 1994 only - Mar 21 0:00 0 -
-Rule Namibia 1994 2016 - Sep Sun>=1 2:00 1:00 S
-Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 -
+# Vanguard section, for zic and other parsers that support negative DST.
+#Rule Namibia 1994 only - Mar 21 0:00 -1:00 WAT
+#Rule Namibia 1994 2017 - Sep Sun>=1 2:00 0 CAT
+#Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
+# Rearguard section, for parsers that do not support negative DST.
+Rule Namibia 1994 only - Mar 21 0:00 0 WAT
+Rule Namibia 1994 2017 - Sep Sun>=1 2:00 1:00 CAT
+Rule Namibia 1995 2017 - Apr Sun>=1 2:00 0 WAT
+# End of rearguard section.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
1:30 - +0130 1903 Mar
2:00 - SAST 1942 Sep 20 2:00
2:00 1:00 SAST 1943 Mar 21 2:00
2:00 - SAST 1990 Mar 21 # independence
+# Vanguard section, for zic and other parsers that support negative DST.
+# 2:00 Namibia %s
+# Rearguard section, for parsers that do not support negative DST.
2:00 - CAT 1994 Mar 21 0:00
- 1:00 Namibia WA%sT 2017 Sep 3 2:00
+# From Paul Eggert (2017-04-07):
+# The official date of the 2017 rule change was 2017-10-24. See:
+# http://www.lac.org.na/laws/annoSTAT/Namibian%20Time%20Act%209%20of%202017.pdf
+ 1:00 Namibia %s 2017 Oct 24
2:00 - CAT
+# End of rearguard section.
# Niger
# See Africa/Lagos.
@@ -1060,6 +1106,8 @@
# São Tomé and Príncipe
+# See Europe/Lisbon for info about the 1912 transition.
+
# From Steffen Thorsen (2018-01-08):
# Multiple sources tell that São Tomé changed from UTC to UTC+1 as
# they entered the year 2018.
@@ -1068,7 +1116,7 @@
# http://www.mnec.gov.st/index.php/publicacoes/documentos/file/90-decreto-lei-n-25-2017
Zone Africa/Sao_Tome 0:26:56 - LMT 1884
- -0:36:45 - LMT 1912 # Lisbon Mean Time
+ -0:36:45 - LMT 1912 Jan 1 00:00u # Lisbon MT
0:00 - GMT 2018 Jan 1 01:00
1:00 - WAT
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/antarctica b/jdk/test/sun/util/calendar/zi/tzdata/antarctica
index c78ef7e..74ce2dc 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/antarctica
+++ b/jdk/test/sun/util/calendar/zi/tzdata/antarctica
@@ -98,7 +98,8 @@
8:00 - +08 2011 Oct 28 2:00
11:00 - +11 2012 Feb 21 17:00u
8:00 - +08 2016 Oct 22
- 11:00 - +11
+ 11:00 - +11 2018 Mar 11 4:00
+ 8:00 - +08
Zone Antarctica/Davis 0 - -00 1957 Jan 13
7:00 - +07 1964 Nov
0 - -00 1969 Feb
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/asia b/jdk/test/sun/util/calendar/zi/tzdata/asia
index c281ece..877f53d 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/asia
+++ b/jdk/test/sun/util/calendar/zi/tzdata/asia
@@ -92,13 +92,13 @@
Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S
Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 -
Rule EUAsia 1996 max - Oct lastSun 1:00u 0 -
-Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 S
+Rule E-EurAsia 1981 max - Mar lastSun 0:00 1:00 -
Rule E-EurAsia 1979 1995 - Sep lastSun 0:00 0 -
Rule E-EurAsia 1996 max - Oct lastSun 0:00 0 -
-Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 S
+Rule RussiaAsia 1981 1984 - Apr 1 0:00 1:00 -
Rule RussiaAsia 1981 1983 - Oct 1 0:00 0 -
Rule RussiaAsia 1984 1995 - Sep lastSun 2:00s 0 -
-Rule RussiaAsia 1985 2010 - Mar lastSun 2:00s 1:00 S
+Rule RussiaAsia 1985 2010 - Mar lastSun 2:00s 1:00 -
Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
# Afghanistan
@@ -133,7 +133,7 @@
# (brief)
# http://www.worldtimezone.com/dst_news/dst_news_armenia03.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 S
+Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
@@ -159,7 +159,7 @@
# http://en.apa.az/xeber_azerbaijan_abolishes_daylight_savings_ti_240862.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 S
+Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Baku 3:19:24 - LMT 1924 May 2
@@ -246,7 +246,7 @@
# http://www.worldtimezone.com/dst_news/dst_news_bangladesh06.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Dhaka 2009 only - Jun 19 23:00 1:00 S
+Rule Dhaka 2009 only - Jun 19 23:00 1:00 -
Rule Dhaka 2009 only - Dec 31 24:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -787,8 +787,9 @@
Rule Macau 1975 1977 - Apr Sun>=15 3:30 1:00 D
Rule Macau 1978 1980 - Apr Sun>=15 0:00 1:00 D
Rule Macau 1978 1980 - Oct Sun>=15 0:00 0 S
+# See Europe/Lisbon for info about the 1912 transition.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Macau 7:34:20 - LMT 1912 Jan 1
+Zone Asia/Macau 7:34:20 - LMT 1911 Dec 31 16:00u
8:00 Macau C%sT
@@ -1129,61 +1130,61 @@
# thirtieth day of Shahrivar.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iran 1978 1980 - Mar 21 0:00 1:00 D
-Rule Iran 1978 only - Oct 21 0:00 0 S
-Rule Iran 1979 only - Sep 19 0:00 0 S
-Rule Iran 1980 only - Sep 23 0:00 0 S
-Rule Iran 1991 only - May 3 0:00 1:00 D
-Rule Iran 1992 1995 - Mar 22 0:00 1:00 D
-Rule Iran 1991 1995 - Sep 22 0:00 0 S
-Rule Iran 1996 only - Mar 21 0:00 1:00 D
-Rule Iran 1996 only - Sep 21 0:00 0 S
-Rule Iran 1997 1999 - Mar 22 0:00 1:00 D
-Rule Iran 1997 1999 - Sep 22 0:00 0 S
-Rule Iran 2000 only - Mar 21 0:00 1:00 D
-Rule Iran 2000 only - Sep 21 0:00 0 S
-Rule Iran 2001 2003 - Mar 22 0:00 1:00 D
-Rule Iran 2001 2003 - Sep 22 0:00 0 S
-Rule Iran 2004 only - Mar 21 0:00 1:00 D
-Rule Iran 2004 only - Sep 21 0:00 0 S
-Rule Iran 2005 only - Mar 22 0:00 1:00 D
-Rule Iran 2005 only - Sep 22 0:00 0 S
-Rule Iran 2008 only - Mar 21 0:00 1:00 D
-Rule Iran 2008 only - Sep 21 0:00 0 S
-Rule Iran 2009 2011 - Mar 22 0:00 1:00 D
-Rule Iran 2009 2011 - Sep 22 0:00 0 S
-Rule Iran 2012 only - Mar 21 0:00 1:00 D
-Rule Iran 2012 only - Sep 21 0:00 0 S
-Rule Iran 2013 2015 - Mar 22 0:00 1:00 D
-Rule Iran 2013 2015 - Sep 22 0:00 0 S
-Rule Iran 2016 only - Mar 21 0:00 1:00 D
-Rule Iran 2016 only - Sep 21 0:00 0 S
-Rule Iran 2017 2019 - Mar 22 0:00 1:00 D
-Rule Iran 2017 2019 - Sep 22 0:00 0 S
-Rule Iran 2020 only - Mar 21 0:00 1:00 D
-Rule Iran 2020 only - Sep 21 0:00 0 S
-Rule Iran 2021 2023 - Mar 22 0:00 1:00 D
-Rule Iran 2021 2023 - Sep 22 0:00 0 S
-Rule Iran 2024 only - Mar 21 0:00 1:00 D
-Rule Iran 2024 only - Sep 21 0:00 0 S
-Rule Iran 2025 2027 - Mar 22 0:00 1:00 D
-Rule Iran 2025 2027 - Sep 22 0:00 0 S
-Rule Iran 2028 2029 - Mar 21 0:00 1:00 D
-Rule Iran 2028 2029 - Sep 21 0:00 0 S
-Rule Iran 2030 2031 - Mar 22 0:00 1:00 D
-Rule Iran 2030 2031 - Sep 22 0:00 0 S
-Rule Iran 2032 2033 - Mar 21 0:00 1:00 D
-Rule Iran 2032 2033 - Sep 21 0:00 0 S
-Rule Iran 2034 2035 - Mar 22 0:00 1:00 D
-Rule Iran 2034 2035 - Sep 22 0:00 0 S
+Rule Iran 1978 1980 - Mar 21 0:00 1:00 -
+Rule Iran 1978 only - Oct 21 0:00 0 -
+Rule Iran 1979 only - Sep 19 0:00 0 -
+Rule Iran 1980 only - Sep 23 0:00 0 -
+Rule Iran 1991 only - May 3 0:00 1:00 -
+Rule Iran 1992 1995 - Mar 22 0:00 1:00 -
+Rule Iran 1991 1995 - Sep 22 0:00 0 -
+Rule Iran 1996 only - Mar 21 0:00 1:00 -
+Rule Iran 1996 only - Sep 21 0:00 0 -
+Rule Iran 1997 1999 - Mar 22 0:00 1:00 -
+Rule Iran 1997 1999 - Sep 22 0:00 0 -
+Rule Iran 2000 only - Mar 21 0:00 1:00 -
+Rule Iran 2000 only - Sep 21 0:00 0 -
+Rule Iran 2001 2003 - Mar 22 0:00 1:00 -
+Rule Iran 2001 2003 - Sep 22 0:00 0 -
+Rule Iran 2004 only - Mar 21 0:00 1:00 -
+Rule Iran 2004 only - Sep 21 0:00 0 -
+Rule Iran 2005 only - Mar 22 0:00 1:00 -
+Rule Iran 2005 only - Sep 22 0:00 0 -
+Rule Iran 2008 only - Mar 21 0:00 1:00 -
+Rule Iran 2008 only - Sep 21 0:00 0 -
+Rule Iran 2009 2011 - Mar 22 0:00 1:00 -
+Rule Iran 2009 2011 - Sep 22 0:00 0 -
+Rule Iran 2012 only - Mar 21 0:00 1:00 -
+Rule Iran 2012 only - Sep 21 0:00 0 -
+Rule Iran 2013 2015 - Mar 22 0:00 1:00 -
+Rule Iran 2013 2015 - Sep 22 0:00 0 -
+Rule Iran 2016 only - Mar 21 0:00 1:00 -
+Rule Iran 2016 only - Sep 21 0:00 0 -
+Rule Iran 2017 2019 - Mar 22 0:00 1:00 -
+Rule Iran 2017 2019 - Sep 22 0:00 0 -
+Rule Iran 2020 only - Mar 21 0:00 1:00 -
+Rule Iran 2020 only - Sep 21 0:00 0 -
+Rule Iran 2021 2023 - Mar 22 0:00 1:00 -
+Rule Iran 2021 2023 - Sep 22 0:00 0 -
+Rule Iran 2024 only - Mar 21 0:00 1:00 -
+Rule Iran 2024 only - Sep 21 0:00 0 -
+Rule Iran 2025 2027 - Mar 22 0:00 1:00 -
+Rule Iran 2025 2027 - Sep 22 0:00 0 -
+Rule Iran 2028 2029 - Mar 21 0:00 1:00 -
+Rule Iran 2028 2029 - Sep 21 0:00 0 -
+Rule Iran 2030 2031 - Mar 22 0:00 1:00 -
+Rule Iran 2030 2031 - Sep 22 0:00 0 -
+Rule Iran 2032 2033 - Mar 21 0:00 1:00 -
+Rule Iran 2032 2033 - Sep 21 0:00 0 -
+Rule Iran 2034 2035 - Mar 22 0:00 1:00 -
+Rule Iran 2034 2035 - Sep 22 0:00 0 -
#
# The following rules are approximations starting in the year 2038.
# These are the best post-2037 approximations available, given the
# restrictions of a single rule using a Gregorian-based data format.
# At some point this table will need to be extended, though quite
# possibly Iran will change the rules first.
-Rule Iran 2036 max - Mar 21 0:00 1:00 D
-Rule Iran 2036 max - Sep 21 0:00 0 S
+Rule Iran 2036 max - Mar 21 0:00 1:00 -
+Rule Iran 2036 max - Sep 21 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Tehran 3:25:44 - LMT 1916
@@ -1219,17 +1220,17 @@
# https://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iraq 1982 only - May 1 0:00 1:00 D
-Rule Iraq 1982 1984 - Oct 1 0:00 0 S
-Rule Iraq 1983 only - Mar 31 0:00 1:00 D
-Rule Iraq 1984 1985 - Apr 1 0:00 1:00 D
-Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 S
-Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D
+Rule Iraq 1982 only - May 1 0:00 1:00 -
+Rule Iraq 1982 1984 - Oct 1 0:00 0 -
+Rule Iraq 1983 only - Mar 31 0:00 1:00 -
+Rule Iraq 1984 1985 - Apr 1 0:00 1:00 -
+Rule Iraq 1985 1990 - Sep lastSun 1:00s 0 -
+Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 -
# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the ':01' is a typo.
# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
#
-Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 D
-Rule Iraq 1991 2007 - Oct 1 3:00s 0 S
+Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 -
+Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time?
@@ -1501,8 +1502,7 @@
# From Hideyuki Suzuki (1998-11-09):
# 'Tokyo' usually stands for the former location of Tokyo Astronomical
-# Observatory: 139 degrees 44' 40.90" E (9h 18m 58.727s),
-# 35 degrees 39' 16.0" N.
+# Observatory: 139° 44' 40.90" E (9h 18m 58.727s), 35° 39' 16.0" N.
# This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996'
# edited by National Astronomical Observatory of Japan....
# JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).
@@ -1510,10 +1510,10 @@
# From Hideyuki Suzuki (1998-11-16):
# The ordinance No. 51 (1886) established "standard time" in Japan,
-# which stands for the time on 135 degrees E.
+# which stands for the time on 135° E.
# In the ordinance No. 167 (1895), "standard time" was renamed to "central
# standard time". And the same ordinance also established "western standard
-# time", which stands for the time on 120 degrees E.... But "western standard
+# time", which stands for the time on 120° E.... But "western standard
# time" was abolished in the ordinance No. 529 (1937). In the ordinance No.
# 167, there is no mention regarding for what place western standard time is
# standard....
@@ -1926,9 +1926,9 @@
# From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 S
+Rule Kyrgyz 1992 1996 - Apr Sun>=7 0:00s 1:00 -
Rule Kyrgyz 1992 1996 - Sep lastSun 0:00 0 -
-Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 S
+Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
@@ -2006,6 +2006,19 @@
# There is no common English-language abbreviation for this time zone.
# Use KST, as that's what we already use for 1954-1961 in ROK.
+# From Kang Seonghoon (2018-04-29):
+# North Korea will revert its time zone from UTC+8:30 (PYT; Pyongyang
+# Time) back to UTC+9 (KST; Korea Standard Time).
+#
+# From Seo Sanghyeon (2018-04-30):
+# Rodong Sinmun 2018-04-30 announced Pyongyang Time transition plan.
+# https://www.nknews.org/kcna/wp-content/uploads/sites/5/2018/04/rodong-2018-04-30.pdf
+# ... the transition date is 2018-05-05 ... Citation should be Decree
+# No. 2232 of April 30, 2018, of the Presidium of the Supreme People's
+# Assembly, as published in Rodong Sinmun.
+# From Tim Parenti (2018-04-29):
+# It appears to be the front page story at the top in the right-most column.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Seoul 8:27:52 - LMT 1908 Apr 1
8:30 - KST 1912 Jan 1
@@ -2017,7 +2030,8 @@
8:30 - KST 1912 Jan 1
9:00 - JST 1945 Aug 24
9:00 - KST 2015 Aug 15 00:00
- 8:30 - KST
+ 8:30 - KST 2018 May 5
+ 9:00 - KST
###############################################################################
@@ -2060,7 +2074,7 @@
# Malaysia
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 TS # one-Third Summer
+Rule NBorneo 1935 1941 - Sep 14 0:00 0:20 -
Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
#
# peninsular Malaysia
@@ -2205,7 +2219,7 @@
# http://zasag.mn/news/view/8969
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Mongol 1983 1984 - Apr 1 0:00 1:00 S
+Rule Mongol 1983 1984 - Apr 1 0:00 1:00 -
Rule Mongol 1983 only - Oct 1 0:00 0 -
# Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
# but McDow says the 2001 switches occurred at 02:00. Also, IATA SSIM
@@ -2222,13 +2236,13 @@
# Mongolian Government meeting has concluded today to cancel daylight
# saving time adoption in Mongolia. Source: http://zasag.mn/news/view/16192
-Rule Mongol 1985 1998 - Mar lastSun 0:00 1:00 S
+Rule Mongol 1985 1998 - Mar lastSun 0:00 1:00 -
Rule Mongol 1984 1998 - Sep lastSun 0:00 0 -
# IATA SSIM (1999-09) says Mongolia no longer observes DST.
-Rule Mongol 2001 only - Apr lastSat 2:00 1:00 S
+Rule Mongol 2001 only - Apr lastSat 2:00 1:00 -
Rule Mongol 2001 2006 - Sep lastSat 2:00 0 -
-Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 S
-Rule Mongol 2015 2016 - Mar lastSat 2:00 1:00 S
+Rule Mongol 2002 2006 - Mar lastSat 2:00 1:00 -
+Rule Mongol 2015 2016 - Mar lastSat 2:00 1:00 -
Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -2662,9 +2676,6 @@
# [Google translation]: "The Council also decided to start daylight
# saving in Palestine as of one o'clock on Saturday morning,
# 2016-03-26, to provide the clock 60 minutes ahead."
-#
-# From Paul Eggert (2016-03-12):
-# Predict spring transitions on March's last Saturday at 01:00 from now on.
# From Sharef Mustafa (2016-10-19):
# [T]he Palestinian cabinet decision (Mar 8th 2016) published on
@@ -2681,6 +2692,16 @@
# https://www.timeanddate.com/time/change/gaza-strip/gaza
# https://www.timeanddate.com/time/change/west-bank/hebron
+# From Sharef Mustafa (2018-03-16):
+# Palestine summer time will start on Mar 24th 2018 by advancing the
+# clock by 60 minutes as per Palestinian cabinet decision published on
+# the official website, though the decree did not specify the exact
+# time of the time shift.
+# http://www.palestinecabinet.gov.ps/Website/AR/NDecrees/ViewFile.ashx?ID=e7a42ab7-ee23-435a-b9c8-a4f7e81f3817
+#
+# From Paul Eggert (2018-03-16):
+# For 2016 on, predict spring transitions on March's fourth Saturday at 01:00.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
Rule EgyptAsia 1957 1958 - Oct 1 0:00 0 -
@@ -2710,7 +2731,7 @@
Rule Palestine 2013 only - Sep Fri>=21 0:00 0 -
Rule Palestine 2014 2015 - Oct Fri>=21 0:00 0 -
Rule Palestine 2015 only - Mar lastFri 24:00 1:00 S
-Rule Palestine 2016 max - Mar lastSat 1:00 1:00 S
+Rule Palestine 2016 max - Mar Sat>=22 1:00 1:00 S
Rule Palestine 2016 max - Oct lastSat 1:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -2760,11 +2781,11 @@
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Phil 1936 only - Nov 1 0:00 1:00 S
+Rule Phil 1936 only - Nov 1 0:00 1:00 -
Rule Phil 1937 only - Feb 1 0:00 0 -
-Rule Phil 1954 only - Apr 12 0:00 1:00 S
+Rule Phil 1954 only - Apr 12 0:00 1:00 -
Rule Phil 1954 only - Jul 1 0:00 0 -
-Rule Phil 1978 only - Mar 22 0:00 1:00 S
+Rule Phil 1978 only - Mar 22 0:00 1:00 -
Rule Phil 1978 only - Sep 21 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
@@ -3120,9 +3141,9 @@
# and is the basis for the information below.
#
# The 1906 transition was effective July 1 and standardized Indochina to
-# Phù Liễn Observatory, legally 104 deg. 17'17" east of Paris.
+# Phù Liễn Observatory, legally 104° 17' 17" east of Paris.
# It's unclear whether this meant legal Paris Mean Time (00:09:21) or
-# the Paris Meridian (2 deg. 20'14.03" E); the former yields 07:06:30.1333...
+# the Paris Meridian (2° 20' 14.03" E); the former yields 07:06:30.1333...
# and the latter 07:06:29.333... so either way it rounds to 07:06:30,
# which is used below even though the modern-day Phù Liễn Observatory
# is closer to 07:06:31. Abbreviate Phù Liễn Mean Time as PLMT.
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/australasia b/jdk/test/sun/util/calendar/zi/tzdata/australasia
index f97957d..2c60fd3 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/australasia
+++ b/jdk/test/sun/util/calendar/zi/tzdata/australasia
@@ -219,20 +219,20 @@
# Lord Howe Island
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule LH 1981 1984 - Oct lastSun 2:00 1:00 D
-Rule LH 1982 1985 - Mar Sun>=1 2:00 0 S
-Rule LH 1985 only - Oct lastSun 2:00 0:30 D
-Rule LH 1986 1989 - Mar Sun>=15 2:00 0 S
-Rule LH 1986 only - Oct 19 2:00 0:30 D
-Rule LH 1987 1999 - Oct lastSun 2:00 0:30 D
-Rule LH 1990 1995 - Mar Sun>=1 2:00 0 S
-Rule LH 1996 2005 - Mar lastSun 2:00 0 S
-Rule LH 2000 only - Aug lastSun 2:00 0:30 D
-Rule LH 2001 2007 - Oct lastSun 2:00 0:30 D
-Rule LH 2006 only - Apr Sun>=1 2:00 0 S
-Rule LH 2007 only - Mar lastSun 2:00 0 S
-Rule LH 2008 max - Apr Sun>=1 2:00 0 S
-Rule LH 2008 max - Oct Sun>=1 2:00 0:30 D
+Rule LH 1981 1984 - Oct lastSun 2:00 1:00 -
+Rule LH 1982 1985 - Mar Sun>=1 2:00 0 -
+Rule LH 1985 only - Oct lastSun 2:00 0:30 -
+Rule LH 1986 1989 - Mar Sun>=15 2:00 0 -
+Rule LH 1986 only - Oct 19 2:00 0:30 -
+Rule LH 1987 1999 - Oct lastSun 2:00 0:30 -
+Rule LH 1990 1995 - Mar Sun>=1 2:00 0 -
+Rule LH 1996 2005 - Mar lastSun 2:00 0 -
+Rule LH 2000 only - Aug lastSun 2:00 0:30 -
+Rule LH 2001 2007 - Oct lastSun 2:00 0:30 -
+Rule LH 2006 only - Apr Sun>=1 2:00 0 -
+Rule LH 2007 only - Mar lastSun 2:00 0 -
+Rule LH 2008 max - Apr Sun>=1 2:00 0 -
+Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
10:00 - AEST 1981 Mar
10:30 LH +1030/+1130 1985 Jul
@@ -390,15 +390,15 @@
# practice than guessing no DST.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S
+Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 -
Rule Fiji 1999 2000 - Feb lastSun 3:00 0 -
-Rule Fiji 2009 only - Nov 29 2:00 1:00 S
+Rule Fiji 2009 only - Nov 29 2:00 1:00 -
Rule Fiji 2010 only - Mar lastSun 3:00 0 -
-Rule Fiji 2010 2013 - Oct Sun>=21 2:00 1:00 S
+Rule Fiji 2010 2013 - Oct Sun>=21 2:00 1:00 -
Rule Fiji 2011 only - Mar Sun>=1 3:00 0 -
Rule Fiji 2012 2013 - Jan Sun>=18 3:00 0 -
Rule Fiji 2014 only - Jan Sun>=18 2:00 0 -
-Rule Fiji 2014 max - Nov Sun>=1 2:00 1:00 S
+Rule Fiji 2014 max - Nov Sun>=1 2:00 1:00 -
Rule Fiji 2015 max - Jan Sun>=14 3:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
@@ -429,11 +429,11 @@
12:00 - +12
Zone Pacific/Enderbury -11:24:20 - LMT 1901
-12:00 - -12 1979 Oct
- -11:00 - -11 1995
+ -11:00 - -11 1994 Dec 31
13:00 - +13
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
-10:40 - -1040 1979 Oct
- -10:00 - -10 1995
+ -10:00 - -10 1994 Dec 31
14:00 - +14
# N Mariana Is
@@ -470,9 +470,9 @@
# New Caledonia
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule NC 1977 1978 - Dec Sun>=1 0:00 1:00 S
+Rule NC 1977 1978 - Dec Sun>=1 0:00 1:00 -
Rule NC 1978 1979 - Feb 27 0:00 0 -
-Rule NC 1996 only - Dec 1 2:00s 1:00 S
+Rule NC 1996 only - Dec 1 2:00s 1:00 -
# Shanks & Pottenger say the following was at 2:00; go with IATA.
Rule NC 1997 only - Mar 2 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -492,27 +492,28 @@
Rule NZ 1934 1940 - Apr lastSun 2:00 0 M
Rule NZ 1934 1940 - Sep lastSun 2:00 0:30 S
Rule NZ 1946 only - Jan 1 0:00 0 S
-# Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no
-# convenient single notation for the date and time of this transition
-# so we must duplicate the Rule lines.
+# Since 1957 Chatham has been 45 minutes ahead of NZ, but until 2018a
+# there was no documented single notation for the date and time of this
+# transition. Duplicate the Rule lines for now, to give the 2018a change
+# time to percolate out.
Rule NZ 1974 only - Nov Sun>=1 2:00s 1:00 D
-Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 D
+Rule Chatham 1974 only - Nov Sun>=1 2:45s 1:00 -
Rule NZ 1975 only - Feb lastSun 2:00s 0 S
-Rule Chatham 1975 only - Feb lastSun 2:45s 0 S
+Rule Chatham 1975 only - Feb lastSun 2:45s 0 -
Rule NZ 1975 1988 - Oct lastSun 2:00s 1:00 D
-Rule Chatham 1975 1988 - Oct lastSun 2:45s 1:00 D
+Rule Chatham 1975 1988 - Oct lastSun 2:45s 1:00 -
Rule NZ 1976 1989 - Mar Sun>=1 2:00s 0 S
-Rule Chatham 1976 1989 - Mar Sun>=1 2:45s 0 S
+Rule Chatham 1976 1989 - Mar Sun>=1 2:45s 0 -
Rule NZ 1989 only - Oct Sun>=8 2:00s 1:00 D
-Rule Chatham 1989 only - Oct Sun>=8 2:45s 1:00 D
+Rule Chatham 1989 only - Oct Sun>=8 2:45s 1:00 -
Rule NZ 1990 2006 - Oct Sun>=1 2:00s 1:00 D
-Rule Chatham 1990 2006 - Oct Sun>=1 2:45s 1:00 D
+Rule Chatham 1990 2006 - Oct Sun>=1 2:45s 1:00 -
Rule NZ 1990 2007 - Mar Sun>=15 2:00s 0 S
-Rule Chatham 1990 2007 - Mar Sun>=15 2:45s 0 S
+Rule Chatham 1990 2007 - Mar Sun>=15 2:45s 0 -
Rule NZ 2007 max - Sep lastSun 2:00s 1:00 D
-Rule Chatham 2007 max - Sep lastSun 2:45s 1:00 D
+Rule Chatham 2007 max - Sep lastSun 2:45s 1:00 -
Rule NZ 2008 max - Apr Sun>=1 2:00s 0 S
-Rule Chatham 2008 max - Apr Sun>=1 2:45s 0 S
+Rule Chatham 2008 max - Apr Sun>=1 2:45s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
11:30 NZ NZ%sT 1946 Jan 1
@@ -536,9 +537,9 @@
# Cook Is
# From Shanks & Pottenger:
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Cook 1978 only - Nov 12 0:00 0:30 HS
+Rule Cook 1978 only - Nov 12 0:00 0:30 -
Rule Cook 1979 1991 - Mar Sun>=1 0:00 0 -
-Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 HS
+Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Rarotonga -10:39:04 - LMT 1901 # Avarua
-10:30 - -1030 1978 Nov 12
@@ -679,11 +680,11 @@
# Assume the pattern instituted in 2012 will continue indefinitely.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule WS 2010 only - Sep lastSun 0:00 1 D
-Rule WS 2011 only - Apr Sat>=1 4:00 0 S
-Rule WS 2011 only - Sep lastSat 3:00 1 D
-Rule WS 2012 max - Apr Sun>=1 4:00 0 S
-Rule WS 2012 max - Sep lastSun 3:00 1 D
+Rule WS 2010 only - Sep lastSun 0:00 1 -
+Rule WS 2011 only - Apr Sat>=1 4:00 0 -
+Rule WS 2011 only - Sep lastSat 3:00 1 -
+Rule WS 2012 max - Apr Sun>=1 4:00 0 -
+Rule WS 2012 max - Sep lastSun 3:00 1 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
-11:26:56 - LMT 1911
@@ -723,11 +724,11 @@
# Tonga
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Tonga 1999 only - Oct 7 2:00s 1:00 S
+Rule Tonga 1999 only - Oct 7 2:00s 1:00 -
Rule Tonga 2000 only - Mar 19 2:00s 0 -
-Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 S
+Rule Tonga 2000 2001 - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2001 2002 - Jan lastSun 2:00 0 -
-Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 S
+Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Tongatapu 12:19:20 - LMT 1901
@@ -804,12 +805,12 @@
# Vanuatu
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Vanuatu 1983 only - Sep 25 0:00 1:00 S
+Rule Vanuatu 1983 only - Sep 25 0:00 1:00 -
Rule Vanuatu 1984 1991 - Mar Sun>=23 0:00 0 -
-Rule Vanuatu 1984 only - Oct 23 0:00 1:00 S
-Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 S
+Rule Vanuatu 1984 only - Oct 23 0:00 1:00 -
+Rule Vanuatu 1985 1991 - Sep Sun>=23 0:00 1:00 -
Rule Vanuatu 1992 1993 - Jan Sun>=23 0:00 0 -
-Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 S
+Rule Vanuatu 1992 only - Oct Sun>=23 0:00 1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
11:00 Vanuatu +11/+12
@@ -1107,7 +1108,23 @@
# (1999-09-27) writes that Giles Meteorological Station uses
# South Australian time even though it's located in Western Australia.
+# From Paul Eggert (2018-04-01):
+# The Guardian Express of Perth, Australia reported today that the
+# government decided to advance the clocks permanently on January 1,
+# 2019, from UT +08 to UT +09. The article noted that an exemption
+# would be made for people aged 61 and over, who "can apply in writing
+# to have the extra hour of sunshine removed from their area." See:
+# Daylight saving coming to WA in 2019. Guardian Express. 2018-04-01.
+# https://www.communitynews.com.au/guardian-express/news/exclusive-daylight-savings-coming-wa-summer-2018/
+
# Queensland
+
+# From Paul Eggert (2018-02-26):
+# I lack access to the following source for Queensland DST:
+# Pearce C. History of daylight saving time in Queensland.
+# Queensland Hist J. 2017 Aug;23(6):389-403
+# https://search.informit.com.au/documentSummary;dn=994682348436426;res=IELHSS
+
# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
# # The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
# # [ Dec 1990 ]
@@ -1534,6 +1551,12 @@
# "declared it the same day [throughout] the country as of Jan. 1, 1995"
# as part of the competition to be first into the 21st century.
+# From Kerry Shetline (2018-02-03):
+# December 31 was the day that was skipped, so that the transition
+# would be from Friday December 30, 1994 to Sunday January 1, 1995.
+# From Paul Eggert (2018-02-04):
+# One source for this is page 202 of: Bartky IR. One Time Fits All:
+# The Campaigns for Global Uniformity (2007).
# Kwajalein
@@ -1626,7 +1649,7 @@
# From Howie Phelps (1999-11-10), who talked to a Pitcairner via shortwave:
# Betty Christian told me yesterday that their local time is the same as
-# Pacific Standard Time. They used to be 1/2 hour different from us here in
+# Pacific Standard Time. They used to be ½ hour different from us here in
# Sacramento but it was changed a couple of years ago.
@@ -1665,7 +1688,7 @@
# 12 hours and 20 minutes ahead of GMT. When New Zealand adjusted its
# standard time in 1940s, Tonga had the choice of subtracting from its
# local time to come on the same standard time as New Zealand or of
-# advancing its time to maintain the differential of 13 degrees
+# advancing its time to maintain the differential of 13°
# (approximately 50 minutes ahead of New Zealand time).
#
# Because His Majesty King Tāufaʻāhau Tupou IV, then Crown Prince
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/europe b/jdk/test/sun/util/calendar/zi/tzdata/europe
index 1565814..99109ec 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/europe
+++ b/jdk/test/sun/util/calendar/zi/tzdata/europe
@@ -140,8 +140,8 @@
# along the towpath within a few yards of it.'
#
# I have a one inch to one mile map of London and my estimate of the stone's
-# position is 51 degrees 28' 30" N, 0 degrees 18' 45" W. The longitude should
-# be within about +-2". The Ordnance Survey grid reference is TQ172761.
+# position is 51° 28' 30" N, 0° 18' 45" W. The longitude should
+# be within about ±2". The Ordnance Survey grid reference is TQ172761.
#
# [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
@@ -181,7 +181,7 @@
# after-hours daylight in which to pursue his research.
# In 1895 he presented a paper to the Wellington Philosophical Society
# that proposed a two-hour daylight-saving shift. See:
-# Hudson GV. On seasonal time-adjustment in countries south of lat. 30 deg.
+# Hudson GV. On seasonal time-adjustment in countries south of lat. 30°.
# Transactions and Proceedings of the New Zealand Institute. 1895;28:734
# http://rsnz.natlib.govt.nz/volume/rsnz_28/rsnz_28_00_006110.html
# Although some interest was expressed in New Zealand, his proposal
@@ -531,19 +531,33 @@
Link Europe/London Europe/Guernsey
Link Europe/London Europe/Isle_of_Man
-# From Paul Eggert (2018-01-19):
+# From Paul Eggert (2018-02-15):
+# In January 2018 we discovered that the negative SAVE values in the
+# Eire rules cause problems with tests for ICU:
+# https://mm.icann.org/pipermail/tz/2018-January/025825.html
+# and with tests for OpenJDK:
+# https://mm.icann.org/pipermail/tz/2018-January/025822.html
+#
+# To work around this problem, the build procedure can translate the
+# following data into two forms, one with negative SAVE values and the
+# other form with a traditional approximation for Irish time stamps
+# after 1971-10-31 02:00 UTC; although this approximation has tm_isdst
+# flags that are reversed, its UTC offsets are correct and this often
+# suffices. This source file currently uses only nonnegative SAVE
+# values, but this is intended to change and downstream code should
+# not rely on it.
+#
# The following is like GB-Eire and EU, except with standard time in
-# summer and negative daylight saving time in winter.
-# Although currently commented out, this will need to become uncommented
-# once the ICU/OpenJDK workaround is removed; see below.
+# summer and negative daylight saving time in winter. It is for when
+# negative SAVE values are used.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-#Rule Eire 1971 only - Oct 31 2:00u -1:00 GMT
-#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 IST
-#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 GMT
-#Rule Eire 1981 max - Mar lastSun 1:00u 0 IST
-#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 GMT
-#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 GMT
-#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 GMT
+#Rule Eire 1971 only - Oct 31 2:00u -1:00 -
+#Rule Eire 1972 1980 - Mar Sun>=16 2:00u 0 -
+#Rule Eire 1972 1980 - Oct Sun>=23 2:00u -1:00 -
+#Rule Eire 1981 max - Mar lastSun 1:00u 0 -
+#Rule Eire 1981 1989 - Oct Sun>=23 1:00u -1:00 -
+#Rule Eire 1990 1995 - Oct Sun>=22 1:00u -1:00 -
+#Rule Eire 1996 max - Oct lastSun 1:00u -1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Dublin -0:25:00 - LMT 1880 Aug 2
@@ -556,24 +570,12 @@
0:00 1:00 IST 1947 Nov 2 2:00s
0:00 - GMT 1948 Apr 18 2:00s
0:00 GB-Eire GMT/IST 1968 Oct 27
-# From Paul Eggert (2018-01-18):
-# The next line should look like this:
+# The next line is for when negative SAVE values are used.
# 1:00 Eire IST/GMT
-# However, in January 2018 we discovered that the Eire rules cause
-# problems with tests for ICU:
-# https://mm.icann.org/pipermail/tz/2018-January/025825.html
-# and with tests for OpenJDK:
-# https://mm.icann.org/pipermail/tz/2018-January/025822.html
-# To work around this problem, use a traditional approximation for
-# time stamps after 1971-10-31 02:00 UTC, to give ICU and OpenJDK
-# developers breathing room to fix bugs. This approximation has
-# correct UTC offsets, but results in tm_isdst flags are the reverse
-# of what they should be. This workaround is temporary and should be
-# removed reasonably soon.
+# These three lines are for when SAVE values are always nonnegative.
1:00 - IST 1971 Oct 31 2:00u
0:00 GB-Eire GMT/IST 1996
0:00 EU GMT/IST
-# End of workaround for ICU and OpenJDK bugs.
###############################################################################
@@ -991,18 +993,30 @@
# Please see the 'asia' file for Asia/Nicosia.
# Czech Republic / Czechia
+#
+# From Paul Eggert (2018-04-15):
+# The source for Czech data is: Kdy začíná a končí letní čas. 2018-04-15.
+# https://kalendar.beda.cz/kdy-zacina-a-konci-letni-cas
+# We know of no English-language name for historical Czech winter time;
+# abbreviate it as "GMT", as it happened to be GMT.
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Czech 1945 only - Apr 8 2:00s 1:00 S
-Rule Czech 1945 only - Nov 18 2:00s 0 -
+Rule Czech 1945 only - Apr Mon>=1 2:00s 1:00 S
+Rule Czech 1945 only - Oct 1 2:00s 0 -
Rule Czech 1946 only - May 6 2:00s 1:00 S
Rule Czech 1946 1949 - Oct Sun>=1 2:00s 0 -
-Rule Czech 1947 only - Apr 20 2:00s 1:00 S
-Rule Czech 1948 only - Apr 18 2:00s 1:00 S
+Rule Czech 1947 1948 - Apr Sun>=15 2:00s 1:00 S
Rule Czech 1949 only - Apr 9 2:00s 1:00 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Prague 0:57:44 - LMT 1850
0:57:44 - PMT 1891 Oct # Prague Mean Time
- 1:00 C-Eur CE%sT 1944 Sep 17 2:00s
+ 1:00 C-Eur CE%sT 1945 May 9
+ 1:00 Czech CE%sT 1946 Dec 1 3:00
+# Vanguard section, for zic and other parsers that support negative DST.
+# 1:00 -1:00 GMT 1947 Feb 23 2:00
+# Rearguard section, for parsers that do not support negative DST.
+ 0:00 - GMT 1947 Feb 23 2:00
+# End of rearguard section.
1:00 Czech CE%sT 1979
1:00 EU CE%sT
# Use Europe/Prague also for Slovakia.
@@ -1557,21 +1571,21 @@
# http://www.almanak.hi.is/klukkan.html
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Iceland 1917 1919 - Feb 19 23:00 1:00 S
+Rule Iceland 1917 1919 - Feb 19 23:00 1:00 -
Rule Iceland 1917 only - Oct 21 1:00 0 -
Rule Iceland 1918 1919 - Nov 16 1:00 0 -
-Rule Iceland 1921 only - Mar 19 23:00 1:00 S
+Rule Iceland 1921 only - Mar 19 23:00 1:00 -
Rule Iceland 1921 only - Jun 23 1:00 0 -
-Rule Iceland 1939 only - Apr 29 23:00 1:00 S
+Rule Iceland 1939 only - Apr 29 23:00 1:00 -
Rule Iceland 1939 only - Oct 29 2:00 0 -
-Rule Iceland 1940 only - Feb 25 2:00 1:00 S
+Rule Iceland 1940 only - Feb 25 2:00 1:00 -
Rule Iceland 1940 1941 - Nov Sun>=2 1:00s 0 -
-Rule Iceland 1941 1942 - Mar Sun>=2 1:00s 1:00 S
+Rule Iceland 1941 1942 - Mar Sun>=2 1:00s 1:00 -
# 1943-1946 - first Sunday in March until first Sunday in winter
-Rule Iceland 1943 1946 - Mar Sun>=1 1:00s 1:00 S
+Rule Iceland 1943 1946 - Mar Sun>=1 1:00s 1:00 -
Rule Iceland 1942 1948 - Oct Sun>=22 1:00s 0 -
# 1947-1967 - first Sunday in April until first Sunday in winter
-Rule Iceland 1947 1967 - Apr Sun>=1 1:00s 1:00 S
+Rule Iceland 1947 1967 - Apr Sun>=1 1:00s 1:00 -
# 1949 and 1967 Oct transitions delayed by 1 week
Rule Iceland 1949 only - Oct 30 1:00s 0 -
Rule Iceland 1950 1966 - Oct Sun>=22 1:00s 0 -
@@ -2037,7 +2051,7 @@
Rule Neth 1945 only - Apr 2 2:00s 1:00 S
Rule Neth 1945 only - Sep 16 2:00s 0 -
#
-# Amsterdam Mean Time was +00:19:32.13 exactly, but the .13 is omitted
+# Amsterdam Mean Time was +00:19:32.13, but the .13 is omitted
# below because the current format requires GMTOFF to be an integer.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Amsterdam 0:19:32 - LMT 1835
@@ -2161,15 +2175,19 @@
1:00 EU CE%sT
# Portugal
-#
+
# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
# According to a Portuguese decree (1911-05-26)
# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
-# Round the old offset to -0:36:45. This agrees with Willett but disagrees
-# with Shanks, who says the transition occurred on 1911-05-24 at 00:00 for
-# Europe/Lisbon, Atlantic/Azores, and Atlantic/Madeira.
+# Round the old offset to -0:36:45. This agrees with Willett....
#
+# From Michael Deckers (2018-02-15):
+# article 5 [of the 1911 decree; Deckers's translation] ...:
+# These dispositions shall enter into force at the instant at which,
+# according to the 2nd article, the civil day January 1, 1912 begins,
+# all clocks therefore having to be advanced or set back correspondingly ...
+
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
@@ -2252,7 +2270,7 @@
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Lisbon -0:36:45 - LMT 1884
- -0:36:45 - LMT 1912 Jan 1 # Lisbon Mean Time
+ -0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
0:00 Port WE%sT 1966 Apr 3 2:00
1:00 - CET 1976 Sep 26 1:00
0:00 Port WE%sT 1983 Sep 25 1:00s
@@ -2261,7 +2279,7 @@
0:00 EU WE%sT
# This Zone can be simplified once we assume zic %z.
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
- -1:54:32 - HMT 1912 Jan 1 # Horta Mean Time
+ -1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
-2:00 Port -02/-01 1942 Apr 25 22:00s
-2:00 Port +00 1942 Aug 15 22:00s
-2:00 Port -02/-01 1943 Apr 17 22:00s
@@ -2277,7 +2295,7 @@
-1:00 EU -01/+00
# This Zone can be simplified once we assume zic %z.
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
- -1:07:36 - FMT 1912 Jan 1 # Funchal Mean Time
+ -1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
-1:00 Port -01/+00 1942 Apr 25 22:00s
-1:00 Port +01 1942 Aug 15 22:00s
-1:00 Port -01/+00 1943 Apr 17 22:00s
@@ -2615,13 +2633,13 @@
# From Vladimir Karpinsky (2014-07-08):
# LMT in Moscow (before Jul 3, 1916) is 2:30:17, that was defined by Moscow
-# Observatory (coordinates: 55 deg. 45'29.70", 37 deg. 34'05.30")....
+# Observatory (coordinates: 55° 45' 29.70", 37° 34' 05.30")....
# LMT in Moscow since Jul 3, 1916 is 2:31:01 as a result of new standard.
# (The info is from the book by Byalokoz ... p. 18.)
# The time in St. Petersburg as capital of Russia was defined by
# Pulkov observatory, near St. Petersburg. In 1916 LMT Moscow
# was synchronized with LMT St. Petersburg (+30 minutes), (Pulkov observatory
-# coordinates: 59 deg. 46'18.70", 30 deg. 19'40.70") so 30 deg. 19'40.70" >
+# coordinates: 59° 46' 18.70", 30° 19' 40.70") so 30° 19' 40.70" >
# 2h01m18.7s = 2:01:19. LMT Moscow = LMT St.Petersburg + 30m 2:01:19 + 0:30 =
# 2:31:19 ...
#
@@ -3450,7 +3468,7 @@
# three degrees, or twelve minutes of time, to the west of the
# meridian of the Observatory of Stockholm". The law is dated 1878-05-31.
#
-# The observatory at that time had the meridian 18 degrees 03' 30"
+# The observatory at that time had the meridian 18° 03' 30"
# eastern longitude = 01:12:14 in time. Less 12 minutes gives the
# national standard time as 01:00:14 ahead of GMT....
#
@@ -3554,7 +3572,7 @@
# From Alois Treindl (2013-09-11):
# The Federal regulations say
# https://www.admin.ch/opc/de/classified-compilation/20071096/index.html
-# ... the meridian for Bern mean time ... is 7 degrees 26' 22.50".
+# ... the meridian for Bern mean time ... is 7° 26' 22.50".
# Expressed in time, it is 0h29m45.5s.
# From Pierre-Yves Berger (2013-09-11):
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/northamerica b/jdk/test/sun/util/calendar/zi/tzdata/northamerica
index 2aa184b..bcfb662 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/northamerica
+++ b/jdk/test/sun/util/calendar/zi/tzdata/northamerica
@@ -48,7 +48,7 @@
# in New York City (1869-10). His 1870 proposal was based on Washington, DC,
# but in 1872-05 he moved the proposed origin to Greenwich.
-# From Paul Eggert (2016-09-21):
+# From Paul Eggert (2018-03-20):
# Dowd's proposal left many details unresolved, such as where to draw
# lines between time zones. The key individual who made time zones
# work in the US was William Frederick Allen - railway engineer,
@@ -59,10 +59,9 @@
# to the General Time Convention on 1883-04-11, saying that his plan
# meant "local time would be practically abolished" - a plus for
# railway scheduling. By the next convention on 1883-10-11 nearly all
-# railroads had agreed and it took effect on 1883-11-18 at 12:00.
-# That Sunday was called the "day of two noons", as the eastern parts
-# of the new zones observed noon twice. Allen witnessed the
-# transition in New York City, writing:
+# railroads had agreed and it took effect on 1883-11-18. That Sunday
+# was called the "day of two noons", as some locations observed noon
+# twice. Allen witnessed the transition in New York City, writing:
#
# I heard the bells of St. Paul's strike on the old time. Four
# minutes later, obedient to the electrical signal from the Naval
@@ -447,8 +446,7 @@
# ...according to the Census Bureau, the largest city is Beulah (although
# it's commonly referred to as Beulah-Hazen, with Hazen being the next
# largest city in Mercer County). Google Maps places Beulah's city hall
-# at 47 degrees 15' 51" N, 101 degrees 46' 40" W, which yields an offset
-# of 6h47'07".
+# at 47° 15' 51" N, 101° 46' 40" W, which yields an offset of 6h47'07".
Zone America/North_Dakota/Beulah -6:47:07 - LMT 1883 Nov 18 12:12:53
-7:00 US M%sT 2010 Nov 7 2:00
@@ -481,7 +479,7 @@
# California, northern Idaho (Benewah, Bonner, Boundary, Clearwater,
# Kootenai, Latah, Lewis, Nez Perce, and Shoshone counties, Idaho county
# north of the Salmon River, and the towns of Burgdorf and Warren),
-# Nevada (except West Wendover), Oregon (except the northern 3/4 of
+# Nevada (except West Wendover), Oregon (except the northern ¾ of
# Malheur county), and Washington
# From Paul Eggert (2016-08-20):
@@ -979,6 +977,13 @@
-5:00 - EST 2006
-5:00 US E%sT
+# From Paul Eggert (2018-03-20):
+# The Louisville & Nashville Railroad's 1883-11-18 change occurred at
+# 10:00 old local time; train were supposed to come to a standstill
+# for precisely 18 minutes. See Bartky Fig. 1 (page 50). It is not
+# clear how this matched civil time in Louisville, so for now continue
+# to assume Louisville switched at noon new local time, like New York.
+#
# Part of Kentucky left its clocks alone in 1974.
# This also includes Clark, Floyd, and Harrison counties in Indiana.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER
@@ -3287,8 +3292,8 @@
# http://www.jamaicaobserver.com/columns/The-politician-in-all-of-us_17573647
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Jamaica -5:07:11 - LMT 1890 # Kingston
- -5:07:11 - KMT 1912 Feb # Kingston Mean Time
+Zone America/Jamaica -5:07:10 - LMT 1890 # Kingston
+ -5:07:10 - KMT 1912 Feb # Kingston Mean Time
-5:00 - EST 1974
-5:00 US E%sT 1984
-5:00 - EST
@@ -3438,7 +3443,7 @@
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Grand_Turk -4:44:32 - LMT 1890
- -5:07:11 - KMT 1912 Feb # Kingston Mean Time
+ -5:07:10 - KMT 1912 Feb # Kingston Mean Time
-5:00 - EST 1979
-5:00 US E%sT 2015 Nov Sun>=1 2:00
-4:00 - AST 2018 Mar 11 3:00
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/southamerica b/jdk/test/sun/util/calendar/zi/tzdata/southamerica
index 38dd275..65d3c9f 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/southamerica
+++ b/jdk/test/sun/util/calendar/zi/tzdata/southamerica
@@ -70,28 +70,28 @@
# AR was chosen because they are the ISO letters that represent Argentina.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Arg 1930 only - Dec 1 0:00 1:00 S
+Rule Arg 1930 only - Dec 1 0:00 1:00 -
Rule Arg 1931 only - Apr 1 0:00 0 -
-Rule Arg 1931 only - Oct 15 0:00 1:00 S
+Rule Arg 1931 only - Oct 15 0:00 1:00 -
Rule Arg 1932 1940 - Mar 1 0:00 0 -
-Rule Arg 1932 1939 - Nov 1 0:00 1:00 S
-Rule Arg 1940 only - Jul 1 0:00 1:00 S
+Rule Arg 1932 1939 - Nov 1 0:00 1:00 -
+Rule Arg 1940 only - Jul 1 0:00 1:00 -
Rule Arg 1941 only - Jun 15 0:00 0 -
-Rule Arg 1941 only - Oct 15 0:00 1:00 S
+Rule Arg 1941 only - Oct 15 0:00 1:00 -
Rule Arg 1943 only - Aug 1 0:00 0 -
-Rule Arg 1943 only - Oct 15 0:00 1:00 S
+Rule Arg 1943 only - Oct 15 0:00 1:00 -
Rule Arg 1946 only - Mar 1 0:00 0 -
-Rule Arg 1946 only - Oct 1 0:00 1:00 S
+Rule Arg 1946 only - Oct 1 0:00 1:00 -
Rule Arg 1963 only - Oct 1 0:00 0 -
-Rule Arg 1963 only - Dec 15 0:00 1:00 S
+Rule Arg 1963 only - Dec 15 0:00 1:00 -
Rule Arg 1964 1966 - Mar 1 0:00 0 -
-Rule Arg 1964 1966 - Oct 15 0:00 1:00 S
+Rule Arg 1964 1966 - Oct 15 0:00 1:00 -
Rule Arg 1967 only - Apr 2 0:00 0 -
-Rule Arg 1967 1968 - Oct Sun>=1 0:00 1:00 S
+Rule Arg 1967 1968 - Oct Sun>=1 0:00 1:00 -
Rule Arg 1968 1969 - Apr Sun>=1 0:00 0 -
-Rule Arg 1974 only - Jan 23 0:00 1:00 S
+Rule Arg 1974 only - Jan 23 0:00 1:00 -
Rule Arg 1974 only - May 1 0:00 0 -
-Rule Arg 1988 only - Dec 1 0:00 1:00 S
+Rule Arg 1988 only - Dec 1 0:00 1:00 -
#
# From Hernan G. Otero (1995-06-26):
# These corrections were contributed by InterSoft Argentina S.A.,
@@ -99,7 +99,7 @@
# Talleres de Hidrografía Naval Argentina
# (Argentine Naval Hydrography Institute)
Rule Arg 1989 1993 - Mar Sun>=1 0:00 0 -
-Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S
+Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 -
#
# From Hernan G. Otero (1995-06-26):
# From this moment on, the law that mandated the daylight saving
@@ -110,7 +110,7 @@
# On October 3, 1999, 0:00 local, Argentina implemented daylight savings time,
# which did not result in the switch of a time zone, as they stayed 9 hours
# from the International Date Line.
-Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 S
+Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 -
# From Paul Eggert (2007-12-28):
# DST was set to expire on March 5, not March 3, but since it was converted
# to standard time on March 3 it's more convenient for us to pretend that
@@ -213,9 +213,9 @@
# la modificación del huso horario, ya que 2009 nos encuentra con
# crecimiento en la producción y distribución energética."
-Rule Arg 2007 only - Dec 30 0:00 1:00 S
+Rule Arg 2007 only - Dec 30 0:00 1:00 -
Rule Arg 2008 2009 - Mar Sun>=15 0:00 0 -
-Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S
+Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
# From Mariano Absatz (2004-05-21):
# Today it was officially published that the Province of Mendoza is changing
@@ -225,12 +225,14 @@
# It's Law No. 7,210. This change is due to a public power emergency, so for
# now we'll assume it's for this year only.
#
-# From Paul Eggert (2014-08-09):
+# From Paul Eggert (2018-01-31):
# Hora de verano para la República Argentina
# http://buenasiembra.com.ar/esoterismo/astrologia/hora-de-verano-de-la-republica-argentina-27.html
# says that standard time in Argentina from 1894-10-31
# to 1920-05-01 was -4:16:48.25. Go with this more-precise value
-# over Shanks & Pottenger.
+# over Shanks & Pottenger. It is upward compatible with Milne, who
+# says Córdoba time was -4:16:48.2.
+
#
# From Mariano Absatz (2004-06-05):
# These media articles from a major newspaper mostly cover the current state:
@@ -404,9 +406,9 @@
# rules...San Luis is still using "Western ARgentina Time" and it got
# stuck on Summer daylight savings time even though the summer is over.
-# From Paul Eggert (2013-09-05):
+# From Paul Eggert (2018-01-23):
# Perhaps San Luis operates on the legal fiction that it is at -04
-# with perpetual summer time, but ordinary usage typically seems to
+# with perpetual daylight saving time, but ordinary usage typically seems to
# just say it's at -03; see, for example,
# https://es.wikipedia.org/wiki/Hora_oficial_argentina
# We've documented similar situations as being plain changes to
@@ -415,9 +417,6 @@
# plus is that this silences a zic complaint that there's no POSIX TZ
# setting for time stamps past 2038.
-# From Paul Eggert (2013-02-21):
-# Milne says Córdoba time was -4:16:48.2. Round to the nearest second.
-
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
#
# Buenos Aires (BA), Capital Federal (CF),
@@ -552,7 +551,7 @@
# San Luis (SL)
Rule SanLuis 2008 2009 - Mar Sun>=8 0:00 0 -
-Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 S
+Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May
@@ -794,14 +793,14 @@
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
# Decree 20,466 <http://pcdsh01.on.br/HV20466.htm> (1931-10-01)
# Decree 21,896 <http://pcdsh01.on.br/HV21896.htm> (1932-01-10)
-Rule Brazil 1931 only - Oct 3 11:00 1:00 S
+Rule Brazil 1931 only - Oct 3 11:00 1:00 -
Rule Brazil 1932 1933 - Apr 1 0:00 0 -
-Rule Brazil 1932 only - Oct 3 0:00 1:00 S
+Rule Brazil 1932 only - Oct 3 0:00 1:00 -
# Decree 23,195 <http://pcdsh01.on.br/HV23195.htm> (1933-10-10)
# revoked DST.
# Decree 27,496 <http://pcdsh01.on.br/HV27496.htm> (1949-11-24)
# Decree 27,998 <http://pcdsh01.on.br/HV27998.htm> (1950-04-13)
-Rule Brazil 1949 1952 - Dec 1 0:00 1:00 S
+Rule Brazil 1949 1952 - Dec 1 0:00 1:00 -
Rule Brazil 1950 only - Apr 16 1:00 0 -
Rule Brazil 1951 1952 - Apr 1 0:00 0 -
# Decree 32,308 <http://pcdsh01.on.br/HV32308.htm> (1953-02-24)
@@ -813,51 +812,51 @@
# in SP, RJ, GB, MG, ES, due to the prolongation of the drought.
# Decree 53,071 <http://pcdsh01.on.br/HV53071.htm> (1963-12-03)
# extended the above decree to all of the national territory on 12-09.
-Rule Brazil 1963 only - Dec 9 0:00 1:00 S
+Rule Brazil 1963 only - Dec 9 0:00 1:00 -
# Decree 53,604 <http://pcdsh01.on.br/HV53604.htm> (1964-02-25)
# extended summer time by one day to 1964-03-01 00:00 (start of school).
Rule Brazil 1964 only - Mar 1 0:00 0 -
# Decree 55,639 <http://pcdsh01.on.br/HV55639.htm> (1965-01-27)
-Rule Brazil 1965 only - Jan 31 0:00 1:00 S
+Rule Brazil 1965 only - Jan 31 0:00 1:00 -
Rule Brazil 1965 only - Mar 31 0:00 0 -
# Decree 57,303 <http://pcdsh01.on.br/HV57303.htm> (1965-11-22)
-Rule Brazil 1965 only - Dec 1 0:00 1:00 S
+Rule Brazil 1965 only - Dec 1 0:00 1:00 -
# Decree 57,843 <http://pcdsh01.on.br/HV57843.htm> (1966-02-18)
Rule Brazil 1966 1968 - Mar 1 0:00 0 -
-Rule Brazil 1966 1967 - Nov 1 0:00 1:00 S
+Rule Brazil 1966 1967 - Nov 1 0:00 1:00 -
# Decree 63,429 <http://pcdsh01.on.br/HV63429.htm> (1968-10-15)
# revoked DST.
# Decree 91,698 <http://pcdsh01.on.br/HV91698.htm> (1985-09-27)
-Rule Brazil 1985 only - Nov 2 0:00 1:00 S
+Rule Brazil 1985 only - Nov 2 0:00 1:00 -
# Decree 92,310 (1986-01-21)
# Decree 92,463 (1986-03-13)
Rule Brazil 1986 only - Mar 15 0:00 0 -
# Decree 93,316 (1986-10-01)
-Rule Brazil 1986 only - Oct 25 0:00 1:00 S
+Rule Brazil 1986 only - Oct 25 0:00 1:00 -
Rule Brazil 1987 only - Feb 14 0:00 0 -
# Decree 94,922 <http://pcdsh01.on.br/HV94922.htm> (1987-09-22)
-Rule Brazil 1987 only - Oct 25 0:00 1:00 S
+Rule Brazil 1987 only - Oct 25 0:00 1:00 -
Rule Brazil 1988 only - Feb 7 0:00 0 -
# Decree 96,676 <http://pcdsh01.on.br/HV96676.htm> (1988-09-12)
# except for the states of AC, AM, PA, RR, RO, and AP (then a territory)
-Rule Brazil 1988 only - Oct 16 0:00 1:00 S
+Rule Brazil 1988 only - Oct 16 0:00 1:00 -
Rule Brazil 1989 only - Jan 29 0:00 0 -
# Decree 98,077 <http://pcdsh01.on.br/HV98077.htm> (1989-08-21)
# with the same exceptions
-Rule Brazil 1989 only - Oct 15 0:00 1:00 S
+Rule Brazil 1989 only - Oct 15 0:00 1:00 -
Rule Brazil 1990 only - Feb 11 0:00 0 -
# Decree 99,530 <http://pcdsh01.on.br/HV99530.htm> (1990-09-17)
# adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF.
# Decree 99,629 (1990-10-19) adds BA, MT.
-Rule Brazil 1990 only - Oct 21 0:00 1:00 S
+Rule Brazil 1990 only - Oct 21 0:00 1:00 -
Rule Brazil 1991 only - Feb 17 0:00 0 -
# Unnumbered decree <http://pcdsh01.on.br/HV1991.htm> (1991-09-25)
# adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF.
-Rule Brazil 1991 only - Oct 20 0:00 1:00 S
+Rule Brazil 1991 only - Oct 20 0:00 1:00 -
Rule Brazil 1992 only - Feb 9 0:00 0 -
# Unnumbered decree <http://pcdsh01.on.br/HV1992.htm> (1992-10-16)
# adopted by same states.
-Rule Brazil 1992 only - Oct 25 0:00 1:00 S
+Rule Brazil 1992 only - Oct 25 0:00 1:00 -
Rule Brazil 1993 only - Jan 31 0:00 0 -
# Decree 942 <http://pcdsh01.on.br/HV942.htm> (1993-09-28)
# adopted by same states, plus AM.
@@ -867,12 +866,12 @@
# adopted by same states, plus MT and TO.
# Decree 1,674 <http://pcdsh01.on.br/HV1674.htm> (1995-10-13)
# adds AL, SE.
-Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 S
+Rule Brazil 1993 1995 - Oct Sun>=11 0:00 1:00 -
Rule Brazil 1994 1995 - Feb Sun>=15 0:00 0 -
Rule Brazil 1996 only - Feb 11 0:00 0 -
# Decree 2,000 <http://pcdsh01.on.br/HV2000.htm> (1996-09-04)
# adopted by same states, minus AL, SE.
-Rule Brazil 1996 only - Oct 6 0:00 1:00 S
+Rule Brazil 1996 only - Oct 6 0:00 1:00 -
Rule Brazil 1997 only - Feb 16 0:00 0 -
# From Daniel C. Sobral (1998-02-12):
# In 1997, the DS began on October 6. The stated reason was that
@@ -882,19 +881,19 @@
# to help dealing with the shortages of electric power.
#
# Decree 2,317 (1997-09-04), adopted by same states.
-Rule Brazil 1997 only - Oct 6 0:00 1:00 S
+Rule Brazil 1997 only - Oct 6 0:00 1:00 -
# Decree 2,495 <http://pcdsh01.on.br/figuras/HV2495.JPG>
# (1998-02-10)
Rule Brazil 1998 only - Mar 1 0:00 0 -
# Decree 2,780 <http://pcdsh01.on.br/figuras/Hv98.jpg> (1998-09-11)
# adopted by the same states as before.
-Rule Brazil 1998 only - Oct 11 0:00 1:00 S
+Rule Brazil 1998 only - Oct 11 0:00 1:00 -
Rule Brazil 1999 only - Feb 21 0:00 0 -
# Decree 3,150 <http://pcdsh01.on.br/figuras/HV3150.gif>
# (1999-08-23) adopted by same states.
# Decree 3,188 <http://pcdsh01.on.br/DecHV99.gif> (1999-09-30)
# adds SE, AL, PB, PE, RN, CE, PI, MA and RR.
-Rule Brazil 1999 only - Oct 3 0:00 1:00 S
+Rule Brazil 1999 only - Oct 3 0:00 1:00 -
Rule Brazil 2000 only - Feb 27 0:00 0 -
# Decree 3,592 <http://pcdsh01.on.br/DEC3592.htm> (2000-09-06)
# adopted by the same states as before.
@@ -904,34 +903,34 @@
# repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00.
# Decree 3,916 <http://pcdsh01.on.br/figuras/HV3916.gif>
# (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
-Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 -
Rule Brazil 2001 2006 - Feb Sun>=15 0:00 0 -
# Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
# 4,399 <http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm>
-Rule Brazil 2002 only - Nov 3 0:00 1:00 S
+Rule Brazil 2002 only - Nov 3 0:00 1:00 -
# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
# 4,844 <http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm>
-Rule Brazil 2003 only - Oct 19 0:00 1:00 S
+Rule Brazil 2003 only - Oct 19 0:00 1:00 -
# Decree 5,223 (2004-10-01) reestablishes DST in MT.
# 5,223 <http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm>
-Rule Brazil 2004 only - Nov 2 0:00 1:00 S
+Rule Brazil 2004 only - Nov 2 0:00 1:00 -
# Decree 5,539 <http://pcdsh01.on.br/DecHV5539.gif> (2005-09-19),
# adopted by the same states as before.
-Rule Brazil 2005 only - Oct 16 0:00 1:00 S
+Rule Brazil 2005 only - Oct 16 0:00 1:00 -
# Decree 5,920 <http://pcdsh01.on.br/DecHV5920.gif> (2006-10-03),
# adopted by the same states as before.
-Rule Brazil 2006 only - Nov 5 0:00 1:00 S
+Rule Brazil 2006 only - Nov 5 0:00 1:00 -
Rule Brazil 2007 only - Feb 25 0:00 0 -
# Decree 6,212 <http://pcdsh01.on.br/DecHV6212.gif> (2007-09-26),
# adopted by the same states as before.
-Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S
+Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 -
# From Frederico A. C. Neves (2008-09-10):
# According to this decree
# http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm
# [t]he DST period in Brazil now on will be from the 3rd Oct Sunday to the
# 3rd Feb Sunday. There is an exception on the return date when this is
# the Carnival Sunday then the return date will be the next Sunday...
-Rule Brazil 2008 2017 - Oct Sun>=15 0:00 1:00 S
+Rule Brazil 2008 2017 - Oct Sun>=15 0:00 1:00 -
Rule Brazil 2008 2011 - Feb Sun>=15 0:00 0 -
# Decree 7,584 <http://pcdsh01.on.br/HVdecreto7584_20111013.jpg> (2011-10-13)
# added Bahia.
@@ -949,7 +948,7 @@
# ... https://www.timeanddate.com/news/time/brazil-delays-dst-2018.html
# From Steffen Thorsen (2017-12-20):
# http://www.planalto.gov.br/ccivil_03/_ato2015-2018/2017/decreto/D9242.htm
-Rule Brazil 2018 max - Nov Sun>=1 0:00 1:00 S
+Rule Brazil 2018 max - Nov Sun>=1 0:00 1:00 -
Rule Brazil 2023 only - Feb Sun>=22 0:00 0 -
Rule Brazil 2024 2025 - Feb Sun>=15 0:00 0 -
Rule Brazil 2026 only - Feb Sun>=22 0:00 0 -
@@ -1256,28 +1255,28 @@
# For now, assume that they will not revert.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Chile 1927 1931 - Sep 1 0:00 1:00 S
+Rule Chile 1927 1931 - Sep 1 0:00 1:00 -
Rule Chile 1928 1932 - Apr 1 0:00 0 -
-Rule Chile 1968 only - Nov 3 4:00u 1:00 S
+Rule Chile 1968 only - Nov 3 4:00u 1:00 -
Rule Chile 1969 only - Mar 30 3:00u 0 -
-Rule Chile 1969 only - Nov 23 4:00u 1:00 S
+Rule Chile 1969 only - Nov 23 4:00u 1:00 -
Rule Chile 1970 only - Mar 29 3:00u 0 -
Rule Chile 1971 only - Mar 14 3:00u 0 -
-Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1970 1972 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1972 1986 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1973 only - Sep 30 4:00u 1:00 S
-Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1973 only - Sep 30 4:00u 1:00 -
+Rule Chile 1974 1987 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1987 only - Apr 12 3:00u 0 -
Rule Chile 1988 1990 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1988 1989 - Oct Sun>=9 4:00u 1:00 S
-Rule Chile 1990 only - Sep 16 4:00u 1:00 S
+Rule Chile 1988 1989 - Oct Sun>=9 4:00u 1:00 -
+Rule Chile 1990 only - Sep 16 4:00u 1:00 -
Rule Chile 1991 1996 - Mar Sun>=9 3:00u 0 -
-Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1991 1997 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 1997 only - Mar 30 3:00u 0 -
Rule Chile 1998 only - Mar Sun>=9 3:00u 0 -
-Rule Chile 1998 only - Sep 27 4:00u 1:00 S
+Rule Chile 1998 only - Sep 27 4:00u 1:00 -
Rule Chile 1999 only - Apr 4 3:00u 0 -
-Rule Chile 1999 2010 - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 1999 2010 - Oct Sun>=9 4:00u 1:00 -
Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
# N.B.: the end of March 29 in Chile is March 30 in Universal time,
# which is used below in specifying the transition.
@@ -1285,11 +1284,11 @@
Rule Chile 2009 only - Mar Sun>=9 3:00u 0 -
Rule Chile 2010 only - Apr Sun>=1 3:00u 0 -
Rule Chile 2011 only - May Sun>=2 3:00u 0 -
-Rule Chile 2011 only - Aug Sun>=16 4:00u 1:00 S
+Rule Chile 2011 only - Aug Sun>=16 4:00u 1:00 -
Rule Chile 2012 2014 - Apr Sun>=23 3:00u 0 -
-Rule Chile 2012 2014 - Sep Sun>=2 4:00u 1:00 S
+Rule Chile 2012 2014 - Sep Sun>=2 4:00u 1:00 -
Rule Chile 2016 max - May Sun>=9 3:00u 0 -
-Rule Chile 2016 max - Aug Sun>=9 4:00u 1:00 S
+Rule Chile 2016 max - Aug Sun>=9 4:00u 1:00 -
# IATA SSIM anomalies: (1992-02) says 1992-03-14;
# (1996-09) says 1998-03-08. Ignore these.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1354,7 +1353,7 @@
# "A variation of fifteen minutes in the public clocks of Bogota is not rare."
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule CO 1992 only - May 3 0:00 1:00 S
+Rule CO 1992 only - May 3 0:00 1:00 -
Rule CO 1993 only - Apr 4 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
@@ -1414,7 +1413,7 @@
# repeated. For now, assume transitions were at 00:00 local time country-wide.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Ecuador 1992 only - Nov 28 0:00 1:00 S
+Rule Ecuador 1992 only - Nov 28 0:00 1:00 -
Rule Ecuador 1993 only - Feb 5 0:00 0 -
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1504,22 +1503,22 @@
# the maintainers of the database to inform them we're adopting
# the same policy this year and suggest recommendations for future years.
#
-# For now we will assume permanent summer time for the Falklands
+# For now we will assume permanent -03 for the Falklands
# until advised differently (to apply for 2012 and beyond, after the 2011
# experiment was apparently successful.)
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Falk 1937 1938 - Sep lastSun 0:00 1:00 S
+Rule Falk 1937 1938 - Sep lastSun 0:00 1:00 -
Rule Falk 1938 1942 - Mar Sun>=19 0:00 0 -
-Rule Falk 1939 only - Oct 1 0:00 1:00 S
-Rule Falk 1940 1942 - Sep lastSun 0:00 1:00 S
+Rule Falk 1939 only - Oct 1 0:00 1:00 -
+Rule Falk 1940 1942 - Sep lastSun 0:00 1:00 -
Rule Falk 1943 only - Jan 1 0:00 0 -
-Rule Falk 1983 only - Sep lastSun 0:00 1:00 S
+Rule Falk 1983 only - Sep lastSun 0:00 1:00 -
Rule Falk 1984 1985 - Apr lastSun 0:00 0 -
-Rule Falk 1984 only - Sep 16 0:00 1:00 S
-Rule Falk 1985 2000 - Sep Sun>=9 0:00 1:00 S
+Rule Falk 1984 only - Sep 16 0:00 1:00 -
+Rule Falk 1985 2000 - Sep Sun>=9 0:00 1:00 -
Rule Falk 1986 2000 - Apr Sun>=16 0:00 0 -
Rule Falk 2001 2010 - Apr Sun>=15 2:00 0 -
-Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 S
+Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Atlantic/Stanley -3:51:24 - LMT 1890
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
@@ -1554,16 +1553,16 @@
# adjust their clocks at 0 hour of the given dates.
#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Para 1975 1988 - Oct 1 0:00 1:00 S
+Rule Para 1975 1988 - Oct 1 0:00 1:00 -
Rule Para 1975 1978 - Mar 1 0:00 0 -
Rule Para 1979 1991 - Apr 1 0:00 0 -
-Rule Para 1989 only - Oct 22 0:00 1:00 S
-Rule Para 1990 only - Oct 1 0:00 1:00 S
-Rule Para 1991 only - Oct 6 0:00 1:00 S
+Rule Para 1989 only - Oct 22 0:00 1:00 -
+Rule Para 1990 only - Oct 1 0:00 1:00 -
+Rule Para 1991 only - Oct 6 0:00 1:00 -
Rule Para 1992 only - Mar 1 0:00 0 -
-Rule Para 1992 only - Oct 5 0:00 1:00 S
+Rule Para 1992 only - Oct 5 0:00 1:00 -
Rule Para 1993 only - Mar 31 0:00 0 -
-Rule Para 1993 1995 - Oct 1 0:00 1:00 S
+Rule Para 1993 1995 - Oct 1 0:00 1:00 -
Rule Para 1994 1995 - Feb lastSun 0:00 0 -
Rule Para 1996 only - Mar 1 0:00 0 -
# IATA SSIM (2000-02) says 1999-10-10; ignore this for now.
@@ -1581,7 +1580,7 @@
# year, the time will change on the first Sunday of October; likewise, the
# clock will be set back on the first Sunday of March.
#
-Rule Para 1996 2001 - Oct Sun>=1 0:00 1:00 S
+Rule Para 1996 2001 - Oct Sun>=1 0:00 1:00 -
# IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
Rule Para 1997 only - Feb lastSun 0:00 0 -
# Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
@@ -1592,7 +1591,7 @@
# dst method to be from the first Sunday in September to the first Sunday in
# April.
Rule Para 2002 2004 - Apr Sun>=1 0:00 0 -
-Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 S
+Rule Para 2002 2003 - Sep Sun>=1 0:00 1:00 -
#
# From Jesper Nørgaard Welen (2005-01-02):
# There are several sources that claim that Paraguay made
@@ -1601,7 +1600,7 @@
# Decree 1,867 (2004-03-05)
# From Carlos Raúl Perasso via Jesper Nørgaard Welen (2006-10-13)
# http://www.presidencia.gov.py/decretos/D1867.pdf
-Rule Para 2004 2009 - Oct Sun>=15 0:00 1:00 S
+Rule Para 2004 2009 - Oct Sun>=15 0:00 1:00 -
Rule Para 2005 2009 - Mar Sun>=8 0:00 0 -
# From Carlos Raúl Perasso (2010-02-18):
# By decree number 3958 issued yesterday
@@ -1614,7 +1613,7 @@
# and that on the first Sunday of the month of October, it is to be set
# forward 60 minutes, in all the territory of the Paraguayan Republic.
# ...
-Rule Para 2010 max - Oct Sun>=1 0:00 1:00 S
+Rule Para 2010 max - Oct Sun>=1 0:00 1:00 -
Rule Para 2010 2012 - Apr Sun>=8 0:00 0 -
#
# From Steffen Thorsen (2013-03-07):
@@ -1647,16 +1646,16 @@
# Shanks & Pottenger don't have this transition. Assume 1986 was like 1987.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Peru 1938 only - Jan 1 0:00 1:00 S
+Rule Peru 1938 only - Jan 1 0:00 1:00 -
Rule Peru 1938 only - Apr 1 0:00 0 -
-Rule Peru 1938 1939 - Sep lastSun 0:00 1:00 S
+Rule Peru 1938 1939 - Sep lastSun 0:00 1:00 -
Rule Peru 1939 1940 - Mar Sun>=24 0:00 0 -
-Rule Peru 1986 1987 - Jan 1 0:00 1:00 S
+Rule Peru 1986 1987 - Jan 1 0:00 1:00 -
Rule Peru 1986 1987 - Apr 1 0:00 0 -
-Rule Peru 1990 only - Jan 1 0:00 1:00 S
+Rule Peru 1990 only - Jan 1 0:00 1:00 -
Rule Peru 1990 only - Apr 1 0:00 0 -
# IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
-Rule Peru 1994 only - Jan 1 0:00 1:00 S
+Rule Peru 1994 only - Jan 1 0:00 1:00 -
Rule Peru 1994 only - Apr 1 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Lima -5:08:12 - LMT 1890
@@ -1702,72 +1701,201 @@
# Uruguay
# From Paul Eggert (1993-11-18):
# Uruguay wins the prize for the strangest peacetime manipulation of the rules.
-# From Shanks & Pottenger:
+#
+# From Tim Parenti (2018-02-20), per Jeremie Bonjour (2018-01-31) and Michael
+# Deckers (2018-02-20):
+# ... At least they kept good records...
+#
+# http://www.armada.mil.uy/ContenidosPDFs/sohma/web/almanaque/almanaque_2018.pdf#page=36
+# Page 36 of Almanaque 2018, published by the Oceanography, Hydrography, and
+# Meteorology Service of the Uruguayan Navy, seems to give many transitions
+# with greater clarity than we've had before. It directly references many laws
+# and decrees which are, in turn, referenced below. They can be viewed in the
+# public archives of the Diario Oficial (in Spanish) at
+# http://www.impo.com.uy/diariooficial/
+#
+# Ley No. 3920 of 1908-06-10 placed the determination of legal time under the
+# auspices of the National Institute for the Prediction of Time. It is unclear
+# exactly what offset was used during this period, though Ley No. 7200 of
+# 1920-04-23 used the Observatory of the National Meteorological Institute in
+# Montevideo (34° 54' 33" S, 56° 12' 45" W) as its reference meridian,
+# retarding legal time by 15 minutes 9 seconds from 1920-04-30 24:00,
+# resulting in UT-04. Assume the corresponding LMT of UT-03:44:51 (given on
+# page 725 of the Proceedings of the Second Pan-American Scientific Congress,
+# 1915-1916) was in use, and merely became official from 1908-06-10.
+# https://www.impo.com.uy/diariooficial/1908/06/18/12
+# https://www.impo.com.uy/diariooficial/1920/04/27/9
+#
+# Ley No. 7594 of 1923-06-28 specified legal time as Observatory time advanced
+# by 44 minutes 51 seconds (UT-03) "from 30 September to 31 March", and by 14
+# minutes 51 seconds (UT-03:30) "the rest of the year"; a message from the
+# National Council of Administration the same day, published directly below the
+# law in the Diario Oficial, specified the first transition to be 1923-09-30
+# 24:00. This effectively established standard time at UT-03:30 with 30
+# minutes DST. Assume transitions at 24:00 on the specified days until Ley No.
+# 7919 of 1926-03-05 ended this arrangement, repealing all "laws and other
+# provisions which oppose" it, resulting in year-round UT-03:30; a Resolución
+# of 1926-03-11 puts the final transition at 1926-03-31 24:00, the same as it
+# would have been under the previous law.
+# https://www.impo.com.uy/diariooficial/1923/07/02/2
+# https://www.impo.com.uy/diariooficial/1926/03/10/2
+# https://www.impo.com.uy/diariooficial/1926/03/18/2
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
-Rule Uruguay 1923 only - Oct 2 0:00 0:30 HS
+Rule Uruguay 1923 1925 - Oct 1 0:00 0:30 -
Rule Uruguay 1924 1926 - Apr 1 0:00 0 -
-Rule Uruguay 1924 1925 - Oct 1 0:00 0:30 HS
-Rule Uruguay 1933 1935 - Oct lastSun 0:00 0:30 HS
-# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
-Rule Uruguay 1934 1936 - Mar Sat>=25 23:30s 0 -
-Rule Uruguay 1936 only - Nov 1 0:00 0:30 HS
-Rule Uruguay 1937 1941 - Mar lastSun 0:00 0 -
-# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
-Rule Uruguay 1937 1940 - Oct lastSun 0:00 0:30 HS
-# Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
-# and 1943 Apr 13 "to present time"; go with Shanks & Pottenger.
-Rule Uruguay 1941 only - Aug 1 0:00 0:30 HS
-Rule Uruguay 1942 only - Jan 1 0:00 0 -
-Rule Uruguay 1942 only - Dec 14 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# http://www.impo.com.uy/diariooficial/1933/10/27/6
+#
+# It appears Ley No. 9122 of 1933 was never published as such in the Diario
+# Oficial, but instead appeared as Document 26 in the Diario on Friday
+# 1933-10-27 as a decree made Monday 1933-10-23 and filed under the Ministry of
+# National Defense. It reinstituted a DST of 30 minutes (to UT-03) "from the
+# last Sunday of October...until the last Saturday of March." In accordance
+# with this provision, the first transition was explicitly specified in Article
+# 2 of the decree as Saturday 1933-10-28 at 24:00; that is, Sunday 1933-10-29
+# at 00:00. Assume transitions at 00:00 Sunday throughout.
+#
+# Departing from the matter-of-fact nature of previous timekeeping laws, the
+# 1933 decree "consider[s] the advantages of...the advance of legal time":
+#
+# "Whereas: The measure adopted by almost all nations at the time of the last
+# World War still persists in North America and Europe, precisely because of
+# the economic, hygienic, and social advantages derived from such an
+# emergency measure...
+#
+# Whereas: The advance of the legal time during the summer seasons, by
+# displacing social activity near sunrise, favors the citizen populations
+# and especially the society that creates and works..."
+#
+# It further specified that "necessary measures" be taken to ensure that
+# "public spectacles finish, in general, before [01:00]."
+Rule Uruguay 1933 1938 - Oct lastSun 0:00 0:30 -
+Rule Uruguay 1934 1941 - Mar lastSat 24:00 0 -
+# From Tim Parenti (2018-02-15):
+# Most of the Rules below, and their contemporaneous Zone lines, have been
+# updated simply to match the Almanaque 2018. Although the document does not
+# list exact transition times, midnight transitions were already present in our
+# data here for all transitions through 2004-09, and this is both consistent
+# with prior transitions and verified in several decrees marked below between
+# 1939-09 and 2004-09, wherein the relevant text was typically of the form:
+#
+# "From 0 hours on [date], the legal time of the entire Republic will be...
+#
+# In accordance with [the preceding], on [previous date] at 24 hours, all
+# clocks throughout the Republic will be [advanced/retarded] by..."
+#
+# It is possible that there is greater specificity to be found for the Rules
+# below, but it is buried in no fewer than 40 different decrees individually
+# referenced by the Almanaque for the period from 1939-09 to 2014-09.
+# Four-fifths of these were promulgated less than two weeks before taking
+# effect; more than half within a week and none more than 5 weeks. Only the
+# handful with comments below have been checked with any thoroughness.
+Rule Uruguay 1939 only - Oct 1 0:00 0:30 -
+Rule Uruguay 1940 only - Oct 27 0:00 0:30 -
+# From Tim Parenti (2018-02-15):
+# Decreto 1145 of the Ministry of National Defense, dated 1941-07-26, specified
+# UT-03 from Friday 1941-08-01 00:00, citing an "urgent...need to save fuel".
+# http://www.impo.com.uy/diariooficial/1941/08/04/1
+Rule Uruguay 1941 only - Aug 1 0:00 0:30 -
+# From Tim Parenti (2018-02-15):
+# Decreto 1866 of the Ministry of National Defense, dated 1942-12-09, specified
+# further advancement (to UT-02:30) from Sunday 1942-12-13 24:00. Since clocks
+# never went back to UT-03:30 thereafter, this is modeled as advancing standard
+# time by 30 minutes to UT-03, while retaining 30 minutes of DST.
+# http://www.impo.com.uy/diariooficial/1942/12/16/3
+Rule Uruguay 1942 only - Dec 14 0:00 0:30 -
Rule Uruguay 1943 only - Mar 14 0:00 0 -
-Rule Uruguay 1959 only - May 24 0:00 1:00 S
+Rule Uruguay 1959 only - May 24 0:00 0:30 -
Rule Uruguay 1959 only - Nov 15 0:00 0 -
-Rule Uruguay 1960 only - Jan 17 0:00 1:00 S
+Rule Uruguay 1960 only - Jan 17 0:00 1:00 -
Rule Uruguay 1960 only - Mar 6 0:00 0 -
-Rule Uruguay 1965 1967 - Apr Sun>=1 0:00 1:00 S
+Rule Uruguay 1965 only - Apr 4 0:00 1:00 -
Rule Uruguay 1965 only - Sep 26 0:00 0 -
-Rule Uruguay 1966 1967 - Oct 31 0:00 0 -
-Rule Uruguay 1968 1970 - May 27 0:00 0:30 HS
-Rule Uruguay 1968 1970 - Dec 2 0:00 0 -
-Rule Uruguay 1972 only - Apr 24 0:00 1:00 S
-Rule Uruguay 1972 only - Aug 15 0:00 0 -
-Rule Uruguay 1974 only - Mar 10 0:00 0:30 HS
-Rule Uruguay 1974 only - Dec 22 0:00 1:00 S
-Rule Uruguay 1976 only - Oct 1 0:00 0 -
-Rule Uruguay 1977 only - Dec 4 0:00 1:00 S
-Rule Uruguay 1978 only - Apr 1 0:00 0 -
-Rule Uruguay 1979 only - Oct 1 0:00 1:00 S
-Rule Uruguay 1980 only - May 1 0:00 0 -
-Rule Uruguay 1987 only - Dec 14 0:00 1:00 S
-Rule Uruguay 1988 only - Mar 14 0:00 0 -
-Rule Uruguay 1988 only - Dec 11 0:00 1:00 S
-Rule Uruguay 1989 only - Mar 12 0:00 0 -
-Rule Uruguay 1989 only - Oct 29 0:00 1:00 S
-# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
-# and that 1992/3's DST was from 10-25 to 03-01. Go with IATA.
-Rule Uruguay 1990 1992 - Mar Sun>=1 0:00 0 -
-Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 S
-Rule Uruguay 1992 only - Oct 18 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# Decreto 321/968 of 1968-05-25, citing emergency drought measures decreed the
+# day before, brought clocks forward 30 minutes from Monday 1968-05-27 00:00.
+# http://www.impo.com.uy/diariooficial/1968/05/30/5
+Rule Uruguay 1968 only - May 27 0:00 0:30 -
+Rule Uruguay 1968 only - Dec 1 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 188/970 of 1970-04-23 instituted restrictions on electricity
+# consumption "as a consequence of the current rainfall regime in the country".
+# Articles 13 and 14 advanced clocks by an hour from Saturday 1970-04-25 00:00.
+# http://www.impo.com.uy/diariooficial/1970/04/29/4
+Rule Uruguay 1970 only - Apr 25 0:00 1:00 -
+Rule Uruguay 1970 only - Jun 14 0:00 0 -
+Rule Uruguay 1972 only - Apr 23 0:00 1:00 -
+Rule Uruguay 1972 only - Jul 16 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 29/974 of 1974-01-11, citing "the international rise in the price of
+# oil", advanced clocks by 90 minutes (to UT-01:30). Decreto 163/974 of
+# 1974-03-04 returned 60 of those minutes (to UT-02:30), and the remaining 30
+# minutes followed in Decreto 679/974 of 1974-08-29.
+# http://www.impo.com.uy/diariooficial/1974/01/22/11
+# http://www.impo.com.uy/diariooficial/1974/03/14/3
+# http://www.impo.com.uy/diariooficial/1974/09/04/6
+Rule Uruguay 1974 only - Jan 13 0:00 1:30 -
+Rule Uruguay 1974 only - Mar 10 0:00 0:30 -
+Rule Uruguay 1974 only - Sep 1 0:00 0 -
+Rule Uruguay 1974 only - Dec 22 0:00 1:00 -
+Rule Uruguay 1975 only - Mar 30 0:00 0 -
+Rule Uruguay 1976 only - Dec 19 0:00 1:00 -
+Rule Uruguay 1977 only - Mar 6 0:00 0 -
+Rule Uruguay 1977 only - Dec 4 0:00 1:00 -
+Rule Uruguay 1978 1979 - Mar Sun>=1 0:00 0 -
+Rule Uruguay 1978 only - Dec 17 0:00 1:00 -
+Rule Uruguay 1979 only - Apr 29 0:00 1:00 -
+Rule Uruguay 1980 only - Mar 16 0:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 725/987 of 1987-12-04 cited "better use of national tourist
+# attractions" to advance clocks one hour from Monday 1987-12-14 00:00.
+# http://www.impo.com.uy/diariooficial/1988/01/25/1
+Rule Uruguay 1987 only - Dec 14 0:00 1:00 -
+Rule Uruguay 1988 only - Feb 28 0:00 0 -
+Rule Uruguay 1988 only - Dec 11 0:00 1:00 -
+Rule Uruguay 1989 only - Mar 5 0:00 0 -
+Rule Uruguay 1989 only - Oct 29 0:00 1:00 -
+Rule Uruguay 1990 only - Feb 25 0:00 0 -
+# From Tim Parenti (2018-02-15), per Paul Eggert (1999-11-04):
+# IATA agrees as below for 1990-10 through 1993-02. Per Almanaque 2018, the
+# 1992/1993 season appears to be the first in over half a century where DST
+# both began and ended pursuant to the same decree.
+Rule Uruguay 1990 1991 - Oct Sun>=21 0:00 1:00 -
+Rule Uruguay 1991 1992 - Mar Sun>=1 0:00 0 -
+Rule Uruguay 1992 only - Oct 18 0:00 1:00 -
Rule Uruguay 1993 only - Feb 28 0:00 0 -
# From Eduardo Cota (2004-09-20):
# The Uruguayan government has decreed a change in the local time....
-# http://www.presidencia.gub.uy/decretos/2004091502.htm
-Rule Uruguay 2004 only - Sep 19 0:00 1:00 S
+# From Tim Parenti (2018-02-15):
+# Decreto 328/004 of 2004-09-15.
+# http://www.impo.com.uy/diariooficial/2004/09/23/documentos.pdf#page=1
+Rule Uruguay 2004 only - Sep 19 0:00 1:00 -
# From Steffen Thorsen (2005-03-11):
# Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
# save energy ... it was postponed two weeks....
-# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+# From Tim Parenti (2018-02-15):
+# This 2005 postponement is not in Almanaque 2018. Go with the contemporaneous
+# reporting, which is confirmed by Decreto 107/005 of 2005-03-10 amending
+# Decreto 328/004:
+# http://www.impo.com.uy/diariooficial/2005/03/15/documentos.pdf#page=1
+# The original decree specified a transition of 2005-03-12 24:00, but the new
+# one specified 2005-03-27 02:00.
Rule Uruguay 2005 only - Mar 27 2:00 0 -
# From Eduardo Cota (2005-09-27):
-# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
-# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
-# 02:00 local time, official time in Uruguay will be at GMT -2.
-Rule Uruguay 2005 only - Oct 9 2:00 1:00 S
-Rule Uruguay 2006 only - Mar 12 2:00 0 -
-# From Jesper Nørgaard Welen (2006-09-06):
-# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
-#
+# ...from 2005-10-09 at 02:00 local time, until 2006-03-12 at 02:00 local time,
+# official time in Uruguay will be at GMT -2.
+# From Tim Parenti (2018-02-15):
+# Decreto 318/005 of 2005-09-19.
+# http://www.impo.com.uy/diariooficial/2005/09/23/documentos.pdf#page=1
+Rule Uruguay 2005 only - Oct 9 2:00 1:00 -
+Rule Uruguay 2006 2015 - Mar Sun>=8 2:00 0 -
+# From Tim Parenti (2018-02-15), per Jesper Nørgaard Welen (2006-09-06):
+# Decreto 311/006 of 2006-09-04 established regular DST from the first Sunday
+# of October at 02:00 through the second Sunday of March at 02:00. Almanaque
+# 2018 appears to have a few typoed dates through this period; ignore them.
+# http://www.impo.com.uy/diariooficial/2006/09/08/documentos.pdf#page=1
+Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
# From Steffen Thorsen (2015-06-30):
# ... it looks like they will not be using DST the coming summer:
# http://www.elobservador.com.uy/gobierno-resolvio-que-no-habra-cambio-horario-verano-n656787
@@ -1777,17 +1905,19 @@
# instead of out to dinner.
# From Pablo Camargo (2015-07-13):
# http://archivo.presidencia.gub.uy/sci/decretos/2015/06/cons_min_201.pdf
-# [dated 2015-06-29; repeals Decree 311/006 dated 2006-09-04]
-Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 S
-Rule Uruguay 2007 2015 - Mar Sun>=8 2:00 0 -
+# From Tim Parenti (2018-02-15):
+# Decreto 178/015 of 2015-06-29; repeals Decreto 311/006.
# This Zone can be simplified once we assume zic %z.
-Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28
- -3:44:44 - MMT 1920 May 1 # Montevideo MT
+Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
+ -3:44:51 - MMT 1920 May 1 # Montevideo MT
+ -4:00 - -04 1923 Oct 1
-3:30 Uruguay -0330/-03 1942 Dec 14
+ -3:00 Uruguay -03/-0230 1960
-3:00 Uruguay -03/-02 1968
- -3:00 Uruguay -03/-0230 1971
+ -3:00 Uruguay -03/-0230 1970
-3:00 Uruguay -03/-02 1974
+ -3:00 Uruguay -03/-0130 1974 Mar 10
-3:00 Uruguay -03/-0230 1974 Dec 22
-3:00 Uruguay -03/-02
diff --git a/jdk/test/sun/util/calendar/zi/tzdata/zone.tab b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab
index f6d9c66..873737e 100644
--- a/jdk/test/sun/util/calendar/zi/tzdata/zone.tab
+++ b/jdk/test/sun/util/calendar/zi/tzdata/zone.tab
@@ -452,7 +452,7 @@
US +643004-1652423 America/Nome Alaska (west)
US +515248-1763929 America/Adak Aleutian Islands
US +211825-1575130 Pacific/Honolulu Hawaii
-UY -3453-05611 America/Montevideo
+UY -345433-0561245 America/Montevideo
UZ +3940+06648 Asia/Samarkand Uzbekistan (west)
UZ +4120+06918 Asia/Tashkent Uzbekistan (east)
VA +415408+0122711 Europe/Vatican
diff --git a/jdk/test/tools/launcher/TestSpecialArgs.java b/jdk/test/tools/launcher/TestSpecialArgs.java
index 0e35f02..85b3b53 100644
--- a/jdk/test/tools/launcher/TestSpecialArgs.java
+++ b/jdk/test/tools/launcher/TestSpecialArgs.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 7124089 7131021 8042469 8066185
+ * @bug 7124089 7131021 8042469 8066185 8074373
* @summary Checks for Launcher special flags, such as MacOSX specific flags,
* and JVM NativeMemoryTracking flags.
* @compile -XDignore.symbol.file TestSpecialArgs.java EnvironmentVariables.java
@@ -270,6 +270,16 @@
tr = doExec(envMap, javaCmd, "Foo", "-XX:NativeMemoryTracking=summary");
checkTestResult(tr);
+ // should accept with no warnings
+ tr = doExec(javaCmd, "-cp", jarFile.getName(),
+ "-XX:NativeMemoryTracking=summary", "Foo");
+ ensureNoWarnings(tr);
+
+ // should accept with no warnings
+ tr = doExec(javaCmd, "-classpath", jarFile.getName(),
+ "-XX:NativeMemoryTracking=summary", "Foo");
+ ensureNoWarnings(tr);
+
// make sure a missing class is handled correctly, because the class
// resolution is performed by the JVM.
tr = doExec(javaCmd, "AbsentClass", "-XX:NativeMemoryTracking=summary");
@@ -278,6 +288,14 @@
}
}
+ void ensureNoWarnings(TestResult tr) {
+ checkTestResult(tr);
+ if (tr.contains("warning: Native Memory Tracking")) {
+ System.err.println(tr.toString());
+ throw new RuntimeException("Test Fails");
+ }
+ }
+
void checkTestResult(TestResult tr) {
if (!tr.isOK()) {
System.err.println(tr.toString());
diff --git a/nashorn/.hgtags b/nashorn/.hgtags
index a445274..3a34a10 100644
--- a/nashorn/.hgtags
+++ b/nashorn/.hgtags
@@ -864,12 +864,24 @@
0a93e6a9934e9e81e96b74e11402793026abfe55 jdk8u162-b11
3f877d379c48178a1203089ea56b4e8061689b5d jdk8u162-b12
3c567ee8d853375cafa61378ab890bb4e82d98c2 jdk8u162-b31
+59508dc01b26fa97854f4fed3ae466e3e3eb3a3e jdk8u162-b32
+4eff9c0f63f007c22495a4d4ab5c295499554855 jdk8u162-b33
+e6b190611af9e2b56270d45fdabb863ece49b600 jdk8u162-b34
3702c8d746075071f459a422a9f226f3a5be5c2f jdk8u171-b00
8281166a86a5ebee40858b6ed2f6068e640b0099 jdk8u171-b01
710e8cf9b7a554469bbaf78e371eb1f4fe086ce2 jdk8u171-b02
42903e21ee6aaab01763aa04a76378381d0ca58d jdk8u171-b03
0f09c1423f3454cac9eef7240d2ff831a104b4d8 jdk8u171-b04
801694cc35e00907f3ef382ae1495e2dadd22278 jdk8u171-b05
+3ae3ebe2e2ee5648c38862179b2b1d1951ad97d7 jdk8u172-b00
+8b311af3f1b260035ff12e86e324f8254b1d760b jdk8u172-b01
+e5e19194a8a2ce6849791bbc2aea2ac1632cdbc2 jdk8u172-b02
+93b6ac37872647ca64877561035f43473da96c04 jdk8u172-b03
+9bd2bd2edbd7c205deafc89c97cb882bce9f232c jdk8u172-b04
+42903e21ee6aaab01763aa04a76378381d0ca58d jdk8u181-b00
+42903e21ee6aaab01763aa04a76378381d0ca58d jdk8u171-b03
+0f09c1423f3454cac9eef7240d2ff831a104b4d8 jdk8u171-b04
+801694cc35e00907f3ef382ae1495e2dadd22278 jdk8u171-b05
bb41125356006139d5e56a1c67a55779a42a5a9e jdk8u171-b06
059028cb56528c8f1673497ad52f847b28eba43a jdk8u171-b07
fd005fcf00fe65dad4b86508a5cd2ea5c627acd5 jdk8u171-b08
@@ -887,3 +899,67 @@
32ba142b2880976087c6da77cc32e58a5d0e8798 jdk8u172-b08
1353afc92267dd05157f752d698fba528924e1a2 jdk8u172-b09
3087d3a4983a9f280e6b29582486e81f020973f2 jdk8u172-b10
+df6d51bc4491fd9fc6aacdb840d2d4d6a07efb03 jdk8u172-b11
+8daca0fd12400791d3fea02a5e9fc195deee06e2 jdk8u181-b01
+51994ad46b6c3be364677138e4f6e123a6c4e3c3 jdk8u181-b02
+4a9aad281a0ee5b34e9e1be146bfc564eaa0ae03 jdk8u181-b03
+5a0b8cd7f9b5cd6099bf7c0536bd114dd4cbf545 jdk8u191-b00
+c6d01f70f16682bcfcca4c5a85424a33bed96298 jdk8u172-b05
+7ea9b82890105406d1ac7316b28559ccc05768c0 jdk8u162-b35
+7de7950c0351ccd6f82787090b78c16b0384b90c jdk8u162-b36
+4aac2244c3a94ab41a583a7570b195f3f638069c jdk8u162-b37
+4c81e132698244f1b7f93a4d2c3d872dbb24bbc4 jdk8u162-b38
+3702c8d746075071f459a422a9f226f3a5be5c2f jdk8u171-b00
+8281166a86a5ebee40858b6ed2f6068e640b0099 jdk8u171-b01
+710e8cf9b7a554469bbaf78e371eb1f4fe086ce2 jdk8u171-b02
+42903e21ee6aaab01763aa04a76378381d0ca58d jdk8u181-b00
+42903e21ee6aaab01763aa04a76378381d0ca58d jdk8u171-b03
+0f09c1423f3454cac9eef7240d2ff831a104b4d8 jdk8u171-b04
+801694cc35e00907f3ef382ae1495e2dadd22278 jdk8u171-b05
+bb41125356006139d5e56a1c67a55779a42a5a9e jdk8u171-b06
+059028cb56528c8f1673497ad52f847b28eba43a jdk8u171-b07
+fd005fcf00fe65dad4b86508a5cd2ea5c627acd5 jdk8u171-b08
+9d9a43a064fc3db9a65a41accf707fc43605955f jdk8u171-b09
+e9b4feb9ed6ac7d8d620b162f8780f8470b21711 jdk8u171-b10
+921be31addf6c9fda681af76bec704780e5f2084 jdk8u171-b11
+3ae3ebe2e2ee5648c38862179b2b1d1951ad97d7 jdk8u172-b00
+8b311af3f1b260035ff12e86e324f8254b1d760b jdk8u172-b01
+e5e19194a8a2ce6849791bbc2aea2ac1632cdbc2 jdk8u172-b02
+93b6ac37872647ca64877561035f43473da96c04 jdk8u172-b03
+9bd2bd2edbd7c205deafc89c97cb882bce9f232c jdk8u172-b04
+c6d01f70f16682bcfcca4c5a85424a33bed96298 jdk8u172-b05
+bb62c7f3b3edf266edd5d093418958f1dc909ce7 jdk8u172-b06
+b14b138cc741dfb9980896516468a95c8c290cd7 jdk8u172-b07
+32ba142b2880976087c6da77cc32e58a5d0e8798 jdk8u172-b08
+1353afc92267dd05157f752d698fba528924e1a2 jdk8u172-b09
+3087d3a4983a9f280e6b29582486e81f020973f2 jdk8u172-b10
+df6d51bc4491fd9fc6aacdb840d2d4d6a07efb03 jdk8u172-b11
+1ade28deec4a0a92e4ee1d743fbd88594d2b033a jdk8u172-b31
+228f8e1dceb069247fad31d08baf61d7a57236a8 jdk8u172-b32
+8c6bd9d0cf71f8014a6c4840a051068660128a3c jdk8u172-b33
+fbb5a1798b866f62862e7b76f340fd9882f325e1 jdk8u172-b34
+7b299af843c764a53e38ffaca7b307cce64ca4e8 jdk8u172-b35
+2a333371ef73230759cd207b3ed544331ed6b7e5 jdk8u172-b36
+28cbe440b3c42aa68cff042394ecf3a805e1b569 jdk8u172-b37
+8daca0fd12400791d3fea02a5e9fc195deee06e2 jdk8u181-b01
+51994ad46b6c3be364677138e4f6e123a6c4e3c3 jdk8u181-b02
+4a9aad281a0ee5b34e9e1be146bfc564eaa0ae03 jdk8u181-b03
+cac6f31d52b6a20856116502eb23cf0e74835f72 jdk8u181-b04
+0408ebf536b802987b2954ecc1bd4c621373606c jdk8u181-b05
+6ef88474d405f58ba406ea4a7bd83bae33f9a385 jdk8u181-b06
+18446ca851c809c8aed7c8ff6869c70eb914f5f8 jdk8u181-b07
+b4549dc6d358429da7d6292600865d8915140944 jdk8u181-b08
+20f8098302f68178cc6ddc9e8b6c6420579cff97 jdk8u181-b09
+1bd5edae0ad07f595e9f6f04e55cb8ce935df26e jdk8u181-b10
+381f2224e3c3eadc2e3bfaf81d43be2d1f8078b9 jdk8u181-b11
+6372ac5af37ae40a4875c6cdf5c28aeb2a701899 jdk8u181-b12
+3824009355133053ce6c714fff39d2e12dc67cde jdk8u181-b13
+4706dc5f752c0e364413e62f19f905a543d602be jdk8u191-b01
+9bae2c31c00bb6081026f7cb61aa50c726239a7a jdk8u191-b02
+1d23567f6ea387f9e047dd0d81f303b6371a27fb jdk8u191-b03
+c374c805e6fb531f05ffd5070a148633c6f0626a jdk8u191-b04
+755288b11f2e8e9d59eb9149d65995b37bd4c9d7 jdk8u191-b05
+5fa57cd058f2c5b0ad03581295decdbdea455eb3 jdk8u191-b06
+878e65541b35df77127fccaf31397b981c9fa15e jdk8u191-b07
+c25dc7436704829b04a1d8803dfd4f3b88ec9f06 jdk8u191-b08
+a449d7e3eb3432c6ae9edcb30380c8f2a9fae45e jdk8u191-b09
diff --git a/nashorn/THIRD_PARTY_README b/nashorn/THIRD_PARTY_README
index e2b8e8d..0614dc2 100644
--- a/nashorn/THIRD_PARTY_README
+++ b/nashorn/THIRD_PARTY_README
@@ -181,6 +181,192 @@
-------------------------------------------------------------------------------
+%% This notice is provided with respect to DejaVu fonts v2.34, which may be
+included with JRE 8, and JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+------------------------------
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
+a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated
+documentation files (the "Font Software"), to reproduce and distribute the
+Font Software, including without limitation the rights to use, copy, merge,
+publish, distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright and trademark notices and this permission notice shall
+be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the fonts
+are renamed to names not containing either the words "Bitstream" or the word
+"Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream
+Vera" names.
+
+The Font Software may be sold as part of a larger software package but no
+copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE
+FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the Gnome Foundation or Bitstream
+Inc., respectively. For further information, contact: fonts at gnome dot
+org.
+
+Arev Fonts Copyright
+------------------------------
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the fonts accompanying this license ("Fonts") and
+associated documentation files (the "Font Software"), to reproduce
+and distribute the modifications to the Bitstream Vera Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit
+persons to whom the Font Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software
+typefaces.
+
+The Font Software may be modified, altered, or added to, and in
+particular the designs of glyphs or characters in the Fonts may be
+modified and additional glyphs or characters may be added to the
+Fonts, only if the fonts are renamed to names not containing either
+the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts
+or Font Software that has been modified and is distributed under the
+"Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by
+itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL
+TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not
+be used in advertising or otherwise to promote the sale, use or other
+dealings in this Font Software without prior written authorization
+from Tavmjong Bah. For further information, contact: tavmjong @ free
+. fr.
+
+TeX Gyre DJV Math
+-----------------
+Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
+
+Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski
+(on behalf of TeX users groups) are in public domain.
+
+Letters imported from Euler Fraktur from AMSfonts are (c) American
+Mathematical Society (see below).
+Bitstream Vera Fonts Copyright
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera
+is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons
+to whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice
+shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may be modified and
+additional glyphs or characters may be added to the Fonts, only if the
+fonts are renamed to names not containing either the words "Bitstream"
+or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or
+Font Software that has been modified and is distributed under the
+"Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but
+no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME
+FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING
+ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN
+THE FONT SOFTWARE.
+Except as contained in this notice, the names of GNOME, the GNOME
+Foundation, and Bitstream Inc., shall not be used in advertising or
+otherwise to promote the sale, use or other dealings in this Font Software
+without prior written authorization from the GNOME Foundation or
+Bitstream Inc., respectively.
+For further information, contact: fonts at gnome dot org.
+
+AMSFonts (v. 2.2) copyright
+
+The PostScript Type 1 implementation of the AMSFonts produced by and
+previously distributed by Blue Sky Research and Y&Y, Inc. are now freely
+available for general use. This has been accomplished through the
+cooperation
+of a consortium of scientific publishers with Blue Sky Research and Y&Y.
+Members of this consortium include:
+
+Elsevier Science IBM Corporation Society for Industrial and Applied
+Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS)
+
+In order to assure the authenticity of these fonts, copyright will be
+held by the American Mathematical Society. This is not meant to restrict
+in any way the legitimate use of the fonts, such as (but not limited to)
+electronic distribution of documents containing these fonts, inclusion of
+these fonts into other public domain or commercial font collections or computer
+applications, use of the outline data to create derivative fonts and/or
+faces, etc. However, the AMS does require that the AMS copyright notice be
+removed from any derivative versions of the fonts which have been altered in
+any way. In addition, to ensure the fidelity of TeX documents using Computer
+Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces,
+has requested that any alterations which yield different font metrics be
+given a different name.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
%% This notice is provided with respect to Document Object Model (DOM) Level 2
& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
@@ -1311,7 +1497,7 @@
-------------------------------------------------------------------------------
-%% This notice is provided with respect to libpng 1.6.16, which may be
+%% This notice is provided with respect to libpng 1.6.35, which may be
included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE ---
@@ -1327,21 +1513,21 @@
This code is released under the libpng license.
-libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
-Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
+libpng versions 1.0.7, July 1, 2000 through 1.6.35, July 15, 2018 are
+Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are
+derived from libpng-1.0.6, and are distributed according to the same
+disclaimer and license as libpng-1.0.6 with the following individuals
+added to the list of Contributing Authors:
Simon-Pierre Cadieux
Eric S. Raymond
+ Mans Rullgard
+ Cosmin Truta
Gilles Vollant
+ James Yu
+ Mandar Sahastrabuddhe
+ Google Inc.
+ Vadim Barkov
and with the following additions to the disclaimer:
@@ -1352,19 +1538,25 @@
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
+libpng-0.96, and are distributed according to the same disclaimer and
+license as libpng-0.96, with the following individuals added to the list
+of Contributing Authors:
Tom Lane
Glenn Randers-Pehrson
Willem van Schaik
libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
+Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
+and are distributed according to the same disclaimer and license as
+libpng-0.88, with the following individuals added to the list of
+Contributing Authors:
John Bowler
Kevin Bracey
@@ -1373,8 +1565,11 @@
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
For the purposes of this copyright and license, "Contributing Authors"
is defined as the following set of individuals:
@@ -1397,13 +1592,13 @@
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
-1. The origin of this source code must not be misrepresented.
+ 1. The origin of this source code must not be misrepresented.
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
+ 2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
+ 3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
@@ -1411,21 +1606,34 @@
source code in a product, acknowledgment is not required but would be
appreciated.
+END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s",png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+a certification mark of the Open Source Initiative. OSI has not addressed
+the additional disclaimers inserted at version 1.0.7.
+
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 22, 2014
+July 15, 2018
--- end of LICENSE ---
diff --git a/nashorn/src/jdk/nashorn/internal/objects/Global.java b/nashorn/src/jdk/nashorn/internal/objects/Global.java
index 85a6a30..18505f0 100644
--- a/nashorn/src/jdk/nashorn/internal/objects/Global.java
+++ b/nashorn/src/jdk/nashorn/internal/objects/Global.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1427,13 +1427,14 @@
}
}
- switch (nameStr) {
- case "context":
+ if ("context".equals(nameStr)) {
return sctxt;
- case "engine":
- return global.engine;
- default:
- break;
+ } else if ("engine".equals(nameStr)) {
+ // expose "engine" variable only when there is no security manager
+ // or when no class filter is set.
+ if (System.getSecurityManager() == null || global.getClassFilter() == null) {
+ return global.engine;
+ }
}
if (self == UNDEFINED) {