mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-30 15:22:41 +00:00
Merge
This commit is contained in:
commit
2559700d1f
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -88,7 +88,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
||||
BASIC_LDFLAGS_JVM_ONLY="-library=%none -mt -z noversion"
|
||||
|
||||
elif test "x$TOOLCHAIN_TYPE" = xxlc; then
|
||||
BASIC_LDFLAGS="-b64 -brtl -bnolibpath -bexpall -bernotok -btextpsize:64K \
|
||||
BASIC_LDFLAGS="-b64 -brtl -bnorwexec -bnolibpath -bexpall -bernotok -btextpsize:64K \
|
||||
-bdatapsize:64K -bstackpsize:64K"
|
||||
# libjvm.so has gotten too large for normal TOC size; compile with qpic=large and link with bigtoc
|
||||
BASIC_LDFLAGS_JVM_ONLY="-Wl,-lC_r -bbigtoc"
|
||||
|
||||
@ -1301,7 +1301,7 @@ var versionArgs = function(input, common) {
|
||||
var args = ["--with-version-build=" + common.build_number];
|
||||
if (input.build_type == "promoted") {
|
||||
args = concat(args,
|
||||
"--with-version-pre=" + version_numbers.get("DEFAULT_PROMOTION_VERSION_PRE"),
|
||||
"--with-version-pre=" + version_numbers.get("DEFAULT_PROMOTED_VERSION_PRE"),
|
||||
"--without-version-opt");
|
||||
} else if (input.build_type == "ci") {
|
||||
var optString = input.build_id_data.ciBuildNumber;
|
||||
|
||||
@ -25,6 +25,7 @@
|
||||
#include "aot/compiledIC_aot.hpp"
|
||||
#include "code/codeCache.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
|
||||
void CompiledDirectStaticCall::set_to_far(const methodHandle& callee, address entry) {
|
||||
if (TraceICs) {
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
#define CPU_AARCH64_MACROASSEMBLER_AARCH64_HPP
|
||||
|
||||
#include "asm/assembler.hpp"
|
||||
#include "oops/compressedOops.hpp"
|
||||
|
||||
// MacroAssembler extends Assembler by frequently used macros.
|
||||
//
|
||||
@ -85,10 +86,10 @@ class MacroAssembler: public Assembler {
|
||||
public:
|
||||
MacroAssembler(CodeBuffer* code) : Assembler(code) {
|
||||
use_XOR_for_compressed_class_base
|
||||
= (operand_valid_for_logical_immediate(false /*is32*/,
|
||||
(uint64_t)Universe::narrow_klass_base())
|
||||
&& ((uint64_t)Universe::narrow_klass_base()
|
||||
> (1UL << log2_intptr(Universe::narrow_klass_range()))));
|
||||
= operand_valid_for_logical_immediate
|
||||
(/*is32*/false, (uint64_t)CompressedKlassPointers::base())
|
||||
&& ((uint64_t)CompressedKlassPointers::base()
|
||||
> (1UL << log2_intptr(CompressedKlassPointers::range())));
|
||||
}
|
||||
|
||||
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include "c1/c1_LIRAssembler.hpp"
|
||||
#include "c1/c1_MacroAssembler.hpp"
|
||||
#include "c1/c1_Runtime1.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "nativeInst_arm.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
|
||||
@ -34,6 +34,7 @@
|
||||
#include "gc/shared/barrierSet.hpp"
|
||||
#include "gc/shared/cardTableBarrierSet.hpp"
|
||||
#include "gc/shared/collectedHeap.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "nativeInst_arm.hpp"
|
||||
#include "oops/objArrayKlass.hpp"
|
||||
#include "runtime/frame.inline.hpp"
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
#include "interpreter/interpreter.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "oops/compiledICHolder.hpp"
|
||||
#include "runtime/safepointMechanism.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
|
||||
@ -33,7 +33,7 @@ static bool returns_to_call_stub(address return_pc) { return return_pc == _call_
|
||||
|
||||
enum platform_dependent_constants {
|
||||
code_size1 = 20000 LP64_ONLY(+10000), // simply increase if too small (assembler will crash if too small)
|
||||
code_size2 = 35300 LP64_ONLY(+11000) // simply increase if too small (assembler will crash if too small)
|
||||
code_size2 = 35300 LP64_ONLY(+11200) // simply increase if too small (assembler will crash if too small)
|
||||
};
|
||||
|
||||
class x86 {
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include "gc/shared/cardTableBarrierSet.inline.hpp"
|
||||
#include "gc/shared/collectedHeap.hpp"
|
||||
#include "memory/metaspaceShared.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "runtime/frame.inline.hpp"
|
||||
|
||||
frame JavaThread::pd_last_frame() {
|
||||
|
||||
@ -1738,9 +1738,6 @@ jlong java_lang_Thread::thread_id(oop java_thread) {
|
||||
}
|
||||
|
||||
oop java_lang_Thread::park_blocker(oop java_thread) {
|
||||
assert(JDK_Version::current().supports_thread_park_blocker(),
|
||||
"Must support parkBlocker field");
|
||||
|
||||
return java_thread->obj_field(_park_blocker_offset);
|
||||
}
|
||||
|
||||
|
||||
@ -450,8 +450,8 @@ CompileTask* CompileQueue::get() {
|
||||
save_hot_method = methodHandle(task->hot_method());
|
||||
|
||||
remove(task);
|
||||
purge_stale_tasks(); // may temporarily release MCQ lock
|
||||
}
|
||||
purge_stale_tasks(); // may temporarily release MCQ lock
|
||||
return task;
|
||||
}
|
||||
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include "gc/shenandoah/shenandoahHeapRegionSet.hpp"
|
||||
#include "gc/shenandoah/shenandoahUtils.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "services/memTracker.hpp"
|
||||
#include "utilities/copy.hpp"
|
||||
|
||||
ShenandoahCollectionSet::ShenandoahCollectionSet(ShenandoahHeap* heap, char* heap_base, size_t size) :
|
||||
|
||||
@ -1280,18 +1280,7 @@ typedef struct {
|
||||
unsigned int reserved3 : 8;
|
||||
unsigned int reserved1 : 16;
|
||||
unsigned int reserved2;
|
||||
|
||||
/* The following bits represents new JDK supports that VM has dependency on.
|
||||
* VM implementation can use these bits to determine which JDK version
|
||||
* and support it has to maintain runtime compatibility.
|
||||
*
|
||||
* When a new bit is added in a minor or update release, make sure
|
||||
* the new bit is also added in the main/baseline.
|
||||
*/
|
||||
unsigned int thread_park_blocker : 1;
|
||||
unsigned int post_vm_init_hook_enabled : 1;
|
||||
unsigned int pending_list_uses_discovered_field : 1;
|
||||
unsigned int : 29;
|
||||
unsigned int : 32;
|
||||
unsigned int : 32;
|
||||
unsigned int : 32;
|
||||
} jdk_version_info;
|
||||
|
||||
@ -26,6 +26,7 @@
|
||||
#include "classfile/moduleEntry.hpp"
|
||||
#include "jvmci/jvmciEnv.hpp"
|
||||
#include "jvmci/jvmciRuntime.hpp"
|
||||
#include "oops/objArrayOop.inline.hpp"
|
||||
#include "runtime/handles.inline.hpp"
|
||||
|
||||
JVMCICompiler* JVMCICompiler::_instance = NULL;
|
||||
|
||||
@ -2959,14 +2959,6 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m
|
||||
LogConfiguration::configure_stdout(LogLevel::Info, true, LOG_TAGS(class, path));
|
||||
}
|
||||
|
||||
// Change the default value for flags which have different default values
|
||||
// when working with older JDKs.
|
||||
#ifdef LINUX
|
||||
if (JDK_Version::current().compare_major(6) <= 0 &&
|
||||
FLAG_IS_DEFAULT(UseLinuxPosixThreadCPUClocks)) {
|
||||
FLAG_SET_DEFAULT(UseLinuxPosixThreadCPUClocks, false);
|
||||
}
|
||||
#endif // LINUX
|
||||
fix_appclasspath();
|
||||
|
||||
return JNI_OK;
|
||||
|
||||
@ -710,14 +710,7 @@ void JDK_Version::initialize() {
|
||||
int security = JDK_VERSION_SECURITY(info.jdk_version);
|
||||
int build = JDK_VERSION_BUILD(info.jdk_version);
|
||||
|
||||
// Incompatible with pre-4243978 JDK.
|
||||
if (info.pending_list_uses_discovered_field == 0) {
|
||||
vm_exit_during_initialization(
|
||||
"Incompatible JDK is not using Reference.discovered field for pending list");
|
||||
}
|
||||
_current = JDK_Version(major, minor, security, info.patch_version, build,
|
||||
info.thread_park_blocker == 1,
|
||||
info.post_vm_init_hook_enabled == 1);
|
||||
_current = JDK_Version(major, minor, security, info.patch_version, build);
|
||||
}
|
||||
|
||||
void JDK_Version_init() {
|
||||
|
||||
@ -74,9 +74,6 @@ class JDK_Version {
|
||||
uint8_t _patch;
|
||||
uint8_t _build;
|
||||
|
||||
bool _thread_park_blocker;
|
||||
bool _post_vm_init_hook_enabled;
|
||||
|
||||
bool is_valid() const {
|
||||
return (_major != 0);
|
||||
}
|
||||
@ -86,16 +83,13 @@ class JDK_Version {
|
||||
|
||||
public:
|
||||
|
||||
JDK_Version() : _major(0), _minor(0), _security(0), _patch(0), _build(0),
|
||||
_thread_park_blocker(false), _post_vm_init_hook_enabled(false)
|
||||
{}
|
||||
JDK_Version() :
|
||||
_major(0), _minor(0), _security(0), _patch(0), _build(0)
|
||||
{}
|
||||
|
||||
JDK_Version(uint8_t major, uint8_t minor = 0, uint8_t security = 0,
|
||||
uint8_t patch = 0, uint8_t build = 0,
|
||||
bool thread_park_blocker = false, bool post_vm_init_hook_enabled = false) :
|
||||
_major(major), _minor(minor), _security(security), _patch(patch), _build(build),
|
||||
_thread_park_blocker(thread_park_blocker),
|
||||
_post_vm_init_hook_enabled(post_vm_init_hook_enabled)
|
||||
uint8_t patch = 0, uint8_t build = 0) :
|
||||
_major(major), _minor(minor), _security(security), _patch(patch), _build(build)
|
||||
{}
|
||||
|
||||
// Returns the current running JDK version
|
||||
@ -120,13 +114,6 @@ class JDK_Version {
|
||||
uint8_t patch_version() const { return _patch; }
|
||||
uint8_t build_number() const { return _build; }
|
||||
|
||||
bool supports_thread_park_blocker() const {
|
||||
return _thread_park_blocker;
|
||||
}
|
||||
bool post_vm_init_hook_enabled() const {
|
||||
return _post_vm_init_hook_enabled;
|
||||
}
|
||||
|
||||
// Performs a full ordering comparison using all fields (patch, build, etc.)
|
||||
int compare(const JDK_Version& other) const;
|
||||
|
||||
|
||||
@ -3194,8 +3194,7 @@ void JavaThread::prepare(jobject jni_thread, ThreadPriority prio) {
|
||||
oop JavaThread::current_park_blocker() {
|
||||
// Support for JSR-166 locks
|
||||
oop thread_oop = threadObj();
|
||||
if (thread_oop != NULL &&
|
||||
JDK_Version::current().supports_thread_park_blocker()) {
|
||||
if (thread_oop != NULL) {
|
||||
return java_lang_Thread::park_blocker(thread_oop);
|
||||
}
|
||||
return NULL;
|
||||
@ -4011,13 +4010,11 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) {
|
||||
RTMLockingCounters::init();
|
||||
#endif
|
||||
|
||||
if (JDK_Version::current().post_vm_init_hook_enabled()) {
|
||||
call_postVMInitHook(THREAD);
|
||||
// The Java side of PostVMInitHook.run must deal with all
|
||||
// exceptions and provide means of diagnosis.
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
CLEAR_PENDING_EXCEPTION;
|
||||
}
|
||||
call_postVMInitHook(THREAD);
|
||||
// The Java side of PostVMInitHook.run must deal with all
|
||||
// exceptions and provide means of diagnosis.
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
CLEAR_PENDING_EXCEPTION;
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@ -893,10 +893,7 @@ void ThreadSnapshot::initialize(ThreadsList * t_list, JavaThread* thread) {
|
||||
}
|
||||
|
||||
// Support for JSR-166 locks
|
||||
if (JDK_Version::current().supports_thread_park_blocker() &&
|
||||
(_thread_status == java_lang_Thread::PARKED ||
|
||||
_thread_status == java_lang_Thread::PARKED_TIMED)) {
|
||||
|
||||
if (_thread_status == java_lang_Thread::PARKED || _thread_status == java_lang_Thread::PARKED_TIMED) {
|
||||
_blocker_object = thread->current_park_blocker();
|
||||
if (_blocker_object != NULL && _blocker_object->is_a(SystemDictionary::java_util_concurrent_locks_AbstractOwnableSynchronizer_klass())) {
|
||||
_blocker_object_owner = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(_blocker_object);
|
||||
|
||||
@ -23,11 +23,14 @@
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "jfr/jfr.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/os.hpp"
|
||||
#include "utilities/debug.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
#include "utilities/tableStatistics.hpp"
|
||||
#if INCLUDE_JFR
|
||||
#include "jfr/jfr.hpp"
|
||||
#endif
|
||||
|
||||
TableRateStatistics::TableRateStatistics() :
|
||||
_added_items(0), _removed_items(0),
|
||||
@ -38,15 +41,19 @@ TableRateStatistics::TableRateStatistics() :
|
||||
TableRateStatistics::~TableRateStatistics() { };
|
||||
|
||||
void TableRateStatistics::add() {
|
||||
#if INCLUDE_JFR
|
||||
if (Jfr::is_recording()) {
|
||||
Atomic::inc(&_added_items);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void TableRateStatistics::remove() {
|
||||
#if INCLUDE_JFR
|
||||
if (Jfr::is_recording()) {
|
||||
Atomic::inc(&_removed_items);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void TableRateStatistics::stamp() {
|
||||
@ -108,11 +115,13 @@ TableStatistics::TableStatistics(TableRateStatistics& rate_stats, NumberSeq summ
|
||||
_bucket_size = (_number_of_buckets <= 0) ? 0 : (_bucket_bytes / _number_of_buckets);
|
||||
_entry_size = (_number_of_entries <= 0) ? 0 : (_entry_bytes / _number_of_entries);
|
||||
|
||||
#if INCLUDE_JFR
|
||||
if (Jfr::is_recording()) {
|
||||
rate_stats.stamp();
|
||||
_add_rate = rate_stats.get_add_rate();
|
||||
_remove_rate = rate_stats.get_remove_rate();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
TableStatistics::~TableStatistics() { }
|
||||
|
||||
@ -1666,25 +1666,33 @@ public final class StringConcatFactory {
|
||||
// and deduce the coder from there. Arguments would be either converted to Strings
|
||||
// during the initial filtering, or handled by specializations in MIXERS.
|
||||
//
|
||||
// The method handle shape before and after all mixers are combined in is:
|
||||
// The method handle shape before all mixers are combined in is:
|
||||
// (long, <args>)String = ("indexCoder", <args>)
|
||||
//
|
||||
// We will bind the initialLengthCoder value to the last mixer (the one that will be
|
||||
// executed first), then fold that in. This leaves the shape after all mixers are
|
||||
// combined in as:
|
||||
// (<args>)String = (<args>)
|
||||
|
||||
int ac = -1;
|
||||
MethodHandle mix = null;
|
||||
for (RecipeElement el : recipe.getElements()) {
|
||||
switch (el.getTag()) {
|
||||
case TAG_CONST:
|
||||
// Constants already handled in the code above
|
||||
break;
|
||||
case TAG_ARG:
|
||||
int ac = el.getArgPos();
|
||||
if (ac >= 0) {
|
||||
// Compute new "index" in-place using old value plus the appropriate argument.
|
||||
mh = MethodHandles.filterArgumentsWithCombiner(mh, 0, mix,
|
||||
0, // old-index
|
||||
1 + ac // selected argument
|
||||
);
|
||||
}
|
||||
|
||||
ac = el.getArgPos();
|
||||
Class<?> argClass = ptypes[ac];
|
||||
MethodHandle mix = mixer(argClass);
|
||||
|
||||
// Compute new "index" in-place using old value plus the appropriate argument.
|
||||
mh = MethodHandles.filterArgumentsWithCombiner(mh, 0, mix,
|
||||
0, // old-index
|
||||
1 + ac // selected argument
|
||||
);
|
||||
mix = mixer(argClass);
|
||||
|
||||
break;
|
||||
default:
|
||||
@ -1692,9 +1700,19 @@ public final class StringConcatFactory {
|
||||
}
|
||||
}
|
||||
|
||||
// Insert initial length and coder value here.
|
||||
// Insert the initialLengthCoder value into the final mixer, then
|
||||
// fold that into the base method handle
|
||||
if (ac >= 0) {
|
||||
mix = MethodHandles.insertArguments(mix, 0, initialLengthCoder);
|
||||
mh = MethodHandles.foldArgumentsWithCombiner(mh, 0, mix,
|
||||
1 + ac // selected argument
|
||||
);
|
||||
} else {
|
||||
// No mixer (constants only concat), insert initialLengthCoder directly
|
||||
mh = MethodHandles.insertArguments(mh, 0, initialLengthCoder);
|
||||
}
|
||||
|
||||
// The method handle shape here is (<args>).
|
||||
mh = MethodHandles.insertArguments(mh, 0, initialLengthCoder);
|
||||
|
||||
// Apply filters, converting the arguments:
|
||||
if (filters != null) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -123,23 +123,40 @@ class URICertStore extends CertStoreSpi {
|
||||
// allowed when downloading CRLs
|
||||
private static final int DEFAULT_CRL_CONNECT_TIMEOUT = 15000;
|
||||
|
||||
// Default maximum read timeout in milliseconds (15 seconds)
|
||||
// allowed when downloading CRLs
|
||||
private static final int DEFAULT_CRL_READ_TIMEOUT = 15000;
|
||||
|
||||
/**
|
||||
* Integer value indicating the connect timeout, in seconds, to be
|
||||
* used for the CRL download. A timeout of zero is interpreted as
|
||||
* an infinite timeout.
|
||||
*/
|
||||
private static final int CRL_CONNECT_TIMEOUT = initializeTimeout();
|
||||
private static final int CRL_CONNECT_TIMEOUT =
|
||||
initializeTimeout("com.sun.security.crl.timeout",
|
||||
DEFAULT_CRL_CONNECT_TIMEOUT);
|
||||
|
||||
/**
|
||||
* Initialize the timeout length by getting the CRL timeout
|
||||
* system property. If the property has not been set, or if its
|
||||
* value is negative, set the timeout length to the default.
|
||||
* Integer value indicating the read timeout, in seconds, to be
|
||||
* used for the CRL download. A timeout of zero is interpreted as
|
||||
* an infinite timeout.
|
||||
*/
|
||||
private static int initializeTimeout() {
|
||||
Integer tmp = java.security.AccessController.doPrivileged(
|
||||
new GetIntegerAction("com.sun.security.crl.timeout"));
|
||||
private static final int CRL_READ_TIMEOUT =
|
||||
initializeTimeout("com.sun.security.crl.readtimeout",
|
||||
DEFAULT_CRL_READ_TIMEOUT);
|
||||
|
||||
/**
|
||||
* Initialize the timeout length by getting the specified CRL timeout
|
||||
* system property. If the property has not been set, or if its
|
||||
* value is negative, set the timeout length to the specified default.
|
||||
*/
|
||||
private static int initializeTimeout(String prop, int def) {
|
||||
Integer tmp = GetIntegerAction.privilegedGetProperty(prop);
|
||||
if (tmp == null || tmp < 0) {
|
||||
return DEFAULT_CRL_CONNECT_TIMEOUT;
|
||||
return def;
|
||||
}
|
||||
if (debug != null) {
|
||||
debug.println(prop + " set to " + tmp + " seconds");
|
||||
}
|
||||
// Convert to milliseconds, as the system property will be
|
||||
// specified in seconds
|
||||
@ -364,6 +381,7 @@ class URICertStore extends CertStoreSpi {
|
||||
}
|
||||
long oldLastModified = lastModified;
|
||||
connection.setConnectTimeout(CRL_CONNECT_TIMEOUT);
|
||||
connection.setReadTimeout(CRL_READ_TIMEOUT);
|
||||
try (InputStream in = connection.getInputStream()) {
|
||||
lastModified = connection.getLastModified();
|
||||
if (oldLastModified != 0) {
|
||||
|
||||
@ -1160,6 +1160,23 @@ jceks.key.serialFilter = java.base/java.lang.Enum;java.base/java.security.KeyRep
|
||||
#
|
||||
#jdk.includeInExceptions=hostInfo,jar
|
||||
|
||||
#
|
||||
# Disabled mechanisms for the Simple Authentication and Security Layer (SASL)
|
||||
#
|
||||
# Disabled mechanisms will not be negotiated by both SASL clients and servers.
|
||||
# These mechanisms will be ignored if they are specified in the mechanisms argument
|
||||
# of `Sasl.createClient` or the mechanism argument of `Sasl.createServer`.
|
||||
#
|
||||
# The value of this property is a comma-separated list of SASL mechanisms.
|
||||
# The mechanisms are case-sensitive. Whitespaces around the commas are ignored.
|
||||
#
|
||||
# Note: This property is currently used by the JDK Reference implementation.
|
||||
# It is not guaranteed to be examined and used by other implementations.
|
||||
#
|
||||
# Example:
|
||||
# jdk.sasl.disabledMechanisms=PLAIN, CRAM-MD5, DIGEST-MD5
|
||||
jdk.sasl.disabledMechanisms=
|
||||
|
||||
#
|
||||
# Policies for distrusting Certificate Authorities (CAs).
|
||||
#
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -46,9 +46,4 @@ JDK_GetVersionInfo0(jdk_version_info* info, size_t info_size) {
|
||||
((version_security & 0xFF) << 8) |
|
||||
(version_build & 0xFF);
|
||||
info->patch_version = version_patch;
|
||||
info->thread_park_blocker = 1;
|
||||
// Advertise presence of PostVMInitHook:
|
||||
// future optimization: detect if this is enabled.
|
||||
info->post_vm_init_hook_enabled = 1;
|
||||
info->pending_list_uses_discovered_field = 1;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,9 +26,12 @@
|
||||
package javax.security.sasl;
|
||||
|
||||
import javax.security.auth.callback.CallbackHandler;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
@ -38,6 +41,8 @@ import java.security.NoSuchAlgorithmException;
|
||||
import java.security.Provider;
|
||||
import java.security.Provider.Service;
|
||||
import java.security.Security;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* A static class for creating SASL clients and servers.
|
||||
@ -65,6 +70,30 @@ import java.security.Security;
|
||||
* @author Rob Weltman
|
||||
*/
|
||||
public class Sasl {
|
||||
|
||||
private static List<String> disabledMechanisms = new ArrayList<>();
|
||||
|
||||
static {
|
||||
String prop = AccessController.doPrivileged(
|
||||
(PrivilegedAction<String>)
|
||||
() -> Security.getProperty("jdk.sasl.disabledMechanisms"));
|
||||
|
||||
if (prop != null) {
|
||||
for (String s : prop.split("\\s*,\\s*")) {
|
||||
if (!s.isEmpty()) {
|
||||
disabledMechanisms.add(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final String SASL_LOGGER_NAME = "javax.security.sasl";
|
||||
|
||||
/**
|
||||
* Logger for debug messages
|
||||
*/
|
||||
private static final Logger logger = Logger.getLogger(SASL_LOGGER_NAME);
|
||||
|
||||
// Cannot create one of these
|
||||
private Sasl() {
|
||||
}
|
||||
@ -318,6 +347,9 @@ public class Sasl {
|
||||
* the preferred provider order for the specified algorithm. This
|
||||
* may be different than the order of providers returned by
|
||||
* {@link Security#getProviders() Security.getProviders()}.
|
||||
* <p>
|
||||
* If a mechanism is listed in the {@code jdk.sasl.disabledMechanisms}
|
||||
* security property, it will be ignored and won't be negotiated.
|
||||
*
|
||||
* @param mechanisms The non-null list of mechanism names to try. Each is the
|
||||
* IANA-registered name of a SASL mechanism. (e.g. "GSSAPI", "CRAM-MD5").
|
||||
@ -381,6 +413,10 @@ public class Sasl {
|
||||
"Mechanism name cannot be null");
|
||||
} else if (mechName.length() == 0) {
|
||||
continue;
|
||||
} else if (isDisabled(mechName)) {
|
||||
logger.log(Level.FINE,
|
||||
"Disabled " + mechName + " mechanism ignored");
|
||||
continue;
|
||||
}
|
||||
String type = "SaslClientFactory";
|
||||
Provider[] provs = Security.getProviders(type + "." + mechName);
|
||||
@ -468,6 +504,9 @@ public class Sasl {
|
||||
* the preferred provider order for the specified algorithm. This
|
||||
* may be different than the order of providers returned by
|
||||
* {@link Security#getProviders() Security.getProviders()}.
|
||||
* <p>
|
||||
* If {@code mechanism} is listed in the {@code jdk.sasl.disabledMechanisms}
|
||||
* security property, it will be ignored and this method returns {@code null}.
|
||||
*
|
||||
* @param mechanism The non-null mechanism name. It must be an
|
||||
* IANA-registered name of a SASL mechanism. (e.g. "GSSAPI", "CRAM-MD5").
|
||||
@ -521,6 +560,10 @@ public class Sasl {
|
||||
throw new NullPointerException("Mechanism name cannot be null");
|
||||
} else if (mechanism.length() == 0) {
|
||||
return null;
|
||||
} else if (isDisabled(mechanism)) {
|
||||
logger.log(Level.FINE,
|
||||
"Disabled " + mechanism + " mechanism ignored");
|
||||
return null;
|
||||
}
|
||||
|
||||
String type = "SaslServerFactory";
|
||||
@ -616,4 +659,8 @@ public class Sasl {
|
||||
}
|
||||
return Collections.unmodifiableSet(result);
|
||||
}
|
||||
|
||||
private static boolean isDisabled(String name) {
|
||||
return disabledMechanisms.contains(name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
@ -23,6 +22,8 @@ package com.sun.org.apache.xerces.internal.impl.dv.xs;
|
||||
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeValueException;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
|
||||
import com.sun.org.apache.xerces.internal.util.XMLChar;
|
||||
import jdk.xml.internal.SecuritySupport;
|
||||
|
||||
/**
|
||||
* All primitive types plus ID/IDREF/ENTITY/INTEGER are derived from this abstract
|
||||
@ -35,9 +36,14 @@ import com.sun.org.apache.xerces.internal.impl.dv.ValidationContext;
|
||||
* @author Neeraj Bajaj, Sun Microsystems, inc.
|
||||
* @author Sandy Gao, IBM
|
||||
*
|
||||
* @LastModified: Apr 2019
|
||||
*/
|
||||
public abstract class TypeValidator {
|
||||
|
||||
private static final boolean USE_CODE_POINT_COUNT_FOR_STRING_LENGTH =
|
||||
Boolean.parseBoolean(SecuritySupport.getSystemProperty(
|
||||
"com.sun.org.apache.xerces.internal.impl.dv.xs.useCodePointCountForStringLength", "false"));
|
||||
|
||||
// which facets are allowed for this type
|
||||
public abstract short getAllowedFacets();
|
||||
|
||||
@ -82,7 +88,14 @@ public abstract class TypeValidator {
|
||||
// get the length of the value
|
||||
// the parameters are in compiled form (from getActualValue)
|
||||
public int getDataLength(Object value) {
|
||||
return (value instanceof String) ? ((String)value).length() : -1;
|
||||
if (value instanceof String) {
|
||||
final String str = (String)value;
|
||||
if (!USE_CODE_POINT_COUNT_FOR_STRING_LENGTH) {
|
||||
return str.length();
|
||||
}
|
||||
return getCodePointLength(str);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get the number of digits of the value
|
||||
@ -97,6 +110,25 @@ public abstract class TypeValidator {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Returns the length of the string in Unicode code points.
|
||||
private int getCodePointLength(String value) {
|
||||
// Count the number of surrogate pairs, and subtract them from
|
||||
// the total length.
|
||||
final int len = value.length();
|
||||
int surrogatePairCount = 0;
|
||||
for (int i = 0; i < len - 1; ++i) {
|
||||
if (XMLChar.isHighSurrogate(value.charAt(i))) {
|
||||
if (XMLChar.isLowSurrogate(value.charAt(++i))) {
|
||||
++surrogatePairCount;
|
||||
}
|
||||
else {
|
||||
--i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return len - surrogatePairCount;
|
||||
}
|
||||
|
||||
// check whether the character is in the range 0x30 ~ 0x39
|
||||
public static final boolean isDigit(char ch) {
|
||||
return ch >= '0' && ch <= '9';
|
||||
|
||||
@ -39,7 +39,6 @@
|
||||
cvc-complex-type.2.4.b = cvc-complex-type.2.4.b: The content of element ''{0}'' is not complete. One of ''{1}'' is expected.
|
||||
cvc-complex-type.2.4.c = cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element ''{0}''.
|
||||
cvc-complex-type.2.4.d = cvc-complex-type.2.4.d: Invalid content was found starting with element ''{0}''. No child element is expected at this point.
|
||||
cvc-complex-type.2.4.d.1 = cvc-complex-type.2.4.d: Invalid content was found starting with element ''{0}''. No child element ''{1}'' is expected at this point.
|
||||
cvc-complex-type.2.4.e = cvc-complex-type.2.4.e: ''{0}'' can occur a maximum of ''{2}'' times in the current sequence. This limit was exceeded. At this point one of ''{1}'' is expected.
|
||||
cvc-complex-type.2.4.f = cvc-complex-type.2.4.f: ''{0}'' can occur a maximum of ''{1}'' times in the current sequence. This limit was exceeded. No child element is expected at this point.
|
||||
cvc-complex-type.2.4.g = cvc-complex-type.2.4.g: Invalid content was found starting with element ''{0}''. ''{1}'' is expected to occur a minimum of ''{2}'' times in the current sequence. One more instance is required to satisfy this constraint.
|
||||
@ -103,7 +102,7 @@
|
||||
src-ct.1 = src-ct.1: Complex Type Definition Representation Error for type ''{0}''. When <complexContent> is used, the base type must be a complexType. ''{1}'' is a simpleType.
|
||||
src-ct.2.1 = src-ct.2.1: Complex Type Definition Representation Error for type ''{0}''. When <simpleContent> is used, the base type must be a complexType whose content type is simple, or, only if restriction is specified, a complex type with mixed content and emptiable particle, or, only if extension is specified, a simple type. ''{1}'' satisfies none of these conditions.
|
||||
src-ct.2.2 = src-ct.2.2: Complex Type Definition Representation Error for type ''{0}''. When a complexType with simpleContent restricts a complexType with mixed content and emptiable particle, then there must be a <simpleType> among the children of <restriction>.
|
||||
src-ct.4 = src-ct.4: Complex Type Definition Representation Error for type ''{0}''. The intersection of wildcards is not expressible.
|
||||
src-ct.4 = src-ct.4: Complex Type Definition Representation Error for type ''{0}''. The intersection of wildcards is not expressible.
|
||||
src-ct.5 = src-ct.5: Complex Type Definition Representation Error for type ''{0}''. The union of wildcards is not expressible.
|
||||
src-element.1 = src-element.1: The properties ''default'' and ''fixed'' cannot both be present in element declaration ''{0}''. Use only one of them.
|
||||
src-element.2.1 = src-element.2.1: : One of 'ref' or 'name' must be present in a local element declaration.
|
||||
@ -234,14 +233,14 @@
|
||||
rcase-MapAndSum.2 = rcase-MapAndSum.2: Group''s occurrence range, ({0},{1}), is not a valid restriction of base group''s occurrence range, ({2},{3}).
|
||||
rcase-NameAndTypeOK.1 = rcase-NameAndTypeOK.1: Elements have names and target namespaces which are not the same: Element ''{0}'' in namespace ''{1}'' and element ''{2}'' in namespace ''{3}''.
|
||||
rcase-NameAndTypeOK.2 = rcase-NameAndTypeOK.2: Error for the particle whose '{'term'}' is the element declaration ''{0}''. The element declaration''s '{'nillable'}' is true, but the corresponding particle in the base type has an element declaration whose '{'nillable'}' is false.
|
||||
rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: Error for the particle whose '{'term'}' is the element declaration ''{0}''. Its occurrence range, ({1},{2}), is not a valid restriction of the range, ({3},{4}, of the corresponding particle in the base type.
|
||||
rcase-NameAndTypeOK.3 = rcase-NameAndTypeOK.3: Error for the particle whose '{'term'}' is the element declaration ''{0}''. Its occurrence range, ({1},{2}), is not a valid restriction of the range, ({3},{4}), of the corresponding particle in the base type.
|
||||
rcase-NameAndTypeOK.4.a = rcase-NameAndTypeOK.4.a: Element ''{0}'' is not fixed, but the corresponding element in the base type is fixed with value ''{1}''.
|
||||
rcase-NameAndTypeOK.4.b = rcase-NameAndTypeOK.4.b: Element ''{0}'' is fixed with value ''{1}'', but the corresponding element in the base type is fixed with value ''{2}''.
|
||||
rcase-NameAndTypeOK.5 = rcase-NameAndTypeOK.5: Identity constraints for element ''{0}'' are not a subset of those in base.
|
||||
rcase-NameAndTypeOK.6 = rcase-NameAndTypeOK.6: The disallowed substitutions for element ''{0}'' are not a superset of those in the base.
|
||||
rcase-NameAndTypeOK.7 = rcase-NameAndTypeOK.7: The type of element ''{0}'', ''{1}'', is not derived from the type of the base element, ''{2}''.
|
||||
rcase-NSCompat.1 = rcase-NSCompat.1: Element ''{0}'' has a namespace ''{1}'' which is not allowed by the wildcard in the base.
|
||||
rcase-NSCompat.2 = rcase-NSCompat.2: Error for the particle whose '{'term'}' is the element declaration ''{0}''. Its occurrence range, ({1},{2}), is not a valid restriction of the range, ({3},{4}, of the corresponding particle in the base type.
|
||||
rcase-NSCompat.2 = rcase-NSCompat.2: Error for the particle whose '{'term'}' is the element declaration ''{0}''. Its occurrence range, ({1},{2}), is not a valid restriction of the range, ({3},{4}), of the corresponding particle in the base type.
|
||||
rcase-NSRecurseCheckCardinality.1 = rcase-NSRecurseCheckCardinality.1: There is not a complete functional mapping between the particles.
|
||||
rcase-NSRecurseCheckCardinality.2 = rcase-NSRecurseCheckCardinality.2: Group''s occurrence range, ({0},{1}), is not a valid restriction of base wildcard''s range, ({2},{3}).
|
||||
rcase-NSSubset.1 = rcase-NSSubset.1: Wildcard is not a subset of corresponding wildcard in base.
|
||||
@ -286,15 +285,15 @@
|
||||
EmptyTargetNamespace = EmptyTargetNamespace: In schema document ''{0}'', the value of the ''targetNamespace'' attribute cannot be an empty string.
|
||||
FacetValueFromBase = FacetValueFromBase: In the declaration of type ''{0}'', value ''{1}'' of facet ''{2}'' must be from the value space of the base type, ''{3}''.
|
||||
FixedFacetValue = FixedFacetValue: In the definition of {3}, the value ''{1}'' for the facet ''{0}'' is invalid, because the value for ''{0}'' has been set to ''{2}'' in one of the ancestor types, and '{'fixed'}' = true.
|
||||
InvalidRegex = InvalidRegex: Pattern value ''{0}'' is not a valid regular expression. The reported error was: ''{1}'' at column ''{2}''.
|
||||
MaxOccurLimit = Current configuration of the parser doesn''t allow a maxOccurs attribute value to be set greater than the value {0}.
|
||||
InvalidRegex = InvalidRegex: Pattern value ''{0}'' is not a valid regular expression. The reported error was: ''{1}''.
|
||||
MaxOccurLimit = Current configuration of the parser doesn''t allow the expansion of a content model for a complex type to contain more than {0} nodes.
|
||||
PublicSystemOnNotation = PublicSystemOnNotation: At least one of ''public'' and ''system'' must appear in element ''notation''.
|
||||
SchemaLocation = SchemaLocation: schemaLocation value = ''{0}'' must have even number of URI''s.
|
||||
TargetNamespace.1 = TargetNamespace.1: Expecting namespace ''{0}'', but the target namespace of the schema document is ''{1}''.
|
||||
TargetNamespace.2 = TargetNamespace.2: Expecting no namespace, but the schema document has a target namespace of ''{1}''.
|
||||
UndeclaredEntity = UndeclaredEntity: Entity ''{0}'' is not declared.
|
||||
UndeclaredPrefix = UndeclaredPrefix: Cannot resolve ''{0}'' as a QName: the prefix ''{1}'' is not declared.
|
||||
|
||||
FacetsContradict = FacetsContradict: For simpleType definition ''{2}'', the enumeration value ''{0}'' contradicts with value of ''{1}'' facet.
|
||||
|
||||
# JAXP 1.2 schema source property errors
|
||||
|
||||
|
||||
@ -23,6 +23,8 @@ package com.sun.org.apache.xerces.internal.impl.xs.traversers;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.InvalidDatatypeValueException;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.XSFacets;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
|
||||
import com.sun.org.apache.xerces.internal.impl.dv.xs.XSSimpleTypeDecl;
|
||||
import com.sun.org.apache.xerces.internal.impl.validation.ValidationState;
|
||||
import com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar;
|
||||
import com.sun.org.apache.xerces.internal.impl.xs.SchemaSymbols;
|
||||
@ -42,6 +44,7 @@ import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
|
||||
import com.sun.org.apache.xerces.internal.xni.QName;
|
||||
import com.sun.org.apache.xerces.internal.xs.XSAttributeUse;
|
||||
import com.sun.org.apache.xerces.internal.xs.XSObjectList;
|
||||
import com.sun.org.apache.xerces.internal.xs.XSSimpleTypeDefinition;
|
||||
import com.sun.org.apache.xerces.internal.xs.XSTypeDefinition;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -280,6 +283,7 @@ abstract class XSDAbstractTraverser {
|
||||
}
|
||||
|
||||
FacetInfo traverseFacets(Element content,
|
||||
XSTypeDefinition typeDef,
|
||||
XSSimpleType baseValidator,
|
||||
XSDocumentInfo schemaDoc) {
|
||||
|
||||
@ -293,6 +297,9 @@ abstract class XSDAbstractTraverser {
|
||||
List<NamespaceContext> enumNSDecls = hasQName ? new ArrayList<>() : null;
|
||||
int currentFacet = 0;
|
||||
xsFacets.reset();
|
||||
boolean seenPattern = false;
|
||||
Element contextNode = (Element)content.getParentNode();
|
||||
boolean hasLengthFacet = false, hasMinLengthFacet = false, hasMaxLengthFacet = false;
|
||||
while (content != null) {
|
||||
// General Attribute Checking
|
||||
Object[] attrs = null;
|
||||
@ -364,7 +371,6 @@ abstract class XSDAbstractTraverser {
|
||||
}
|
||||
}
|
||||
else if (facet.equals(SchemaSymbols.ELT_PATTERN)) {
|
||||
facetsPresent |= XSSimpleType.FACET_PATTERN;
|
||||
attrs = fAttrChecker.checkAttributes(content, false, schemaDoc);
|
||||
String patternVal = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
|
||||
// The facet can't be used if the value is missing. Ignore
|
||||
@ -376,6 +382,7 @@ abstract class XSDAbstractTraverser {
|
||||
continue;
|
||||
}
|
||||
|
||||
seenPattern = true;
|
||||
if (fPattern.length() == 0) {
|
||||
fPattern.append(patternVal);
|
||||
} else {
|
||||
@ -477,9 +484,11 @@ abstract class XSDAbstractTraverser {
|
||||
switch (currentFacet) {
|
||||
case XSSimpleType.FACET_MINLENGTH:
|
||||
xsFacets.minLength = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
|
||||
hasMinLengthFacet = true;
|
||||
break;
|
||||
case XSSimpleType.FACET_MAXLENGTH:
|
||||
xsFacets.maxLength = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
|
||||
hasMaxLengthFacet = true;
|
||||
break;
|
||||
case XSSimpleType.FACET_MAXEXCLUSIVE:
|
||||
xsFacets.maxExclusive = (String)attrs[XSAttributeChecker.ATTIDX_VALUE];
|
||||
@ -504,6 +513,7 @@ abstract class XSDAbstractTraverser {
|
||||
break;
|
||||
case XSSimpleType.FACET_LENGTH:
|
||||
xsFacets.length = ((XInt)attrs[XSAttributeChecker.ATTIDX_VALUE]).intValue();
|
||||
hasLengthFacet = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -566,16 +576,148 @@ abstract class XSDAbstractTraverser {
|
||||
xsFacets.enumNSDecls = enumNSDecls;
|
||||
xsFacets.enumAnnotations = enumAnnotations;
|
||||
}
|
||||
if ((facetsPresent & XSSimpleType.FACET_PATTERN) != 0) {
|
||||
if (seenPattern) {
|
||||
facetsPresent |= XSSimpleType.FACET_PATTERN;
|
||||
xsFacets.pattern = fPattern.toString();
|
||||
xsFacets.patternAnnotations = patternAnnotations;
|
||||
}
|
||||
|
||||
fPattern.setLength(0);
|
||||
|
||||
// check if length, minLength and maxLength facets contradict with enumeration facets.
|
||||
// currently considers the case when the baseValidator is a built-in type.
|
||||
if (enumData != null) {
|
||||
if (hasLengthFacet) {
|
||||
checkEnumerationAndLengthInconsistency(baseValidator, enumData, contextNode, getSchemaTypeName(typeDef));
|
||||
}
|
||||
if (hasMinLengthFacet) {
|
||||
checkEnumerationAndMinLengthInconsistency(baseValidator, enumData, contextNode, getSchemaTypeName(typeDef));
|
||||
}
|
||||
if (hasMaxLengthFacet) {
|
||||
checkEnumerationAndMaxLengthInconsistency(baseValidator, enumData, contextNode, getSchemaTypeName(typeDef));
|
||||
}
|
||||
}
|
||||
|
||||
return new FacetInfo(xsFacets, content, facetsPresent, facetsFixed);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get name of an XSD type definition as a string value (which will typically be the value of "name" attribute of a
|
||||
* type definition, or an internal name determined by the validator for anonymous types).
|
||||
*/
|
||||
public static String getSchemaTypeName(XSTypeDefinition typeDefn) {
|
||||
|
||||
String typeNameStr = "";
|
||||
if (typeDefn instanceof XSSimpleTypeDefinition) {
|
||||
typeNameStr = ((XSSimpleTypeDecl) typeDefn).getTypeName();
|
||||
}
|
||||
else {
|
||||
typeNameStr = ((XSComplexTypeDecl) typeDefn).getTypeName();
|
||||
}
|
||||
|
||||
return typeNameStr;
|
||||
|
||||
} // getSchemaTypeName
|
||||
|
||||
/*
|
||||
* Check whether values of xs:maxLength and xs:enumeration are consistent. Report a warning message if they are not.
|
||||
*/
|
||||
private void checkEnumerationAndMaxLengthInconsistency(XSSimpleType baseValidator, List<String> enumData, Element contextNode, String typeName) {
|
||||
if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() / 2 > xsFacets.maxLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
byte[] decodedVal = Base64.decode(enumVal);
|
||||
if (decodedVal != null && (new String(decodedVal)).length() > xsFacets.maxLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() > xsFacets.maxLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MAXLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // checkEnumerationAndMaxLengthInconsistency
|
||||
|
||||
/*
|
||||
* Check whether values of xs:minLength and xs:enumeration are consistent. Report a warning message if they are not.
|
||||
*/
|
||||
private void checkEnumerationAndMinLengthInconsistency(XSSimpleType baseValidator, List<String> enumData, Element contextNode, String typeName) {
|
||||
if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() / 2 < xsFacets.minLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
byte[] decodedVal = Base64.decode(enumVal);
|
||||
if (decodedVal != null && (new String(decodedVal)).length() < xsFacets.minLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() < xsFacets.minLength) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_MINLENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // checkEnumerationAndMinLengthInconsistency
|
||||
|
||||
/*
|
||||
* Check whether values of xs:length and xs:enumeration are consistent. Report a warning message if they are not.
|
||||
*/
|
||||
private void checkEnumerationAndLengthInconsistency(XSSimpleType baseValidator, List<String> enumData, Element contextNode, String typeName) {
|
||||
if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_HEXBINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() / 2 != xsFacets.length) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(baseValidator.getNamespace()) &&
|
||||
SchemaSymbols.ATTVAL_BASE64BINARY.equals(baseValidator.getName())) {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
byte[] decodedVal = Base64.decode(enumVal);
|
||||
if (decodedVal != null && (new String(decodedVal)).length() != xsFacets.length) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (int enumIdx = 0; enumIdx < enumData.size(); enumIdx++) {
|
||||
String enumVal = (enumData.get(enumIdx));
|
||||
if (enumVal.length() != xsFacets.length) {
|
||||
reportSchemaWarning("FacetsContradict", new Object[]{enumVal, SchemaSymbols.ELT_LENGTH, typeName}, contextNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // checkEnumerationAndLengthInconsistency
|
||||
|
||||
|
||||
// return whether QName/NOTATION is part of the given type
|
||||
private boolean containsQName(XSSimpleType type) {
|
||||
@ -724,6 +866,10 @@ abstract class XSDAbstractTraverser {
|
||||
fSchemaHandler.reportSchemaError(key, args, ele);
|
||||
}
|
||||
|
||||
void reportSchemaWarning (String key, Object[] args, Element ele) {
|
||||
fSchemaHandler.reportSchemaWarning(key, args, ele);
|
||||
}
|
||||
|
||||
/**
|
||||
* Element/Attribute traversers call this method to check whether
|
||||
* the type is NOTATION without enumeration facet
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
@ -62,7 +62,7 @@ import org.w3c.dom.Element;
|
||||
* </complexType>
|
||||
*
|
||||
* @xerces.internal
|
||||
*
|
||||
* @LastModified: Apr 2019
|
||||
*/
|
||||
|
||||
class XSDComplexTypeTraverser extends XSDAbstractParticleTraverser {
|
||||
@ -574,7 +574,7 @@ class XSDComplexTypeTraverser extends XSDAbstractParticleTraverser {
|
||||
short fixedFacets = 0 ;
|
||||
|
||||
if (simpleContent!=null) {
|
||||
FacetInfo fi = traverseFacets(simpleContent, baseValidator, schemaDoc);
|
||||
FacetInfo fi = traverseFacets(simpleContent, fComplexTypeDecl, baseValidator, schemaDoc);
|
||||
attrNode = fi.nodeAfterFacets;
|
||||
facetData = fi.facetdata;
|
||||
presentFacets = fi.fPresentFacets;
|
||||
@ -1193,9 +1193,6 @@ class XSDComplexTypeTraverser extends XSDAbstractParticleTraverser {
|
||||
// REVISIT: do we need to remove all attribute uses already added into
|
||||
// the attribute group? maybe it's ok to leave them there. -SG
|
||||
fAttrGrp.fAttributeWC = getErrorWildcard();
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
private void contentBackup() {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
@ -60,6 +60,7 @@ import com.sun.org.apache.xerces.internal.util.StAXLocationWrapper;
|
||||
import com.sun.org.apache.xerces.internal.util.SymbolHash;
|
||||
import com.sun.org.apache.xerces.internal.util.SymbolTable;
|
||||
import com.sun.org.apache.xerces.internal.util.URI.MalformedURIException;
|
||||
import com.sun.org.apache.xerces.internal.util.XMLChar;
|
||||
import com.sun.org.apache.xerces.internal.util.XMLSymbols;
|
||||
import com.sun.org.apache.xerces.internal.utils.XMLSecurityManager;
|
||||
import com.sun.org.apache.xerces.internal.utils.XMLSecurityPropertyManager;
|
||||
@ -129,7 +130,7 @@ import org.xml.sax.XMLReader;
|
||||
* @author Neil Graham, IBM
|
||||
* @author Pavani Mukthipudi, Sun Microsystems
|
||||
*
|
||||
* @LastModified: Nov 2017
|
||||
* @LastModified: Apr 2019
|
||||
*/
|
||||
@SuppressWarnings("deprecation") //org.xml.sax.helpers.XMLReaderFactory
|
||||
public class XSDHandler {
|
||||
@ -591,10 +592,27 @@ public class XSDHandler {
|
||||
} //is instanceof XMLInputSource
|
||||
|
||||
if (schemaRoot == null) {
|
||||
// something went wrong right off the hop
|
||||
if (is instanceof XSInputSource) {
|
||||
return fGrammarBucket.getGrammar(desc.getTargetNamespace());
|
||||
// Need to return a grammar. If the XSInputSource has a list
|
||||
// of grammar objects, then get the first one and return it.
|
||||
// If it has a list of components, then get the grammar that
|
||||
// contains the first component and return it.
|
||||
// If we return null, the XMLSchemaLoader will think nothing
|
||||
// was loaded, and will not try to put the grammar objects
|
||||
// into the grammar pool.
|
||||
XSInputSource xsinput = (XSInputSource)is;
|
||||
SchemaGrammar[] grammars = xsinput.getGrammars();
|
||||
if (grammars != null && grammars.length > 0) {
|
||||
grammar = fGrammarBucket.getGrammar(grammars[0].getTargetNamespace());
|
||||
}
|
||||
else {
|
||||
XSObject[] components = xsinput.getComponents();
|
||||
if (components != null && components.length > 0) {
|
||||
grammar = fGrammarBucket.getGrammar(components[0].getNamespace());
|
||||
}
|
||||
}
|
||||
}
|
||||
// something went wrong right off the hop
|
||||
return grammar;
|
||||
}
|
||||
|
||||
@ -1299,6 +1317,7 @@ public class XSDHandler {
|
||||
String qName = currSchemaDoc.fTargetNamespace == null ?
|
||||
","+lName:
|
||||
currSchemaDoc.fTargetNamespace +","+lName;
|
||||
qName = XMLChar.trim(qName);
|
||||
String componentType = DOMUtil.getLocalName(redefineComp);
|
||||
if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {
|
||||
checkForDuplicateNames(qName, ATTRIBUTEGROUP_TYPE, fUnparsedAttributeGroupRegistry, fUnparsedAttributeGroupRegistrySub, redefineComp, currSchemaDoc);
|
||||
@ -1343,6 +1362,7 @@ public class XSDHandler {
|
||||
String qName = currSchemaDoc.fTargetNamespace == null?
|
||||
","+lName:
|
||||
currSchemaDoc.fTargetNamespace +","+lName;
|
||||
qName = XMLChar.trim(qName);
|
||||
String componentType = DOMUtil.getLocalName(globalComp);
|
||||
|
||||
if (componentType.equals(SchemaSymbols.ELT_ATTRIBUTE)) {
|
||||
@ -2466,9 +2486,15 @@ public class XSDHandler {
|
||||
return getSchemaDocument0(key, schemaId, schemaElement);
|
||||
}
|
||||
catch (XMLStreamException e) {
|
||||
StAXLocationWrapper slw = new StAXLocationWrapper();
|
||||
slw.setLocation(e.getLocation());
|
||||
throw new XMLParseException(slw, e.getMessage(), e);
|
||||
Throwable t = e.getNestedException();
|
||||
if (t instanceof IOException) {
|
||||
exception = (IOException) t;
|
||||
}
|
||||
else {
|
||||
StAXLocationWrapper slw = new StAXLocationWrapper();
|
||||
slw.setLocation(e.getLocation());
|
||||
throw new XMLParseException(slw, e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
catch (IOException e) {
|
||||
exception = e;
|
||||
@ -2741,16 +2767,29 @@ public class XSDHandler {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void addNewImportedGrammars(SchemaGrammar srcGrammar, SchemaGrammar dstGrammar) {
|
||||
final ArrayList<SchemaGrammar> igs1 = (ArrayList<SchemaGrammar>)srcGrammar.getImportedGrammars();
|
||||
if (igs1 != null) {
|
||||
ArrayList<SchemaGrammar> igs2 = (ArrayList<SchemaGrammar>)dstGrammar.getImportedGrammars();
|
||||
|
||||
if (igs2 == null) {
|
||||
igs2 = (ArrayList<SchemaGrammar>)igs1.clone();
|
||||
dstGrammar.setImportedGrammars(igs2);
|
||||
final ArrayList<SchemaGrammar> src = (ArrayList<SchemaGrammar>)srcGrammar.getImportedGrammars();
|
||||
if (src != null) {
|
||||
ArrayList<SchemaGrammar> dst = (ArrayList<SchemaGrammar>)dstGrammar.getImportedGrammars();
|
||||
if (dst == null) {
|
||||
dst = new ArrayList<>();
|
||||
dstGrammar.setImportedGrammars(dst);
|
||||
}
|
||||
else {
|
||||
updateImportList(igs1, igs2);
|
||||
for (SchemaGrammar sg :src) {
|
||||
// Can't use the object from the source import list directly.
|
||||
// It's possible there is already a grammar with the same
|
||||
// namespace in the bucket but a different object.
|
||||
// This can happen if the bucket has grammar A1, and we try
|
||||
// to add B and A2, where A2 imports B. When B is added, we
|
||||
// create a new object B' and store it in the bucket. Then we
|
||||
// try to merge A2 and A1. We can't use B. Need to get B' from
|
||||
// the bucket and store it in A's import list.
|
||||
SchemaGrammar sg1 = fGrammarBucket.getGrammar(sg.getTargetNamespace());
|
||||
if (sg1 != null) {
|
||||
sg = sg1;
|
||||
}
|
||||
if (!containedImportedGrammar(dst, sg)) {
|
||||
dst.add(sg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3162,7 +3201,7 @@ public class XSDHandler {
|
||||
|
||||
private void addRelatedType(XSTypeDefinition type, List<XSObject> componentList, String namespace, Map<String, List<String>> dependencies) {
|
||||
if (!type.getAnonymous()) {
|
||||
if (!type.getNamespace().equals(SchemaSymbols.URI_SCHEMAFORSCHEMA)) { //REVISIT - do we use == instead
|
||||
if (!SchemaSymbols.URI_SCHEMAFORSCHEMA.equals(type.getNamespace())) { //REVISIT - do we use == instead
|
||||
if (!componentList.contains(type)) {
|
||||
final List<String> importedNamespaces = findDependentNamespaces(namespace, dependencies);
|
||||
addNamespaceDependency(namespace, type.getNamespace(), importedNamespaces);
|
||||
|
||||
@ -395,7 +395,7 @@ class XSDSimpleTypeTraverser extends XSDAbstractTraverser {
|
||||
}
|
||||
// now traverse facets, if it's derived by restriction
|
||||
if (restriction && content != null) {
|
||||
FacetInfo fi = traverseFacets(content, baseValidator, schemaDoc);
|
||||
FacetInfo fi = traverseFacets(content, newDecl, baseValidator, schemaDoc);
|
||||
content = fi.nodeAfterFacets;
|
||||
|
||||
try {
|
||||
|
||||
@ -2914,7 +2914,7 @@ public class Attr extends JCTree.Visitor {
|
||||
public void visitLambda(JCLambda that) {
|
||||
// or lambda expressions!
|
||||
}
|
||||
}.scan(tree);
|
||||
}.scan(tree.body);
|
||||
}
|
||||
|
||||
Types.MapVisitor<DiagnosticPosition> targetChecker = new Types.MapVisitor<DiagnosticPosition>() {
|
||||
|
||||
@ -26,8 +26,14 @@
|
||||
* @test
|
||||
* @summary Test extended ArrayIndexOutOfBoundsException message. The
|
||||
* message lists information about the array and the indexes involved.
|
||||
* @compile ArrayIndexOutOfBoundsExceptionTest.java
|
||||
* @comment This will run in 'normal' mode when Graal is not enabled, else
|
||||
* Graal mode.
|
||||
* @run testng ArrayIndexOutOfBoundsExceptionTest
|
||||
*/
|
||||
/**
|
||||
* @test
|
||||
* @requires !vm.graal.enabled
|
||||
* @comment These test C1 and C2 so make no sense when Graal is enabled.
|
||||
* @run testng/othervm -Xcomp -XX:-TieredCompilation ArrayIndexOutOfBoundsExceptionTest
|
||||
* @run testng/othervm -Xcomp -XX:TieredStopAtLevel=1 ArrayIndexOutOfBoundsExceptionTest
|
||||
*/
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,23 +24,70 @@
|
||||
package validation;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Listeners;
|
||||
import org.testng.annotations.Test;
|
||||
import org.xml.sax.ErrorHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8149915 8222991
|
||||
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
|
||||
* @run testng/othervm -DrunSecMngr=true validation.SchemaTest
|
||||
* @run testng/othervm validation.SchemaTest
|
||||
* @summary Test Schema creation
|
||||
* @bug 8149915
|
||||
*/
|
||||
@Listeners({jaxp.library.FilePolicy.class})
|
||||
public class SchemaTest {
|
||||
/**
|
||||
* Verifies that an over-the-limit value of an enumeration is caught as a
|
||||
* warning.
|
||||
* @throws Exception if the test fails
|
||||
*/
|
||||
@Test
|
||||
public void testSchema() throws Exception {
|
||||
String xsd = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n" +
|
||||
" <xsd:simpleType name=\"PaymentStatus\">\n" +
|
||||
" <xsd:restriction base=\"xsd:string\">\n" +
|
||||
" <xsd:maxLength value=\"15\"/>\n" +
|
||||
" <xsd:enumeration value=\"AWAIT_PAY_INFO\"/>\n" +
|
||||
" <xsd:enumeration value=\"AWAIT_AUTH\"/>\n" +
|
||||
" <xsd:enumeration value=\"REQUESTED_AUTH\"/>\n" +
|
||||
" <xsd:enumeration value=\"REQUESTED_CHARGE\"/>\n" +
|
||||
" <xsd:enumeration value=\"PAID\"/>\n" +
|
||||
" </xsd:restriction>\n" +
|
||||
" </xsd:simpleType> \n" +
|
||||
"</xsd:schema>";
|
||||
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
||||
final List<SAXParseException> exceptions = new ArrayList<>();
|
||||
|
||||
factory.setErrorHandler(new ErrorHandler()
|
||||
{
|
||||
@Override
|
||||
public void warning(SAXParseException exception) throws SAXException
|
||||
{
|
||||
exceptions.add(exception);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fatalError(SAXParseException exception) throws SAXException
|
||||
{}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException exception) throws SAXException
|
||||
{}
|
||||
});
|
||||
factory.newSchema(new StreamSource(new StringReader(xsd)));
|
||||
Assert.assertTrue(exceptions.get(0).toString().contains("FacetsContradict"),
|
||||
"Report warning when the maxLength limit is exceeded in an enumeration");
|
||||
}
|
||||
|
||||
/*
|
||||
* @bug 8149915
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,8 @@
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.concurrent.Phaser;
|
||||
@ -42,7 +44,9 @@ public class Streams {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
try (ServerSocket ss = new ServerSocket(0)) {
|
||||
try (ServerSocket ss = new ServerSocket()) {
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
ss.bind(new InetSocketAddress(loopback, 0));
|
||||
runTest(OutputStreamGetter.class, ss);
|
||||
runTest(InputStreamGetter.class, ss);
|
||||
}
|
||||
@ -55,9 +59,12 @@ public class Streams {
|
||||
throws Exception
|
||||
{
|
||||
final int port = ss.getLocalPort();
|
||||
final InetAddress address = ss.getInetAddress();
|
||||
Socket[] sockets = new Socket[NUM_THREADS];
|
||||
for (int i=0; i<NUM_THREADS; i++) {
|
||||
sockets[i] = new Socket("localhost", port);
|
||||
sockets[i] = address.isAnyLocalAddress()
|
||||
? new Socket("localhost", port)
|
||||
: new Socket(address, port);
|
||||
try (Socket socket = ss.accept()) {}
|
||||
}
|
||||
|
||||
|
||||
86
test/jdk/javax/security/sasl/Sasl/DisabledMechanisms.java
Normal file
86
test/jdk/javax/security/sasl/Sasl/DisabledMechanisms.java
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8200400
|
||||
* @modules java.security.sasl
|
||||
* @library /test/lib
|
||||
* @run main/othervm DisabledMechanisms
|
||||
* DIGEST-MD5 DIGEST-MD5
|
||||
* @run main/othervm -DdisabledMechanisms= DisabledMechanisms
|
||||
* DIGEST-MD5 DIGEST-MD5
|
||||
* @run main/othervm -DdisabledMechanisms=DIGEST-MD5,NTLM DisabledMechanisms
|
||||
* null null
|
||||
* @run main/othervm -DdisabledMechanisms=DIGEST-MD5 DisabledMechanisms
|
||||
* NTLM null
|
||||
* @run main/othervm -DdisabledMechanisms=NTLM DisabledMechanisms
|
||||
* DIGEST-MD5 DIGEST-MD5
|
||||
*/
|
||||
|
||||
import java.security.Security;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import javax.security.auth.callback.PasswordCallback;
|
||||
import javax.security.sasl.Sasl;
|
||||
import javax.security.sasl.SaslClient;
|
||||
import javax.security.sasl.SaslServer;
|
||||
import javax.security.auth.callback.Callback;
|
||||
import javax.security.auth.callback.CallbackHandler;
|
||||
|
||||
import jdk.test.lib.Asserts;
|
||||
|
||||
public class DisabledMechanisms {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
String authorizationId = "username";
|
||||
String protocol = "ldap";
|
||||
String serverName = "server1";
|
||||
Map props = Collections.emptyMap();
|
||||
|
||||
String disabled = System.getProperty("disabledMechanisms");
|
||||
if (disabled != null) {
|
||||
Security.setProperty("jdk.sasl.disabledMechanisms", disabled);
|
||||
}
|
||||
|
||||
CallbackHandler callbackHandler = callbacks -> {
|
||||
for (Callback cb : callbacks) {
|
||||
if (cb instanceof PasswordCallback) {
|
||||
((PasswordCallback) cb).setPassword("password".toCharArray());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
SaslClient client = Sasl.createSaslClient(
|
||||
new String[]{"DIGEST-MD5", "NTLM"}, authorizationId,
|
||||
protocol, serverName, props, callbackHandler);
|
||||
Asserts.assertEQ(client == null ? null : client.getMechanismName(),
|
||||
args[0].equals("null") ? null : args[0]);
|
||||
|
||||
SaslServer server = Sasl.createSaslServer(
|
||||
"DIGEST-MD5", protocol, serverName, props, callbackHandler);
|
||||
Asserts.assertEQ(server == null ? null : server.getMechanismName(),
|
||||
args[1].equals("null") ? null : args[1]);
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -253,7 +253,7 @@ public class ValidatePathWithParams {
|
||||
}
|
||||
|
||||
// Generate CertPath with certsToValidate
|
||||
ArrayList<X509Certificate> certs = new ArrayList();
|
||||
ArrayList<X509Certificate> certs = new ArrayList<>();
|
||||
for (String cert : certsToValidate) {
|
||||
if (cert != null) {
|
||||
certs.add(getCertificate(cert));
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,17 +32,19 @@
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.InetAddress;
|
||||
import java.net.URL;
|
||||
|
||||
public class FtpURLConnectionLeak {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
FtpServer server = new FtpServer(0);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
FtpServer server = new FtpServer(loopback, 0);
|
||||
server.setFileSystemHandler(new CustomFileSystemHandler("/"));
|
||||
server.setAuthHandler(new MyAuthHandler());
|
||||
int port = server.getLocalPort();
|
||||
String authority = server.getAuthority();
|
||||
server.start();
|
||||
URL url = new URL("ftp://localhost:" + port + "/filedoesNotExist.txt");
|
||||
URL url = new URL("ftp://" + authority + "/filedoesNotExist.txt");
|
||||
try (server) {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
try {
|
||||
|
||||
@ -96,10 +96,11 @@ public class AuthHeaderTest implements HttpCallback {
|
||||
public static void main (String[] args) throws Exception {
|
||||
MyAuthenticator auth = new MyAuthenticator ();
|
||||
Authenticator.setDefault (auth);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
try {
|
||||
server = new TestHttpServer (new AuthHeaderTest(), 1, 10, 0);
|
||||
System.out.println ("Server: listening on port: " + server.getLocalPort());
|
||||
client ("http://localhost:"+server.getLocalPort()+"/d1/foo.html");
|
||||
server = new TestHttpServer (new AuthHeaderTest(), 1, 10, loopback, 0);
|
||||
System.out.println ("Server: listening on port: " + server.getAuthority());
|
||||
client ("http://" + server.getAuthority() + "/d1/foo.html");
|
||||
} catch (Exception e) {
|
||||
if (server != null) {
|
||||
server.terminate();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,6 +54,16 @@ public class FtpServer extends Thread implements AutoCloseable {
|
||||
private boolean done = false;
|
||||
private ArrayList<FtpCommandHandler> clients = new ArrayList<FtpCommandHandler>();
|
||||
|
||||
/**
|
||||
* Creates an instance of an FTP server which will listen for incoming
|
||||
* connections on the specified port. If the port is set to 0, it will
|
||||
* automatically select an available ephemeral port.
|
||||
*/
|
||||
public FtpServer(InetAddress addr, int port) throws IOException {
|
||||
listener = new ServerSocket();
|
||||
listener.bind(new InetSocketAddress(addr, port));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instance of an FTP server which will listen for incoming
|
||||
* connections on the specified port. If the port is set to 0, it will
|
||||
@ -100,6 +110,17 @@ public class FtpServer extends Thread implements AutoCloseable {
|
||||
return listener.getLocalPort();
|
||||
}
|
||||
|
||||
public String getAuthority() {
|
||||
InetAddress address = listener.getInetAddress();
|
||||
String hostaddr = address.isAnyLocalAddress()
|
||||
? "localhost" : address.getHostAddress();
|
||||
if (hostaddr.indexOf(':') > -1) {
|
||||
hostaddr = "[" + hostaddr + "]";
|
||||
}
|
||||
return hostaddr + ":" + getLocalPort();
|
||||
}
|
||||
|
||||
|
||||
void addClient(Socket client) {
|
||||
FtpCommandHandler h = new FtpCommandHandler(client, this);
|
||||
h.setHandlers(fsh, auth);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 4333920
|
||||
* @modules jdk.httpserver
|
||||
* @library /test/lib
|
||||
* @run main ChunkedEncodingTest
|
||||
* @summary ChunkedEncodingTest unit test
|
||||
*/
|
||||
@ -36,6 +37,7 @@ import com.sun.net.httpserver.HttpServer;
|
||||
import com.sun.net.httpserver.HttpHandler;
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import static java.lang.System.out;
|
||||
import jdk.test.lib.net.URIBuilder;
|
||||
|
||||
public class ChunkedEncodingTest{
|
||||
private static MessageDigest serverDigest, clientDigest;
|
||||
@ -61,7 +63,13 @@ public class ChunkedEncodingTest{
|
||||
|
||||
int port = server.getAddress().getPort();
|
||||
out.println ("Server listening on port: " + port);
|
||||
client("http://localhost:" + port + "/chunked/");
|
||||
String url = URIBuilder.newBuilder()
|
||||
.scheme("http")
|
||||
.host(server.getAddress().getAddress())
|
||||
.port(port)
|
||||
.path("/chunked/")
|
||||
.build().toString();
|
||||
client(url);
|
||||
|
||||
if (!MessageDigest.isEqual(clientMac, serverMac)) {
|
||||
throw new RuntimeException(
|
||||
@ -83,7 +91,8 @@ public class ChunkedEncodingTest{
|
||||
* Http Server
|
||||
*/
|
||||
static HttpServer startHttpServer() throws IOException {
|
||||
HttpServer httpServer = HttpServer.create(new InetSocketAddress(0), 0);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
HttpServer httpServer = HttpServer.create(new InetSocketAddress(loopback, 0), 0);
|
||||
HttpHandler httpHandler = new SimpleHandler();
|
||||
httpServer.createContext("/chunked/", httpHandler);
|
||||
httpServer.start();
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,6 +27,7 @@
|
||||
* @summary ChunkedEncoding unit test; MeteredStream/ProgressData problem
|
||||
* @modules java.base/sun.net
|
||||
* jdk.httpserver
|
||||
* @library /test/lib
|
||||
* @run main ChunkedEncodingWithProgressMonitorTest
|
||||
*/
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 6446990
|
||||
* @modules jdk.httpserver
|
||||
* @library /test/lib
|
||||
* @run main/othervm TestAvailable
|
||||
* @summary HttpURLConnection#available() reads more and more data into memory
|
||||
*/
|
||||
@ -35,6 +36,7 @@ import java.io.*;
|
||||
import com.sun.net.httpserver.*;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import jdk.test.lib.net.URIBuilder;
|
||||
|
||||
public class TestAvailable
|
||||
{
|
||||
@ -60,7 +62,13 @@ public class TestAvailable
|
||||
try {
|
||||
InetSocketAddress address = httpServer.getAddress();
|
||||
|
||||
URL url = new URL("http://localhost:" + address.getPort() + "/testAvailable/");
|
||||
URL url = URIBuilder.newBuilder()
|
||||
.scheme("http")
|
||||
.host(address.getAddress())
|
||||
.port(address.getPort())
|
||||
.path("/testAvailable/")
|
||||
.toURLUnchecked();
|
||||
|
||||
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
|
||||
|
||||
uc.setDoOutput(true);
|
||||
@ -102,7 +110,9 @@ public class TestAvailable
|
||||
* Http Server
|
||||
*/
|
||||
public void startHttpServer() throws IOException {
|
||||
httpServer = com.sun.net.httpserver.HttpServer.create(new InetSocketAddress(0), 0);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
InetSocketAddress sockaddr = new InetSocketAddress(loopback, 0);
|
||||
httpServer = com.sun.net.httpserver.HttpServer.create(sockaddr, 0);
|
||||
|
||||
// create HttpServer context
|
||||
HttpContext ctx = httpServer.createContext("/testAvailable/", new MyHandler());
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,8 +84,8 @@ public class MultiThreadTest extends Thread {
|
||||
byte[] b;
|
||||
int requests;
|
||||
|
||||
MultiThreadTest(int port, int requests) throws Exception {
|
||||
uri = "http://localhost:" + port + "/foo.html";
|
||||
MultiThreadTest(String authority, int requests) throws Exception {
|
||||
uri = "http://" + authority + "/foo.html";
|
||||
|
||||
b = new byte [256];
|
||||
this.requests = requests;
|
||||
@ -134,14 +134,16 @@ public class MultiThreadTest extends Thread {
|
||||
}
|
||||
|
||||
/* start the server */
|
||||
ServerSocket ss = new ServerSocket(0);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
ServerSocket ss = new ServerSocket();
|
||||
ss.bind(new InetSocketAddress(loopback, 0));
|
||||
Server svr = new Server(ss);
|
||||
svr.start();
|
||||
|
||||
Object lock = MultiThreadTest.getLock();
|
||||
synchronized (lock) {
|
||||
for (int i=0; i<threads; i++) {
|
||||
MultiThreadTest t = new MultiThreadTest(ss.getLocalPort(), requests);
|
||||
MultiThreadTest t = new MultiThreadTest(svr.getAuthority(), requests);
|
||||
t.start ();
|
||||
}
|
||||
try {
|
||||
@ -185,6 +187,16 @@ public class MultiThreadTest extends Thread {
|
||||
this.ss = ss;
|
||||
}
|
||||
|
||||
public String getAuthority() {
|
||||
InetAddress address = ss.getInetAddress();
|
||||
String hostaddr = address.isAnyLocalAddress()
|
||||
? "localhost" : address.getHostAddress();
|
||||
if (hostaddr.indexOf(':') > -1) {
|
||||
hostaddr = "[" + hostaddr + "]";
|
||||
}
|
||||
return hostaddr + ":" + ss.getLocalPort();
|
||||
}
|
||||
|
||||
public Queue<Worker> workers() {
|
||||
return workers;
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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.io.InputStreamReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.Authenticator;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.PasswordAuthentication;
|
||||
import java.net.URL;
|
||||
@ -54,7 +55,6 @@ import java.util.List;
|
||||
*/
|
||||
public class DigestAuth {
|
||||
|
||||
static final String LOCALHOST = "localhost";
|
||||
static final String EXPECT_FAILURE = null;
|
||||
static final String EXPECT_DIGEST = "Digest";
|
||||
static final String REALM = "testrealm@host.com";
|
||||
@ -119,8 +119,7 @@ public class DigestAuth {
|
||||
AuthenticatorImpl auth = new AuthenticatorImpl();
|
||||
Authenticator.setDefault(auth);
|
||||
|
||||
String url = String.format("http://%s:%d/test/",
|
||||
LOCALHOST, server.getPort());
|
||||
String url = String.format("http://%s/test/", server.getAuthority());
|
||||
|
||||
boolean success = true;
|
||||
switch (testcase) {
|
||||
@ -322,6 +321,16 @@ public class DigestAuth {
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
public String getAuthority() {
|
||||
InetAddress address = server.getAddress().getAddress();
|
||||
String hostaddr = address.isAnyLocalAddress()
|
||||
? "localhost" : address.getHostAddress();
|
||||
if (hostaddr.indexOf(':') > -1) {
|
||||
hostaddr = "[" + hostaddr + "]";
|
||||
}
|
||||
return hostaddr + ":" + getPort();
|
||||
}
|
||||
|
||||
void setWWWAuthHeader(String wwwAuthHeader) {
|
||||
this.wwwAuthHeader = wwwAuthHeader;
|
||||
}
|
||||
@ -331,8 +340,9 @@ public class DigestAuth {
|
||||
}
|
||||
|
||||
static LocalHttpServer startServer() throws IOException {
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
HttpServer httpServer = HttpServer.create(
|
||||
new InetSocketAddress(0), 0);
|
||||
new InetSocketAddress(loopback, 0), 0);
|
||||
LocalHttpServer localHttpServer = new LocalHttpServer(httpServer);
|
||||
localHttpServer.start();
|
||||
|
||||
@ -342,7 +352,7 @@ public class DigestAuth {
|
||||
void start() {
|
||||
server.createContext("/test", this);
|
||||
server.start();
|
||||
System.out.println("HttpServer: started on port " + getPort());
|
||||
System.out.println("HttpServer: started on port " + getAuthority());
|
||||
}
|
||||
|
||||
void stop() {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -43,14 +43,15 @@ public class test {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
TestCache.reset();
|
||||
HttpServer s = HttpServer.create (new InetSocketAddress(0), 10);
|
||||
s.createContext ("/", new HttpHandler () {
|
||||
public void handle (HttpExchange e) {
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
HttpServer s = HttpServer.create(new InetSocketAddress(loopback, 0), 10);
|
||||
s.createContext("/", new HttpHandler() {
|
||||
public void handle(HttpExchange e) {
|
||||
try {
|
||||
byte[] buf = new byte [LEN];
|
||||
OutputStream o = e.getResponseBody();
|
||||
e.sendResponseHeaders(200, LEN);
|
||||
o.write (buf);
|
||||
o.write(buf);
|
||||
e.close();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
@ -91,10 +92,10 @@ public class test {
|
||||
}
|
||||
|
||||
if (TestCache.fail) {
|
||||
System.out.println ("TEST FAILED");
|
||||
throw new RuntimeException ();
|
||||
System.out.println("TEST FAILED");
|
||||
throw new RuntimeException();
|
||||
} else {
|
||||
System.out.println ("TEST OK");
|
||||
System.out.println("TEST OK");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 6189206
|
||||
* @modules java.base/sun.net.www
|
||||
* @library /test/lib
|
||||
* @run main/othervm -Dhttp.keepAlive=false CloseOptionHeader
|
||||
* @summary HTTP client should set "Connection: close" header in request when keepalive is disabled
|
||||
*/
|
||||
@ -33,7 +34,7 @@ import java.net.*;
|
||||
import java.util.*;
|
||||
import java.io.*;
|
||||
import sun.net.www.MessageHeader;
|
||||
|
||||
import jdk.test.lib.net.URIBuilder;
|
||||
|
||||
public class CloseOptionHeader implements Runnable {
|
||||
static ServerSocket ss;
|
||||
@ -79,14 +80,20 @@ public class CloseOptionHeader implements Runnable {
|
||||
Thread tester = new Thread(new CloseOptionHeader());
|
||||
|
||||
/* start the server */
|
||||
ss = new ServerSocket(0);
|
||||
InetAddress loopback = InetAddress.getLoopbackAddress();
|
||||
ss = new ServerSocket();
|
||||
ss.bind(new InetSocketAddress(loopback, 0));
|
||||
tester.start();
|
||||
|
||||
/* connect to the server just started
|
||||
* server then check the request to see whether
|
||||
* there is a close connection option header in it
|
||||
*/
|
||||
URL url = new URL("http://localhost:" + ss.getLocalPort());
|
||||
URL url = URIBuilder.newBuilder()
|
||||
.scheme("http")
|
||||
.host(ss.getInetAddress())
|
||||
.port(ss.getLocalPort())
|
||||
.toURL();
|
||||
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
|
||||
huc.connect();
|
||||
huc.getResponseCode();
|
||||
|
||||
@ -32,8 +32,15 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.security.KeyStore;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.cert.*;
|
||||
import java.util.*;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateExpiredException;
|
||||
import java.security.cert.CertificateNotYetValidException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
||||
public class VerifyCACerts {
|
||||
|
||||
@ -45,8 +52,8 @@ public class VerifyCACerts {
|
||||
private static final int COUNT = 92;
|
||||
|
||||
// map of cert alias to SHA-256 fingerprint
|
||||
private static final Map<String, String> FINGERPRINT_MAP
|
||||
= new HashMap<String, String>() {
|
||||
@SuppressWarnings("serial")
|
||||
private static final Map<String, String> FINGERPRINT_MAP = new HashMap<>() {
|
||||
{
|
||||
put("actalisauthenticationrootca [jdk]",
|
||||
"55:92:60:84:EC:96:3A:64:B9:6E:2A:BE:01:CE:0B:A8:6A:64:FB:FE:BC:C7:AA:B5:AF:C1:55:B3:7F:D7:60:66");
|
||||
@ -237,6 +244,7 @@ public class VerifyCACerts {
|
||||
|
||||
// Exception list to 90 days expiry policy
|
||||
// No error will be reported if certificate in this list expires
|
||||
@SuppressWarnings("serial")
|
||||
private static final HashSet<String> EXPIRY_EXC_ENTRIES = new HashSet<>() {
|
||||
{
|
||||
// Valid until: Sat Jul 06 19:59:59 EDT 2019
|
||||
|
||||
162
test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java
Normal file
162
test/jdk/sun/security/x509/URICertStore/CRLReadTimeout.java
Normal file
@ -0,0 +1,162 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8191808
|
||||
* @summary check that CRL download is interrupted if it takes too long
|
||||
* @library /test/lib
|
||||
* @run main/othervm -Dcom.sun.security.crl.readtimeout=1 CRLReadTimeout
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.security.KeyStore;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.CertPath;
|
||||
import java.security.cert.CertPathValidator;
|
||||
import java.security.cert.CertPathValidatorException;
|
||||
import java.security.cert.PKIXParameters;
|
||||
import java.security.cert.PKIXRevocationChecker;
|
||||
import static java.security.cert.PKIXRevocationChecker.Option.*;
|
||||
import java.security.cert.TrustAnchor;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import com.sun.net.httpserver.HttpServer;
|
||||
|
||||
import jdk.test.lib.SecurityTools;
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
|
||||
public class CRLReadTimeout {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
String timeout = System.getProperty("com.sun.security.crl.readtimeout");
|
||||
if (timeout == null) {
|
||||
timeout = "15";
|
||||
}
|
||||
System.out.println("Testing timeout of " + timeout + " seconds");
|
||||
|
||||
CrlHttpServer crlServer = new CrlHttpServer(Integer.parseInt(timeout));
|
||||
try {
|
||||
crlServer.start();
|
||||
testTimeout(crlServer.getPort());
|
||||
} finally {
|
||||
crlServer.stop();
|
||||
}
|
||||
}
|
||||
|
||||
private static void testTimeout(int port) throws Exception {
|
||||
|
||||
// create certificate chain with two certs, root and end-entity
|
||||
keytool("-alias duke -dname CN=duke -genkey -keyalg RSA");
|
||||
keytool("-alias root -dname CN=root -genkey -keyalg RSA");
|
||||
keytool("-certreq -alias duke -file duke.req");
|
||||
// set CRL URI to local server
|
||||
keytool("-gencert -infile duke.req -alias root -rfc -outfile duke.cert "
|
||||
+ "-ext crl=uri:http://localhost:" + port + "/crl");
|
||||
keytool("-importcert -file duke.cert -alias duke");
|
||||
|
||||
KeyStore ks = KeyStore.getInstance(new File("ks"),
|
||||
"changeit".toCharArray());
|
||||
X509Certificate cert = (X509Certificate)ks.getCertificate("duke");
|
||||
X509Certificate root = (X509Certificate)ks.getCertificate("root");
|
||||
|
||||
// validate chain
|
||||
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
|
||||
PKIXRevocationChecker prc =
|
||||
(PKIXRevocationChecker)cpv.getRevocationChecker();
|
||||
prc.setOptions(EnumSet.of(PREFER_CRLS, NO_FALLBACK, SOFT_FAIL));
|
||||
PKIXParameters params =
|
||||
new PKIXParameters(Set.of(new TrustAnchor(root, null)));
|
||||
params.addCertPathChecker(prc);
|
||||
CertificateFactory cf = CertificateFactory.getInstance("X.509");
|
||||
CertPath cp = cf.generateCertPath(List.of(cert));
|
||||
cpv.validate(cp, params);
|
||||
|
||||
// unwrap soft fail exceptions and check for SocketTimeoutException
|
||||
boolean expected = false;
|
||||
for (CertPathValidatorException softFail:prc.getSoftFailExceptions()) {
|
||||
Throwable cause = softFail.getCause();
|
||||
while (cause != null) {
|
||||
if (cause instanceof SocketTimeoutException) {
|
||||
expected = true;
|
||||
break;
|
||||
}
|
||||
cause = cause.getCause();
|
||||
}
|
||||
if (expected) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!expected) {
|
||||
throw new Exception("SocketTimeoutException not thrown");
|
||||
}
|
||||
}
|
||||
|
||||
private static OutputAnalyzer keytool(String cmd) throws Exception {
|
||||
return SecurityTools.keytool("-storepass changeit "
|
||||
+ "-keystore ks " + cmd);
|
||||
}
|
||||
|
||||
private static class CrlHttpServer {
|
||||
|
||||
private final HttpServer server;
|
||||
private final int timeout;
|
||||
|
||||
public CrlHttpServer(int timeout) throws IOException {
|
||||
server = HttpServer.create();
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
public void start() throws IOException {
|
||||
server.bind(new InetSocketAddress(0), 0);
|
||||
server.createContext("/", t -> {
|
||||
try (InputStream is = t.getRequestBody()) {
|
||||
is.readAllBytes();
|
||||
}
|
||||
try {
|
||||
// sleep for 2 seconds longer to force timeout
|
||||
Thread.sleep((timeout + 2)*1000);
|
||||
} catch (InterruptedException ie) {
|
||||
throw new IOException(ie);
|
||||
}
|
||||
});
|
||||
server.setExecutor(null);
|
||||
server.start();
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
server.stop(0);
|
||||
}
|
||||
|
||||
int getPort() {
|
||||
return server.getAddress().getPort();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 8222251
|
||||
* @summary preflow visitor is not visiting lambda expressions
|
||||
* @compile PreflowNotVisitingLambdaExpTest.java
|
||||
*/
|
||||
|
||||
public class PreflowNotVisitingLambdaExpTest {
|
||||
interface HandleCallback<T, X extends Exception> {
|
||||
T withHandle(Handle handle) throws X;
|
||||
}
|
||||
|
||||
interface HandleConsumer<X extends Exception> {
|
||||
void useHandle(Handle handle) throws X;
|
||||
}
|
||||
|
||||
interface Handle {}
|
||||
|
||||
interface Jdbi {
|
||||
<R, X extends Exception> R withHandle(HandleCallback<R, X> callback) throws X;
|
||||
<X extends Exception> void useHandle(final HandleConsumer<X> callback) throws X;
|
||||
}
|
||||
|
||||
interface ObjectAssert<ACTUAL> {
|
||||
void isSameAs(ACTUAL t);
|
||||
}
|
||||
|
||||
static <T> ObjectAssert<T> assertThat(T actual) {
|
||||
return null;
|
||||
}
|
||||
|
||||
private Jdbi jdbi;
|
||||
|
||||
public void nestedUseHandle() {
|
||||
jdbi.withHandle(h1 -> {
|
||||
jdbi.useHandle(h2 ->
|
||||
assertThat(h1).isSameAs(h2));
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user