diff options
Diffstat (limited to 'java/openjdk8/files/patch-8u25-b17')
-rw-r--r-- | java/openjdk8/files/patch-8u25-b17 | 5306 |
1 files changed, 5306 insertions, 0 deletions
diff --git a/java/openjdk8/files/patch-8u25-b17 b/java/openjdk8/files/patch-8u25-b17 new file mode 100644 index 000000000000..e469f8b9ad4f --- /dev/null +++ b/java/openjdk8/files/patch-8u25-b17 @@ -0,0 +1,5306 @@ +--- ./.hgtags Wed Jul 30 03:50:56 2014 -0700 ++++ ./.hgtags Wed Sep 17 11:23:18 2014 -0700 +@@ -313,3 +313,21 @@ + b14daf2459c5430dfe5d435483d6f424cff09584 jdk8u20-b23 + 1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b24 + 1710841b0229403f4af85eac8b68ea5065a26c81 jdk8u20-b25 ++d1a7ea2c3e1091e0df1285963328a96f475f240d jdk8u20-b26 ++97c6d6a8e5bb3dfc24b9a32711aa0906ea110e23 jdk8u25-b00 ++c4cfb4376f5916c5d7eb1f39a0e23402de0d9818 jdk8u25-b01 ++b4d29a751077e5500e766b8104dd1cb7148a550f jdk8u25-b02 ++d3df54be114a5c41d4881b61cd42fbb0e52aaf4a jdk8u25-b03 ++64e7567a8539078a678853a384340eee469168b0 jdk8u25-b04 ++6de13ae93be20b97f53e3837739947d59fb4fd65 jdk8u25-b05 ++69d17ee59c0e77033aca293501a642d0abc20c85 jdk8u25-b06 ++561d066eaa6428088b4f7e273a8caed90e8f6073 jdk8u25-b07 ++c2a5ad21d01c5d921c4e928edcb14cc3d61eb62b jdk8u25-b08 ++1249614d7f1d9bf8443f0abd0622b4d2a3ab0638 jdk8u25-b09 ++0c5d41165be3f4bb989bd84283c2df3e37b9845d jdk8u25-b10 ++cc5ab3e0fe815ae80bb52fa5affcb35ee0f51cff jdk8u25-b11 ++c35e73e4acd8ed03e77e8e20023bac115c7dfe38 jdk8u25-b12 ++5d990a43c996ef039c6619e55215d589e09d1022 jdk8u25-b13 ++4429ea47ee6eca6b8a1dbda1950566ee821ba19d jdk8u25-b14 ++09eaef69f384ecf8ec0342b87a8b150740941140 jdk8u25-b15 ++f0a48c214c46b7351ff8e6d6b6dc533463a4be21 jdk8u25-b16 +--- ./common/autoconf/generated-configure.sh Wed Jul 30 03:50:56 2014 -0700 ++++ ./common/autoconf/generated-configure.sh Wed Sep 17 11:23:18 2014 -0700 +@@ -3868,7 +3868,7 @@ + #CUSTOM_AUTOCONF_INCLUDE + + # Do not change or remove the following line, it is needed for consistency checks: +-DATE_WHEN_GENERATED=1397150809 ++DATE_WHEN_GENERATED=1410971760 + + ############################################################################### + # +--- ./make/Jprt.gmk Wed Jul 30 03:50:56 2014 -0700 ++++ ./make/Jprt.gmk Wed Sep 17 11:23:18 2014 -0700 +@@ -145,6 +145,9 @@ + ifdef ALT_INSTALL_UPX_FILENAME + @$(ECHO) " --with-upx-filename=$(call UnixPath,$(ALT_INSTALL_UPX_FILENAME)) " >> $@.tmp + endif ++ ifdef ALT_BSDIFF_DIR ++ @$(ECHO) " --with-bsdiff-dir=$(call UnixPath,$(ALT_BSDIFF_DIR)) " >> $@.tmp ++ endif + ifdef ALT_CCSS_SIGNING_DIR + @$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp + endif +--- ./make/jprt.properties Wed Jul 30 03:50:56 2014 -0700 ++++ ./make/jprt.properties Wed Sep 17 11:23:18 2014 -0700 +@@ -25,8 +25,9 @@ + + # Properties for jprt + +-# Locked down to jdk8 +-jprt.tools.default.release=jdk8 ++# The current release name ++my.jdk.update.version=25 ++jprt.tools.default.release=jdk8u${my.jdk.update.version} + + # Unix toolkit to use for building on windows + jprt.windows.jdk8.build.unix.toolkit=cygwin +--- ./corba/.hgtags Wed Jul 30 03:51:08 2014 -0700 ++++ ./corba/.hgtags Mon Sep 08 12:34:37 2014 -0700 +@@ -311,3 +311,21 @@ + 919405d7316dfcbddee5ad8dd08905916df88e04 jdk8u20-b23 + 34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b24 + 34c930eaa6b591621afde05ca2e24571c91cdc9b jdk8u20-b25 ++37bde23c96f66912c44b1b893c08d4ad4cff5f4e jdk8u20-b26 ++08aa9f55fe5bce1f04cfd2958f71e8df18643e29 jdk8u25-b00 ++31f50e3c0dcbdfa7f11a895179065e6888c2cf3c jdk8u25-b01 ++162703b7c2f16ce00d1b54a8f95d12eda9753eba jdk8u25-b02 ++ddaa2a3e452c8fbb1a7046e743096d0f9489290e jdk8u25-b03 ++a76e6e02711edbfab4931dc679cbd3df6169ec84 jdk8u25-b04 ++2fab01326282ee9033c089933b2dc46aef127abd jdk8u25-b05 ++76068779ea16c40a9d3c14751a3bbd6c21f09cfd jdk8u25-b06 ++db4d845d6a4d71ef5e48a8888f71375b0e21959f jdk8u25-b07 ++afd9d9e1bbb5ab77c95a8750d2df164e05088d09 jdk8u25-b08 ++1322b445ab39930c50c3901f6c439aad99a62fe8 jdk8u25-b09 ++2e6da97d338ad5a65bf07f9d9648dcb74b5776b4 jdk8u25-b10 ++11f77cdff0b2a07fd89f439b044d9f10a15f8fd5 jdk8u25-b11 ++f560274aec4f42283c10070921afae403a153de2 jdk8u25-b12 ++987bd55824c4794c8784a47fc45ecd18a9c2a5c8 jdk8u25-b13 ++7e9a2027d0214019d66325fa7ca59cf8281fb43e jdk8u25-b14 ++5b2cb4935667cd02d7974b3b6fb6bf4092b5acae jdk8u25-b15 ++28d7f90e04e46ce8c633a2fbf0157d9e77db17c3 jdk8u25-b16 +--- ./hotspot/.hgtags Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/.hgtags Mon Sep 08 12:35:01 2014 -0700 +@@ -500,3 +500,21 @@ + 42ddd0bbcb6630fe463ec9bc1893c838d5edff1b jdk8u20-b24 + 00cf2b6f51b9560b01030e8f4c28c466f0b21fe3 hs25.20-b23 + 19408d5fd31c25ce60c43dd33e92b96e8df4a4ea jdk8u20-b25 ++eaa4074a7e3975cd33ec55e6b584586e2ac681bd jdk8u20-b26 ++a4d44dfb7d30eea54bc172e4429a655454ae0bbf jdk8u25-b00 ++9a2152fbd929b0d8b2f5c326a5526214ae71731a jdk8u25-b01 ++d3d5604ea0dea3812e87ba76ac199d0a8be6f49f jdk8u25-b02 ++27348de6239bb527c37c0bf59e938ed127b619a7 jdk8u25-b03 ++220eefb3609e250a0bb0ed26236c1213b8000050 jdk8u25-b04 ++db8383148bc9417dd4c38fa4cea39510f17325f3 jdk8u25-b05 ++605df8463453628df49351fa63632666f18698cd jdk8u25-b06 ++520188d4bade17dbe75163d1f635c08168ea560c jdk8u25-b07 ++f3f50c4f9ea5d3af40cb794b6f3f2a337c8873db jdk8u25-b08 ++4f209b7a580c78bac255e69f4724c42584c32a7d jdk8u25-b09 ++19c692f1e4c571a9285e33e7d3d15948769fcbdd jdk8u25-b10 ++9e2bb00a81910776d5b16c49a3f4c5264ceab522 jdk8u25-b11 ++2993491d47df8c4b096ea7fa534162bde8b53dcf jdk8u25-b12 ++ca6d25be853b5c428c6228871316671843264666 jdk8u25-b13 ++c77d5db189422e2eef0443ee212644e497113b18 jdk8u25-b14 ++e62c06b887310b5bd23be9b817a9a6f0daf0d0e1 jdk8u25-b15 ++6467bdd4d22d8b140844dc847c43b9ba7cb0bbd1 jdk8u25-b16 +--- ./hotspot/make/bsd/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-debug Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -82,6 +82,7 @@ + _JVM_EnableCompiler + _JVM_Exit + _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller + _JVM_FindClassFromClass + _JVM_FindClassFromClassLoader + _JVM_FindClassFromBootLoader +--- ./hotspot/make/bsd/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/bsd/makefiles/mapfile-vers-product Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -82,6 +82,7 @@ + _JVM_EnableCompiler + _JVM_Exit + _JVM_FillInStackTrace ++ _JVM_FindClassFromCaller + _JVM_FindClassFromClass + _JVM_FindClassFromClassLoader + _JVM_FindClassFromBootLoader +--- ./hotspot/make/hotspot_version Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/hotspot_version Mon Sep 08 12:35:01 2014 -0700 +@@ -34,8 +34,8 @@ + HOTSPOT_VM_COPYRIGHT=Copyright 2014 + + HS_MAJOR_VER=25 +-HS_MINOR_VER=20 +-HS_BUILD_NUMBER=23 ++HS_MINOR_VER=25 ++HS_BUILD_NUMBER=02 + + JDK_MAJOR_VER=1 + JDK_MINOR_VER=8 +--- ./hotspot/make/linux/makefiles/mapfile-vers-debug Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-debug Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/make/linux/makefiles/mapfile-vers-product Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/linux/makefiles/mapfile-vers-product Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/make/solaris/makefiles/mapfile-vers Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/make/solaris/makefiles/mapfile-vers Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + # +-# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++# Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + # + # This code is free software; you can redistribute it and/or modify it +@@ -84,6 +84,7 @@ + JVM_EnableCompiler; + JVM_Exit; + JVM_FillInStackTrace; ++ JVM_FindClassFromCaller; + JVM_FindClassFromClass; + JVM_FindClassFromClassLoader; + JVM_FindClassFromBootLoader; +--- ./hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classFileParser.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -2780,11 +2780,6 @@ + ClassFileStream* cfs = stream(); + u1* current_start = cfs->current(); + +- guarantee_property(attribute_byte_length > sizeof(u2), +- "Invalid BootstrapMethods attribute length %u in class file %s", +- attribute_byte_length, +- CHECK); +- + cfs->guarantee_more(attribute_byte_length, CHECK); + + int attribute_array_length = cfs->get_u2_fast(); +@@ -2831,6 +2826,11 @@ + "bootstrap_method_index %u has bad constant type in class file %s", + bootstrap_method_index, + CHECK); ++ ++ guarantee_property((operand_fill_index + 1 + argument_count) < operands->length(), ++ "Invalid BootstrapMethods num_bootstrap_methods or num_bootstrap_arguments value in class file %s", ++ CHECK); ++ + operands->at_put(operand_fill_index++, bootstrap_method_index); + operands->at_put(operand_fill_index++, argument_count); + +@@ -2848,7 +2848,6 @@ + } + + assert(operand_fill_index == operands->length(), "exact fill"); +- assert(ConstantPool::operand_array_length(operands) == attribute_array_length, "correct decode"); + + u1* current_end = cfs->current(); + guarantee_property(current_end == current_start + attribute_byte_length, +--- ./hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoader.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -84,6 +84,7 @@ + typedef jboolean (JNICALL *ReadEntry_t)(jzfile *zip, jzentry *entry, unsigned char *buf, char *namebuf); + typedef jboolean (JNICALL *ReadMappedEntry_t)(jzfile *zip, jzentry *entry, unsigned char **buf, char *namebuf); + typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n); ++typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len); + + static ZipOpen_t ZipOpen = NULL; + static ZipClose_t ZipClose = NULL; +@@ -92,6 +93,7 @@ + static ReadMappedEntry_t ReadMappedEntry = NULL; + static GetNextEntry_t GetNextEntry = NULL; + static canonicalize_fn_t CanonicalizeEntry = NULL; ++static Crc32_t Crc32 = NULL; + + // Globals + +@@ -632,9 +634,11 @@ + ReadEntry = CAST_TO_FN_PTR(ReadEntry_t, os::dll_lookup(handle, "ZIP_ReadEntry")); + ReadMappedEntry = CAST_TO_FN_PTR(ReadMappedEntry_t, os::dll_lookup(handle, "ZIP_ReadMappedEntry")); + GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry")); ++ Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32")); + + // ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL +- if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || GetNextEntry == NULL) { ++ if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL || ++ GetNextEntry == NULL || Crc32 == NULL) { + vm_exit_during_initialization("Corrupted ZIP library", path); + } + +@@ -644,6 +648,11 @@ + // This lookup only works on 1.3. Do not check for non-null here + } + ++int ClassLoader::crc32(int crc, const char* buf, int len) { ++ assert(Crc32 != NULL, "ZIP_CRC32 is not found"); ++ return (*Crc32)(crc, (const jbyte*)buf, len); ++} ++ + // PackageInfo data exists in order to support the java.lang.Package + // class. A Package object provides information about a java package + // (version, vendor, etc.) which originates in the manifest of the jar +--- ./hotspot/src/share/vm/classfile/classLoader.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/classLoader.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -215,6 +215,7 @@ + // to avoid confusing the zip library + static bool get_canonical_path(char* orig, char* out, int len); + public: ++ static int crc32(int crc, const char* buf, int len); + // Used by the kernel jvm. + static void update_class_path_entry_list(char *path, + bool check_for_duplicates); +--- ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -54,21 +54,6 @@ + return frame; + } + +-bool StackMapFrame::has_new_object() const { +- int32_t i; +- for (i = 0; i < _max_locals; i++) { +- if (_locals[i].is_uninitialized()) { +- return true; +- } +- } +- for (i = 0; i < _stack_size; i++) { +- if (_stack[i].is_uninitialized()) { +- return true; +- } +- } +- return false; +-} +- + void StackMapFrame::initialize_object( + VerificationType old_object, VerificationType new_object) { + int32_t i; +@@ -163,7 +148,7 @@ + VerificationType* from, VerificationType* to, int32_t len, TRAPS) const { + int32_t i = 0; + for (i = 0; i < len; i++) { +- if (!to[i].is_assignable_from(from[i], verifier(), THREAD)) { ++ if (!to[i].is_assignable_from(from[i], verifier(), false, THREAD)) { + break; + } + } +@@ -260,7 +245,7 @@ + } + VerificationType top = _stack[--_stack_size]; + bool subtype = type.is_assignable_from( +- top, verifier(), CHECK_(VerificationType::bogus_type())); ++ top, verifier(), false, CHECK_(VerificationType::bogus_type())); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, stack_top_ctx(), +@@ -280,7 +265,7 @@ + return VerificationType::bogus_type(); + } + bool subtype = type.is_assignable_from(_locals[index], +- verifier(), CHECK_(VerificationType::bogus_type())); ++ verifier(), false, CHECK_(VerificationType::bogus_type())); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, +@@ -303,14 +288,14 @@ + "get long/double overflows locals"); + return; + } +- bool subtype = type1.is_assignable_from(_locals[index], verifier(), CHECK); ++ bool subtype = type1.is_assignable_from(_locals[index], verifier(), false, CHECK); + if (!subtype) { + verifier()->verify_error( + ErrorContext::bad_type(_offset, + TypeOrigin::local(index, this), TypeOrigin::implicit(type1)), + "Bad local variable type"); + } else { +- subtype = type2.is_assignable_from(_locals[index + 1], verifier(), CHECK); ++ subtype = type2.is_assignable_from(_locals[index + 1], verifier(), false, CHECK); + if (!subtype) { + /* Unreachable? All local store routines convert a split long or double + * into a TOP during the store. So we should never end up seeing an +--- ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapFrame.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -155,10 +155,6 @@ + const methodHandle m, VerificationType thisKlass, TRAPS); + + // Search local variable type array and stack type array. +- // Return true if an uninitialized object is found. +- bool has_new_object() const; +- +- // Search local variable type array and stack type array. + // Set every element with type of old_object to new_object. + void initialize_object( + VerificationType old_object, VerificationType new_object); +@@ -238,7 +234,7 @@ + if (_stack_size != 0) { + VerificationType top = _stack[_stack_size - 1]; + bool subtype = type.is_assignable_from( +- top, verifier(), CHECK_(VerificationType::bogus_type())); ++ top, verifier(), false, CHECK_(VerificationType::bogus_type())); + if (subtype) { + --_stack_size; + return top; +@@ -253,9 +249,9 @@ + assert(type2.is_long() || type2.is_double(), "must be long/double_2"); + if (_stack_size >= 2) { + VerificationType top1 = _stack[_stack_size - 1]; +- bool subtype1 = type1.is_assignable_from(top1, verifier(), CHECK); ++ bool subtype1 = type1.is_assignable_from(top1, verifier(), false, CHECK); + VerificationType top2 = _stack[_stack_size - 2]; +- bool subtype2 = type2.is_assignable_from(top2, verifier(), CHECK); ++ bool subtype2 = type2.is_assignable_from(top2, verifier(), false, CHECK); + if (subtype1 && subtype2) { + _stack_size -= 2; + return; +--- ./hotspot/src/share/vm/classfile/stackMapTable.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -70,24 +70,26 @@ + + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + int index = get_index_from_offset(target); +- return match_stackmap(frame, target, index, match, update, ctx, THREAD); ++ return match_stackmap(frame, target, index, match, update, handler, ctx, THREAD); + } + + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. ++// handler is true if the frame in stackmap_table is for an exception handler. + // +-// The values of match and update are: _match__update_ ++// The values of match and update are: _match__update__handler + // +-// checking a branch target/exception handler: true false ++// checking a branch target: true false false ++// checking an exception handler: true false true + // linear bytecode verification following an +-// unconditional branch: false true ++// unconditional branch: false true false + // linear bytecode verification not following an +-// unconditional branch: true true ++// unconditional branch: true true false + bool StackMapTable::match_stackmap( + StackMapFrame* frame, int32_t target, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const { ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const { + if (frame_index < 0 || frame_index >= _frame_count) { + *ctx = ErrorContext::missing_stackmap(frame->offset()); + frame->verifier()->verify_error( +@@ -98,11 +100,9 @@ + StackMapFrame *stackmap_frame = _frame_array[frame_index]; + bool result = true; + if (match) { +- // when checking handler target, match == true && update == false +- bool is_exception_handler = !update; + // Has direct control flow from last instruction, need to match the two + // frames. +- result = frame->is_assignable_to(stackmap_frame, is_exception_handler, ++ result = frame->is_assignable_to(stackmap_frame, handler, + ctx, CHECK_VERIFY_(frame->verifier(), result)); + } + if (update) { +@@ -126,24 +126,10 @@ + StackMapFrame* frame, int32_t target, TRAPS) const { + ErrorContext ctx; + bool match = match_stackmap( +- frame, target, true, false, &ctx, CHECK_VERIFY(frame->verifier())); ++ frame, target, true, false, false, &ctx, CHECK_VERIFY(frame->verifier())); + if (!match || (target < 0 || target >= _code_length)) { + frame->verifier()->verify_error(ctx, + "Inconsistent stackmap frames at branch target %d", target); +- return; +- } +- // check if uninitialized objects exist on backward branches +- check_new_object(frame, target, CHECK_VERIFY(frame->verifier())); +- frame->verifier()->update_furthest_jump(target); +-} +- +-void StackMapTable::check_new_object( +- const StackMapFrame* frame, int32_t target, TRAPS) const { +- if (frame->offset() > target && frame->has_new_object()) { +- frame->verifier()->verify_error( +- ErrorContext::bad_code(frame->offset()), +- "Uninitialized object exists on backward branch %d", target); +- return; + } + } + +--- ./hotspot/src/share/vm/classfile/stackMapTable.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/stackMapTable.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -74,12 +74,12 @@ + // specified offset. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + // Match and/or update current_frame to the frame in stackmap table with + // specified offset and frame index. Return true if the two frames match. + bool match_stackmap( + StackMapFrame* current_frame, int32_t offset, int32_t frame_index, +- bool match, bool update, ErrorContext* ctx, TRAPS) const; ++ bool match, bool update, bool handler, ErrorContext* ctx, TRAPS) const; + + // Check jump instructions. Make sure there are no uninitialized + // instances on backward branch. +@@ -90,10 +90,6 @@ + // Returns the frame array index where the frame with offset is stored. + int get_index_from_offset(int32_t offset) const; + +- // Make sure that there's no uninitialized object exist on backward branch. +- void check_new_object( +- const StackMapFrame* frame, int32_t target, TRAPS) const; +- + void print_on(outputStream* str) const; + }; + +--- ./hotspot/src/share/vm/classfile/verificationType.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verificationType.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -42,7 +42,8 @@ + } + + bool VerificationType::is_reference_assignable_from( +- const VerificationType& from, ClassVerifier* context, TRAPS) const { ++ const VerificationType& from, ClassVerifier* context, ++ bool from_field_is_protected, TRAPS) const { + instanceKlassHandle klass = context->current_class(); + if (from.is_null()) { + // null is assignable to any reference +@@ -62,9 +63,11 @@ + Handle(THREAD, klass->protection_domain()), true, CHECK_false); + KlassHandle this_class(THREAD, obj); + +- if (this_class->is_interface()) { +- // We treat interfaces as java.lang.Object, including +- // java.lang.Cloneable and java.io.Serializable ++ if (this_class->is_interface() && (!from_field_is_protected || ++ from.name() != vmSymbols::java_lang_Object())) { ++ // If we are not trying to access a protected field or method in ++ // java.lang.Object then we treat interfaces as java.lang.Object, ++ // including java.lang.Cloneable and java.io.Serializable. + return true; + } else if (from.is_object()) { + Klass* from_class = SystemDictionary::resolve_or_fail( +@@ -76,7 +79,8 @@ + VerificationType comp_this = get_component(context, CHECK_false); + VerificationType comp_from = from.get_component(context, CHECK_false); + if (!comp_this.is_bogus() && !comp_from.is_bogus()) { +- return comp_this.is_assignable_from(comp_from, context, CHECK_false); ++ return comp_this.is_assignable_from(comp_from, context, ++ from_field_is_protected, CHECK_false); + } + } + return false; +--- ./hotspot/src/share/vm/classfile/verificationType.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verificationType.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -265,7 +265,8 @@ + // is assignable to another. Returns true if one can assign 'from' to + // this. + bool is_assignable_from( +- const VerificationType& from, ClassVerifier* context, TRAPS) const { ++ const VerificationType& from, ClassVerifier* context, ++ bool from_field_is_protected, TRAPS) const { + if (equals(from) || is_bogus()) { + return true; + } else { +@@ -286,7 +287,9 @@ + return from.is_integer(); + default: + if (is_reference() && from.is_reference()) { +- return is_reference_assignable_from(from, context, CHECK_false); ++ return is_reference_assignable_from(from, context, ++ from_field_is_protected, ++ CHECK_false); + } else { + return false; + } +@@ -308,7 +311,8 @@ + private: + + bool is_reference_assignable_from( +- const VerificationType&, ClassVerifier*, TRAPS) const; ++ const VerificationType&, ClassVerifier*, bool from_field_is_protected, ++ TRAPS) const; + }; + + #endif // SHARE_VM_CLASSFILE_VERIFICATIONTYPE_HPP +--- ./hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -634,8 +634,6 @@ + // flow from current instruction to the next + // instruction in sequence + +- set_furthest_jump(0); +- + Bytecodes::Code opcode; + while (!bcs.is_last_bytecode()) { + // Check for recursive re-verification before each bytecode. +@@ -1736,7 +1734,7 @@ + VerificationType throwable = + VerificationType::reference_type(vmSymbols::java_lang_Throwable()); + bool is_subclass = throwable.is_assignable_from( +- catch_type, this, CHECK_VERIFY(this)); ++ catch_type, this, false, CHECK_VERIFY(this)); + if (!is_subclass) { + // 4286534: should throw VerifyError according to recent spec change + verify_error(ErrorContext::bad_type(handler_pc, +@@ -1794,7 +1792,7 @@ + // If matched, current_frame will be updated by this method. + bool matches = stackmap_table->match_stackmap( + current_frame, this_offset, stackmap_index, +- !no_control_flow, true, &ctx, CHECK_VERIFY_(this, 0)); ++ !no_control_flow, true, false, &ctx, CHECK_VERIFY_(this, 0)); + if (!matches) { + // report type error + verify_error(ctx, "Instruction type does not match stack map"); +@@ -1841,7 +1839,7 @@ + } + ErrorContext ctx; + bool matches = stackmap_table->match_stackmap( +- new_frame, handler_pc, true, false, &ctx, CHECK_VERIFY(this)); ++ new_frame, handler_pc, true, false, true, &ctx, CHECK_VERIFY(this)); + if (!matches) { + verify_error(ctx, "Stack map does not match the one at " + "exception handler %d", handler_pc); +@@ -2191,7 +2189,7 @@ + stack_object_type = current_type(); + } + is_assignable = target_class_type.is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, false, CHECK_VERIFY(this)); + if (!is_assignable) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), +@@ -2218,7 +2216,7 @@ + // It's protected access, check if stack object is assignable to + // current class. + is_assignable = current_type().is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, true, CHECK_VERIFY(this)); + if (!is_assignable) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), +@@ -2233,6 +2231,181 @@ + } + } + ++// Look at the method's handlers. If the bci is in the handler's try block ++// then check if the handler_pc is already on the stack. If not, push it. ++void ClassVerifier::push_handlers(ExceptionTable* exhandlers, ++ GrowableArray<u4>* handler_stack, ++ u4 bci) { ++ int exlength = exhandlers->length(); ++ for(int x = 0; x < exlength; x++) { ++ if (bci >= exhandlers->start_pc(x) && bci < exhandlers->end_pc(x)) { ++ handler_stack->append_if_missing(exhandlers->handler_pc(x)); ++ } ++ } ++} ++ ++// Return TRUE if all code paths starting with start_bc_offset end in ++// bytecode athrow or loop. ++bool ClassVerifier::ends_in_athrow(u4 start_bc_offset) { ++ ResourceMark rm; ++ // Create bytecode stream. ++ RawBytecodeStream bcs(method()); ++ u4 code_length = method()->code_size(); ++ bcs.set_start(start_bc_offset); ++ u4 target; ++ // Create stack for storing bytecode start offsets for if* and *switch. ++ GrowableArray<u4>* bci_stack = new GrowableArray<u4>(30); ++ // Create stack for handlers for try blocks containing this handler. ++ GrowableArray<u4>* handler_stack = new GrowableArray<u4>(30); ++ // Create list of visited branch opcodes (goto* and if*). ++ GrowableArray<u4>* visited_branches = new GrowableArray<u4>(30); ++ ExceptionTable exhandlers(_method()); ++ ++ while (true) { ++ if (bcs.is_last_bytecode()) { ++ // if no more starting offsets to parse or if at the end of the ++ // method then return false. ++ if ((bci_stack->is_empty()) || ((u4)bcs.end_bci() == code_length)) ++ return false; ++ // Pop a bytecode starting offset and scan from there. ++ bcs.set_start(bci_stack->pop()); ++ } ++ Bytecodes::Code opcode = bcs.raw_next(); ++ u4 bci = bcs.bci(); ++ ++ // If the bytecode is in a TRY block, push its handlers so they ++ // will get parsed. ++ push_handlers(&exhandlers, handler_stack, bci); ++ ++ switch (opcode) { ++ case Bytecodes::_if_icmpeq: ++ case Bytecodes::_if_icmpne: ++ case Bytecodes::_if_icmplt: ++ case Bytecodes::_if_icmpge: ++ case Bytecodes::_if_icmpgt: ++ case Bytecodes::_if_icmple: ++ case Bytecodes::_ifeq: ++ case Bytecodes::_ifne: ++ case Bytecodes::_iflt: ++ case Bytecodes::_ifge: ++ case Bytecodes::_ifgt: ++ case Bytecodes::_ifle: ++ case Bytecodes::_if_acmpeq: ++ case Bytecodes::_if_acmpne: ++ case Bytecodes::_ifnull: ++ case Bytecodes::_ifnonnull: ++ target = bcs.dest(); ++ if (visited_branches->contains(bci)) { ++ if (bci_stack->is_empty()) return true; ++ // Pop a bytecode starting offset and scan from there. ++ bcs.set_start(bci_stack->pop()); ++ } else { ++ if (target > bci) { // forward branch ++ if (target >= code_length) return false; ++ // Push the branch target onto the stack. ++ bci_stack->push(target); ++ // then, scan bytecodes starting with next. ++ bcs.set_start(bcs.next_bci()); ++ } else { // backward branch ++ // Push bytecode offset following backward branch onto the stack. ++ bci_stack->push(bcs.next_bci()); ++ // Check bytecodes starting with branch target. ++ bcs.set_start(target); ++ } ++ // Record target so we don't branch here again. ++ visited_branches->append(bci); ++ } ++ break; ++ ++ case Bytecodes::_goto: ++ case Bytecodes::_goto_w: ++ target = (opcode == Bytecodes::_goto ? bcs.dest() : bcs.dest_w()); ++ if (visited_branches->contains(bci)) { ++ if (bci_stack->is_empty()) return true; ++ // Been here before, pop new starting offset from stack. ++ bcs.set_start(bci_stack->pop()); ++ } else { ++ if (target >= code_length) return false; ++ // Continue scanning from the target onward. ++ bcs.set_start(target); ++ // Record target so we don't branch here again. ++ visited_branches->append(bci); ++ } ++ break; ++ ++ // Check that all switch alternatives end in 'athrow' bytecodes. Since it ++ // is difficult to determine where each switch alternative ends, parse ++ // each switch alternative until either hit a 'return', 'athrow', or reach ++ // the end of the method's bytecodes. This is gross but should be okay ++ // because: ++ // 1. tableswitch and lookupswitch byte codes in handlers for ctor explicit ++ // constructor invocations should be rare. ++ // 2. if each switch alternative ends in an athrow then the parsing should be ++ // short. If there is no athrow then it is bogus code, anyway. ++ case Bytecodes::_lookupswitch: ++ case Bytecodes::_tableswitch: ++ { ++ address aligned_bcp = (address) round_to((intptr_t)(bcs.bcp() + 1), jintSize); ++ u4 default_offset = Bytes::get_Java_u4(aligned_bcp) + bci; ++ int keys, delta; ++ if (opcode == Bytecodes::_tableswitch) { ++ jint low = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); ++ jint high = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); ++ // This is invalid, but let the regular bytecode verifier ++ // report this because the user will get a better error message. ++ if (low > high) return true; ++ keys = high - low + 1; ++ delta = 1; ++ } else { ++ keys = (int)Bytes::get_Java_u4(aligned_bcp + jintSize); ++ delta = 2; ++ } ++ // Invalid, let the regular bytecode verifier deal with it. ++ if (keys < 0) return true; ++ ++ // Push the offset of the next bytecode onto the stack. ++ bci_stack->push(bcs.next_bci()); ++ ++ // Push the switch alternatives onto the stack. ++ for (int i = 0; i < keys; i++) { ++ u4 target = bci + (jint)Bytes::get_Java_u4(aligned_bcp+(3+i*delta)*jintSize); ++ if (target > code_length) return false; ++ bci_stack->push(target); ++ } ++ ++ // Start bytecode parsing for the switch at the default alternative. ++ if (default_offset > code_length) return false; ++ bcs.set_start(default_offset); ++ break; ++ } ++ ++ case Bytecodes::_return: ++ return false; ++ ++ case Bytecodes::_athrow: ++ { ++ if (bci_stack->is_empty()) { ++ if (handler_stack->is_empty()) { ++ return true; ++ } else { ++ // Parse the catch handlers for try blocks containing athrow. ++ bcs.set_start(handler_stack->pop()); ++ } ++ } else { ++ // Pop a bytecode offset and starting scanning from there. ++ bcs.set_start(bci_stack->pop()); ++ } ++ } ++ break; ++ ++ default: ++ ; ++ } // end switch ++ } // end while loop ++ ++ return false; ++} ++ + void ClassVerifier::verify_invoke_init( + RawBytecodeStream* bcs, u2 ref_class_index, VerificationType ref_class_type, + StackMapFrame* current_frame, u4 code_length, bool *this_uninit, +@@ -2252,25 +2425,26 @@ + return; + } + +- // Make sure that this call is not jumped over. +- if (bci < furthest_jump()) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad <init> method call from inside of a branch"); +- return; +- } +- +- // Make sure that this call is not done from within a TRY block because +- // that can result in returning an incomplete object. Simply checking +- // (bci >= start_pc) also ensures that this call is not done after a TRY +- // block. That is also illegal because this call must be the first Java +- // statement in the constructor. ++ // Check if this call is done from inside of a TRY block. If so, make ++ // sure that all catch clause paths end in a throw. Otherwise, this ++ // can result in returning an incomplete object. + ExceptionTable exhandlers(_method()); + int exlength = exhandlers.length(); + for(int i = 0; i < exlength; i++) { +- if (bci >= exhandlers.start_pc(i)) { +- verify_error(ErrorContext::bad_code(bci), +- "Bad <init> method call from after the start of a try block"); +- return; ++ u2 start_pc = exhandlers.start_pc(i); ++ u2 end_pc = exhandlers.end_pc(i); ++ ++ if (bci >= start_pc && bci < end_pc) { ++ if (!ends_in_athrow(exhandlers.handler_pc(i))) { ++ verify_error(ErrorContext::bad_code(bci), ++ "Bad <init> method call from after the start of a try block"); ++ return; ++ } else if (VerboseVerification) { ++ ResourceMark rm; ++ tty->print_cr( ++ "Survived call to ends_in_athrow(): %s", ++ current_class()->name()->as_C_string()); ++ } + } + } + +@@ -2315,7 +2489,7 @@ + instanceKlassHandle mh(THREAD, m->method_holder()); + if (m->is_protected() && !mh->is_same_class_package(_klass())) { + bool assignable = current_type().is_assignable_from( +- objectref_type, this, CHECK_VERIFY(this)); ++ objectref_type, this, true, CHECK_VERIFY(this)); + if (!assignable) { + verify_error(ErrorContext::bad_type(bci, + TypeOrigin::cp(new_class_index, objectref_type), +@@ -2490,11 +2664,11 @@ + bool have_imr_indirect = cp->tag_at(index).value() == JVM_CONSTANT_InterfaceMethodref; + if (!current_class()->is_anonymous()) { + subtype = ref_class_type.is_assignable_from( +- current_type(), this, CHECK_VERIFY(this)); ++ current_type(), this, false, CHECK_VERIFY(this)); + } else { + VerificationType host_klass_type = + VerificationType::reference_type(current_class()->host_klass()->name()); +- subtype = ref_class_type.is_assignable_from(host_klass_type, this, CHECK_VERIFY(this)); ++ subtype = ref_class_type.is_assignable_from(host_klass_type, this, false, CHECK_VERIFY(this)); + + // If invokespecial of IMR, need to recheck for same or + // direct interface relative to the host class +@@ -2538,7 +2712,7 @@ + VerificationType top = current_frame->pop_stack(CHECK_VERIFY(this)); + VerificationType hosttype = + VerificationType::reference_type(current_class()->host_klass()->name()); +- bool subtype = hosttype.is_assignable_from(top, this, CHECK_VERIFY(this)); ++ bool subtype = hosttype.is_assignable_from(top, this, false, CHECK_VERIFY(this)); + if (!subtype) { + verify_error( ErrorContext::bad_type(current_frame->offset(), + current_frame->stack_top_ctx(), +@@ -2563,7 +2737,7 @@ + // It's protected access, check if stack object is + // assignable to current class. + bool is_assignable = current_type().is_assignable_from( +- stack_object_type, this, CHECK_VERIFY(this)); ++ stack_object_type, this, true, CHECK_VERIFY(this)); + if (!is_assignable) { + if (ref_class_type.name() == vmSymbols::java_lang_Object() + && stack_object_type.is_array() +@@ -2746,7 +2920,7 @@ + "Method expects a return value"); + return; + } +- bool match = return_type.is_assignable_from(type, this, CHECK_VERIFY(this)); ++ bool match = return_type.is_assignable_from(type, this, false, CHECK_VERIFY(this)); + if (!match) { + verify_error(ErrorContext::bad_type(bci, + current_frame->stack_top_ctx(), TypeOrigin::signature(return_type)), +--- ./hotspot/src/share/vm/classfile/verifier.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/classfile/verifier.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -30,6 +30,7 @@ + #include "oops/klass.hpp" + #include "oops/method.hpp" + #include "runtime/handles.hpp" ++#include "utilities/growableArray.hpp" + #include "utilities/exceptions.hpp" + + // The verifier class +@@ -258,9 +259,6 @@ + + ErrorContext _error_context; // contains information about an error + +- // Used to detect illegal jumps over calls to super() nd this() in ctors. +- int32_t _furthest_jump; +- + void verify_method(methodHandle method, TRAPS); + char* generate_code_data(methodHandle m, u4 code_length, TRAPS); + void verify_exception_handler_table(u4 code_length, char* code_data, +@@ -306,6 +304,16 @@ + StackMapFrame* current_frame, u4 code_length, bool* this_uninit, + constantPoolHandle cp, TRAPS); + ++ // Used by ends_in_athrow() to push all handlers that contain bci onto ++ // the handler_stack, if the handler is not already on the stack. ++ void push_handlers(ExceptionTable* exhandlers, ++ GrowableArray<u4>* handler_stack, ++ u4 bci); ++ ++ // Returns true if all paths starting with start_bc_offset end in athrow ++ // bytecode or loop. ++ bool ends_in_athrow(u4 start_bc_offset); ++ + void verify_invoke_instructions( + RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame, + bool* this_uninit, VerificationType return_type, +@@ -407,19 +415,6 @@ + + TypeOrigin ref_ctx(const char* str, TRAPS); + +- // Keep track of the furthest branch done in a method to make sure that +- // there are no branches over calls to super() or this() from inside of +- // a constructor. +- int32_t furthest_jump() { return _furthest_jump; } +- +- void set_furthest_jump(int32_t target) { +- _furthest_jump = target; +- } +- +- void update_furthest_jump(int32_t target) { +- if (target > _furthest_jump) _furthest_jump = target; +- } +- + }; + + inline int ClassVerifier::change_sig_to_verificationType( +--- ./hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/interpreter/linkResolver.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -246,6 +246,12 @@ + // Ignore overpasses so statics can be found during resolution + Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass); + ++ if (klass->oop_is_array()) { ++ // Only consider klass and super klass for arrays ++ result = methodHandle(THREAD, result_oop); ++ return; ++ } ++ + // JDK 8, JVMS 5.4.3.4: Interface method resolution should + // ignore static and non-public methods of java.lang.Object, + // like clone, finalize, registerNatives. +@@ -290,6 +296,11 @@ + result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::normal)); + } + ++ if (klass->oop_is_array()) { ++ // Only consider klass and super klass for arrays ++ return; ++ } ++ + if (result.is_null()) { + Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods(); + if (default_methods != NULL) { +@@ -546,7 +557,7 @@ + // 2. lookup method in resolved klass and its super klasses + lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK); + +- if (resolved_method.is_null()) { // not found in the class hierarchy ++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy + // 3. lookup method in all the interfaces implemented by the resolved klass + lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); + +@@ -559,16 +570,16 @@ + CLEAR_PENDING_EXCEPTION; + } + } ++ } + +- if (resolved_method.is_null()) { +- // 4. method lookup failed +- ResourceMark rm(THREAD); +- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), +- Method::name_and_sig_as_C_string(resolved_klass(), +- method_name, +- method_signature), +- nested_exception); +- } ++ if (resolved_method.is_null()) { ++ // 4. method lookup failed ++ ResourceMark rm(THREAD); ++ THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), ++ Method::name_and_sig_as_C_string(resolved_klass(), ++ method_name, ++ method_signature), ++ nested_exception); + } + + // 5. access checks, access checking may be turned off when calling from within the VM. +@@ -634,17 +645,18 @@ + // JDK8: also look for static methods + lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK); + +- if (resolved_method.is_null()) { ++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { + // lookup method in all the super-interfaces + lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); +- if (resolved_method.is_null()) { +- // no method found +- ResourceMark rm(THREAD); +- THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(), +- Method::name_and_sig_as_C_string(resolved_klass(), +- method_name, +- method_signature)); +- } ++ } ++ ++ if (resolved_method.is_null()) { ++ // no method found ++ ResourceMark rm(THREAD); ++ THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(), ++ Method::name_and_sig_as_C_string(resolved_klass(), ++ method_name, ++ method_signature)); + } + + if (check_access) { +@@ -776,7 +788,7 @@ + } + + // Resolve instance field +- KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd)); ++ KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd)); + // check if field exists; i.e., if a klass containing the field def has been selected + if (sel_klass.is_null()) { + ResourceMark rm(THREAD); +--- ./hotspot/src/share/vm/memory/filemap.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/filemap.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -177,7 +177,14 @@ + fail_continue("The shared archive file has the wrong version."); + return false; + } +- _file_offset = (long)n; ++ size_t len = lseek(fd, 0, SEEK_END); ++ struct FileMapInfo::FileMapHeader::space_info* si = ++ &_header._space[MetaspaceShared::mc]; ++ if (si->_file_offset >= len || len - si->_file_offset < si->_used) { ++ fail_continue("The shared archive file has been truncated."); ++ return false; ++ } ++ _file_offset = n; + return true; + } + +@@ -268,6 +275,7 @@ + si->_capacity = capacity; + si->_read_only = read_only; + si->_allow_exec = allow_exec; ++ si->_crc = ClassLoader::crc32(0, base, (jint)size); + write_bytes_aligned(base, (int)size); + } + +@@ -292,14 +300,15 @@ + // Align file position to an allocation unit boundary. + + void FileMapInfo::align_file_position() { +- long new_file_offset = align_size_up(_file_offset, os::vm_allocation_granularity()); ++ size_t new_file_offset = align_size_up(_file_offset, ++ os::vm_allocation_granularity()); + if (new_file_offset != _file_offset) { + _file_offset = new_file_offset; + if (_file_open) { + // Seek one byte back from the target and write a byte to insure + // that the written file is the correct length. + _file_offset -= 1; +- if (lseek(_fd, _file_offset, SEEK_SET) < 0) { ++ if (lseek(_fd, (long)_file_offset, SEEK_SET) < 0) { + fail_stop("Unable to seek.", NULL); + } + char zero = 0; +@@ -406,6 +415,19 @@ + return base; + } + ++bool FileMapInfo::verify_region_checksum(int i) { ++ if (!VerifySharedSpaces) { ++ return true; ++ } ++ const char* buf = _header._space[i]._base; ++ size_t sz = _header._space[i]._used; ++ int crc = ClassLoader::crc32(0, buf, (jint)sz); ++ if (crc != _header._space[i]._crc) { ++ fail_continue("Checksum verification failed."); ++ return false; ++ } ++ return true; ++} + + // Unmap a memory region in the address space. + +@@ -457,8 +479,20 @@ + return true; + } + ++int FileMapInfo::compute_header_crc() { ++ char* header = (char*)&_header; ++ // start computing from the field after _crc ++ char* buf = (char*)&_header._crc + sizeof(int); ++ size_t sz = sizeof(FileMapInfo::FileMapHeader) - (buf - header); ++ int crc = ClassLoader::crc32(0, buf, (jint)sz); ++ return crc; ++} + + bool FileMapInfo::validate() { ++ if (VerifySharedSpaces && compute_header_crc() != _header._crc) { ++ fail_continue("Header checksum verification failed."); ++ return false; ++ } + if (_header._version != current_version()) { + fail_continue("The shared archive file is the wrong version."); + return false; +--- ./hotspot/src/share/vm/memory/filemap.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/filemap.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -54,7 +54,7 @@ + + bool _file_open; + int _fd; +- long _file_offset; ++ size_t _file_offset; + + // FileMapHeader describes the shared space data in the file to be + // mapped. This structure gets written to a file. It is not a class, so +@@ -62,12 +62,14 @@ + + struct FileMapHeader { + int _magic; // identify file type. ++ int _crc; // header crc checksum. + int _version; // (from enum, above.) + size_t _alignment; // how shared archive should be aligned + int _obj_alignment; // value of ObjectAlignmentInBytes + + struct space_info { +- int _file_offset; // sizeof(this) rounded to vm page size ++ int _crc; // crc checksum of the current space ++ size_t _file_offset; // sizeof(this) rounded to vm page size + char* _base; // copy-on-write base address + size_t _capacity; // for validity checking + size_t _used; // for setting space top on read +@@ -104,6 +106,8 @@ + } + + static int current_version() { return _current_version; } ++ int compute_header_crc(); ++ void set_header_crc(int crc) { _header._crc = crc; } + void populate_header(size_t alignment); + bool validate(); + void invalidate(); +@@ -136,6 +140,7 @@ + void write_bytes_aligned(const void* buffer, int count); + char* map_region(int i); + void unmap_region(int i); ++ bool verify_region_checksum(int i); + void close(); + bool is_open() { return _file_open; } + ReservedSpace reserve_shared_memory(); +--- ./hotspot/src/share/vm/memory/metaspaceShared.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/memory/metaspaceShared.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -585,6 +585,7 @@ + + // Pass 2 - write data. + mapinfo->open_for_write(); ++ mapinfo->set_header_crc(mapinfo->compute_header_crc()); + mapinfo->write_header(); + mapinfo->write_space(MetaspaceShared::ro, _loader_data->ro_metaspace(), true); + mapinfo->write_space(MetaspaceShared::rw, _loader_data->rw_metaspace(), false); +@@ -863,9 +864,13 @@ + + // Map each shared region + if ((_ro_base = mapinfo->map_region(ro)) != NULL && ++ mapinfo->verify_region_checksum(ro) && + (_rw_base = mapinfo->map_region(rw)) != NULL && ++ mapinfo->verify_region_checksum(rw) && + (_md_base = mapinfo->map_region(md)) != NULL && ++ mapinfo->verify_region_checksum(md) && + (_mc_base = mapinfo->map_region(mc)) != NULL && ++ mapinfo->verify_region_checksum(mc) && + (image_alignment == (size_t)max_alignment())) { + // Success (no need to do anything) + return true; +--- ./hotspot/src/share/vm/oops/arrayKlass.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -64,6 +64,13 @@ + return NULL; + } + ++// find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined ++Klass* ArrayKlass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { ++ // There are no fields in an array klass but look to the super class (Object) ++ assert(super(), "super klass must be present"); ++ return super()->find_field(name, sig, fd); ++} ++ + Method* ArrayKlass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + // There are no methods in an array klass but the super class (Object) has some + assert(super(), "super klass must be present"); +--- ./hotspot/src/share/vm/oops/arrayKlass.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/arrayKlass.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -28,6 +28,7 @@ + #include "memory/universe.hpp" + #include "oops/klass.hpp" + ++class fieldDescriptor; + class klassVtable; + + // ArrayKlass is the abstract baseclass for all array classes +@@ -85,6 +86,9 @@ + virtual oop multi_allocate(int rank, jint* sizes, TRAPS); + objArrayOop allocate_arrayArray(int n, int length, TRAPS); + ++ // find field according to JVM spec 5.4.3.2, returns the klass in which the field is defined ++ Klass* find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const; ++ + // Lookup operations + Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + +--- ./hotspot/src/share/vm/oops/klass.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -128,6 +128,15 @@ + return is_subclass_of(k); + } + ++Klass* Klass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const { ++#ifdef ASSERT ++ tty->print_cr("Error: find_field called on a klass oop." ++ " Likely error: reflection method does not correctly" ++ " wrap return value in a mirror object."); ++#endif ++ ShouldNotReachHere(); ++ return NULL; ++} + + Method* Klass::uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const { + #ifdef ASSERT +--- ./hotspot/src/share/vm/oops/klass.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/oops/klass.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -91,6 +91,7 @@ + class klassVtable; + class ParCompactionManager; + class KlassSizeStats; ++class fieldDescriptor; + + class Klass : public Metadata { + friend class VMStructs; +@@ -423,6 +424,7 @@ + virtual void initialize(TRAPS); + // lookup operation for MethodLookupCache + friend class MethodLookupCache; ++ virtual Klass* find_field(Symbol* name, Symbol* signature, fieldDescriptor* fd) const; + virtual Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const; + public: + Method* lookup_method(Symbol* name, Symbol* signature) const { +--- ./hotspot/src/share/vm/prims/jvm.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -803,6 +803,7 @@ + return (jclass) JNIHandles::make_local(env, k->java_mirror()); + JVM_END + ++// Not used; JVM_FindClassFromCaller replaces this. + JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name, + jboolean init, jobject loader, + jboolean throwError)) +@@ -829,6 +830,42 @@ + return result; + JVM_END + ++// Find a class with this name in this loader, using the caller's protection domain. ++JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name, ++ jboolean init, jobject loader, ++ jclass caller)) ++ JVMWrapper2("JVM_FindClassFromCaller %s throws ClassNotFoundException", name); ++ // Java libraries should ensure that name is never null... ++ if (name == NULL || (int)strlen(name) > Symbol::max_length()) { ++ // It's impossible to create this class; the name cannot fit ++ // into the constant pool. ++ THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name); ++ } ++ ++ TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL); ++ ++ oop loader_oop = JNIHandles::resolve(loader); ++ oop from_class = JNIHandles::resolve(caller); ++ oop protection_domain = NULL; ++ // If loader is null, shouldn't call ClassLoader.checkPackageAccess; otherwise get ++ // NPE. Put it in another way, the bootstrap class loader has all permission and ++ // thus no checkPackageAccess equivalence in the VM class loader. ++ // The caller is also passed as NULL by the java code if there is no security ++ // manager to avoid the performance cost of getting the calling class. ++ if (from_class != NULL && loader_oop != NULL) { ++ protection_domain = java_lang_Class::as_Klass(from_class)->protection_domain(); ++ } ++ ++ Handle h_loader(THREAD, loader_oop); ++ Handle h_prot(THREAD, protection_domain); ++ jclass result = find_class_from_class_loader(env, h_name, init, h_loader, ++ h_prot, false, THREAD); ++ ++ if (TraceClassResolution && result != NULL) { ++ trace_class_resolution(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(result))); ++ } ++ return result; ++JVM_END + + JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name, + jboolean init, jclass from)) +@@ -3984,10 +4021,15 @@ + + // Shared JNI/JVM entry points ////////////////////////////////////////////////////////////// + +-jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) { ++jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, ++ Handle loader, Handle protection_domain, ++ jboolean throwError, TRAPS) { + // Security Note: + // The Java level wrapper will perform the necessary security check allowing +- // us to pass the NULL as the initiating class loader. ++ // us to pass the NULL as the initiating class loader. The VM is responsible for ++ // the checkPackageAccess relative to the initiating class loader via the ++ // protection_domain. The protection_domain is passed as NULL by the java code ++ // if there is no security manager in 3-arg Class.forName(). + Klass* klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL); + + KlassHandle klass_handle(THREAD, klass); +--- ./hotspot/src/share/vm/prims/jvm.h Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/prims/jvm.h Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -420,6 +420,19 @@ + JVM_FindClassFromBootLoader(JNIEnv *env, const char *name); + + /* ++ * Find a class from a given class loader. Throws ClassNotFoundException. ++ * name: name of class ++ * init: whether initialization is done ++ * loader: class loader to look up the class. This may not be the same as the caller's ++ * class loader. ++ * caller: initiating class. The initiating class may be null when a security ++ * manager is not installed. ++ */ ++JNIEXPORT jclass JNICALL ++JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, ++ jobject loader, jclass caller); ++ ++/* + * Find a class from a given class. + */ + JNIEXPORT jclass JNICALL +--- ./hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/arguments.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -2387,6 +2387,10 @@ + warning("The VM option CICompilerCountPerCPU overrides CICompilerCount."); + } + ++#ifdef COMPILER1 ++ status &= verify_interval(SafepointPollOffset, 0, os::vm_page_size() - BytesPerWord, "SafepointPollOffset"); ++#endif ++ + return status; + } + +@@ -3577,6 +3581,11 @@ + return JNI_ENOMEM; + } + ++ // Set up VerifySharedSpaces ++ if (FLAG_IS_DEFAULT(VerifySharedSpaces) && SharedArchiveFile != NULL) { ++ VerifySharedSpaces = true; ++ } ++ + // Delay warning until here so that we've had a chance to process + // the -XX:-PrintWarnings flag + if (needs_hotspotrc_warning) { +--- ./hotspot/src/share/vm/runtime/globals.hpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/globals.hpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1142,11 +1142,11 @@ + "Prevent spurious or premature wakeups from object.wait " \ + "(Solaris only)") \ + \ +- product(intx, NativeMonitorTimeout, -1, "(Unstable)") \ +- \ +- product(intx, NativeMonitorFlags, 0, "(Unstable)") \ +- \ +- product(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \ ++ experimental(intx, NativeMonitorTimeout, -1, "(Unstable)") \ ++ \ ++ experimental(intx, NativeMonitorFlags, 0, "(Unstable)") \ ++ \ ++ experimental(intx, NativeMonitorSpinLimit, 20, "(Unstable)") \ + \ + develop(bool, UsePthreads, false, \ + "Use pthread-based instead of libthread-based synchronization " \ +@@ -3745,6 +3745,10 @@ + product(bool, UseSharedSpaces, true, \ + "Use shared spaces for metadata") \ + \ ++ product(bool, VerifySharedSpaces, false, \ ++ "Verify shared spaces (false for default archive, true for " \ ++ "archive specified by -XX:SharedArchiveFile)") \ ++ \ + product(bool, RequireSharedSpaces, false, \ + "Require shared spaces for metadata") \ + \ +--- ./hotspot/src/share/vm/runtime/reflection.cpp Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/src/share/vm/runtime/reflection.cpp Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -482,7 +482,7 @@ + ik = InstanceKlass::cast(hc); + + // There's no way to make a host class loop short of patching memory. +- // Therefore there cannot be a loop here unles there's another bug. ++ // Therefore there cannot be a loop here unless there's another bug. + // Still, let's check for it. + assert(--inf_loop_check > 0, "no host_klass loop"); + } +@@ -551,7 +551,8 @@ + if (access.is_protected()) { + if (!protected_restriction) { + // See if current_class (or outermost host class) is a subclass of field_class +- if (host_class->is_subclass_of(field_class)) { ++ // An interface may not access protected members of j.l.Object ++ if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) { + if (access.is_static() || // static fields are ok, see 6622385 + current_class == resolved_class || + field_class == resolved_class || +--- ./hotspot/test/runtime/7116786/Test7116786.java Wed Jul 30 03:51:43 2014 -0700 ++++ ./hotspot/test/runtime/7116786/Test7116786.java Mon Sep 08 12:35:01 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -147,7 +147,8 @@ + "no stackmap frame at jump location or bad jump", + "Inconsistent stackmap frames at branch target "), + +- new Case("case15", "stackMapTable.cpp", true, "check_new_object", ++ /* Backward jump with uninit is allowed starting with JDK 8 */ ++ new Case("case15", "stackMapTable.cpp", false, "check_new_object", + "backward jump with uninit", + "Uninitialized object exists on backward branch "), + +--- ./jaxp/.hgtags Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/.hgtags Mon Sep 08 12:36:00 2014 -0700 +@@ -313,3 +313,21 @@ + d6ded60cfdc53861ae7d1a010f95b5036d610e80 jdk8u20-b23 + dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b24 + dd09d8b9edefb5684941941e5d9b35c84ee066f3 jdk8u20-b25 ++938b9d502c2b0f9684151e1b1f47cf7052db1502 jdk8u20-b26 ++65e5ee249ebc81c0ccfff23946a0a2a6d4becdcc jdk8u25-b00 ++b29277565edfdece4e3928b135d4fd86ae141e4f jdk8u25-b01 ++09df5bda467090041090873f71d418eebcadf516 jdk8u25-b02 ++f3567e6bed22eaf89c3c7d64e0b1fa308707260f jdk8u25-b03 ++a4d0f11cf08d5dae91c5e9ad387b1ff88388503d jdk8u25-b04 ++0c4917cea678dc2a3745baca74016f0d6f169012 jdk8u25-b05 ++e84d78dd9e0533eb11c26b69727c044898d19f60 jdk8u25-b06 ++7aaaec31a0331ad091abedf81c928b47a982222d jdk8u25-b07 ++e48a4594f19ad119bc27d89c53dd35d11ed6da7d jdk8u25-b08 ++a09893b8f617912569196d7bd64a96c349796be0 jdk8u25-b09 ++85de91b6e953c8c21ac5e6d9a5e284f86d759680 jdk8u25-b10 ++5c1ac461fef7fe0f810bd9d6051db5a24247de1d jdk8u25-b11 ++c078e904db0a7be650e4ba2d665277785e2216b0 jdk8u25-b12 ++24184cfe0f8b0da0f349933ae7b5cc16455a52b8 jdk8u25-b13 ++90f3b8b970a8bb3173083111248372afdc61652d jdk8u25-b14 ++f5ac2e242bb95be0a3deddf37362178202086137 jdk8u25-b15 ++df68b132a471ed1e825a79bd1d8acb47d2bcc04f jdk8u25-b16 +--- ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xalan/internal/xsltc/compiler/util/ErrorMessages_ja.java Mon Sep 08 12:36:00 2014 -0700 +@@ -679,7 +679,7 @@ + * documentation. + */ + {ErrorMsg.COMPILE_USAGE_STR, +- "SYNOPSIS\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o <output>]\n [-d <directory>] [-j <jarfile>] [-p <package>]\n [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n -o <output> \u540D\u524D<output>\u3092\u751F\u6210\u6E08translet\u306B\n \u5272\u308A\u5F53\u3066\u308B\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u306F\u3001translet\u540D\u306F\n <stylesheet>\u540D\u306B\u7531\u6765\u3057\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\n \u8907\u6570\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30B3\u30F3\u30D1\u30A4\u30EB\u3059\u308B\u5834\u5408\u306F\u7121\u8996\u3055\u308C\u307E\u3059\u3002\n -d <directory> translet\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u6307\u5B9A\u3059\u308B\n -j <jarfile> <jarfile>\u3067\u6307\u5B9A\u3055\u308C\u308B\u540D\u524D\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306Btranslet\u30AF\u30E9\u30B9\u3092\n \u30D1\u30C3\u30B1\u30FC\u30B8\u3059\u308B\n -p <package> \u751F\u6210\u3055\u308C\u308B\u3059\u3079\u3066\u306Etranslet\u30AF\u30E9\u30B9\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\n \u63A5\u982D\u8F9E\u3092\u6307\u5B9A\u3059\u308B\u3002\n -n \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5316\u3092\u6709\u52B9\u306B\u3059\u308B(\u5E73\u5747\u3057\u3066\u30C7\u30D5\u30A9\u30EB\u30C8\u52D5\u4F5C\u306E\u65B9\u304C\n \u512A\u308C\u3066\u3044\u307E\u3059)\u3002\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -u <stylesheet>\u5F15\u6570\u3092URL\u3068\u3057\u3066\u89E3\u91C8\u3059\u308B\n -i \u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092stdin\u304B\u3089\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u3092\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u5F37\u5236\u3059\u308B\n -v \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n -h \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u6587\u3092\u51FA\u529B\u3059\u308B\n"}, ++ "\u5F62\u5F0F\n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile [-o <output>]\n [-d <directory>] [-j <jarfile>] [-p <package>]\n [-n] [-x] [-u] [-v] [-h] { <stylesheet> | -i }\n\nOPTIONS\n -o <output> \u540D\u524D<output>\u3092\u751F\u6210\u6E08translet\u306B\n \u5272\u308A\u5F53\u3066\u308B\u3002\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u306F\u3001translet\u540D\u306F\n <stylesheet>\u540D\u306B\u7531\u6765\u3057\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\n \u8907\u6570\u306E\u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092\u30B3\u30F3\u30D1\u30A4\u30EB\u3059\u308B\u5834\u5408\u306F\u7121\u8996\u3055\u308C\u307E\u3059\u3002\n -d <directory> translet\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u6307\u5B9A\u3059\u308B\n -j <jarfile> <jarfile>\u3067\u6307\u5B9A\u3055\u308C\u308B\u540D\u524D\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306Btranslet\u30AF\u30E9\u30B9\u3092\n \u30D1\u30C3\u30B1\u30FC\u30B8\u3059\u308B\n -p <package> \u751F\u6210\u3055\u308C\u308B\u3059\u3079\u3066\u306Etranslet\u30AF\u30E9\u30B9\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\n \u63A5\u982D\u8F9E\u3092\u6307\u5B9A\u3059\u308B\u3002\n -n \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u30A4\u30F3\u30E9\u30A4\u30F3\u5316\u3092\u6709\u52B9\u306B\u3059\u308B(\u5E73\u5747\u3057\u3066\u30C7\u30D5\u30A9\u30EB\u30C8\u52D5\u4F5C\u306E\u65B9\u304C\n \u512A\u308C\u3066\u3044\u307E\u3059)\u3002\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -u <stylesheet>\u5F15\u6570\u3092URL\u3068\u3057\u3066\u89E3\u91C8\u3059\u308B\n -i \u30B9\u30BF\u30A4\u30EB\u30B7\u30FC\u30C8\u3092stdin\u304B\u3089\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u3092\u30B3\u30F3\u30D1\u30A4\u30E9\u306B\u5F37\u5236\u3059\u308B\n -v \u30B3\u30F3\u30D1\u30A4\u30E9\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3059\u308B\n -h \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u6587\u3092\u51FA\u529B\u3059\u308B\n"}, + + /* + * Note to translators: This message contains usage information for a +@@ -691,7 +691,7 @@ + * documentation. + */ + {ErrorMsg.TRANSFORM_USAGE_STR, +- "SYNOPSIS \n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform [-j <jarfile>]\n [-x] [-n <iterations>] {-u <document_url> | <document>}\n <class> [<param1>=<value1> ...]\n\n translet <class>\u3092\u4F7F\u7528\u3057\u3066\u3001<document>\u3067\u6307\u5B9A\u3055\u308C\u308B\n XML\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5909\u63DB\u3059\u308B\u3002translet <class>\u306F\n \u30E6\u30FC\u30B6\u30FC\u306ECLASSPATH\u5185\u304B\u3001\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u6307\u5B9A\u3055\u308C\u305F<jarfile>\u5185\u306B\u3042\u308A\u307E\u3059\u3002\nOPTIONS\n -j <jarfile> translet\u3092\u30ED\u30FC\u30C9\u3059\u308Bjarfile\u3092\u6307\u5B9A\u3059\u308B\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -n <iterations> \u5909\u63DB\u3092<iterations>\u56DE\u5B9F\u884C\u3057\u3001\n \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n -u <document_url> XML\u5165\u529B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092URL\u3068\u3057\u3066\u6307\u5B9A\u3059\u308B\n"}, ++ "\u5F62\u5F0F \n java com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform [-j <jarfile>]\n [-x] [-n <iterations>] {-u <document_url> | <document>}\n <class> [<param1>=<value1> ...]\n\n translet <class>\u3092\u4F7F\u7528\u3057\u3066\u3001<document>\u3067\u6307\u5B9A\u3055\u308C\u308B\n XML\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u5909\u63DB\u3059\u308B\u3002translet <class>\u306F\n \u30E6\u30FC\u30B6\u30FC\u306ECLASSPATH\u5185\u304B\u3001\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u6307\u5B9A\u3055\u308C\u305F<jarfile>\u5185\u306B\u3042\u308A\u307E\u3059\u3002\nOPTIONS\n -j <jarfile> translet\u3092\u30ED\u30FC\u30C9\u3059\u308Bjarfile\u3092\u6307\u5B9A\u3059\u308B\n -x \u8FFD\u52A0\u306E\u30C7\u30D0\u30C3\u30B0\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u51FA\u529B\u3092\u30AA\u30F3\u306B\u3059\u308B\n -n <iterations> \u5909\u63DB\u3092<iterations>\u56DE\u5B9F\u884C\u3057\u3001\n \u30D7\u30ED\u30D5\u30A1\u30A4\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n -u <document_url> XML\u5165\u529B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092URL\u3068\u3057\u3066\u6307\u5B9A\u3059\u308B\n"}, + + + +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java Mon Sep 08 12:36:00 2014 -0700 +@@ -612,9 +612,9 @@ + //fElementStack2.clear(); + //fReplaceEntityReferences = true; + //fSupportExternalEntities = true; +- Boolean bo = (Boolean)propertyManager.getProperty(XMLInputFactoryImpl.IS_REPLACING_ENTITY_REFERENCES); ++ Boolean bo = (Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES); + fReplaceEntityReferences = bo.booleanValue(); +- bo = (Boolean)propertyManager.getProperty(XMLInputFactoryImpl.IS_SUPPORTING_EXTERNAL_ENTITIES); ++ bo = (Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES); + fSupportExternalEntities = bo.booleanValue(); + Boolean cdata = (Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.STAX_REPORT_CDATA_EVENT) ; + if(cdata != null) +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLEntityManager.java Mon Sep 08 12:36:00 2014 -0700 +@@ -53,6 +53,7 @@ + import java.util.Map; + import java.util.Stack; + import javax.xml.XMLConstants; ++import javax.xml.stream.XMLInputFactory; + + + /** +@@ -305,6 +306,11 @@ + /** Property Manager. This is used from Stax */ + protected PropertyManager fPropertyManager ; + ++ /** StAX properties */ ++ boolean fSupportDTD = true; ++ boolean fReplaceEntityReferences = true; ++ boolean fSupportExternalEntities = true; ++ + /** used to restrict external access */ + protected String fAccessExternalDTD = EXTERNAL_ACCESS_DEFAULT; + +@@ -1136,7 +1142,8 @@ + boolean parameter = entityName.startsWith("%"); + boolean general = !parameter; + if (unparsed || (general && !fExternalGeneralEntities) || +- (parameter && !fExternalParameterEntities)) { ++ (parameter && !fExternalParameterEntities) || ++ !fSupportDTD || !fSupportExternalEntities) { + + if (fEntityHandler != null) { + fResourceIdentifier.clear(); +@@ -1431,6 +1438,10 @@ + fStaxEntityResolver = null; + } + ++ fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)).booleanValue(); ++ fReplaceEntityReferences = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES)).booleanValue(); ++ fSupportExternalEntities = ((Boolean)propertyManager.getProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES)).booleanValue(); ++ + // Zephyr feature ignore-external-dtd is the opposite of Xerces' load-external-dtd + fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)).booleanValue(); + +@@ -1502,6 +1513,11 @@ + fSecurityManager = (XMLSecurityManager)componentManager.getProperty(SECURITY_MANAGER, null); + entityExpansionIndex = fSecurityManager.getIndex(Constants.JDK_ENTITY_EXPANSION_LIMIT); + ++ //StAX Property ++ fSupportDTD = true; ++ fReplaceEntityReferences = true; ++ fSupportExternalEntities = true; ++ + // JAXP 1.5 feature + XMLSecurityPropertyManager spm = (XMLSecurityPropertyManager) componentManager.getProperty(XML_SECURITY_PROPERTY_MANAGER, null); + if (spm == null) { +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/DOMMessages_de.properties Mon Sep 08 12:36:00 2014 -0700 +@@ -26,7 +26,7 @@ + SYNTAX_ERR = Ung\u00FCltige 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 Wertetyp f\u00FCr diesen Parameternamen ist nicht mit dem erwarteten Wertetyp kompatibel. ++TYPE_MISMATCH_ERR = Der Werttyp f\u00FCr diesen Parameternamen ist nicht mit dem erwarteten Werttyp kompatibel. + + #error messages or exceptions + FEATURE_NOT_SUPPORTED = Parameter {0} wird erkannt, aber der angeforderte Wert kann nicht festgelegt werden. +--- ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages_de.properties Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xerces/internal/impl/msg/XIncludeMessages_de.properties Mon Sep 08 12:36:00 2014 -0700 +@@ -27,7 +27,7 @@ + UnexpandedEntityReferenceIllegal = Der Ersatz eines "include"-Elements, das als Dokumentelement im Quell-Infoset der obersten Ebene angezeigt wird, darf keine nicht erweiterten Entit\u00E4tsreferenzen enthalten. + HrefFragmentIdentifierIllegal = Fragment-IDs d\u00FCrfen nicht verwendet werden. Der "href"-Attributwert "{0}" ist nicht zul\u00E4ssig. + HrefSyntacticallyInvalid = "href"-Attributwert "{0}" hat eine ung\u00FCltige Syntax. Nach Anwenden der Escape-Regeln ist der Wert kein syntaktisch korrekter URI oder IRI. +-XPointerStreamability = Es wurde ein xpointer angegeben, der auf eine Stelle im Quell-Infoset verweist. Auf diese Stelle kann aufgrund des Streaming-Charakters des Prozessors nicht zugegriffen werden. ++XPointerStreamability = Es wurde ein xpointer angegeben, der auf eine Stelle im Quell-Infoset verweist. Auf diese Stelle kann aufgrund des Streamingcharakters des Prozessors nicht zugegriffen werden. + + XPointerResolutionUnsuccessful = XPointer-Aufl\u00F6sung nicht erfolgreich. + +--- ./jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java Wed Jul 30 03:53:11 2014 -0700 ++++ ./jaxp/src/com/sun/org/apache/xpath/internal/res/XPATHErrorResources_de.java Mon Sep 08 12:36:00 2014 -0700 +@@ -3,7 +3,7 @@ + * DO NOT REMOVE OR ALTER! + */ + /* +- * Copyright 1999-2004 The Apache Software Foundation. ++ * Copyright 1999-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. +@@ -878,7 +878,7 @@ + { "optionIN", " [-in inputXMLURL]"}, + { "optionSelect", " [-select xpath expression]"}, + { "optionMatch", " [-match match pattern (f\u00FCr Vergleichsdiagnose)]"}, +- { "optionAnyExpr", "Oder nur ein XPath-Ausdruck f\u00FChrt einen Diagnose-Dump aus"}, ++ { "optionAnyExpr", "Oder nur ein XPath-Ausdruck f\u00FChrt einen Diagnosedump aus"}, + { "noParsermsg1", "XSL-Prozess war nicht erfolgreich."}, + { "noParsermsg2", "** Parser konnte nicht gefunden werden **"}, + { "noParsermsg3", "Pr\u00FCfen Sie den Classpath."}, +--- ./jaxws/.hgtags Wed Jul 30 03:53:36 2014 -0700 ++++ ./jaxws/.hgtags Mon Sep 08 12:36:09 2014 -0700 +@@ -311,3 +311,21 @@ + f3bf1b270fea8b17aa2846f962f7514b6f772ab4 jdk8u20-b23 + 1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b24 + 1277c0d492fd9253f1ea2730eb160953397bd939 jdk8u20-b25 ++7025a2c10ea4116ce8f31bb1e305f732aa1025f0 jdk8u20-b26 ++efc85d318f4697f40bdd1f3757677be97f1758d9 jdk8u25-b00 ++a76779e1b0376650dfc29a1f3b14760f05e0fc6d jdk8u25-b01 ++3d31955043b9f1807c9d695c7b5d604d11c132cf jdk8u25-b02 ++c67cb85b249c69a96d7ac72734c35bc18644befe jdk8u25-b03 ++81129354f0e821f3d41dbcf8a68ce82f9d776127 jdk8u25-b04 ++5f78130b0a64df9568a827f9ea589fdc3a7c080c jdk8u25-b05 ++433da54f73257545d95edbc356fdb0e37a9d95eb jdk8u25-b06 ++cccfc3f8dec888c8fe86c212a51af2fba1e11aef jdk8u25-b07 ++c758be4c3cac65a2744bf4e7ed9bdabb85234de2 jdk8u25-b08 ++73423d29fe362e843cdccad510e2e44e2899bc9e jdk8u25-b09 ++391b45e0081afcf3db709878916063a63dca7b05 jdk8u25-b10 ++57cd66833abf44f499faaaed2c16bdf94b258ca9 jdk8u25-b11 ++56b97127afa66fa01eec0fcf467a77cd2e445b4f jdk8u25-b12 ++0ebb9d8c3dd49559b716f02825924801be55b3e7 jdk8u25-b13 ++392a9579cc95d27806c1dde16eee776524a49761 jdk8u25-b14 ++d3a96bbb88521188a3af1a34dd9523f13afa521d jdk8u25-b15 ++4570a7d00aa9bd3df028f52d6f9d8c434163b689 jdk8u25-b16 +--- ./jdk/.hgtags Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/.hgtags Tue Sep 09 12:00:58 2014 -0700 +@@ -311,3 +311,24 @@ + be30cb2a3088f2b7b334b499f7eddbd5312312a7 jdk8u20-b23 + dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b24 + dfb9f24d56b51e5a2ca26e77fc69a2464d51a4d3 jdk8u20-b25 ++dd229c5f57bff4e75a70908294a13072b9a48385 jdk8u20-b26 ++abca9f6f1a10e9f91b2538bbe7870f54f550d986 jdk8u25-b00 ++7d0627679c9fdeaaaa9fe15c7cc11af0763621ec jdk8u25-b01 ++b0277ec994b751ebb761814675352506cd56bcd6 jdk8u25-b02 ++5606d84f30bab5ed4bc5776572edd469fb013e13 jdk8u25-b03 ++40630cd55da8a2db7980249dc31af285965cb5e9 jdk8u25-b04 ++75b48287a1b3fc5757ac473f72c8918c7f345ffc jdk8u25-b05 ++5b80b4b22b4ca0b630c7f1cec3605da7694168e2 jdk8u25-b06 ++0e0a35b0bf0ff5852026c50038d5c2ecb26c075c jdk8u25-b07 ++d7d221f56fd17b96bab4440448641a844f9e92cd jdk8u25-b08 ++0c6cf43c5bcf0917d07a1bc94adb7a091f18f32c jdk8u25-b09 ++1317d94e95861a47fee8258903b652af70a3493c jdk8u25-b10 ++2104dfd9a4c2b519cdca019aec938db539bf4f3f jdk8u25-b11 ++eaaa9a04b9fdcfa4a830b811ed209eb2c45a4a6b jdk8u25-b12 ++c3a855402b923d3ba819b05292a971953fc8ed0b jdk8u25-b13 ++2a6df63ca0f0f59bb730638b05c72d77a23f93c8 jdk8u25-b14 ++412d9ade90401d098f3662bd688ab393008423bd jdk8u25-b15 ++f07bc5dab84c67f5d1dccbab318ee1c5485c852d jdk8u25-b16 ++0000000000000000000000000000000000000000 jdk8u25-b16 ++0000000000000000000000000000000000000000 jdk8u25-b16 ++d067890f970f3a712f870f6311d20f3359b6eaf0 jdk8u25-b16 +--- ./jdk/make/lib/CoreLibraries.gmk Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/make/lib/CoreLibraries.gmk Tue Sep 09 12:00:58 2014 -0700 +@@ -264,7 +264,7 @@ + $(call SET_SHARED_LIBRARY_ORIGIN) \ + $(EXPORT_ZIP_FUNCS), \ + LDFLAGS_windows := -export:ZIP_Open -export:ZIP_Close -export:ZIP_FindEntry \ +- -export:ZIP_ReadEntry -export:ZIP_GetNextEntry jvm.lib \ ++ -export:ZIP_ReadEntry -export:ZIP_GetNextEntry -export:ZIP_CRC32 jvm.lib \ + $(WIN_JAVA_LIB), \ + LDFLAGS_SUFFIX_linux := -ljvm -ljava $(LIBZ), \ + LDFLAGS_SUFFIX_solaris := -ljvm -ljava $(LIBZ) -lc, \ +--- ./jdk/make/mapfiles/libnet/mapfile-vers Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/make/mapfiles/libnet/mapfile-vers Tue Sep 09 12:00:58 2014 -0700 +@@ -28,6 +28,8 @@ + SUNWprivate_1.1 { + global: + JNI_OnLoad; ++ Java_java_net_AbstractPlainDatagramSocketImpl_init; ++ Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable; + Java_java_net_PlainSocketImpl_socketListen; + Java_java_net_PlainDatagramSocketImpl_getTTL; + Java_java_net_PlainDatagramSocketImpl_init; +--- ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -105,6 +105,8 @@ + + private final SecurityWarningWindow warningWindow; + ++ private volatile boolean targetFocusable; ++ + /** + * Current modal blocker or null. + * +@@ -240,13 +242,12 @@ + if (!visible && warningWindow != null) { + warningWindow.setVisible(false, false); + } +- ++ updateFocusableWindowState(); + super.setVisibleImpl(visible); + // TODO: update graphicsConfig, see 4868278 + platformWindow.setVisible(visible); + if (isSimpleWindow()) { + KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance(); +- + if (visible) { + if (!getTarget().isAutoRequestFocus()) { + return; +@@ -397,6 +398,7 @@ + + @Override + public void updateFocusableWindowState() { ++ targetFocusable = getTarget().isFocusableWindow(); + platformWindow.updateFocusableWindowState(); + } + +@@ -1220,13 +1222,13 @@ + } + + private boolean isFocusableWindow() { +- boolean focusable = getTarget().isFocusableWindow(); ++ boolean focusable = targetFocusable; + if (isSimpleWindow()) { + LWWindowPeer ownerPeer = getOwnerFrameDialog(this); + if (ownerPeer == null) { + return false; + } +- return focusable && ownerPeer.getTarget().isFocusableWindow(); ++ return focusable && ownerPeer.targetFocusable; + } + return focusable; + } +--- ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -56,19 +56,22 @@ + + private PropertyChangeListener propertyChangeHandler; + ++ @Override + protected void installListeners(JScrollPane scrollPane) { + super.installListeners(scrollPane); + propertyChangeHandler = createPropertyChangeHandler(); + scrollPane.addPropertyChangeListener(propertyChangeHandler); + } + +- protected void uninstallListeners(JScrollPane scrollPane) { ++ @Override ++ protected void uninstallListeners(JComponent scrollPane) { + super.uninstallListeners(scrollPane); + scrollPane.removePropertyChangeListener(propertyChangeHandler); + } + + private PropertyChangeListener createPropertyChangeHandler() { + return new PropertyChangeListener() { ++ @Override + public void propertyChange(PropertyChangeEvent e) { + String propertyName = e.getPropertyName(); + +@@ -92,6 +95,7 @@ + }}; + } + ++ @Override + protected void installDefaults(JScrollPane scrollpane) { + super.installDefaults(scrollpane); + +@@ -115,7 +119,7 @@ + } + } + +- ++ @Override + protected void uninstallDefaults(JScrollPane c) { + super.uninstallDefaults(c); + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + import java.io.InputStream; + import java.security.AccessController; + import java.security.PrivilegedAction; ++import java.security.PrivilegedActionException; ++import java.security.PrivilegedExceptionAction; + import java.util.ArrayList; + import java.util.List; + +@@ -35,6 +37,7 @@ + import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper; + import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithm; + import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer; ++import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException; + import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolver; + import com.sun.org.apache.xml.internal.security.transforms.Transform; + import com.sun.org.apache.xml.internal.security.utils.ElementProxy; +@@ -118,43 +121,50 @@ + log.log(java.util.logging.Level.FINE, "Registering default algorithms"); + } + try { +- // +- // Bind the default prefixes +- // +- ElementProxy.registerDefaultPrefixes(); ++ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>(){ ++ @Override public Void run() throws XMLSecurityException { ++ // ++ // Bind the default prefixes ++ // ++ ElementProxy.registerDefaultPrefixes(); + +- // +- // Set the default Transforms +- // +- Transform.registerDefaultAlgorithms(); ++ // ++ // Set the default Transforms ++ // ++ Transform.registerDefaultAlgorithms(); + +- // +- // Set the default signature algorithms +- // +- SignatureAlgorithm.registerDefaultAlgorithms(); ++ // ++ // Set the default signature algorithms ++ // ++ SignatureAlgorithm.registerDefaultAlgorithms(); + +- // +- // Set the default JCE algorithms +- // +- JCEMapper.registerDefaultAlgorithms(); ++ // ++ // Set the default JCE algorithms ++ // ++ JCEMapper.registerDefaultAlgorithms(); + +- // +- // Set the default c14n algorithms +- // +- Canonicalizer.registerDefaultAlgorithms(); ++ // ++ // Set the default c14n algorithms ++ // ++ Canonicalizer.registerDefaultAlgorithms(); + +- // +- // Register the default resolvers +- // +- ResourceResolver.registerDefaultResolvers(); ++ // ++ // Register the default resolvers ++ // ++ ResourceResolver.registerDefaultResolvers(); + +- // +- // Register the default key resolvers +- // +- KeyResolver.registerDefaultResolvers(); +- } catch (Exception ex) { +- log.log(java.util.logging.Level.SEVERE, ex.getMessage(), ex); +- ex.printStackTrace(); ++ // ++ // Register the default key resolvers ++ // ++ KeyResolver.registerDefaultResolvers(); ++ ++ return null; ++ } ++ }); ++ } catch (PrivilegedActionException ex) { ++ XMLSecurityException xse = (XMLSecurityException)ex.getException(); ++ log.log(java.util.logging.Level.SEVERE, xse.getMessage(), xse); ++ xse.printStackTrace(); + } + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java Tue Sep 09 12:00:58 2014 -0700 +@@ -27,6 +27,7 @@ + + import com.sun.org.apache.xml.internal.security.encryption.XMLCipher; + import com.sun.org.apache.xml.internal.security.signature.XMLSignature; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Element; + + +@@ -49,8 +50,11 @@ + * + * @param id + * @param algorithm ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the JCE algorithm + */ + public static void register(String id, Algorithm algorithm) { ++ JavaUtils.checkRegisterPermission(); + algorithmsMap.put(id, algorithm); + } + +@@ -292,8 +296,11 @@ + /** + * Sets the default Provider for obtaining the security algorithms + * @param provider the default providerId. ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the JCE provider + */ + public static void setProviderId(String provider) { ++ JavaUtils.checkRegisterPermission(); + providerName = provider; + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java Tue Sep 09 12:00:58 2014 -0700 +@@ -37,6 +37,7 @@ + import com.sun.org.apache.xml.internal.security.signature.XMLSignature; + import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException; + import com.sun.org.apache.xml.internal.security.utils.Constants; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Attr; + import org.w3c.dom.Document; + import org.w3c.dom.Element; +@@ -314,18 +315,21 @@ + } + + /** +- * Registers implementing class of the Transform algorithm with algorithmURI ++ * Registers implementing class of the SignatureAlgorithm with algorithmURI + * +- * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. ++ * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>. + * @param implementingClass <code>implementingClass</code> the implementing class of + * {@link SignatureAlgorithmSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered + * @throws XMLSignatureException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the signature algorithm + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + XMLSignatureException { ++ JavaUtils.checkRegisterPermission(); + if (log.isLoggable(java.util.logging.Level.FINE)) { + log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); + } +@@ -352,15 +356,18 @@ + /** + * Registers implementing class of the Transform algorithm with algorithmURI + * +- * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>. ++ * @param algorithmURI algorithmURI URI representation of <code>SignatureAlgorithm</code>. + * @param implementingClass <code>implementingClass</code> the implementing class of + * {@link SignatureAlgorithmSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered + * @throws XMLSignatureException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the signature algorithm + */ + public static void register(String algorithmURI, Class<? extends SignatureAlgorithmSpi> implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + XMLSignatureException { ++ JavaUtils.checkRegisterPermission(); + if (log.isLoggable(java.util.logging.Level.FINE)) { + log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass); + } +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -41,6 +41,7 @@ + import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments; + import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical; + import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Document; + import org.w3c.dom.Node; + import org.w3c.dom.NodeList; +@@ -142,10 +143,13 @@ + * @param algorithmURI + * @param implementingClass + * @throws AlgorithmAlreadyRegisteredException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the canonicalizer + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { ++ JavaUtils.checkRegisterPermission(); + // check whether URI is already registered + Class<? extends CanonicalizerSpi> registeredClass = + canonicalizerHash.get(algorithmURI); +@@ -166,9 +170,12 @@ + * @param algorithmURI + * @param implementingClass + * @throws AlgorithmAlreadyRegisteredException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the canonicalizer + */ +- public static void register(String algorithmURI, Class<CanonicalizerSpi> implementingClass) ++ public static void register(String algorithmURI, Class<? extends CanonicalizerSpi> implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException { ++ JavaUtils.checkRegisterPermission(); + // check whether URI is already registered + Class<? extends CanonicalizerSpi> registeredClass = canonicalizerHash.get(algorithmURI); + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java Tue Sep 09 12:00:58 2014 -0700 +@@ -42,6 +42,7 @@ + import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SKIResolver; + import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.X509SubjectNameResolver; + import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import org.w3c.dom.Element; + import org.w3c.dom.Node; + +@@ -175,9 +176,12 @@ + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void register(String className, boolean globalResolver) + throws ClassNotFoundException, IllegalAccessException, InstantiationException { ++ JavaUtils.checkRegisterPermission(); + KeyResolverSpi keyResolverSpi = + (KeyResolverSpi) Class.forName(className).newInstance(); + keyResolverSpi.setGlobalResolver(globalResolver); +@@ -195,8 +199,11 @@ + * + * @param className + * @param globalResolver Whether the KeyResolverSpi is a global resolver or not ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void registerAtStart(String className, boolean globalResolver) { ++ JavaUtils.checkRegisterPermission(); + KeyResolverSpi keyResolverSpi = null; + Exception ex = null; + try { +@@ -228,11 +235,14 @@ + * + * @param keyResolverSpi a KeyResolverSpi instance to register + * @param start whether to register the KeyResolverSpi at the start of the list or not ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void register( + KeyResolverSpi keyResolverSpi, + boolean start + ) { ++ JavaUtils.checkRegisterPermission(); + KeyResolver resolver = new KeyResolver(keyResolverSpi); + if (start) { + resolverVector.add(0, resolver); +@@ -254,9 +264,12 @@ + * @throws InstantiationException + * @throws IllegalAccessException + * @throws ClassNotFoundException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the key resolver + */ + public static void registerClassNames(List<String> classNames) + throws ClassNotFoundException, IllegalAccessException, InstantiationException { ++ JavaUtils.checkRegisterPermission(); + List<KeyResolver> keyResolverList = new ArrayList<KeyResolver>(classNames.size()); + for (String className : classNames) { + KeyResolverSpi keyResolverSpi = +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/transforms/Transform.java Tue Sep 09 12:00:58 2014 -0700 +@@ -46,6 +46,7 @@ + import com.sun.org.apache.xml.internal.security.transforms.implementations.TransformXSLT; + import com.sun.org.apache.xml.internal.security.utils.Constants; + import com.sun.org.apache.xml.internal.security.utils.HelperNodeList; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy; + import com.sun.org.apache.xml.internal.security.utils.XMLUtils; + import org.w3c.dom.Document; +@@ -181,11 +182,14 @@ + * class of {@link TransformSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI + * is already registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the transform + */ + @SuppressWarnings("unchecked") + public static void register(String algorithmURI, String implementingClass) + throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, + InvalidTransformException { ++ JavaUtils.checkRegisterPermission(); + // are we already registered? + Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); + if (transformSpi != null) { +@@ -206,9 +210,12 @@ + * class of {@link TransformSpi} + * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI + * is already registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register the transform + */ + public static void register(String algorithmURI, Class<? extends TransformSpi> implementingClass) + throws AlgorithmAlreadyRegisteredException { ++ JavaUtils.checkRegisterPermission(); + // are we already registered? + Class<? extends TransformSpi> transformSpi = transformSpiHash.get(algorithmURI); + if (transformSpi != null) { +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/ElementProxy.java Tue Sep 09 12:00:58 2014 -0700 +@@ -468,9 +468,12 @@ + * @param namespace + * @param prefix + * @throws XMLSecurityException ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the default prefix + */ + public static void setDefaultPrefix(String namespace, String prefix) + throws XMLSecurityException { ++ JavaUtils.checkRegisterPermission(); + if (prefixMappings.containsValue(prefix)) { + String storedPrefix = prefixMappings.get(namespace); + if (!storedPrefix.equals(prefix)) { +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/JavaUtils.java Tue Sep 09 12:00:58 2014 -0700 +@@ -28,6 +28,7 @@ + import java.io.FileOutputStream; + import java.io.IOException; + import java.io.InputStream; ++import java.security.SecurityPermission; + + /** + * A collection of different, general-purpose methods for JAVA-specific things +@@ -39,6 +40,10 @@ + private static java.util.logging.Logger log = + java.util.logging.Logger.getLogger(JavaUtils.class.getName()); + ++ private static final SecurityPermission REGISTER_PERMISSION = ++ new SecurityPermission( ++ "com.sun.org.apache.xml.internal.security.register"); ++ + private JavaUtils() { + // we don't allow instantiation + } +@@ -145,4 +150,21 @@ + + return retBytes; + } ++ ++ /** ++ * Throws a {@code SecurityException} if a security manager is installed ++ * and the caller is not allowed to register an implementation of an ++ * algorithm, transform, or other security sensitive XML Signature function. ++ * ++ * @throws SecurityException if a security manager is installed and the ++ * caller has not been granted the ++ * {@literal "com.sun.org.apache.xml.internal.security.register"} ++ * {@code SecurityPermission} ++ */ ++ public static void checkRegisterPermission() { ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ sm.checkPermission(REGISTER_PERMISSION); ++ } ++ } + } +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/XMLUtils.java Tue Sep 09 12:00:58 2014 -0700 +@@ -80,32 +80,44 @@ + /** + * Set the prefix for the digital signature namespace + * @param prefix the new prefix for the digital signature namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setDsPrefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + dsPrefix = prefix; + } + + /** + * Set the prefix for the digital signature 1.1 namespace + * @param prefix the new prefix for the digital signature 1.1 namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setDs11Prefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + ds11Prefix = prefix; + } + + /** + * Set the prefix for the encryption namespace + * @param prefix the new prefix for the encryption namespace ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setXencPrefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + xencPrefix = prefix; + } + + /** + * Set the prefix for the encryption namespace 1.1 + * @param prefix the new prefix for the encryption namespace 1.1 ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to set the prefix + */ + public static void setXenc11Prefix(String prefix) { ++ JavaUtils.checkRegisterPermission(); + xenc11Prefix = prefix; + } + +--- ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/com/sun/org/apache/xml/internal/security/utils/resolver/ResourceResolver.java Tue Sep 09 12:00:58 2014 -0700 +@@ -27,6 +27,7 @@ + import java.util.Map; + + import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput; ++import com.sun.org.apache.xml.internal.security.utils.JavaUtils; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverDirectHTTP; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment; + import com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverLocalFilesystem; +@@ -199,9 +200,12 @@ + * the class cannot be registered. + * + * @param className the name of the ResourceResolverSpi class to be registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + @SuppressWarnings("unchecked") + public static void register(String className) { ++ JavaUtils.checkRegisterPermission(); + try { + Class<ResourceResolverSpi> resourceResolverClass = + (Class<ResourceResolverSpi>) Class.forName(className); +@@ -216,9 +220,12 @@ + * list. This method logs a warning if the class cannot be registered. + * + * @param className the name of the ResourceResolverSpi class to be registered ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + @SuppressWarnings("unchecked") + public static void registerAtStart(String className) { ++ JavaUtils.checkRegisterPermission(); + try { + Class<ResourceResolverSpi> resourceResolverClass = + (Class<ResourceResolverSpi>) Class.forName(className); +@@ -233,8 +240,11 @@ + * cannot be registered. + * @param className + * @param start ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + public static void register(Class<? extends ResourceResolverSpi> className, boolean start) { ++ JavaUtils.checkRegisterPermission(); + try { + ResourceResolverSpi resourceResolverSpi = className.newInstance(); + register(resourceResolverSpi, start); +@@ -250,8 +260,11 @@ + * cannot be registered. + * @param resourceResolverSpi + * @param start ++ * @throws SecurityException if a security manager is installed and the ++ * caller does not have permission to register a resource resolver + */ + public static void register(ResourceResolverSpi resourceResolverSpi, boolean start) { ++ JavaUtils.checkRegisterPermission(); + synchronized(resolverList) { + if (start) { + resolverList.add(0, new ResourceResolver(resourceResolverSpi)); +--- ./jdk/src/share/classes/java/lang/Class.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/lang/Class.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -256,8 +256,8 @@ + @CallerSensitive + public static Class<?> forName(String className) + throws ClassNotFoundException { +- return forName0(className, true, +- ClassLoader.getClassLoader(Reflection.getCallerClass())); ++ Class<?> caller = Reflection.getCallerClass(); ++ return forName0(className, true, ClassLoader.getClassLoader(caller), caller); + } + + +@@ -327,22 +327,27 @@ + ClassLoader loader) + throws ClassNotFoundException + { +- if (sun.misc.VM.isSystemDomainLoader(loader)) { +- SecurityManager sm = System.getSecurityManager(); +- if (sm != null) { +- ClassLoader ccl = ClassLoader.getClassLoader(Reflection.getCallerClass()); ++ Class<?> caller = null; ++ SecurityManager sm = System.getSecurityManager(); ++ if (sm != null) { ++ // Reflective call to get caller class is only needed if a security manager ++ // is present. Avoid the overhead of making this call otherwise. ++ caller = Reflection.getCallerClass(); ++ if (sun.misc.VM.isSystemDomainLoader(loader)) { ++ ClassLoader ccl = ClassLoader.getClassLoader(caller); + if (!sun.misc.VM.isSystemDomainLoader(ccl)) { + sm.checkPermission( + SecurityConstants.GET_CLASSLOADER_PERMISSION); + } + } + } +- return forName0(name, initialize, loader); ++ return forName0(name, initialize, loader, caller); + } + +- /** Called after security checks have been made. */ ++ /** Called after security check for system loader access checks have been made. */ + private static native Class<?> forName0(String name, boolean initialize, +- ClassLoader loader) ++ ClassLoader loader, ++ Class<?> caller) + throws ClassNotFoundException; + + /** +--- ./jdk/src/share/classes/java/lang/invoke/MethodType.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/lang/invoke/MethodType.java Tue Sep 09 12:00:58 2014 -0700 +@@ -653,7 +653,7 @@ + * @return the parameter types (as an immutable list) + */ + public List<Class<?>> parameterList() { +- return Collections.unmodifiableList(Arrays.asList(ptypes)); ++ return Collections.unmodifiableList(Arrays.asList(ptypes.clone())); + } + + /*non-public*/ Class<?> lastParameterType() { +--- ./jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/AbstractPlainDatagramSocketImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -68,6 +68,7 @@ + return null; + } + }); ++ init(); + } + + /** +@@ -362,4 +363,7 @@ + protected boolean nativeConnectDisabled() { + return connectDisabled; + } ++ ++ native int dataAvailable(); ++ private static native void init(); + } +--- ./jdk/src/share/classes/java/net/DatagramSocket.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/DatagramSocket.java Tue Sep 09 12:00:58 2014 -0700 +@@ -83,6 +83,17 @@ + */ + boolean oldImpl = false; + ++ /** ++ * Set when a socket is ST_CONNECTED until we are certain ++ * that any packets which might have been received prior ++ * to calling connect() but not read by the application ++ * have been read. During this time we check the source ++ * address of all packets received to be sure they are from ++ * the connected destination. Other packets are read but ++ * silently dropped. ++ */ ++ private boolean explicitFilter = false; ++ private int bytesLeftToFilter; + /* + * Connection state: + * ST_NOT_CONNECTED = socket not connected +@@ -142,6 +153,15 @@ + + // socket is now connected by the impl + connectState = ST_CONNECTED; ++ // Do we need to filter some packets? ++ int avail = getImpl().dataAvailable(); ++ if (avail == -1) { ++ throw new SocketException(); ++ } ++ explicitFilter = avail > 0; ++ if (explicitFilter) { ++ bytesLeftToFilter = getReceiveBufferSize(); ++ } + } catch (SocketException se) { + + // connection will be emulated by DatagramSocket +@@ -490,6 +510,7 @@ + connectedAddress = null; + connectedPort = -1; + connectState = ST_NOT_CONNECTED; ++ explicitFilter = false; + } + } + +@@ -748,10 +769,13 @@ + } // end of while + } + } +- if (connectState == ST_CONNECTED_NO_IMPL) { ++ DatagramPacket tmp = null; ++ if ((connectState == ST_CONNECTED_NO_IMPL) || explicitFilter) { + // We have to do the filtering the old fashioned way since + // the native impl doesn't support connect or the connect +- // via the impl failed. ++ // via the impl failed, or .. "explicitFilter" may be set when ++ // a socket is connected via the impl, for a period of time ++ // when packets from other sources might be queued on socket. + boolean stop = false; + while (!stop) { + InetAddress peekAddress = null; +@@ -770,8 +794,14 @@ + if ((!connectedAddress.equals(peekAddress)) || + (connectedPort != peekPort)) { + // throw the packet away and silently continue +- DatagramPacket tmp = new DatagramPacket(new byte[1], 1); ++ tmp = new DatagramPacket( ++ new byte[1024], 1024); + getImpl().receive(tmp); ++ if (explicitFilter) { ++ if (checkFiltering(tmp)) { ++ stop = true; ++ } ++ } + } else { + stop = true; + } +@@ -780,9 +810,22 @@ + // If the security check succeeds, or the datagram is + // connected then receive the packet + getImpl().receive(p); ++ if (explicitFilter && tmp == null) { ++ // packet was not filtered, account for it here ++ checkFiltering(p); ++ } + } + } + ++ private boolean checkFiltering(DatagramPacket p) throws SocketException { ++ bytesLeftToFilter -= p.getLength(); ++ if (bytesLeftToFilter <= 0 || getImpl().dataAvailable() <= 0) { ++ explicitFilter = false; ++ return true; ++ } ++ return false; ++ } ++ + /** + * Gets the local address to which the socket is bound. + * +--- ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/net/DatagramSocketImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -47,6 +47,12 @@ + */ + protected FileDescriptor fd; + ++ int dataAvailable() { ++ // default impl returns zero, which disables the calling ++ // functionality ++ return 0; ++ } ++ + /** + * The DatagramSocket or MulticastSocket + * that owns this impl +--- ./jdk/src/share/classes/java/security/Signature.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/security/Signature.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -590,6 +590,9 @@ + if (outbuf == null) { + throw new IllegalArgumentException("No output buffer given"); + } ++ if (offset < 0 || len < 0) { ++ throw new IllegalArgumentException("offset or len is less than 0"); ++ } + if (outbuf.length - offset < len) { + throw new IllegalArgumentException + ("Output buffer too small for specified offset and length"); +@@ -658,9 +661,16 @@ + public final boolean verify(byte[] signature, int offset, int length) + throws SignatureException { + if (state == VERIFY) { +- if ((signature == null) || (offset < 0) || (length < 0) || +- (length > signature.length - offset)) { +- throw new IllegalArgumentException("Bad arguments"); ++ if (signature == null) { ++ throw new IllegalArgumentException("signature is null"); ++ } ++ if (offset < 0 || length < 0) { ++ throw new IllegalArgumentException ++ ("offset or length is less than 0"); ++ } ++ if (signature.length - offset < length) { ++ throw new IllegalArgumentException ++ ("signature too small for specified offset and length"); + } + + return engineVerify(signature, offset, length); +@@ -713,6 +723,16 @@ + public final void update(byte[] data, int off, int len) + throws SignatureException { + if (state == SIGN || state == VERIFY) { ++ if (data == null) { ++ throw new IllegalArgumentException("data is null"); ++ } ++ if (off < 0 || len < 0) { ++ throw new IllegalArgumentException("off or len is less than 0"); ++ } ++ if (data.length - off < len) { ++ throw new IllegalArgumentException ++ ("data too small for specified offset and length"); ++ } + engineUpdate(data, off, len); + } else { + throw new SignatureException("object not initialized for " +--- ./jdk/src/share/classes/java/security/cert/CertificateRevokedException.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/security/cert/CertificateRevokedException.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -94,7 +94,10 @@ + this.revocationDate = new Date(revocationDate.getTime()); + this.reason = reason; + this.authority = authority; +- this.extensions = new HashMap<String, Extension>(extensions); ++ // make sure Map only contains correct types ++ this.extensions = Collections.checkedMap(new HashMap<>(), ++ String.class, Extension.class); ++ this.extensions.putAll(extensions); + } + + /** +@@ -172,7 +175,8 @@ + public String getMessage() { + return "Certificate has been revoked, reason: " + + reason + ", revocation date: " + revocationDate +- + ", authority: " + authority + ", extensions: " + extensions; ++ + ", authority: " + authority + ", extension OIDs: " ++ + extensions.keySet(); + } + + /** +--- ./jdk/src/share/classes/java/util/Collections.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/Collections.java Tue Sep 09 12:00:58 2014 -0700 +@@ -3077,10 +3077,7 @@ + public void remove() { it.remove(); }}; + } + +- public boolean add(E e) { +- typeCheck(e); +- return c.add(e); +- } ++ public boolean add(E e) { return c.add(typeCheck(e)); } + + private E[] zeroLengthElementArray; // Lazily initialized + +@@ -3187,11 +3184,7 @@ + public E peek() {return queue.peek();} + public E poll() {return queue.poll();} + public E remove() {return queue.remove();} +- +- public boolean offer(E e) { +- typeCheck(e); +- return add(e); +- } ++ public boolean offer(E e) {return queue.offer(typeCheck(e));} + } + + /** +@@ -3440,13 +3433,11 @@ + public int lastIndexOf(Object o) { return list.lastIndexOf(o); } + + public E set(int index, E element) { +- typeCheck(element); +- return list.set(index, element); ++ return list.set(index, typeCheck(element)); + } + + public void add(int index, E element) { +- typeCheck(element); +- list.add(index, element); ++ list.add(index, typeCheck(element)); + } + + public boolean addAll(int index, Collection<? extends E> c) { +@@ -3467,13 +3458,11 @@ + public void remove() { i.remove(); } + + public void set(E e) { +- typeCheck(e); +- i.set(e); ++ i.set(typeCheck(e)); + } + + public void add(E e) { +- typeCheck(e); +- i.add(e); ++ i.add(typeCheck(e)); + } + + @Override +--- ./jdk/src/share/classes/java/util/ResourceBundle.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/ResourceBundle.java Tue Sep 09 12:00:58 2014 -0700 +@@ -2650,7 +2650,10 @@ + } catch (ClassNotFoundException e) { + } + } else if (format.equals("java.properties")) { +- final String resourceName = toResourceName(bundleName, "properties"); ++ final String resourceName = toResourceName0(bundleName, "properties"); ++ if (resourceName == null) { ++ return bundle; ++ } + final ClassLoader classLoader = loader; + final boolean reloadFlag = reload; + InputStream stream = null; +@@ -2804,7 +2807,10 @@ + } + boolean result = false; + try { +- String resourceName = toResourceName(toBundleName(baseName, locale), format); ++ String resourceName = toResourceName0(toBundleName(baseName, locale), format); ++ if (resourceName == null) { ++ return result; ++ } + URL url = loader.getResource(resourceName); + if (url != null) { + long lastModified = 0; +@@ -2938,6 +2944,15 @@ + sb.append(bundleName.replace('.', '/')).append('.').append(suffix); + return sb.toString(); + } ++ ++ private String toResourceName0(String bundleName, String suffix) { ++ // application protocol check ++ if (bundleName.contains("://")) { ++ return null; ++ } else { ++ return toResourceName(bundleName, suffix); ++ } ++ } + } + + private static class SingleFormatControl extends Control { +--- ./jdk/src/share/classes/java/util/logging/LogRecord.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/logging/LogRecord.java Tue Sep 09 12:00:58 2014 -0700 +@@ -513,7 +513,13 @@ + // If necessary, try to regenerate the resource bundle. + if (resourceBundleName != null) { + try { +- resourceBundle = ResourceBundle.getBundle(resourceBundleName); ++ // use system class loader to ensure the ResourceBundle ++ // instance is a different instance than null loader uses ++ final ResourceBundle bundle = ++ ResourceBundle.getBundle(resourceBundleName, ++ Locale.getDefault(), ++ ClassLoader.getSystemClassLoader()); ++ resourceBundle = bundle; + } catch (MissingResourceException ex) { + // This is not a good place to throw an exception, + // so we simply leave the resourceBundle null. +--- ./jdk/src/share/classes/java/util/logging/Logger.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/java/util/logging/Logger.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -1934,6 +1934,9 @@ + } + + setCallersClassLoaderRef(callersClass); ++ if (isSystemLogger && getCallersClassLoader() != null) { ++ checkPermission(); ++ } + if (findResourceBundle(name, true) == null) { + // We've failed to find an expected ResourceBundle. + // unset the caller's ClassLoader since we were unable to find the +@@ -2168,11 +2171,13 @@ + return trb; + } + final String rbName = isSystemLogger +- ? trb.resourceBundleName ++ // ancestor of a system logger is expected to be a system logger. ++ // ignore resource bundle name if it's not. ++ ? (target.isSystemLogger ? trb.resourceBundleName : null) + : target.getResourceBundleName(); + if (rbName != null) { + return LoggerBundle.get(rbName, +- findResourceBundle(rbName, true)); ++ findResourceBundle(rbName, true)); + } + target = isSystemLogger ? target.parent : target.getParent(); + } +--- ./jdk/src/share/classes/javax/crypto/CipherInputStream.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/javax/crypto/CipherInputStream.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -88,6 +88,8 @@ + private int ofinish = 0; + // stream status + private boolean closed = false; ++ // The stream has been read from. False if the stream has never been read. ++ private boolean read = false; + + /** + * private convenience function. +@@ -103,13 +105,15 @@ + private int getMoreData() throws IOException { + if (done) return -1; + int readin = input.read(ibuffer); ++ read = true; + if (readin == -1) { + done = true; + try { + obuffer = cipher.doFinal(); ++ } catch (IllegalBlockSizeException | BadPaddingException e) { ++ obuffer = null; ++ throw new IOException(e); + } +- catch (IllegalBlockSizeException e) {obuffer = null;} +- catch (BadPaddingException e) {obuffer = null;} + if (obuffer == null) + return -1; + else { +@@ -120,7 +124,10 @@ + } + try { + obuffer = cipher.update(ibuffer, 0, readin); +- } catch (IllegalStateException e) {obuffer = null;}; ++ } catch (IllegalStateException e) { ++ obuffer = null; ++ throw e; ++ } + ostart = 0; + if (obuffer == null) + ofinish = 0; +@@ -308,6 +315,11 @@ + } + } + catch (BadPaddingException | IllegalBlockSizeException ex) { ++ /* If no data has been read from the stream to be en/decrypted, ++ we supress any exceptions, and close quietly. */ ++ if (read) { ++ throw new IOException(ex); ++ } + } + ostart = 0; + ofinish = 0; +--- ./jdk/src/share/classes/javax/swing/JDesktopPane.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/javax/swing/JDesktopPane.java Tue Sep 09 12:00:58 2014 -0700 +@@ -43,6 +43,7 @@ + import java.beans.PropertyVetoException; + import java.util.Set; + import java.util.TreeSet; ++import java.util.LinkedHashSet; + /** + * A container used to create a multiple-document interface or a virtual desktop. + * You create <code>JInternalFrame</code> objects and add them to the +@@ -266,7 +267,7 @@ + + private static Collection<JInternalFrame> getAllFrames(Container parent) { + int i, count; +- Collection<JInternalFrame> results = new ArrayList<JInternalFrame>(); ++ Collection<JInternalFrame> results = new LinkedHashSet<>(); + count = parent.getComponentCount(); + for (i = 0; i < count; i++) { + Component next = parent.getComponent(i); +--- ./jdk/src/share/classes/sun/awt/ComponentFactory.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/ComponentFactory.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + + package sun.awt; + ++import sun.awt.datatransfer.DataTransferer; ++ + import java.awt.*; + import java.awt.dnd.*; + import java.awt.dnd.peer.DragSourceContextPeer; +@@ -93,4 +95,6 @@ + RobotPeer createRobot(Robot target, GraphicsDevice screen) + throws AWTException, HeadlessException; + ++ DataTransferer getDataTransferer(); ++ + } +--- ./jdk/src/share/classes/sun/awt/HeadlessToolkit.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/HeadlessToolkit.java Tue Sep 09 12:00:58 2014 -0700 +@@ -25,6 +25,8 @@ + + package sun.awt; + ++import sun.awt.datatransfer.DataTransferer; ++ + import java.awt.*; + import java.awt.dnd.*; + import java.awt.dnd.peer.DragSourceContextPeer; +@@ -401,6 +403,11 @@ + return null; + } + ++ @Override ++ public DataTransferer getDataTransferer() { ++ return null; ++ } ++ + @SuppressWarnings("deprecation") + public FontMetrics getFontMetrics(Font font) { + return tk.getFontMetrics(font); +--- ./jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/SunToolkit.java Tue Sep 09 12:00:58 2014 -0700 +@@ -205,8 +205,6 @@ + + public abstract boolean isTraySupported(); + +- public abstract DataTransferer getDataTransferer(); +- + @SuppressWarnings("deprecation") + public abstract FontPeer getFontPeer(String name, int style); + +--- ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -86,6 +86,7 @@ + import java.util.TreeMap; + import java.util.TreeSet; + ++import sun.awt.ComponentFactory; + import sun.util.logging.PlatformLogger; + + import sun.awt.AppContext; +@@ -272,7 +273,7 @@ + * instead, null will be returned. + */ + public static synchronized DataTransferer getInstance() { +- return ((SunToolkit) Toolkit.getDefaultToolkit()).getDataTransferer(); ++ return ((ComponentFactory) Toolkit.getDefaultToolkit()).getDataTransferer(); + } + + /** +--- ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/awt/image/BytePackedRaster.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1408,10 +1408,10 @@ + } + } + +- int lastbit = (dataBitOffset +- + (height-1) * scanlineStride * 8 +- + (width-1) * pixelBitStride +- + pixelBitStride - 1); ++ long lastbit = (long) dataBitOffset ++ + (long) (height - 1) * (long) scanlineStride * 8 ++ + (long) (width - 1) * (long) pixelBitStride ++ + (long) pixelBitStride - 1; + if (lastbit < 0 || lastbit / 8 >= data.length) { + throw new RasterFormatException("raster dimensions overflow " + + "array bounds"); +--- ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/invoke/util/VerifyAccess.java Tue Sep 09 12:00:58 2014 -0700 +@@ -102,19 +102,24 @@ + case PUBLIC: + return true; // already checked above + case PROTECTED: ++ assert !defc.isInterface(); // protected members aren't allowed in interfaces + if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 && + isSamePackage(defc, lookupClass)) + return true; + if ((allowedModes & PROTECTED) == 0) + return false; ++ // Protected members are accessible by subclasses, which does not include interfaces. ++ // Interfaces are types, not classes. They should not have access to ++ // protected members in j.l.Object, even though it is their superclass. + if ((mods & STATIC) != 0 && + !isRelatedClass(refc, lookupClass)) + return false; + if ((allowedModes & PROTECTED) != 0 && +- isSuperClass(defc, lookupClass)) ++ isSubClass(lookupClass, defc)) + return true; + return false; + case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access. ++ assert !defc.isInterface(); // package-private members aren't allowed in interfaces + return ((allowedModes & PACKAGE_ALLOWED) != 0 && + isSamePackage(defc, lookupClass)); + case PRIVATE: +@@ -129,12 +134,13 @@ + + static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) { + return (refc == lookupClass || +- refc.isAssignableFrom(lookupClass) || +- lookupClass.isAssignableFrom(refc)); ++ isSubClass(refc, lookupClass) || ++ isSubClass(lookupClass, refc)); + } + +- static boolean isSuperClass(Class<?> defc, Class<?> lookupClass) { +- return defc.isAssignableFrom(lookupClass); ++ static boolean isSubClass(Class<?> lookupClass, Class<?> defc) { ++ return defc.isAssignableFrom(lookupClass) && ++ !lookupClass.isInterface(); // interfaces are types, not classes. + } + + static int getClassModifiers(Class<?> c) { +--- ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/nio/ch/DatagramChannelImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -755,6 +755,26 @@ + + // set or refresh local address + localAddress = Net.localAddress(fd); ++ ++ // flush any packets already received. ++ boolean blocking = false; ++ synchronized (blockingLock()) { ++ try { ++ blocking = isBlocking(); ++ // remainder of each packet thrown away ++ ByteBuffer tmpBuf = ByteBuffer.allocate(1); ++ if (blocking) { ++ configureBlocking(false); ++ } ++ do { ++ tmpBuf.clear(); ++ } while (receive(tmpBuf) != null); ++ } finally { ++ if (blocking) { ++ configureBlocking(true); ++ } ++ } ++ } + } + } + } +--- ./jdk/src/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,7 +29,6 @@ + import java.lang.reflect.*; + import java.io.Serializable; + import java.util.*; +-import java.lang.annotation.*; + import java.security.AccessController; + import java.security.PrivilegedAction; + +@@ -45,6 +44,11 @@ + private final Map<String, Object> memberValues; + + AnnotationInvocationHandler(Class<? extends Annotation> type, Map<String, Object> memberValues) { ++ Class<?>[] superInterfaces = type.getInterfaces(); ++ if (!type.isAnnotation() || ++ superInterfaces.length != 1 || ++ superInterfaces[0] != java.lang.annotation.Annotation.class) ++ throw new AnnotationFormatError("Attempt to create proxy for a non-annotation type."); + this.type = type; + this.memberValues = memberValues; + } +@@ -57,13 +61,17 @@ + if (member.equals("equals") && paramTypes.length == 1 && + paramTypes[0] == Object.class) + return equalsImpl(args[0]); +- assert paramTypes.length == 0; +- if (member.equals("toString")) ++ if (paramTypes.length != 0) ++ throw new AssertionError("Too many parameters for an annotation method"); ++ ++ switch(member) { ++ case "toString": + return toStringImpl(); +- if (member.equals("hashCode")) ++ case "hashCode": + return hashCodeImpl(); +- if (member.equals("annotationType")) ++ case "annotationType": + return type; ++ } + + // Handle annotation member accessors + Object result = memberValues.get(member); +@@ -129,7 +137,7 @@ + * Implementation of dynamicProxy.toString() + */ + private String toStringImpl() { +- StringBuffer result = new StringBuffer(128); ++ StringBuilder result = new StringBuilder(128); + result.append('@'); + result.append(type.getName()); + result.append('('); +@@ -277,6 +285,7 @@ + new PrivilegedAction<Method[]>() { + public Method[] run() { + final Method[] mm = type.getDeclaredMethods(); ++ validateAnnotationMethods(mm); + AccessibleObject.setAccessible(mm, true); + return mm; + } +@@ -287,6 +296,94 @@ + private transient volatile Method[] memberMethods = null; + + /** ++ * Validates that a method is structurally appropriate for an ++ * annotation type. As of Java SE 8, annotation types cannot ++ * contain static methods and the declared methods of an ++ * annotation type must take zero arguments and there are ++ * restrictions on the return type. ++ */ ++ private void validateAnnotationMethods(Method[] memberMethods) { ++ /* ++ * Specification citations below are from JLS ++ * 9.6.1. Annotation Type Elements ++ */ ++ boolean valid = true; ++ for(Method method : memberMethods) { ++ /* ++ * "By virtue of the AnnotationTypeElementDeclaration ++ * production, a method declaration in an annotation type ++ * declaration cannot have formal parameters, type ++ * parameters, or a throws clause. ++ * ++ * "By virtue of the AnnotationTypeElementModifier ++ * production, a method declaration in an annotation type ++ * declaration cannot be default or static." ++ */ ++ if (method.getModifiers() != (Modifier.PUBLIC | Modifier.ABSTRACT) || ++ method.isDefault() || ++ method.getParameterCount() != 0 || ++ method.getExceptionTypes().length != 0) { ++ valid = false; ++ break; ++ } ++ ++ /* ++ * "It is a compile-time error if the return type of a ++ * method declared in an annotation type is not one of the ++ * following: a primitive type, String, Class, any ++ * parameterized invocation of Class, an enum type ++ * (section 8.9), an annotation type, or an array type ++ * (chapter 10) whose element type is one of the preceding ++ * types." ++ */ ++ Class<?> returnType = method.getReturnType(); ++ if (returnType.isArray()) { ++ returnType = returnType.getComponentType(); ++ if (returnType.isArray()) { // Only single dimensional arrays ++ valid = false; ++ break; ++ } ++ } ++ ++ if (!((returnType.isPrimitive() && returnType != void.class) || ++ returnType == java.lang.String.class || ++ returnType == java.lang.Class.class || ++ returnType.isEnum() || ++ returnType.isAnnotation())) { ++ valid = false; ++ break; ++ } ++ ++ /* ++ * "It is a compile-time error if any method declared in an ++ * annotation type has a signature that is ++ * override-equivalent to that of any public or protected ++ * method declared in class Object or in the interface ++ * java.lang.annotation.Annotation." ++ * ++ * The methods in Object or Annotation meeting the other ++ * criteria (no arguments, contrained return type, etc.) ++ * above are: ++ * ++ * String toString() ++ * int hashCode() ++ * Class<? extends Annotation> annotationType() ++ */ ++ String methodName = method.getName(); ++ if ((methodName.equals("toString") && returnType == java.lang.String.class) || ++ (methodName.equals("hashCode") && returnType == int.class) || ++ (methodName.equals("annotationType") && returnType == java.lang.Class.class)) { ++ valid = false; ++ break; ++ } ++ } ++ if (valid) ++ return; ++ else ++ throw new AnnotationFormatError("Malformed method on an annotation type"); ++ } ++ ++ /** + * Implementation of dynamicProxy.hashCode() + */ + private int hashCodeImpl() { +@@ -330,7 +427,6 @@ + throws java.io.IOException, ClassNotFoundException { + s.defaultReadObject(); + +- + // Check to make sure that types have not evolved incompatibly + + AnnotationType annotationType = null; +@@ -343,7 +439,6 @@ + + Map<String, Class<?>> memberTypes = annotationType.memberTypes(); + +- + // If there are annotation members without values, that + // situation is handled by the invoke method. + for (Map.Entry<String, Object> memberValue : memberValues.entrySet()) { +--- ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/provider/SecureRandom.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -29,6 +29,7 @@ + import java.security.MessageDigest; + import java.security.SecureRandomSpi; + import java.security.NoSuchAlgorithmException; ++import java.security.NoSuchProviderException; + + /** + * <p>This class provides a crytpographically strong pseudo-random number +@@ -94,9 +95,19 @@ + */ + private void init(byte[] seed) { + try { +- digest = MessageDigest.getInstance("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available.", e); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available.", exc); ++ } + } + + if (seed != null) { +@@ -265,9 +276,19 @@ + s.defaultReadObject (); + + try { +- digest = MessageDigest.getInstance("SHA"); +- } catch (NoSuchAlgorithmException e) { +- throw new InternalError("internal error: SHA-1 not available.", e); ++ /* ++ * Use the local SUN implementation to avoid native ++ * performance overhead. ++ */ ++ digest = MessageDigest.getInstance("SHA", "SUN"); ++ } catch (NoSuchProviderException | NoSuchAlgorithmException e) { ++ // Fallback to any available. ++ try { ++ digest = MessageDigest.getInstance("SHA"); ++ } catch (NoSuchAlgorithmException exc) { ++ throw new InternalError( ++ "internal error: SHA-1 not available.", exc); ++ } + } + } + } +--- ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/CipherSuite.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -968,7 +968,7 @@ + * 1. Prefer Suite B compliant cipher suites, see RFC6460 (To be + * changed later, see below). + * 2. Prefer the stronger bulk cipher, in the order of AES_256(GCM), +- * AES_128(GCM), AES_256, AES_128, RC-4, 3DES-EDE. ++ * AES_128(GCM), AES_256, AES_128, 3DES-EDE, RC-4. + * 3. Prefer the stronger MAC algorithm, in the order of SHA384, + * SHA256, SHA, MD5. + * 4. Prefer the better performance of key exchange and digital +@@ -1055,18 +1055,6 @@ + add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", + 0x0032, --p, K_DHE_DSS, B_AES_128, T); + +- // RC-4 +- add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", +- 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); +- add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", +- 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); +- add("SSL_RSA_WITH_RC4_128_SHA", +- 0x0005, --p, K_RSA, B_RC4_128, N); +- add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", +- 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); +- add("TLS_ECDH_RSA_WITH_RC4_128_SHA", +- 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); +- + // Cipher suites in GCM mode, see RFC 5288/5289. + // + // We may increase the priority of cipher suites in GCM mode when +@@ -1127,6 +1115,17 @@ + add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", + 0x0013, --p, K_DHE_DSS, B_3DES, N); + ++ // RC-4 ++ add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", ++ 0xC007, --p, K_ECDHE_ECDSA, B_RC4_128, N); ++ add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", ++ 0xC011, --p, K_ECDHE_RSA, B_RC4_128, N); ++ add("SSL_RSA_WITH_RC4_128_SHA", ++ 0x0005, --p, K_RSA, B_RC4_128, N); ++ add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", ++ 0xC002, --p, K_ECDH_ECDSA, B_RC4_128, N); ++ add("TLS_ECDH_RSA_WITH_RC4_128_SHA", ++ 0xC00C, --p, K_ECDH_RSA, B_RC4_128, N); + add("SSL_RSA_WITH_RC4_128_MD5", + 0x0004, --p, K_RSA, B_RC4_128, N); + +@@ -1146,7 +1145,7 @@ + * 2. If a cipher suite has been obsoleted, we put it at the end of + * the list. + * 3. Prefer the stronger bulk cipher, in the order of AES_256, +- * AES_128, RC-4, 3DES-EDE, DES, RC4_40, DES40, NULL. ++ * AES_128, 3DES-EDE, RC-4, DES, DES40, RC4_40, NULL. + * 4. Prefer the stronger MAC algorithm, in the order of SHA384, + * SHA256, SHA, MD5. + * 5. Prefer the better performance of key exchange and digital +@@ -1174,15 +1173,40 @@ + add("TLS_DH_anon_WITH_AES_128_CBC_SHA", + 0x0034, --p, K_DH_ANON, B_AES_128, N); + ++ add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0xC017, --p, K_ECDH_ANON, B_3DES, N); ++ add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ 0x001b, --p, K_DH_ANON, B_3DES, N); ++ + add("TLS_ECDH_anon_WITH_RC4_128_SHA", + 0xC016, --p, K_ECDH_ANON, B_RC4_128, N); + add("SSL_DH_anon_WITH_RC4_128_MD5", + 0x0018, --p, K_DH_ANON, B_RC4_128, N); + +- add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- 0xC017, --p, K_ECDH_ANON, B_3DES, N); +- add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", +- 0x001b, --p, K_DH_ANON, B_3DES, N); ++ // weak cipher suites obsoleted in TLS 1.2 ++ add("SSL_RSA_WITH_DES_CBC_SHA", ++ 0x0009, --p, K_RSA, B_DES, N, tls12); ++ add("SSL_DHE_RSA_WITH_DES_CBC_SHA", ++ 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); ++ add("SSL_DHE_DSS_WITH_DES_CBC_SHA", ++ 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); ++ add("SSL_DH_anon_WITH_DES_CBC_SHA", ++ 0x001a, --p, K_DH_ANON, B_DES, N, tls12); ++ ++ // weak cipher suites obsoleted in TLS 1.1 ++ add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); ++ add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); ++ add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", ++ 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); ++ ++ add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); ++ add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", ++ 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); + + add("TLS_RSA_WITH_NULL_SHA256", + 0x003b, --p, K_RSA, B_NULL, N, max, tls12, P_SHA256); +@@ -1201,52 +1225,27 @@ + add("SSL_RSA_WITH_NULL_MD5", + 0x0001, --p, K_RSA, B_NULL, N); + +- // weak cipher suites obsoleted in TLS 1.2 +- add("SSL_RSA_WITH_DES_CBC_SHA", +- 0x0009, --p, K_RSA, B_DES, N, tls12); +- add("SSL_DHE_RSA_WITH_DES_CBC_SHA", +- 0x0015, --p, K_DHE_RSA, B_DES, N, tls12); +- add("SSL_DHE_DSS_WITH_DES_CBC_SHA", +- 0x0012, --p, K_DHE_DSS, B_DES, N, tls12); +- add("SSL_DH_anon_WITH_DES_CBC_SHA", +- 0x001a, --p, K_DH_ANON, B_DES, N, tls12); +- +- // weak cipher suites obsoleted in TLS 1.1 +- add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", +- 0x0003, --p, K_RSA_EXPORT, B_RC4_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", +- 0x0017, --p, K_DH_ANON, B_RC4_40, N, tls11); +- +- add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0008, --p, K_RSA_EXPORT, B_DES_40, N, tls11); +- add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", +- 0x0014, --p, K_DHE_RSA, B_DES_40, N, tls11); +- add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", +- 0x0011, --p, K_DHE_DSS, B_DES_40, N, tls11); +- add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", +- 0x0019, --p, K_DH_ANON, B_DES_40, N, tls11); +- + // Supported Kerberos ciphersuites from RFC2712 ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ 0x001f, --p, K_KRB5, B_3DES, N); ++ add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", ++ 0x0023, --p, K_KRB5, B_3DES, N); + add("TLS_KRB5_WITH_RC4_128_SHA", + 0x0020, --p, K_KRB5, B_RC4_128, N); + add("TLS_KRB5_WITH_RC4_128_MD5", + 0x0024, --p, K_KRB5, B_RC4_128, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- 0x001f, --p, K_KRB5, B_3DES, N); +- add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", +- 0x0023, --p, K_KRB5, B_3DES, N); + add("TLS_KRB5_WITH_DES_CBC_SHA", + 0x001e, --p, K_KRB5, B_DES, N, tls12); + add("TLS_KRB5_WITH_DES_CBC_MD5", + 0x0022, --p, K_KRB5, B_DES, N, tls12); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); ++ add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", ++ 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", + 0x0028, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); + add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", + 0x002b, --p, K_KRB5_EXPORT, B_RC4_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- 0x0026, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); +- add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", +- 0x0029, --p, K_KRB5_EXPORT, B_DES_40, N, tls11); + + /* + * Other values from the TLS Cipher Suite Registry, as of August 2010. +--- ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/ClientHandshaker.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -36,6 +36,8 @@ + + import java.security.cert.X509Certificate; + import java.security.cert.CertificateException; ++import java.security.cert.CertificateParsingException; ++import javax.security.auth.x500.X500Principal; + + import javax.crypto.SecretKey; + import javax.crypto.spec.SecretKeySpec; +@@ -89,12 +91,66 @@ + private final static boolean enableSNIExtension = + Debug.getBooleanProperty("jsse.enableSNIExtension", true); + ++ /* ++ * Allow unsafe server certificate change? ++ * ++ * Server certificate change during SSL/TLS renegotiation may be considered ++ * unsafe, as described in the Triple Handshake attacks: ++ * ++ * https://secure-resumption.com/tlsauth.pdf ++ * ++ * Endpoint identification (See ++ * SSLParameters.getEndpointIdentificationAlgorithm()) is a pretty nice ++ * guarantee that the server certificate change in renegotiation is legal. ++ * However, endpoing identification is only enabled for HTTPS and LDAP ++ * over SSL/TLS by default. It is not enough to protect SSL/TLS ++ * connections other than HTTPS and LDAP. ++ * ++ * The renegotiation indication extension (See RFC 5764) is a pretty ++ * strong guarantee that the endpoints on both client and server sides ++ * are identical on the same connection. However, the Triple Handshake ++ * attacks can bypass this guarantee if there is a session-resumption ++ * handshake between the initial full handshake and the renegotiation ++ * full handshake. ++ * ++ * Server certificate change may be unsafe and should be restricted if ++ * endpoint identification is not enabled and the previous handshake is ++ * a session-resumption abbreviated initial handshake, unless the ++ * identities represented by both certificates can be regraded as the ++ * same (See isIdentityEquivalent()). ++ * ++ * Considering the compatibility impact and the actual requirements to ++ * support server certificate change in practice, the system property, ++ * jdk.tls.allowUnsafeServerCertChange, is used to define whether unsafe ++ * server certificate change in renegotiation is allowed or not. The ++ * default value of the system property is "false". To mitigate the ++ * compactibility impact, applications may want to set the system ++ * property to "true" at their own risk. ++ * ++ * If the value of the system property is "false", server certificate ++ * change in renegotiation after a session-resumption abbreviated initial ++ * handshake is restricted (See isIdentityEquivalent()). ++ * ++ * If the system property is set to "true" explicitly, the restriction on ++ * server certificate change in renegotiation is disabled. ++ */ ++ private final static boolean allowUnsafeServerCertChange = ++ Debug.getBooleanProperty("jdk.tls.allowUnsafeServerCertChange", false); ++ + private List<SNIServerName> requestedServerNames = + Collections.<SNIServerName>emptyList(); + + private boolean serverNamesAccepted = false; + + /* ++ * the reserved server certificate chain in previous handshaking ++ * ++ * The server certificate chain is only reserved if the previous ++ * handshake is a session-resumption abbreviated initial handshake. ++ */ ++ private X509Certificate[] reservedServerCerts = null; ++ ++ /* + * Constructors + */ + ClientHandshaker(SSLSocketImpl socket, SSLContextImpl context, +@@ -555,14 +611,19 @@ + // we wanted to resume, but the server refused + session = null; + if (!enableNewSession) { +- throw new SSLException +- ("New session creation is disabled"); ++ throw new SSLException("New session creation is disabled"); + } + } + } + + if (resumingSession && session != null) { + setHandshakeSessionSE(session); ++ // Reserve the handshake state if this is a session-resumption ++ // abbreviated initial handshake. ++ if (isInitialHandshake) { ++ session.setAsSessionResumption(true); ++ } ++ + return; + } + +@@ -1064,6 +1125,13 @@ + } + + /* ++ * Reset the handshake state if this is not an initial handshake. ++ */ ++ if (!isInitialHandshake) { ++ session.setAsSessionResumption(false); ++ } ++ ++ /* + * OK, it verified. If we're doing the fast handshake, add that + * "Finished" message to the hash of handshake messages, then send + * our own change_cipher_spec and Finished message for the server +@@ -1161,8 +1229,23 @@ + System.out.println("%% No cached client session"); + } + } +- if ((session != null) && (session.isRejoinable() == false)) { +- session = null; ++ if (session != null) { ++ // If unsafe server certificate change is not allowed, reserve ++ // current server certificates if the previous handshake is a ++ // session-resumption abbreviated initial handshake. ++ if (!allowUnsafeServerCertChange && session.isSessionResumption()) { ++ try { ++ // If existing, peer certificate chain cannot be null. ++ reservedServerCerts = ++ (X509Certificate[])session.getPeerCertificates(); ++ } catch (SSLPeerUnverifiedException puve) { ++ // Maybe not certificate-based, ignore the exception. ++ } ++ } ++ ++ if (!session.isRejoinable()) { ++ session = null; ++ } + } + + if (session != null) { +@@ -1331,9 +1414,28 @@ + } + X509Certificate[] peerCerts = mesg.getCertificateChain(); + if (peerCerts.length == 0) { +- fatalSE(Alerts.alert_bad_certificate, +- "empty certificate chain"); ++ fatalSE(Alerts.alert_bad_certificate, "empty certificate chain"); + } ++ ++ // Allow server certificate change in client side during renegotiation ++ // after a session-resumption abbreviated initial handshake? ++ // ++ // DO NOT need to check allowUnsafeServerCertChange here. We only ++ // reserve server certificates when allowUnsafeServerCertChange is ++ // flase. ++ if (reservedServerCerts != null) { ++ // It is not necessary to check the certificate update if endpoint ++ // identification is enabled. ++ String identityAlg = getEndpointIdentificationAlgorithmSE(); ++ if ((identityAlg == null || identityAlg.length() == 0) && ++ !isIdentityEquivalent(peerCerts[0], reservedServerCerts[0])) { ++ ++ fatalSE(Alerts.alert_bad_certificate, ++ "server certificate change is restricted " + ++ "during renegotiation"); ++ } ++ } ++ + // ask the trust manager to verify the chain + X509TrustManager tm = sslContext.getX509TrustManager(); + try { +@@ -1370,4 +1472,81 @@ + } + session.setPeerCertificates(peerCerts); + } ++ ++ /* ++ * Whether the certificates can represent the same identity? ++ * ++ * The certificates can be used to represent the same identity: ++ * 1. If the subject alternative names of IP address are present in ++ * both certificates, they should be identical; otherwise, ++ * 2. if the subject alternative names of DNS name are present in ++ * both certificates, they should be identical; otherwise, ++ * 3. if the subject fields are present in both certificates, the ++ * certificate subjects and issuers should be identical. ++ */ ++ private static boolean isIdentityEquivalent(X509Certificate thisCert, ++ X509Certificate prevCert) { ++ if (thisCert.equals(prevCert)) { ++ return true; ++ } ++ ++ // check the iPAddress field in subjectAltName extension ++ Object thisIPAddress = getSubjectAltName(thisCert, 7); // 7: iPAddress ++ Object prevIPAddress = getSubjectAltName(prevCert, 7); ++ if (thisIPAddress != null && prevIPAddress!= null) { ++ // only allow the exactly match ++ return Objects.equals(thisIPAddress, prevIPAddress); ++ } ++ ++ // check the dNSName field in subjectAltName extension ++ Object thisDNSName = getSubjectAltName(thisCert, 2); // 2: dNSName ++ Object prevDNSName = getSubjectAltName(prevCert, 2); ++ if (thisDNSName != null && prevDNSName!= null) { ++ // only allow the exactly match ++ return Objects.equals(thisDNSName, prevDNSName); ++ } ++ ++ // check the certificate subject and issuer ++ X500Principal thisSubject = thisCert.getSubjectX500Principal(); ++ X500Principal prevSubject = prevCert.getSubjectX500Principal(); ++ X500Principal thisIssuer = thisCert.getIssuerX500Principal(); ++ X500Principal prevIssuer = prevCert.getIssuerX500Principal(); ++ if (!thisSubject.getName().isEmpty() && ++ !prevSubject.getName().isEmpty() && ++ thisSubject.equals(prevSubject) && ++ thisIssuer.equals(prevIssuer)) { ++ return true; ++ } ++ ++ return false; ++ } ++ ++ /* ++ * Returns the subject alternative name of the specified type in the ++ * subjectAltNames extension of a certificate. ++ */ ++ private static Object getSubjectAltName(X509Certificate cert, int type) { ++ Collection<List<?>> subjectAltNames; ++ ++ try { ++ subjectAltNames = cert.getSubjectAlternativeNames(); ++ } catch (CertificateParsingException cpe) { ++ if (debug != null && Debug.isOn("handshake")) { ++ System.out.println( ++ "Attempt to obtain subjectAltNames extension failed!"); ++ } ++ return null; ++ } ++ ++ if (subjectAltNames != null) { ++ for (List<?> subjectAltName : subjectAltNames) { ++ int subjectAltNameType = (Integer)subjectAltName.get(0); ++ if (subjectAltNameType == type) { ++ return subjectAltName.get(1); ++ } ++ } ++ } ++ ++ return null; ++ } + } +--- ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/Handshaker.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -359,6 +359,17 @@ + } + } + ++ String getEndpointIdentificationAlgorithmSE() { ++ SSLParameters paras; ++ if (conn != null) { ++ paras = conn.getSSLParameters(); ++ } else { ++ paras = engine.getSSLParameters(); ++ } ++ ++ return paras.getEndpointIdentificationAlgorithm(); ++ } ++ + private void setVersionSE(ProtocolVersion protocolVersion) { + if (conn != null) { + conn.setVersion(protocolVersion); +--- ./jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -115,6 +115,14 @@ + private Principal localPrincipal; + + /* ++ * Is the session currently re-established with a session-resumption ++ * abbreviated initial handshake? ++ * ++ * Note that currently we only set this variable in client side. ++ */ ++ private boolean isSessionResumption = false; ++ ++ /* + * We count session creations, eventually for statistical data but + * also since counters make shorter debugging IDs than the big ones + * we use in the protocol for uniqueness-over-time. +@@ -325,6 +333,22 @@ + } + + /** ++ * Return true if the session is currently re-established with a ++ * session-resumption abbreviated initial handshake. ++ */ ++ boolean isSessionResumption() { ++ return isSessionResumption; ++ } ++ ++ /** ++ * Resets whether the session is re-established with a session-resumption ++ * abbreviated initial handshake. ++ */ ++ void setAsSessionResumption(boolean flag) { ++ isSessionResumption = flag; ++ } ++ ++ /** + * Returns the name of the cipher suite in use on this session + */ + @Override +--- ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Tue Sep 09 12:00:58 2014 -0700 +@@ -103,7 +103,7 @@ + HELP_ABOUT_DIALOG_JAVA_VERSION=Java VM\u30D0\u30FC\u30B8\u30E7\u30F3:<br>{0} + HELP_ABOUT_DIALOG_MASTHEAD_ACCESSIBLE_NAME=\u30DE\u30B9\u30C8\u30D8\u30C3\u30C9\u56F3\u5F62 + HELP_ABOUT_DIALOG_MASTHEAD_TITLE=JConsole\u306B\u3064\u3044\u3066 +-HELP_ABOUT_DIALOG_TITLE=JConsole: \u8A73\u7D30 ++HELP_ABOUT_DIALOG_TITLE=JConsole: \u60C5\u5831 + HELP_ABOUT_DIALOG_USER_GUIDE_LINK_URL=http://docs.oracle.com/javase/{0}/docs/technotes/guides/management/jconsole.html + HELP_MENU_ABOUT_TITLE=JConsole\u306B\u3064\u3044\u3066(&A) + HELP_MENU_USER_GUIDE_TITLE=\u30AA\u30F3\u30E9\u30A4\u30F3\u30FB\u30E6\u30FC\u30B6\u30FC\u30FB\u30AC\u30A4\u30C9(&U) +--- ./jdk/src/share/classes/sun/util/locale/BaseLocale.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/util/locale/BaseLocale.java Tue Sep 09 12:00:58 2014 -0700 +@@ -31,6 +31,7 @@ + */ + + package sun.util.locale; ++import java.lang.ref.SoftReference; + + + public final class BaseLocale { +@@ -163,11 +164,11 @@ + return h; + } + +- private static final class Key implements Comparable<Key> { +- private final String lang; +- private final String scrt; +- private final String regn; +- private final String vart; ++ private static final class Key { ++ private final SoftReference<String> lang; ++ private final SoftReference<String> scrt; ++ private final SoftReference<String> regn; ++ private final SoftReference<String> vart; + private final boolean normalized; + private final int hash; + +@@ -179,10 +180,10 @@ + assert language.intern() == language + && region.intern() == region; + +- lang = language; +- scrt = ""; +- regn = region; +- vart = ""; ++ lang = new SoftReference(language); ++ scrt = new SoftReference(""); ++ regn = new SoftReference(region); ++ vart = new SoftReference(""); + this.normalized = true; + + int h = language.hashCode(); +@@ -203,40 +204,40 @@ + String variant, boolean normalized) { + int h = 0; + if (language != null) { +- lang = language; ++ lang = new SoftReference(language); + int len = language.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(language.charAt(i)); + } + } else { +- lang = ""; ++ lang = new SoftReference(""); + } + if (script != null) { +- scrt = script; ++ scrt = new SoftReference(script); + int len = script.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(script.charAt(i)); + } + } else { +- scrt = ""; ++ scrt = new SoftReference(""); + } + if (region != null) { +- regn = region; ++ regn = new SoftReference(region); + int len = region.length(); + for (int i = 0; i < len; i++) { + h = 31*h + LocaleUtils.toLower(region.charAt(i)); + } + } else { +- regn = ""; ++ regn = new SoftReference(""); + } + if (variant != null) { +- vart = variant; ++ vart = new SoftReference(variant); + int len = variant.length(); + for (int i = 0; i < len; i++) { + h = 31*h + variant.charAt(i); + } + } else { +- vart = ""; ++ vart = new SoftReference(""); + } + hash = h; + this.normalized = normalized; +@@ -244,28 +245,31 @@ + + @Override + public boolean equals(Object obj) { +- return (this == obj) || +- (obj instanceof Key) +- && this.hash == ((Key)obj).hash +- && LocaleUtils.caseIgnoreMatch(((Key)obj).lang, this.lang) +- && LocaleUtils.caseIgnoreMatch(((Key)obj).scrt, this.scrt) +- && LocaleUtils.caseIgnoreMatch(((Key)obj).regn, this.regn) +- && ((Key)obj).vart.equals(vart); // variant is case sensitive in JDK! ++ if (this == obj) { ++ return true; + } + +- @Override +- public int compareTo(Key other) { +- int res = LocaleUtils.caseIgnoreCompare(this.lang, other.lang); +- if (res == 0) { +- res = LocaleUtils.caseIgnoreCompare(this.scrt, other.scrt); +- if (res == 0) { +- res = LocaleUtils.caseIgnoreCompare(this.regn, other.regn); +- if (res == 0) { +- res = this.vart.compareTo(other.vart); ++ if (obj instanceof Key && this.hash == ((Key)obj).hash) { ++ String tl = this.lang.get(); ++ String ol = ((Key)obj).lang.get(); ++ if (tl != null && ol != null && ++ LocaleUtils.caseIgnoreMatch(ol, tl)) { ++ String ts = this.scrt.get(); ++ String os = ((Key)obj).scrt.get(); ++ if (ts != null && os != null && ++ LocaleUtils.caseIgnoreMatch(os, ts)) { ++ String tr = this.regn.get(); ++ String or = ((Key)obj).regn.get(); ++ if (tr != null && or != null && ++ LocaleUtils.caseIgnoreMatch(or, tr)) { ++ String tv = this.vart.get(); ++ String ov = ((Key)obj).vart.get(); ++ return (ov != null && ov.equals(tv)); + } + } + } +- return res; ++ } ++ return false; + } + + @Override +@@ -278,10 +282,10 @@ + return key; + } + +- String lang = LocaleUtils.toLowerString(key.lang).intern(); +- String scrt = LocaleUtils.toTitleString(key.scrt).intern(); +- String regn = LocaleUtils.toUpperString(key.regn).intern(); +- String vart = key.vart.intern(); // preserve upper/lower cases ++ String lang = LocaleUtils.toLowerString(key.lang.get()).intern(); ++ String scrt = LocaleUtils.toTitleString(key.scrt.get()).intern(); ++ String regn = LocaleUtils.toUpperString(key.regn.get()).intern(); ++ String vart = key.vart.get().intern(); // preserve upper/lower cases + + return new Key(lang, scrt, regn, vart, true); + } +@@ -294,12 +298,18 @@ + + @Override + protected Key normalizeKey(Key key) { ++ assert key.lang.get() != null && ++ key.scrt.get() != null && ++ key.regn.get() != null && ++ key.vart.get() != null; ++ + return Key.normalize(key); + } + + @Override + protected BaseLocale createObject(Key key) { +- return new BaseLocale(key.lang, key.scrt, key.regn, key.vart); ++ return new BaseLocale(key.lang.get(), key.scrt.get(), ++ key.regn.get(), key.vart.get()); + } + } + } +--- ./jdk/src/share/classes/sun/util/locale/LocaleObjectCache.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/classes/sun/util/locale/LocaleObjectCache.java Tue Sep 09 12:00:58 2014 -0700 +@@ -57,8 +57,10 @@ + value = entry.get(); + } + if (value == null) { ++ V newVal = createObject(key); ++ // make sure key is normalized *after* the object creation ++ // so that newVal is assured to be created from a valid key. + key = normalizeKey(key); +- V newVal = createObject(key); + if (key == null || newVal == null) { + // subclass must return non-null key/value object + return null; +--- ./jdk/src/share/javavm/export/jvm.h Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/javavm/export/jvm.h Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -386,6 +386,19 @@ + JVM_FindClassFromBootLoader(JNIEnv *env, const char *name); + + /* ++ * Find a class from a given class loader. Throws ClassNotFoundException. ++ * name: name of class ++ * init: whether initialization is done ++ * loader: class loader to look up the class. This may not be the same as the caller's ++ * class loader. ++ * caller: initiating class. The initiating class may be null when a security ++ * manager is not installed. ++ */ ++JNIEXPORT jclass JNICALL ++JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init, ++ jobject loader, jclass caller); ++ ++/* + * Find a class from a given class loader. Throw ClassNotFoundException + * or NoClassDefFoundError depending on the value of the last + * argument. +--- ./jdk/src/share/native/java/lang/Class.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/lang/Class.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1994, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -97,7 +97,7 @@ + + JNIEXPORT jclass JNICALL + Java_java_lang_Class_forName0(JNIEnv *env, jclass this, jstring classname, +- jboolean initialize, jobject loader) ++ jboolean initialize, jobject loader, jclass caller) + { + char *clname; + jclass cls = 0; +@@ -135,8 +135,7 @@ + goto done; + } + +- cls = JVM_FindClassFromClassLoader(env, clname, initialize, +- loader, JNI_FALSE); ++ cls = JVM_FindClassFromCaller(env, clname, initialize, loader, caller); + + done: + if (clname != buf) { +--- ./jdk/src/share/native/java/util/zip/CRC32.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/CRC32.c Tue Sep 09 12:00:58 2014 -0700 +@@ -54,7 +54,8 @@ + return crc; + } + +-JNIEXPORT jint ZIP_CRC32(jint crc, const jbyte *buf, jint len) ++JNIEXPORT jint JNICALL ++ZIP_CRC32(jint crc, const jbyte *buf, jint len) + { + return crc32(crc, (Bytef*)buf, len); + } +--- ./jdk/src/share/native/java/util/zip/ZipFile.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/ZipFile.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -172,11 +172,7 @@ + } + (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path); + path[ulen] = '\0'; +- if (addSlash == JNI_FALSE) { +- ze = ZIP_GetEntry(zip, path, 0); +- } else { +- ze = ZIP_GetEntry(zip, path, (jint)ulen); +- } ++ ze = ZIP_GetEntry2(zip, path, (jint)ulen, addSlash); + if (path != buf) { + free(path); + } +@@ -269,7 +265,7 @@ + switch (type) { + case java_util_zip_ZipFile_JZENTRY_NAME: + if (ze->name != 0) { +- len = (int)strlen(ze->name); ++ len = (int)ze->nlen; + if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL) + break; + (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte *)ze->name); +--- ./jdk/src/share/native/java/util/zip/zip_util.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/zip_util.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1021,6 +1021,7 @@ + if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch; + memcpy(ze->name, cen + CENHDR, nlen); + ze->name[nlen] = '\0'; ++ ze->nlen = nlen; + if (elen > 0) { + char *extra = cen + CENHDR + nlen; + +@@ -1118,7 +1119,34 @@ + jzentry * + ZIP_GetEntry(jzfile *zip, char *name, jint ulen) + { +- unsigned int hsh = hash(name); ++ if (ulen == 0) { ++ return ZIP_GetEntry2(zip, name, strlen(name), JNI_FALSE); ++ } ++ return ZIP_GetEntry2(zip, name, ulen, JNI_TRUE); ++} ++ ++jboolean equals(char* name1, int len1, char* name2, int len2) { ++ if (len1 != len2) { ++ return JNI_FALSE; ++ } ++ while (len1-- > 0) { ++ if (*name1++ != *name2++) { ++ return JNI_FALSE; ++ } ++ } ++ return JNI_TRUE; ++} ++ ++/* ++ * Returns the zip entry corresponding to the specified name, or ++ * NULL if not found. ++ * This method supports embedded null character in "name", use ulen ++ * for the length of "name". ++ */ ++jzentry * ++ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash) ++{ ++ unsigned int hsh = hashN(name, ulen); + jint idx; + jzentry *ze = 0; + +@@ -1139,7 +1167,7 @@ + + /* Check the cached entry first */ + ze = zip->cache; +- if (ze && strcmp(ze->name,name) == 0) { ++ if (ze && equals(ze->name, ze->nlen, name, ulen)) { + /* Cache hit! Remove and return the cached entry. */ + zip->cache = 0; + ZIP_Unlock(zip); +@@ -1165,7 +1193,7 @@ + * we keep searching. + */ + ze = newEntry(zip, zc, ACCESS_RANDOM); +- if (ze && strcmp(ze->name, name)==0) { ++ if (ze && equals(ze->name, ze->nlen, name, ulen)) { + break; + } + if (ze != 0) { +@@ -1184,8 +1212,8 @@ + break; + } + +- /* If no real length was passed in, we are done */ +- if (ulen == 0) { ++ /* If no need to try appending slash, we are done */ ++ if (!addSlash) { + break; + } + +@@ -1195,11 +1223,11 @@ + } + + /* Add slash and try once more */ +- name[ulen] = '/'; +- name[ulen+1] = '\0'; ++ name[ulen++] = '/'; ++ name[ulen] = '\0'; + hsh = hash_append(hsh, '/'); + idx = zip->table[hsh % zip->tablelen]; +- ulen = 0; ++ addSlash = JNI_FALSE; + } + + Finally: +--- ./jdk/src/share/native/java/util/zip/zip_util.h Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/java/util/zip/zip_util.h Tue Sep 09 12:00:58 2014 -0700 +@@ -154,6 +154,7 @@ + * - If pos <= 0 then it is the position of entry LOC header. + * If pos > 0 then it is the position of entry data. + * pos should not be accessed directly, but only by ZIP_GetEntryDataOffset. ++ * - entry name may include embedded null character, use nlen for length + */ + + typedef struct jzentry { /* Zip file entry */ +@@ -166,6 +167,7 @@ + jbyte *extra; /* optional extra data */ + jlong pos; /* position of LOC header or entry data */ + jint flag; /* general purpose flag */ ++ jint nlen; /* length of the entry name */ + } jzentry; + + /* +@@ -269,5 +271,5 @@ + jint ZIP_Read(jzfile *zip, jzentry *entry, jlong pos, void *buf, jint len); + void ZIP_FreeEntry(jzfile *zip, jzentry *ze); + jlong ZIP_GetEntryDataOffset(jzfile *zip, jzentry *entry); +- ++jzentry * ZIP_GetEntry2(jzfile *zip, char *name, jint ulen, jboolean addSlash); + #endif /* !_ZIP_H_ */ +--- ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/share/native/sun/font/layout/ContextualSubstSubtables.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -243,12 +243,22 @@ + le_uint16 srSetCount = SWAPW(subRuleSetCount); + + if (coverageIndex < srSetCount) { ++ LEReferenceToArrayOf<Offset> subRuleSetTableOffsetArrayRef(base, success, ++ &subRuleSetTableOffsetArray[coverageIndex], 1); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + Offset subRuleSetTableOffset = SWAPW(subRuleSetTableOffsetArray[coverageIndex]); + LEReferenceTo<SubRuleSetTable> + subRuleSetTable(base, success, (const SubRuleSetTable *) ((char *) this + subRuleSetTableOffset)); + le_uint16 subRuleCount = SWAPW(subRuleSetTable->subRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + ++ LEReferenceToArrayOf<Offset> subRuleTableOffsetArrayRef(base, success, ++ subRuleSetTable->subRuleTableOffsetArray, subRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 subRule = 0; subRule < subRuleCount; subRule += 1) { + Offset subRuleTableOffset = + SWAPW(subRuleSetTable->subRuleTableOffsetArray[subRule]); +@@ -301,13 +311,22 @@ + glyphIterator->getCurrGlyphID(), + success); + +- if (setClass < scSetCount && subClassSetTableOffsetArray[setClass] != 0) { ++ if (setClass < scSetCount) { ++ LEReferenceToArrayOf<Offset> ++ subClassSetTableOffsetArrayRef(base, success, subClassSetTableOffsetArray, setClass); ++ if (LE_FAILURE(success)) { return 0; } ++ if (subClassSetTableOffsetArray[setClass] != 0) { ++ + Offset subClassSetTableOffset = SWAPW(subClassSetTableOffsetArray[setClass]); + LEReferenceTo<SubClassSetTable> + subClassSetTable(base, success, (const SubClassSetTable *) ((char *) this + subClassSetTableOffset)); + le_uint16 subClassRuleCount = SWAPW(subClassSetTable->subClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); +- ++ LEReferenceToArrayOf<Offset> ++ subClassRuleTableOffsetArrayRef(base, success, subClassSetTable->subClassRuleTableOffsetArray, subClassRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 scRule = 0; scRule < subClassRuleCount; scRule += 1) { + Offset subClassRuleTableOffset = + SWAPW(subClassSetTable->subClassRuleTableOffsetArray[scRule]); +@@ -331,6 +350,7 @@ + glyphIterator->setCurrStreamPosition(position); + } + } ++ } + + // XXX If we get here, the table is mal-formed... + } +@@ -442,13 +462,22 @@ + le_uint16 srSetCount = SWAPW(chainSubRuleSetCount); + + if (coverageIndex < srSetCount) { ++ LEReferenceToArrayOf<Offset> ++ chainSubRuleSetTableOffsetArrayRef(base, success, chainSubRuleSetTableOffsetArray, coverageIndex); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + Offset chainSubRuleSetTableOffset = SWAPW(chainSubRuleSetTableOffsetArray[coverageIndex]); + LEReferenceTo<ChainSubRuleSetTable> + chainSubRuleSetTable(base, success, (const ChainSubRuleSetTable *) ((char *) this + chainSubRuleSetTableOffset)); + le_uint16 chainSubRuleCount = SWAPW(chainSubRuleSetTable->chainSubRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); +- ++ LEReferenceToArrayOf<Offset> ++ chainSubRuleTableOffsetArrayRef(base, success, chainSubRuleSetTable->chainSubRuleTableOffsetArray, chainSubRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 subRule = 0; subRule < chainSubRuleCount; subRule += 1) { + Offset chainSubRuleTableOffset = + SWAPW(chainSubRuleSetTable->chainSubRuleTableOffsetArray[subRule]); +@@ -530,6 +559,11 @@ + le_int32 setClass = inputClassDefinitionTable->getGlyphClass(inputClassDefinitionTable, + glyphIterator->getCurrGlyphID(), + success); ++ LEReferenceToArrayOf<Offset> ++ chainSubClassSetTableOffsetArrayRef(base, success, chainSubClassSetTableOffsetArray, setClass); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + + if (setClass < scSetCount && chainSubClassSetTableOffsetArray[setClass] != 0) { + Offset chainSubClassSetTableOffset = SWAPW(chainSubClassSetTableOffsetArray[setClass]); +@@ -538,7 +572,11 @@ + le_uint16 chainSubClassRuleCount = SWAPW(chainSubClassSetTable->chainSubClassRuleCount); + le_int32 position = glyphIterator->getCurrStreamPosition(); + GlyphIterator tempIterator(*glyphIterator, emptyFeatureList); +- ++ LEReferenceToArrayOf<Offset> ++ chainSubClassRuleTableOffsetArrayRef(base, success, chainSubClassSetTable->chainSubClassRuleTableOffsetArray, chainSubClassRuleCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + for (le_uint16 scRule = 0; scRule < chainSubClassRuleCount; scRule += 1) { + Offset chainSubClassRuleTableOffset = + SWAPW(chainSubClassSetTable->chainSubClassRuleTableOffsetArray[scRule]); +@@ -603,12 +641,14 @@ + } + + le_uint16 backtrkGlyphCount = SWAPW(backtrackGlyphCount); ++ LEReferenceToArrayOf<Offset> backtrackGlyphArrayRef(base, success, backtrackCoverageTableOffsetArray, backtrkGlyphCount); ++ if (LE_FAILURE(success)) { ++ return 0; ++ } + le_uint16 inputGlyphCount = (le_uint16) SWAPW(backtrackCoverageTableOffsetArray[backtrkGlyphCount]); + LEReferenceToArrayOf<Offset> inputCoverageTableOffsetArray(base, success, &backtrackCoverageTableOffsetArray[backtrkGlyphCount + 1], inputGlyphCount+2); // offset + if (LE_FAILURE(success)) { return 0; } + const le_uint16 lookaheadGlyphCount = (le_uint16) SWAPW(inputCoverageTableOffsetArray[inputGlyphCount]); +- +- if( LE_FAILURE(success)) { return 0; } + LEReferenceToArrayOf<Offset> lookaheadCoverageTableOffsetArray(base, success, inputCoverageTableOffsetArray.getAlias(inputGlyphCount + 1, success), lookaheadGlyphCount+2); + + if( LE_FAILURE(success) ) { return 0; } +--- ./jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/awt/X11/XTextAreaPeer.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1024,7 +1024,8 @@ + } + } + +- protected void uninstallListeners(JScrollPane scrollPane) { ++ @Override ++ protected void uninstallListeners(JComponent scrollPane) { + super.uninstallListeners(scrollPane); + scrollPane.removePropertyChangeListener(propertyChangeHandler); + } +--- ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/print/CUPSPrinter.java Tue Sep 09 12:00:58 2014 -0700 +@@ -126,7 +126,7 @@ + /** + * Returns array of MediaSizeNames derived from PPD. + */ +- public MediaSizeName[] getMediaSizeNames() { ++ MediaSizeName[] getMediaSizeNames() { + initMedia(); + return cupsMediaSNames; + } +@@ -135,7 +135,7 @@ + /** + * Returns array of Custom MediaSizeNames derived from PPD. + */ +- public CustomMediaSizeName[] getCustomMediaSizeNames() { ++ CustomMediaSizeName[] getCustomMediaSizeNames() { + initMedia(); + return cupsCustomMediaSNames; + } +@@ -144,7 +144,7 @@ + /** + * Returns array of MediaPrintableArea derived from PPD. + */ +- public MediaPrintableArea[] getMediaPrintableArea() { ++ MediaPrintableArea[] getMediaPrintableArea() { + initMedia(); + return cupsMediaPrintables; + } +@@ -152,7 +152,7 @@ + /** + * Returns array of MediaTrays derived from PPD. + */ +- public MediaTray[] getMediaTrays() { ++ MediaTray[] getMediaTrays() { + initMedia(); + return cupsMediaTrays; + } +--- ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/solaris/classes/sun/print/IPPPrintService.java Tue Sep 09 12:00:58 2014 -0700 +@@ -993,7 +993,9 @@ + + public synchronized Class[] getSupportedAttributeCategories() { + if (supportedCats != null) { +- return supportedCats; ++ Class<?> [] copyCats = new Class<?>[supportedCats.length]; ++ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); ++ return copyCats; + } + + initAttributes(); +@@ -1050,7 +1052,9 @@ + } + supportedCats = new Class[catList.size()]; + catList.toArray(supportedCats); +- return supportedCats; ++ Class<?>[] copyCats = new Class<?>[supportedCats.length]; ++ System.arraycopy(supportedCats, 0, copyCats, 0, copyCats.length); ++ return copyCats; + } + + +--- ./jdk/src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/solaris/native/java/net/AbstractPlainDatagramSocketImpl.c Tue Sep 09 12:00:58 2014 -0700 +@@ -0,0 +1,89 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++#include <sys/types.h> ++#include <sys/socket.h> ++ ++#ifdef __solaris__ ++#include <unistd.h> ++#include <stropts.h> ++ ++#ifndef BSD_COMP ++#define BSD_COMP ++#endif ++ ++#endif ++ ++#include <sys/ioctl.h> ++ ++#include "jvm.h" ++#include "jni_util.h" ++#include "net_util.h" ++ ++#include "java_net_AbstractPlainDatagramSocketImpl.h" ++ ++static jfieldID IO_fd_fdID; ++ ++static jfieldID apdsi_fdID; ++ ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL ++Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { ++ ++ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fdID); ++ ++ IO_fd_fdID = NET_GetFileDescriptorID(env); ++} ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: dataAvailable ++ * Signature: ()I ++ */ ++JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable ++(JNIEnv *env, jobject this) { ++ int fd, retval; ++ ++ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); ++ ++ if (IS_NULL(fdObj)) { ++ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", ++ "Socket closed"); ++ return -1; ++ } ++ fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); ++ ++ if (ioctl(fd, FIONREAD, &retval) < 0) { ++ return -1; ++ } ++ return retval; ++} +--- ./jdk/src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/src/windows/native/java/net/AbstractPlainDatagramSocketImpl.c Tue Sep 09 12:00:58 2014 -0700 +@@ -0,0 +1,113 @@ ++/* ++ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. ++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ++ * ++ * This code is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 only, as ++ * published by the Free Software Foundation. Oracle designates this ++ * particular file as subject to the "Classpath" exception as provided ++ * by Oracle in the LICENSE file that accompanied this code. ++ * ++ * This code is distributed in the hope that it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ++ * version 2 for more details (a copy is included in the LICENSE file that ++ * accompanied this code). ++ * ++ * You should have received a copy of the GNU General Public License version ++ * 2 along with this work; if not, write to the Free Software Foundation, ++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA ++ * or visit www.oracle.com if you need additional information or have any ++ * questions. ++ */ ++ ++#include <windows.h> ++#include <winsock2.h> ++ ++#include "jvm.h" ++#include "jni_util.h" ++#include "net_util.h" ++ ++#include "java_net_AbstractPlainDatagramSocketImpl.h" ++ ++static jfieldID IO_fd_fdID = NULL; ++static jfieldID apdsi_fdID = NULL; ++ ++static jfieldID apdsi_fd1ID = NULL; ++static jclass two_stacks_clazz = NULL; ++ ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: init ++ * Signature: ()V ++ */ ++JNIEXPORT void JNICALL ++Java_java_net_AbstractPlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) { ++ ++ apdsi_fdID = (*env)->GetFieldID(env, cls, "fd", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fdID); ++ IO_fd_fdID = NET_GetFileDescriptorID(env); ++ CHECK_NULL(IO_fd_fdID); ++ ++ two_stacks_clazz = (*env)->FindClass(env, "java/net/TwoStacksPlainDatagramSocketImpl"); ++ CHECK_NULL(two_stacks_clazz); ++ ++ /* Handle both TwoStacks and DualStack here */ ++ ++ if (JNU_Equals(env, cls, two_stacks_clazz)) { ++ /* fd1 present only in TwoStack.. */ ++ apdsi_fd1ID = (*env)->GetFieldID(env, cls, "fd1", ++ "Ljava/io/FileDescriptor;"); ++ CHECK_NULL(apdsi_fd1ID); ++ } ++ ++ JNU_CHECK_EXCEPTION(env); ++} ++ ++/* ++ * Class: java_net_AbstractPlainDatagramSocketImpl ++ * Method: dataAvailable ++ * Signature: ()I ++ */ ++JNIEXPORT jint JNICALL Java_java_net_AbstractPlainDatagramSocketImpl_dataAvailable ++(JNIEnv *env, jobject this) { ++ SOCKET fd; ++ SOCKET fd1; ++ int rv = -1, rv1 = -1; ++ jobject fdObj = (*env)->GetObjectField(env, this, apdsi_fdID); ++ ++ if (!IS_NULL(fdObj)) { ++ int retval = 0; ++ fd = (SOCKET)(*env)->GetIntField(env, fdObj, IO_fd_fdID); ++ rv = ioctlsocket(fd, FIONREAD, &retval); ++ if (retval > 0) { ++ return retval; ++ } ++ } ++ ++ if (!IS_NULL(apdsi_fd1ID)) { ++ /* TwoStacks */ ++ jobject fd1Obj = (*env)->GetObjectField(env, this, apdsi_fd1ID); ++ if (!IS_NULL(fd1Obj)) { ++ int retval = 0; ++ fd1 = (SOCKET)(*env)->GetIntField(env, fd1Obj, IO_fd_fdID); ++ rv1 = ioctlsocket(fd1, FIONREAD, &retval); ++ if (retval > 0) { ++ return retval; ++ } ++ } ++ } ++ ++ if (rv < 0 && rv1 < 0) { ++ JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", ++ "Socket closed"); ++ return -1; ++ } ++ ++ return 0; ++} ++ +--- ./jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/awt/splashscreen/splashscreen_sys.c Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -213,6 +213,14 @@ + void + SplashRedrawWindow(Splash * splash) + { ++ if (!SplashIsStillLooping(splash)) { ++ KillTimer(splash->hWnd, 0); ++ } ++ ++ if (splash->currentFrame < 0) { ++ return; ++ } ++ + SplashUpdateScreenData(splash); + if (splash->isLayered) { + BLENDFUNCTION bf; +@@ -303,9 +311,6 @@ + time = 0; + SetTimer(splash->hWnd, 0, time, NULL); + } +- else { +- KillTimer(splash->hWnd, 0); +- } + } + + void SplashReconfigureNow(Splash * splash) { +--- ./jdk/src/windows/native/sun/windows/awt_Component.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -6930,9 +6930,9 @@ + { + TRY; + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( + (void *(*)(void *))AwtComponent::_NativeHandlesWheelScrolling, +- env->NewGlobalRef(self))); ++ env->NewGlobalRef(self)); + // global ref is deleted in _NativeHandlesWheelScrolling + + CATCH_BAD_ALLOC_RET(NULL); +@@ -6951,9 +6951,9 @@ + + jobject selfGlobalRef = env->NewGlobalRef(self); + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( + (void*(*)(void*))AwtComponent::_IsObscured, +- (void *)selfGlobalRef)); ++ (void *)selfGlobalRef); + // selfGlobalRef is deleted in _IsObscured + + CATCH_BAD_ALLOC_RET(NULL); +--- ./jdk/src/windows/native/sun/windows/awt_List.cpp Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/src/windows/native/sun/windows/awt_List.cpp Tue Sep 09 12:00:58 2014 -0700 +@@ -1018,8 +1018,8 @@ + ses->list = env->NewGlobalRef(self); + ses->index = index; + +- return JNI_IS_TRUE(AwtToolkit::GetInstance().SyncCall( +- (void *(*)(void *))AwtList::_IsSelected, ses)); ++ return (jboolean)AwtToolkit::GetInstance().SyncCall( ++ (void *(*)(void *))AwtList::_IsSelected, ses); + // global ref and ses are deleted in _IsSelected + + CATCH_BAD_ALLOC_RET(FALSE); +--- ./jdk/test/java/awt/Focus/WindowIsFocusableAccessByThreadsTest/WindowIsFocusableAccessByThreadsTest.java Thu Jan 01 00:00:00 1970 +0000 ++++ ./jdk/test/java/awt/Focus/WindowIsFocusableAccessByThreadsTest/WindowIsFocusableAccessByThreadsTest.java Tue Sep 09 12:00:58 2014 -0700 +@@ -0,0 +1,113 @@ ++/* ++ * 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 8047288 ++ @summary Tests method isFocusable of Window component. It should be accessed only from EDT ++ @author artem.malinko@oracle.com ++ @library ../../regtesthelpers ++ @build Util ++ @run main WindowIsFocusableAccessByThreadsTest ++*/ ++ ++import test.java.awt.regtesthelpers.Util; ++ ++import javax.swing.*; ++import java.awt.*; ++import java.util.concurrent.atomic.AtomicBoolean; ++ ++public class WindowIsFocusableAccessByThreadsTest { ++ private static AtomicBoolean testPassed = new AtomicBoolean(true); ++ private static volatile TestFrame frame; ++ private static volatile TestWindow window; ++ private static volatile Button openWindowBtn; ++ ++ public static void main(String[] args) { ++ frame = new TestFrame("Test EDT access to Window components"); ++ window = new TestWindow(frame); ++ ++ SwingUtilities.invokeLater(WindowIsFocusableAccessByThreadsTest::init); ++ ++ Util.waitTillShown(frame); ++ Robot robot = Util.createRobot(); ++ Util.clickOnComp(frame, robot, 100); ++ Util.clickOnComp(openWindowBtn, robot, 100); ++ ++ Util.waitTillShown(window); ++ ++ if (!testPassed.get()) { ++ throw new RuntimeException("Window component methods has been accessed not " + ++ "from Event Dispatching Thread"); ++ } ++ } ++ ++ private static void init() { ++ frame.setSize(400, 400); ++ frame.setLayout(new FlowLayout()); ++ openWindowBtn = new Button("open window"); ++ openWindowBtn.addActionListener(e -> { ++ window.setSize(100, 100); ++ window.setLocation(400, 100); ++ window.setVisible(true); ++ }); ++ frame.add(openWindowBtn); ++ frame.setVisible(true); ++ } ++ ++ private static void testThread() { ++ if (!SwingUtilities.isEventDispatchThread()) { ++ testPassed.set(false); ++ } ++ } ++ ++ private static class TestWindow extends Window { ++ public TestWindow(Frame owner) { ++ super(owner); ++ } ++ ++ // isFocusable method is final and we can't add this test to it. ++ // But it invokes getFocusableWindowState and here we can check ++ // if thread is EDT. ++ @Override ++ public boolean getFocusableWindowState() { ++ testThread(); ++ return super.getFocusableWindowState(); ++ } ++ } ++ ++ private static class TestFrame extends Frame { ++ private TestFrame(String title) throws HeadlessException { ++ super(title); ++ } ++ ++ // isFocusable method is final and we can't add this test to it. ++ // But it invokes getFocusableWindowState and here we can check ++ // if thread is EDT. ++ @Override ++ public boolean getFocusableWindowState() { ++ testThread(); ++ return super.getFocusableWindowState(); ++ } ++ } ++} +--- ./jdk/test/java/util/Collections/CheckedQueue.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/java/util/Collections/CheckedQueue.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -23,55 +23,40 @@ + + /* + * @test +- * @bug 5020931 ++ * @bug 5020931 8048207 + * @summary Unit test for Collections.checkedQueue ++ * @run testng CheckedQueue + */ + +-import java.lang.reflect.Method; + import java.util.Collections; +-import java.util.Iterator; + import java.util.Queue; + import java.util.concurrent.ArrayBlockingQueue; + ++import org.testng.annotations.Test; ++import static org.testng.Assert.fail; ++import static org.testng.Assert.assertEquals; ++import static org.testng.Assert.assertTrue; ++import static org.testng.Assert.assertFalse; ++ ++ + public class CheckedQueue { +- static int status = 0; +- +- public static void main(String[] args) throws Exception { +- new CheckedQueue(); +- } +- +- public CheckedQueue() throws Exception { +- run(); +- } +- +- private void run() throws Exception { +- Method[] methods = this.getClass().getDeclaredMethods(); +- +- for (int i = 0; i < methods.length; i++) { +- Method method = methods[i]; +- String methodName = method.getName(); +- +- if (methodName.startsWith("test")) { +- try { +- Object obj = method.invoke(this, new Object[0]); +- } catch(Exception e) { +- throw new Exception(this.getClass().getName() + "." + +- methodName + " test failed, test exception " +- + "follows\n" + e.getCause()); +- } +- } +- } +- } + + /** + * This test adds items to a queue. + */ +- private void test00() { ++ @Test ++ public void testAdd() { + int arrayLength = 10; +- ArrayBlockingQueue<String> abq = new ArrayBlockingQueue(arrayLength); ++ Queue<String> abq = Collections.checkedQueue(new ArrayBlockingQueue<>(arrayLength), String.class); + + for (int i = 0; i < arrayLength; i++) { +- abq.add(new String(Integer.toString(i))); ++ abq.add(Integer.toString(i)); ++ } ++ ++ try { ++ abq.add("full"); ++ } catch (IllegalStateException full) { ++ + } + } + +@@ -80,23 +65,17 @@ + * {@code String}s gets the checked queue, and attempt to add an Integer to + * the checked queue. + */ +- private void test01() throws Exception { ++ @Test(expectedExceptions = ClassCastException.class) ++ public void testAddFail1() { + int arrayLength = 10; + ArrayBlockingQueue<String> abq = new ArrayBlockingQueue(arrayLength + 1); + + for (int i = 0; i < arrayLength; i++) { +- abq.add(new String(Integer.toString(i))); ++ abq.add(Integer.toString(i)); + } + + Queue q = Collections.checkedQueue(abq, String.class); +- +- try { +- q.add(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test01 test" +- + " failed, should throw ClassCastException."); +- } catch(ClassCastException cce) { +- // Do nothing. +- } ++ q.add(0); + } + + /** +@@ -104,47 +83,40 @@ + * {@code String}, gets the checked queue, and attempt to add an Integer to + * the checked queue. + */ +- private void test02() throws Exception { ++ @Test(expectedExceptions = ClassCastException.class) ++ public void testAddFail2() { + ArrayBlockingQueue<String> abq = new ArrayBlockingQueue(1); + Queue q = Collections.checkedQueue(abq, String.class); + +- try { +- q.add(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test02 test" +- + " failed, should throw ClassCastException."); +- } catch(ClassCastException e) { +- // Do nothing. +- } ++ q.add(0); + } + + /** + * This test tests the Collections.checkedQueue method call for nulls in + * each and both of the parameters. + */ +- private void test03() throws Exception { ++ @Test ++ public void testArgs() { + ArrayBlockingQueue<String> abq = new ArrayBlockingQueue(1); + Queue q; + + try { + q = Collections.checkedQueue(null, String.class); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(NullPointerException npe) { + // Do nothing + } + + try { + q = Collections.checkedQueue(abq, null); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(Exception e) { + // Do nothing + } + + try { + q = Collections.checkedQueue(null, null); +- throw new Exception(this.getClass().getName() + "." + "test03 test" +- + " failed, should throw NullPointerException."); ++ fail( "should throw NullPointerException."); + } catch(Exception e) { + // Do nothing + } +@@ -153,38 +125,28 @@ + /** + * This test tests the CheckedQueue.offer method. + */ +- private void test04() throws Exception { ++ @Test ++ public void testOffer() { + ArrayBlockingQueue<String> abq = new ArrayBlockingQueue(1); + Queue q = Collections.checkedQueue(abq, String.class); + + try { + q.offer(null); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw NullPointerException."); ++ fail("should throw NullPointerException."); + } catch (NullPointerException npe) { + // Do nothing + } + + try { +- q.offer(new Integer(0)); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw ClassCastException."); ++ q.offer(0); ++ fail("should throw ClassCastException."); + } catch (ClassCastException cce) { + // Do nothing + } + +- q.offer(new String("0")); ++ assertTrue(q.offer("0"), "queue should have room"); + +- try { +- q.offer(new String("1")); +- throw new Exception(this.getClass().getName() + "." + "test04 test" +- + " failed, should throw IllegalStateException."); +- } catch(IllegalStateException ise) { +- // Do nothing +- } +- } +- +- private void test05() { +- ++ // no room at the inn! ++ assertFalse(q.offer("1"), "queue should be full"); + } + } +--- ./jdk/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/java2d/cmm/ColorConvertOp/ColConvCCMTest.java Tue Sep 09 12:00:58 2014 -0700 +@@ -23,7 +23,7 @@ + + /** + * @test +- * @bug 6476665 7033534 6830714 ++ * @bug 6476665 7033534 6830714 8052162 + * @summary Verifies color conversion of Component Color Model based images + * @run main ColConvCCMTest + */ +--- ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/security/ssl/sanity/ciphersuites/CipherSuitesInOrder.java Tue Sep 09 12:00:58 2014 -0700 +@@ -69,11 +69,6 @@ + "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", +- "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", + + "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", +@@ -97,6 +92,12 @@ + "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", + "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", ++ ++ "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_EMPTY_RENEGOTIATION_INFO_SCSV", +@@ -110,10 +111,20 @@ + "TLS_DH_anon_WITH_AES_128_CBC_SHA256", + "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", + "TLS_DH_anon_WITH_AES_128_CBC_SHA", ++ "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", ++ "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", + "TLS_ECDH_anon_WITH_RC4_128_SHA", + "SSL_DH_anon_WITH_RC4_128_MD5", +- "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", +- "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", ++ "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", ++ "SSL_RSA_EXPORT_WITH_RC4_40_MD5", ++ "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", + "TLS_RSA_WITH_NULL_SHA256", + "TLS_ECDHE_ECDSA_WITH_NULL_SHA", + "TLS_ECDHE_RSA_WITH_NULL_SHA", +@@ -122,26 +133,16 @@ + "TLS_ECDH_RSA_WITH_NULL_SHA", + "TLS_ECDH_anon_WITH_NULL_SHA", + "SSL_RSA_WITH_NULL_MD5", +- "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_RC4_40_MD5", +- "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", +- "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", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", ++ "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_RC4_128_SHA", + "TLS_KRB5_WITH_RC4_128_MD5", +- "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", +- "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", + "TLS_KRB5_WITH_DES_CBC_SHA", + "TLS_KRB5_WITH_DES_CBC_MD5", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", ++ "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", + "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", +- "TLS_KRB5_EXPORT_WITH_RC4_40_MD5", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", +- "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5" ++ "TLS_KRB5_EXPORT_WITH_RC4_40_MD5" + ); + + private final static String[] protocols = { +--- ./jdk/test/sun/tools/native2ascii/NativeErrors.java Wed Jul 30 18:42:59 2014 +0100 ++++ ./jdk/test/sun/tools/native2ascii/NativeErrors.java Tue Sep 09 12:00:58 2014 -0700 +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved. ++ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it +@@ -25,12 +25,18 @@ + * @test + * @bug 4136352 + * @summary Test Native2ASCII error messages +- * ++ * @library /lib/testlibrary ++ * @build jdk.testlibrary.* NativeErrors ++ * @run main NativeErrors + */ + +-import java.io.*; +-import sun.tools.native2ascii.*; +-import java.util.*; ++ ++import java.io.File; ++import java.util.ResourceBundle; ++import java.util.MissingResourceException; ++import jdk.testlibrary.OutputAnalyzer; ++import jdk.testlibrary.JDKToolLauncher; ++import jdk.testlibrary.ProcessTools; + + public class NativeErrors { + +@@ -45,30 +51,18 @@ + } + } + +- public static void main(String args[]) throws Exception { +- String[] command; +- Process p = null; +- BufferedReader in = null; ++ public static void main(String args[]) throws Throwable { ++ // Execute command in another vm. Verify stdout for expected err msg. + +- // Construct a command that runs the test in other vm +- // Exec another vm to run test in +- // Read the result to determine if test failed +- +- command = getComString("-encoding"); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.bad.arg"); ++ // Test with no input file given. ++ checkResult(executeCmd("-encoding"), "err.bad.arg"); + + File f0 = new File(System.getProperty("test.src", "."), "test123"); + String path0 = f0.getPath(); + if ( f0.exists() ) { + throw new Error("Input file should not exist: " + path0); + } +- +- command = getComString(path0); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.cannot.read"); ++ checkResult(executeCmd(path0), "err.cannot.read"); + + File f1 = new File(System.getProperty("test.src", "."), "test1"); + File f2 = File.createTempFile("test2", ".tmp"); +@@ -81,71 +75,38 @@ + throw new Error("Output file cannot be made read only: " + path2); + } + f2.deleteOnExit(); +- +- command = getComString(path1, path2); +- p = Runtime.getRuntime().exec(command); +- in = new BufferedReader(new InputStreamReader(p.getInputStream())); +- checkResult(in, "err.cannot.write"); ++ checkResult(executeCmd(path1, path2), "err.cannot.write"); + } + +- +- private static void checkResult(BufferedReader in, String errorExpected) +- throws Exception { +- String errorReceived; +- errorReceived = in.readLine(); +- assert errorReceived != null : "First readline cannot be null"; +- errorExpected = rsrc.getString(errorExpected); +- assert errorExpected != null : "Expected message cannot be null"; +- StringBuffer error = new StringBuffer(errorExpected); +- int start = errorExpected.indexOf("{0}"); +- if (start >= 0) { +- error.delete(start, start+3); +- errorExpected = error.toString(); ++ private static String executeCmd(String... toolArgs) throws Throwable { ++ JDKToolLauncher cmd = JDKToolLauncher.createUsingTestJDK("native2ascii"); ++ for (String s : toolArgs) { ++ cmd.addToolArg(s); + } +- //System.out.println("received: " + errorReceived); +- //System.out.println("expected: " + errorExpected); +- if (!errorReceived.endsWith(errorExpected)) +- throw new RuntimeException("Native2ascii bad arg error broken."); ++ OutputAnalyzer output = ProcessTools.executeProcess(cmd.getCommand()); ++ if (output == null || output.getStdout() == null) { ++ throw new Exception("Output was null. Process did not finish correctly."); ++ } ++ if (output.getExitValue() == 0) { ++ throw new Exception("Process exit code was 0, but error was expected."); ++ } ++ return output.getStdout(); + } + +- private static String[] getComString(String arg2) { +- String[] coms = new String[2]; +- coms[0] = getPathString(); +- coms[1] = arg2; +- return coms; +- } ++ private static void checkResult( ++ String errorReceived, String errorKey) throws Exception { ++ String errorExpected = rsrc.getString(errorKey); ++ if (errorExpected == null) { ++ throw new Exception("No error message for key: " + errorKey); ++ } ++ // Remove template tag from error message. ++ errorExpected = errorExpected.replaceAll("\\{0\\}", ""); + +- private static String[] getComString(String arg2, String arg3) { +- String[] coms = new String[3]; +- coms[0] = getPathString(); +- coms[1] = arg2; +- coms[2] = arg3; +- return coms; +- } +- +- /* +- * Search for path to native2ascii +- */ +- private static String getPathString() { +- String path = System.getProperty("java.home") + File.separator + +- "bin" + File.separator + "native2ascii"; +- if (File.separatorChar == '\\') { +- path = path + ".exe"; ++ System.out.println("received: " + errorReceived); ++ System.out.println("expected: " + errorExpected); ++ if (errorReceived.indexOf(errorExpected) < 0) { ++ throw new RuntimeException("Native2ascii bad arg error broken."); + } +- File f = new File(path); +- if (!f.exists()) { +- System.out.println("Cannot find native2ascii at "+path); +- path = System.getProperty("java.home") + File.separator + ".." + +- File.separator + "bin" + File.separator + "native2ascii"; +- if (File.separatorChar == '\\') { +- path = path + ".exe"; +- } +- f = new File(path); +- if (!f.exists()) +- throw new RuntimeException("Cannot find native2ascii at "+path); +- System.out.println("Using native2ascii at "+path); +- } +- return path; + } + + } +--- ./langtools/.hgtags Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/.hgtags Mon Sep 08 12:38:00 2014 -0700 +@@ -311,3 +311,21 @@ + 5c1d6da1445aa3a2e5cf6101c70e79bfbe2745a5 jdk8u20-b23 + 9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b24 + 9239118487dfb47ee850d2cc9b10a0a2e510da3c jdk8u20-b25 ++5e6d409a72327a31b8a8f9aa0b32ef213c8b629c jdk8u20-b26 ++f491f1581f196950c2cb858508dd06601968c417 jdk8u25-b00 ++5bc865e0a2e3c59c1c8bc41e731509e1737ddea1 jdk8u25-b01 ++4dec0c684a9ead80ea2bca6b042682367c1abf90 jdk8u25-b02 ++1d039298d33f8062a0aa75442bd39434e16ee2df jdk8u25-b03 ++5c806c4b2830056caaca3329e634ff040bfe1c7b jdk8u25-b04 ++f1625806cabab809993fbc650b77c5a28d70035d jdk8u25-b05 ++7a6309461a7294cc78789f547b0a652757d17156 jdk8u25-b06 ++aad835b33337c22f4d632c2531c453de00a8f778 jdk8u25-b07 ++224b8260b2c72e2902e48522240c97de11b3570a jdk8u25-b08 ++a5fa1a2bd63cfcce67dae074c07cd0f2baa8ddc0 jdk8u25-b09 ++0dfd4099658397efa118918cd43f79e194c320ea jdk8u25-b10 ++eee8277448304f5d785310edff072d993a0c1868 jdk8u25-b11 ++664a10268f61616b682985855015663c30d0476f jdk8u25-b12 ++89b2f04998c7a1f987cadb4c42801d1ec500a870 jdk8u25-b13 ++a340d68b020585cad7aa6e38d1aafb19ad0e4e07 jdk8u25-b14 ++6e0c19cd42d7c4d307bea26840ee831cbd14e2fc jdk8u25-b15 ++7fa6fa7cc204de988e224c6f8f75e62128fa84cd jdk8u25-b16 +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Mon Sep 08 12:38:00 2014 -0700 +@@ -1677,6 +1677,9 @@ + # 0: string + compiler.err.static.intf.methods.not.supported.in.source=static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) + ++# 0: string ++compiler.err.static.intf.method.invoke.not.supported.in.source=static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u30FB\u30E1\u30BD\u30C3\u30C9\u547C\u51FA\u3057\u306F-source {0}\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\n(static\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u30FB\u30E1\u30BD\u30C3\u30C9\u547C\u51FA\u3057\u3092\u4F7F\u7528\u53EF\u80FD\u306B\u3059\u308B\u306B\u306F\u3001-source 8\u4EE5\u4E0A\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044) ++ + ######################################## + # Diagnostics for verbose resolution + # used by Resolve (debug only) +--- ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Wed Jul 30 03:55:11 2014 -0700 ++++ ./langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Mon Sep 08 12:38:00 2014 -0700 +@@ -1677,6 +1677,9 @@ + # 0: string + compiler.err.static.intf.methods.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u9759\u6001\u63A5\u53E3\u65B9\u6CD5) + ++# 0: string ++compiler.err.static.intf.method.invoke.not.supported.in.source=-source {0} \u4E2D\u4E0D\u652F\u6301\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\u8C03\u7528\n(\u8BF7\u4F7F\u7528 -source 8 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u542F\u7528\u9759\u6001\u63A5\u53E3\u65B9\u6CD5\u8C03\u7528) ++ + ######################################## + # Diagnostics for verbose resolution + # used by Resolve (debug only) +--- ./nashorn/.hgtags Wed Jul 30 03:55:26 2014 -0700 ++++ ./nashorn/.hgtags Mon Sep 08 12:38:15 2014 -0700 +@@ -299,3 +299,21 @@ + ad36f9454ce38d78be39fc819902e1223765ee5e jdk8u20-b23 + d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b24 + d3da140e179343011017669a6dbfcc52b0e56f52 jdk8u20-b25 ++a23ac9db4227d78b3389e01fa94a8cb695a8fb0a jdk8u20-b26 ++7001e9f95b443a75e432205a29974c05b88e0fdc jdk8u25-b00 ++a9f77bd14874d5f8fdf935704dd54a0451f2bc69 jdk8u25-b01 ++895e47783e2ee6823496a5ae84039a4f50311c7d jdk8u25-b02 ++b84d92194c367411fcd8b5f510d4589709a8e71e jdk8u25-b03 ++894ab2f06c93987f8596f5906985ff0a452f2fb2 jdk8u25-b04 ++25b89ca363c41e1a1d90d7e95d5227d23e4292f3 jdk8u25-b05 ++0a50d568a901700213fe40c38089748ca1d1af88 jdk8u25-b06 ++25b719b33ac8f8ffb7e4353fddcda93ca6027b0d jdk8u25-b07 ++0f74f65763a300cfe5f897b6b21f36d64f9d2115 jdk8u25-b08 ++158837f537e45fc4664a56ad4759f8a1b30cab73 jdk8u25-b09 ++7e00c05fc54b0404bf2eedda35dd38ae1ad23e50 jdk8u25-b10 ++8cd6af10dd4de9e28ffe30c9107954fffd15dc99 jdk8u25-b11 ++f76715cd4e902602bdbb4ba9a3774c10afeee012 jdk8u25-b12 ++34c95bcacff79a5794416a8e715a8e63bfe7fc58 jdk8u25-b13 ++6a93467eaa36f732b84ecd463e046c4066fef40c jdk8u25-b14 ++71e8403a2f8279315419adf5f4e9d6b232b6835c jdk8u25-b15 ++1500138ce513600457be6bfa10979ecce6515aa6 jdk8u25-b16 |