# HG changeset patch # User mgronlun # Date 1568459900 -7200 # Node ID 68031e66087227707369ba234fb3f42ae499f9db # Parent 1fe292a94df135563f9f9f026430a89dae29b566# Parent 3054503bad7d84214fc735acc651eb1c3c77f037 Merge diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/os/posix/gc/z/zUtils_posix.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/os/posix/gc/z/zUtils_posix.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2015, 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. + */ + +#include "precompiled.hpp" +#include "gc/z/zUtils.hpp" +#include "utilities/debug.hpp" + +#include + +uintptr_t ZUtils::alloc_aligned(size_t alignment, size_t size) { + void* res = NULL; + + if (posix_memalign(&res, alignment, size) != 0) { + fatal("posix_memalign() failed"); + } + + memset(res, 0, size); + + return (uintptr_t)res; +} diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/classfile/classLoader.cpp --- a/src/hotspot/share/classfile/classLoader.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/classfile/classLoader.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -1325,7 +1325,7 @@ THREAD); if (HAS_PENDING_EXCEPTION) { if (DumpSharedSpaces) { - tty->print_cr("Preload Error: Failed to load %s", class_name); + log_error(cds)("Preload Error: Failed to load %s", class_name); } return NULL; } diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/classfile/classLoaderExt.cpp --- a/src/hotspot/share/classfile/classLoaderExt.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/classfile/classLoaderExt.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -32,6 +32,7 @@ #include "classfile/modules.hpp" #include "classfile/systemDictionaryShared.hpp" #include "classfile/vmSymbols.hpp" +#include "logging/log.hpp" #include "memory/allocation.inline.hpp" #include "memory/filemap.hpp" #include "memory/resourceArea.hpp" @@ -146,7 +147,7 @@ if (found != NULL) { // Same behavior as jdk/src/share/classes/java/util/jar/Attributes.java // If duplicated entries are found, the last one is used. - tty->print_cr("Warning: Duplicate name in Manifest: %s.\n" + log_warning(cds)("Warning: Duplicate name in Manifest: %s.\n" "Ensure that the manifest does not have duplicate entries, and\n" "that blank lines separate individual sections in both your\n" "manifest and in the META-INF/MANIFEST.MF entry in the jar file:\n%s\n", tag, jar_path); @@ -276,7 +277,7 @@ } if (NULL == stream) { - tty->print_cr("Preload Warning: Cannot find %s", class_name); + log_warning(cds)("Preload Warning: Cannot find %s", class_name); return NULL; } @@ -295,7 +296,7 @@ THREAD); if (HAS_PENDING_EXCEPTION) { - tty->print_cr("Preload Error: Failed to load %s", class_name); + log_error(cds)("Preload Error: Failed to load %s", class_name); return NULL; } return result; diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zCPU.cpp --- a/src/hotspot/share/gc/z/zCPU.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zCPU.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -33,8 +33,8 @@ #define ZCPU_UNKNOWN_SELF (Thread*)-2; PaddedEnd* ZCPU::_affinity = NULL; -__thread Thread* ZCPU::_self = ZCPU_UNKNOWN_SELF; -__thread uint32_t ZCPU::_cpu = 0; +THREAD_LOCAL Thread* ZCPU::_self = ZCPU_UNKNOWN_SELF; +THREAD_LOCAL uint32_t ZCPU::_cpu = 0; void ZCPU::initialize() { assert(_affinity == NULL, "Already initialized"); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zCPU.hpp --- a/src/hotspot/share/gc/z/zCPU.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zCPU.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -26,6 +26,7 @@ #include "memory/allocation.hpp" #include "memory/padded.hpp" +#include "utilities/globalDefinitions.hpp" class Thread; @@ -36,8 +37,8 @@ }; static PaddedEnd* _affinity; - static __thread Thread* _self; - static __thread uint32_t _cpu; + static THREAD_LOCAL Thread* _self; + static THREAD_LOCAL uint32_t _cpu; public: static void initialize(); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zLock.hpp --- a/src/hotspot/share/gc/z/zLock.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zLock.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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,16 +25,13 @@ #define SHARE_GC_Z_ZLOCK_HPP #include "memory/allocation.hpp" -#include +#include "runtime/os.hpp" class ZLock { private: - pthread_mutex_t _lock; + os::PlatformMutex _lock; public: - ZLock(); - ~ZLock(); - void lock(); bool try_lock(); void unlock(); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zLock.inline.hpp --- a/src/hotspot/share/gc/z/zLock.inline.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zLock.inline.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 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,27 +26,20 @@ #include "gc/z/zLock.hpp" #include "runtime/atomic.hpp" +#include "runtime/os.inline.hpp" #include "runtime/thread.hpp" #include "utilities/debug.hpp" -inline ZLock::ZLock() { - pthread_mutex_init(&_lock, NULL); -} - -inline ZLock::~ZLock() { - pthread_mutex_destroy(&_lock); -} - inline void ZLock::lock() { - pthread_mutex_lock(&_lock); + _lock.lock(); } inline bool ZLock::try_lock() { - return pthread_mutex_trylock(&_lock) == 0; + return _lock.try_lock(); } inline void ZLock::unlock() { - pthread_mutex_unlock(&_lock); + _lock.unlock(); } inline ZReentrantLock::ZReentrantLock() : diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zStat.cpp --- a/src/hotspot/share/gc/z/zStat.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zStat.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -755,7 +755,7 @@ // // Stat timer // -__thread uint32_t ZStatTimerDisable::_active = 0; +THREAD_LOCAL uint32_t ZStatTimerDisable::_active = 0; // // Stat sample/inc diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zStat.hpp --- a/src/hotspot/share/gc/z/zStat.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zStat.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -29,6 +29,7 @@ #include "gc/z/zMetronome.hpp" #include "logging/logHandle.hpp" #include "memory/allocation.hpp" +#include "utilities/globalDefinitions.hpp" #include "utilities/numberSeq.hpp" #include "utilities/ticks.hpp" @@ -271,7 +272,7 @@ // class ZStatTimerDisable : public StackObj { private: - static __thread uint32_t _active; + static THREAD_LOCAL uint32_t _active; public: ZStatTimerDisable() { diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zThread.cpp --- a/src/hotspot/share/gc/z/zThread.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zThread.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -26,13 +26,13 @@ #include "runtime/thread.hpp" #include "utilities/debug.hpp" -__thread bool ZThread::_initialized; -__thread uintptr_t ZThread::_id; -__thread bool ZThread::_is_vm; -__thread bool ZThread::_is_java; -__thread bool ZThread::_is_worker; -__thread bool ZThread::_is_runtime_worker; -__thread uint ZThread::_worker_id; +THREAD_LOCAL bool ZThread::_initialized; +THREAD_LOCAL uintptr_t ZThread::_id; +THREAD_LOCAL bool ZThread::_is_vm; +THREAD_LOCAL bool ZThread::_is_java; +THREAD_LOCAL bool ZThread::_is_worker; +THREAD_LOCAL bool ZThread::_is_runtime_worker; +THREAD_LOCAL uint ZThread::_worker_id; void ZThread::initialize() { assert(!_initialized, "Already initialized"); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zThread.hpp --- a/src/hotspot/share/gc/z/zThread.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/gc/z/zThread.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -25,6 +25,7 @@ #define SHARE_GC_Z_ZTHREAD_HPP #include "memory/allocation.hpp" +#include "utilities/globalDefinitions.hpp" #include "utilities/debug.hpp" class ZThread : public AllStatic { @@ -33,13 +34,13 @@ friend class ZRuntimeWorkersInitializeTask; private: - static __thread bool _initialized; - static __thread uintptr_t _id; - static __thread bool _is_vm; - static __thread bool _is_java; - static __thread bool _is_worker; - static __thread bool _is_runtime_worker; - static __thread uint _worker_id; + static THREAD_LOCAL bool _initialized; + static THREAD_LOCAL uintptr_t _id; + static THREAD_LOCAL bool _is_vm; + static THREAD_LOCAL bool _is_java; + static THREAD_LOCAL bool _is_worker; + static THREAD_LOCAL bool _is_runtime_worker; + static THREAD_LOCAL uint _worker_id; static void initialize(); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/gc/z/zUtils.cpp --- a/src/hotspot/share/gc/z/zUtils.cpp Sat Sep 14 13:15:10 2019 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include "precompiled.hpp" -#include "gc/z/zUtils.inline.hpp" -#include "utilities/debug.hpp" - -#include - -uintptr_t ZUtils::alloc_aligned(size_t alignment, size_t size) { - void* res = NULL; - - if (posix_memalign(&res, alignment, size) != 0) { - fatal("posix_memalign() failed"); - } - - memset(res, 0, size); - - return (uintptr_t)res; -} diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/memory/filemap.cpp --- a/src/hotspot/share/memory/filemap.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/memory/filemap.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -459,7 +459,7 @@ if (e->is_dir()) { const char* path = e->name(); if (!os::dir_is_empty(path)) { - tty->print_cr("Error: non-empty directory '%s'", path); + log_error(cds)("Error: non-empty directory '%s'", path); has_nonempty_dir = true; } } diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/memory/metaspaceShared.cpp --- a/src/hotspot/share/memory/metaspaceShared.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/memory/metaspaceShared.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -1814,7 +1814,7 @@ if (klass == NULL && (PENDING_EXCEPTION->klass()->name() == vmSymbols::java_lang_ClassNotFoundException())) { // print a warning only when the pending exception is class not found - tty->print_cr("Preload Warning: Cannot find %s", parser.current_class_name()); + log_warning(cds)("Preload Warning: Cannot find %s", parser.current_class_name()); } CLEAR_PENDING_EXCEPTION; } @@ -1860,7 +1860,7 @@ ik->link_class(THREAD); if (HAS_PENDING_EXCEPTION) { ResourceMark rm; - tty->print_cr("Preload Warning: Verification failed for %s", + log_warning(cds)("Preload Warning: Verification failed for %s", ik->external_name()); CLEAR_PENDING_EXCEPTION; ik->set_in_error_state(); diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/runtime/arguments.cpp --- a/src/hotspot/share/runtime/arguments.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/runtime/arguments.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -539,6 +539,7 @@ { "FlightRecorder", JDK_Version::jdk(13), JDK_Version::undefined(), JDK_Version::undefined() }, { "FieldsAllocationStyle", JDK_Version::jdk(14), JDK_Version::jdk(15), JDK_Version::jdk(16) }, { "CompactFields", JDK_Version::jdk(14), JDK_Version::jdk(15), JDK_Version::jdk(16) }, + { "MonitorBound", JDK_Version::jdk(14), JDK_Version::jdk(15), JDK_Version::jdk(16) }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/runtime/globals.hpp --- a/src/hotspot/share/runtime/globals.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/runtime/globals.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -713,7 +713,7 @@ "Use LWP-based instead of libthread-based synchronization " \ "(SPARC only)") \ \ - product(intx, MonitorBound, 0, "Bound Monitor population") \ + product(intx, MonitorBound, 0, "(Deprecated) Bound Monitor population") \ range(0, max_jint) \ \ experimental(intx, MonitorUsedDeflationThreshold, 90, \ diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/runtime/thread.cpp --- a/src/hotspot/share/runtime/thread.cpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/runtime/thread.cpp Sat Sep 14 13:18:20 2019 +0200 @@ -166,7 +166,7 @@ #ifndef USE_LIBRARY_BASED_TLS_ONLY // Current thread is maintained as a thread-local variable -THREAD_LOCAL_DECL Thread* Thread::_thr_current = NULL; +THREAD_LOCAL Thread* Thread::_thr_current = NULL; #endif // ======= Thread ======== diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/runtime/thread.hpp --- a/src/hotspot/share/runtime/thread.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/runtime/thread.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -142,7 +142,7 @@ #ifndef USE_LIBRARY_BASED_TLS_ONLY // Current thread is maintained as a thread-local variable - static THREAD_LOCAL_DECL Thread* _thr_current; + static THREAD_LOCAL Thread* _thr_current; #endif // Thread local data area available to the GC. The internal diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/utilities/globalDefinitions_gcc.hpp --- a/src/hotspot/share/utilities/globalDefinitions_gcc.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/utilities/globalDefinitions_gcc.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -254,9 +254,7 @@ #define JLONG_FORMAT_W(width) "%" #width "ld" #endif // _LP64 && __APPLE__ -#ifndef USE_LIBRARY_BASED_TLS_ONLY -#define THREAD_LOCAL_DECL __thread -#endif +#define THREAD_LOCAL __thread // Inlining support #define NOINLINE __attribute__ ((noinline)) diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/utilities/globalDefinitions_solstudio.hpp --- a/src/hotspot/share/utilities/globalDefinitions_solstudio.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/utilities/globalDefinitions_solstudio.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -245,9 +245,7 @@ #define offset_of(klass,field) offsetof(klass,field) -#ifndef USE_LIBRARY_BASED_TLS_ONLY -#define THREAD_LOCAL_DECL __thread -#endif +#define THREAD_LOCAL __thread // Inlining support #define NOINLINE diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/utilities/globalDefinitions_visCPP.hpp --- a/src/hotspot/share/utilities/globalDefinitions_visCPP.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/utilities/globalDefinitions_visCPP.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -153,9 +153,7 @@ #define offset_of(klass,field) offsetof(klass,field) -#ifndef USE_LIBRARY_BASED_TLS_ONLY -#define THREAD_LOCAL_DECL __declspec( thread ) -#endif +#define THREAD_LOCAL __declspec(thread) // Inlining support // MSVC has '__declspec(noinline)' but according to the official documentation diff -r 1fe292a94df1 -r 68031e660872 src/hotspot/share/utilities/globalDefinitions_xlc.hpp --- a/src/hotspot/share/utilities/globalDefinitions_xlc.hpp Sat Sep 14 13:15:10 2019 +0200 +++ b/src/hotspot/share/utilities/globalDefinitions_xlc.hpp Sat Sep 14 13:18:20 2019 +0200 @@ -130,10 +130,6 @@ // AIX 5.3 has buggy __thread support. (see JDK-8176442). #define USE_LIBRARY_BASED_TLS_ONLY 1 -#ifndef USE_LIBRARY_BASED_TLS_ONLY -#define THREAD_LOCAL_DECL __thread -#endif - // Inlining support // // Be aware that for function/method declarations, xlC only supports the following diff -r 1fe292a94df1 -r 68031e660872 src/java.base/macosx/classes/sun/nio/fs/BsdFileStore.java --- a/src/java.base/macosx/classes/sun/nio/fs/BsdFileStore.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.base/macosx/classes/sun/nio/fs/BsdFileStore.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -62,22 +62,14 @@ } // step 2: find mount point - UnixPath parent = path.getParent(); - while (parent != null) { - UnixFileAttributes attrs = null; - try { - attrs = UnixFileAttributes.get(parent, true); - } catch (UnixException x) { - x.rethrowAsIOException(parent); - } - if (attrs.dev() != dev()) - break; - path = parent; - parent = parent.getParent(); + byte[] dir = null; + try { + dir = BsdNativeDispatcher.getmntonname(path); + } catch (UnixException x) { + x.rethrowAsIOException(path); } // step 3: lookup mounted file systems - byte[] dir = path.asByteArray(); for (UnixMountEntry entry: fs.getMountEntries()) { if (Arrays.equals(dir, entry.dir())) return entry; diff -r 1fe292a94df1 -r 68031e660872 src/java.base/macosx/classes/sun/nio/fs/BsdNativeDispatcher.java --- a/src/java.base/macosx/classes/sun/nio/fs/BsdNativeDispatcher.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.base/macosx/classes/sun/nio/fs/BsdNativeDispatcher.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -51,6 +51,20 @@ */ static native void endfsstat(long iter) throws UnixException; + /** + * int statfs(const char *path, struct statfs *buf); + * returns buf->f_mntonname (directory on which mounted) + */ + static byte[] getmntonname(UnixPath path) throws UnixException { + NativeBuffer pathBuffer = copyToNativeBuffer(path); + try { + return getmntonname0(pathBuffer.address()); + } finally { + pathBuffer.release(); + } + } + static native byte[] getmntonname0(long pathAddress) throws UnixException; + // initialize field IDs private static native void initIDs(); diff -r 1fe292a94df1 -r 68031e660872 src/java.base/macosx/native/libnio/fs/BsdNativeDispatcher.c --- a/src/java.base/macosx/native/libnio/fs/BsdNativeDispatcher.c Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.base/macosx/native/libnio/fs/BsdNativeDispatcher.c Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 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 @@ -203,3 +203,24 @@ free(iter); } } + +JNIEXPORT jbyteArray JNICALL +Java_sun_nio_fs_BsdNativeDispatcher_getmntonname0(JNIEnv *env, jclass this, + jlong pathAddress) +{ + struct statfs buf; + const char* path = (const char*)jlong_to_ptr(pathAddress); + + if (statfs(path, &buf) != 0) { + throwUnixException(env, errno); + } + + jsize len = strlen(buf.f_mntonname); + jbyteArray mntonname = (*env)->NewByteArray(env, len); + if (mntonname != NULL) { + (*env)->SetByteArrayRegion(env, mntonname, 0, len, + (jbyte*)buf.f_mntonname); + } + + return mntonname; +} diff -r 1fe292a94df1 -r 68031e660872 src/java.base/share/classes/java/util/regex/Pattern.java --- a/src/java.base/share/classes/java/util/regex/Pattern.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.base/share/classes/java/util/regex/Pattern.java Sat Sep 14 13:18:20 2019 +0200 @@ -3931,12 +3931,14 @@ boolean match(Matcher matcher, int i, CharSequence seq) { if (i < matcher.to) { int ch = Character.codePointAt(seq, i); - return predicate.is(ch) && - next.match(matcher, i + Character.charCount(ch), seq); - } else { - matcher.hitEnd = true; - return false; + i += Character.charCount(ch); + if (i <= matcher.to) { + return predicate.is(ch) && + next.match(matcher, i, seq); + } } + matcher.hitEnd = true; + return false; } boolean study(TreeInfo info) { info.minLength++; diff -r 1fe292a94df1 -r 68031e660872 src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java --- a/src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.base/unix/classes/sun/nio/fs/UnixNativeDispatcher.java Sat Sep 14 13:18:20 2019 +0200 @@ -33,7 +33,7 @@ protected UnixNativeDispatcher() { } // returns a NativeBuffer containing the given path - private static NativeBuffer copyToNativeBuffer(UnixPath path) { + static NativeBuffer copyToNativeBuffer(UnixPath path) { byte[] cstr = path.getByteArrayForSysCalls(); int size = cstr.length + 1; NativeBuffer buffer = NativeBuffers.getNativeBufferFromCache(size); diff -r 1fe292a94df1 -r 68031e660872 src/java.naming/share/classes/com/sun/jndi/ldap/DefaultLdapDnsProvider.java --- a/src/java.naming/share/classes/com/sun/jndi/ldap/DefaultLdapDnsProvider.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/DefaultLdapDnsProvider.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -76,7 +76,7 @@ } LdapDnsProviderResult res = new LdapDnsProviderResult(domainName, endpoints); - if (res.getEndpoints().size() == 0 && res.getDomainName().isEmpty()) { + if (res.getEndpoints().isEmpty() && res.getDomainName().isEmpty()) { return Optional.empty(); } else { return Optional.of(res); diff -r 1fe292a94df1 -r 68031e660872 src/java.naming/share/classes/com/sun/jndi/ldap/LdapDnsProviderService.java --- a/src/java.naming/share/classes/com/sun/jndi/ldap/LdapDnsProviderService.java Sat Sep 14 13:15:10 2019 +0200 +++ b/src/java.naming/share/classes/com/sun/jndi/ldap/LdapDnsProviderService.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 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 @@ -37,6 +37,8 @@ * The {@code LdapDnsProviderService} is responsible for creating and providing * access to the registered {@code LdapDnsProvider}s. The {@link ServiceLoader} * is used to find and register any implementations of {@link LdapDnsProvider}. + * + *

Instances of this class are safe for use by multiple threads. */ final class LdapDnsProviderService { @@ -68,11 +70,11 @@ } /** - * Retrieve the singleton static instance of LdapDnsProviderService. + * Retrieves the singleton instance of LdapDnsProviderService. */ static LdapDnsProviderService getInstance() { if (service != null) return service; - synchronized(LOCK) { + synchronized (LOCK) { if (service != null) return service; service = new LdapDnsProviderService(); } @@ -80,7 +82,7 @@ } /** - * Retrieve result from the first provider that successfully resolves + * Retrieves result from the first provider that successfully resolves * the endpoints. If no results are found when calling installed * subclasses of {@code LdapDnsProvider} then this method will fall back * to the {@code DefaultLdapDnsProvider}. @@ -91,14 +93,15 @@ LdapDnsProviderResult lookupEndpoints(String url, Hashtable env) throws NamingException { - Iterator iterator = providers.iterator(); + LdapDnsProviderResult result = null; Hashtable envCopy = new Hashtable<>(env); - LdapDnsProviderResult result = null; - - while (result == null && iterator.hasNext()) { - result = iterator.next().lookupEndpoints(url, envCopy) - .filter(r -> r.getEndpoints().size() > 0) - .orElse(null); + synchronized (LOCK) { + Iterator iterator = providers.iterator(); + while (result == null && iterator.hasNext()) { + result = iterator.next().lookupEndpoints(url, envCopy) + .filter(r -> !r.getEndpoints().isEmpty()) + .orElse(null); + } } if (result == null) { diff -r 1fe292a94df1 -r 68031e660872 test/hotspot/jtreg/ProblemList.txt --- a/test/hotspot/jtreg/ProblemList.txt Sat Sep 14 13:15:10 2019 +0200 +++ b/test/hotspot/jtreg/ProblemList.txt Sat Sep 14 13:18:20 2019 +0200 @@ -167,7 +167,7 @@ vmTestbase/nsk/jdi/VirtualMachine/redefineClasses/redefineclasses021/TestDescription.java 8065773 generic-all vmTestbase/nsk/jdi/VirtualMachine/redefineClasses/redefineclasses023/TestDescription.java 8065773 generic-all -vmTestbase/nsk/jdb/eval/eval001/eval001.java 8212117 generic-all +vmTestbase/nsk/jdb/eval/eval001/eval001.java 8221503 generic-all vmTestbase/metaspace/gc/firstGC_10m/TestDescription.java 8208250 generic-all vmTestbase/metaspace/gc/firstGC_50m/TestDescription.java 8208250 generic-all diff -r 1fe292a94df1 -r 68031e660872 test/hotspot/jtreg/serviceability/sa/TestJmapCore.java --- a/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/hotspot/jtreg/serviceability/sa/TestJmapCore.java Sat Sep 14 13:18:20 2019 +0200 @@ -98,8 +98,8 @@ : ProcessTools.executeProcess("sh", "-c", "ulimit -c unlimited && " + ProcessTools.getCommandLine(pb)); File core; - String pattern = Platform.isWindows() ? "mdmp" : "core"; - File[] cores = new File(".").listFiles((dir, name) -> name.contains(pattern)); + String pattern = Platform.isWindows() ? ".*\\.mdmp" : "core(\\.\\d+)?"; + File[] cores = new File(".").listFiles((dir, name) -> name.matches(pattern)); if (cores.length == 0) { // /cores/core.$pid might be generated on macosx by default String pid = output.firstMatch("^(\\d+)" + pidSeparator, 1); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/ProblemList.txt --- a/test/jdk/ProblemList.txt Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/ProblemList.txt Sat Sep 14 13:18:20 2019 +0200 @@ -872,8 +872,6 @@ com/sun/jndi/ldap/DeadSSLLdapTimeoutTest.java 8169942 linux-i586,macosx-all,windows-x64 -com/sun/jndi/ldap/LdapTimeoutTest.java 8151678 generic-all - com/sun/jndi/dns/ConfigTests/PortUnreachable.java 7164518 macosx-all javax/rmi/ssl/SSLSocketParametersTest.sh 8162906 generic-all diff -r 1fe292a94df1 -r 68031e660872 test/jdk/com/sun/jndi/ldap/LdapTimeoutTest.java --- a/test/jdk/com/sun/jndi/ldap/LdapTimeoutTest.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/com/sun/jndi/ldap/LdapTimeoutTest.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, 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 @@ -21,424 +21,487 @@ * questions. */ -/** +/* * @test - * @run main/othervm LdapTimeoutTest - * @bug 7094377 8000487 6176036 7056489 + * @library /test/lib + * lib/ + * @run testng/othervm LdapTimeoutTest + * @bug 7094377 8000487 6176036 7056489 8151678 * @summary Timeout tests for ldap */ +import org.testng.Assert; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.InitialDirContext; +import javax.naming.directory.SearchControls; +import java.io.IOException; +import java.io.OutputStream; import java.net.Socket; -import java.net.ServerSocket; -import java.net.SocketTimeoutException; -import java.io.*; -import javax.naming.*; -import javax.naming.directory.*; +import java.util.ArrayList; +import java.util.Hashtable; import java.util.List; -import java.util.Hashtable; -import java.util.ArrayList; +import java.util.Objects; import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.FutureTask; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.concurrent.TimeUnit; -import javax.net.ssl.SSLHandshakeException; +import static java.lang.String.format; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; +import static jdk.test.lib.Utils.adjustTimeout; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.expectThrows; +public class LdapTimeoutTest { + + // ------ configure test timeouts here ------ -abstract class LdapTest implements Callable { + /* + * Practical representation of an infinite timeout. + */ + private static final long INFINITY_MILLIS = adjustTimeout(20_000); + /* + * The acceptable variation in timeout measurements. + */ + private static final long TOLERANCE = adjustTimeout( 3_500); - Hashtable env; - TestServer server; - ScheduledExecutorService killSwitchPool; - boolean passed = false; - private int HANGING_TEST_TIMEOUT = 20_000; + private static final long CONNECT_MILLIS = adjustTimeout( 3_000); + private static final long READ_MILLIS = adjustTimeout(10_000); + + static { + // a series of checks to make sure this timeouts configuration is + // consistent and the timeouts do not overlap - public LdapTest (TestServer server, Hashtable env) { - this.server = server; - this.env = env; + assert (TOLERANCE >= 0); + // context creation + assert (2 * CONNECT_MILLIS + TOLERANCE < READ_MILLIS); + // context creation immediately followed by search + assert (2 * CONNECT_MILLIS + READ_MILLIS + TOLERANCE < INFINITY_MILLIS); + } + + @BeforeTest + public void beforeTest() { + startAuxiliaryDiagnosticOutput(); } - public LdapTest(TestServer server, Hashtable env, - ScheduledExecutorService killSwitchPool) - { - this(server, env); - this.killSwitchPool = killSwitchPool; + /* + * These are timeout tests and they are run in parallel to reduce the total + * amount of run time. + * + * Currently it doesn't seem possible to instruct JTREG to run TestNG test + * methods in parallel. That said, this JTREG test is still + * a "TestNG-flavored" test for the sake of having org.testng.Assert + * capability. + */ + @Test + public void test() throws Exception { + List> futures = new ArrayList<>(); + ExecutorService executorService = Executors.newCachedThreadPool(); + try { + futures.add(executorService.submit(() -> { test1(); return null; })); + futures.add(executorService.submit(() -> { test2(); return null; })); + futures.add(executorService.submit(() -> { test3(); return null; })); + futures.add(executorService.submit(() -> { test4(); return null; })); + futures.add(executorService.submit(() -> { test5(); return null; })); + futures.add(executorService.submit(() -> { test6(); return null; })); + futures.add(executorService.submit(() -> { test7(); return null; })); + } finally { + executorService.shutdown(); + } + int failedCount = 0; + for (var f : futures) { + try { + f.get(); + } catch (ExecutionException e) { + failedCount++; + e.getCause().printStackTrace(System.out); + } + } + if (failedCount > 0) + throw new RuntimeException(failedCount + " (sub)tests failed"); + } + + static void test1() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + // Here and in the other tests it's important to close the server as + // calling `thread.interrupt` from assertion may not be enough + // (depending on where the blocking call has stuck) + try (TestServer server = new NotBindableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + // Here and in the other tests joining done purely to reduce timing + // jitter. Commenting out or removing that should not make the test + // incorrect. (ServerSocket can accept connection as soon as it is + // bound, not need to call `accept` before that.) + server.starting().join(); + assertIncompletion(INFINITY_MILLIS, () -> new InitialDirContext(env)); + } } - public abstract void performOp(InitialContext ctx) throws NamingException; - public abstract void handleNamingException( - NamingException e, long start, long end); + static void test2() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); + try (TestServer server = new BindableButNotReadableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + InitialDirContext ctx = new InitialDirContext(env); + SearchControls scl = new SearchControls(); + scl.setSearchScope(SearchControls.SUBTREE_SCOPE); + assertIncompletion(INFINITY_MILLIS, + () -> ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl)); + } + } - public void pass() { - this.passed = true; + static void test3() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + try (TestServer server = new BindableButNotReadableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + InitialDirContext ctx = new InitialDirContext(env); + SearchControls scl = new SearchControls(); + scl.setSearchScope(SearchControls.SUBTREE_SCOPE); + assertIncompletion(INFINITY_MILLIS, + () -> ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl)); + } } - public void fail() { - throw new RuntimeException("Test failed"); + static void test4() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); + env.put("com.sun.jndi.ldap.read.timeout", String.valueOf(READ_MILLIS)); + try (TestServer server = new NotBindableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + Assert.ThrowingRunnable completion = + () -> assertCompletion(CONNECT_MILLIS, + 2 * CONNECT_MILLIS + TOLERANCE, + () -> new InitialDirContext(env)); + NamingException e = expectThrows(NamingException.class, completion); + String msg = e.getMessage(); + assertTrue(msg != null && msg.contains("timeout") + && msg.contains(String.valueOf(CONNECT_MILLIS)), + msg); + } } - public void fail(Exception e) { - throw new RuntimeException("Test failed", e); + static void test5() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); + env.put("com.sun.jndi.ldap.read.timeout", String.valueOf(READ_MILLIS)); + try (TestServer server = new BindableButNotReadableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + InitialDirContext ctx = new InitialDirContext(env); + SearchControls scl = new SearchControls(); + scl.setSearchScope(SearchControls.SUBTREE_SCOPE); + Assert.ThrowingRunnable completion = + () -> assertCompletion(READ_MILLIS, + READ_MILLIS + TOLERANCE, + () -> ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl)); + NamingException e = expectThrows(NamingException.class, completion); + String msg = e.getMessage(); + assertTrue(msg != null && msg.contains("timeout") + && msg.contains(String.valueOf(READ_MILLIS)), + msg); + } } - boolean shutItDown(InitialContext ctx) { - try { - if (ctx != null) ctx.close(); - return true; - } catch (NamingException ex) { - return false; + static void test6() throws Exception { + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); + env.put("com.sun.jndi.ldap.read.timeout", String.valueOf(READ_MILLIS)); + try (TestServer server = new NotBindableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + Assert.ThrowingRunnable completion = + () -> assertCompletion(CONNECT_MILLIS, + 2 * CONNECT_MILLIS + TOLERANCE, + () -> new InitialDirContext(env)); + NamingException e = expectThrows(NamingException.class, completion); + String msg = e.getMessage(); + assertTrue(msg != null && msg.contains("timeout") + && msg.contains(String.valueOf(CONNECT_MILLIS)), + msg); } } - public Boolean call() { - InitialContext ctx = null; - ScheduledFuture killer = null; - long start = System.nanoTime(); - - try { - while(!server.accepting()) - Thread.sleep(200); // allow the server to start up - Thread.sleep(200); // to be sure - - // if this is a hanging test, scheduled a thread to - // interrupt after a certain time - if (killSwitchPool != null) { - final Thread current = Thread.currentThread(); - killer = killSwitchPool.schedule( - new Callable() { - public Void call() throws Exception { - current.interrupt(); - return null; - } - }, HANGING_TEST_TIMEOUT, MILLISECONDS); - } - - env.put(Context.PROVIDER_URL, "ldap://localhost:" + - server.getLocalPort()); - - try { - ctx = new InitialDirContext(env); - performOp(ctx); - fail(); - } catch (NamingException e) { - long end = System.nanoTime(); - System.out.println(this.getClass().toString() + " - elapsed: " - + NANOSECONDS.toMillis(end - start)); - handleNamingException(e, start, end); - } finally { - if (killer != null && !killer.isDone()) - killer.cancel(true); - shutItDown(ctx); - server.close(); - } - return passed; - } catch (IOException|InterruptedException e) { - throw new RuntimeException(e); + static void test7() throws Exception { + // 8000487: Java JNDI connection library on ldap conn is + // not honoring configured timeout + Hashtable env = new Hashtable<>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); + env.put("com.sun.jndi.ldap.connect.timeout", String.valueOf(CONNECT_MILLIS)); + env.put("com.sun.jndi.ldap.read.timeout", String.valueOf(READ_MILLIS)); + env.put(Context.SECURITY_AUTHENTICATION, "simple"); + env.put(Context.SECURITY_PRINCIPAL, "user"); + env.put(Context.SECURITY_CREDENTIALS, "password"); + try (TestServer server = new NotBindableServer()) { + env.put(Context.PROVIDER_URL, urlTo(server)); + server.start(); + server.starting().join(); + Assert.ThrowingRunnable completion = + () -> assertCompletion(CONNECT_MILLIS, + 2 * CONNECT_MILLIS + TOLERANCE, + () -> new InitialDirContext(env)); + NamingException e = expectThrows(NamingException.class, completion); + String msg = e.getMessage(); + assertTrue(msg != null && msg.contains("timeout") + && msg.contains(String.valueOf(CONNECT_MILLIS)), + msg); } } -} - -abstract class ReadServerTest extends LdapTest { - - public ReadServerTest(Hashtable env) throws IOException { - super(new BindableServer(), env); - } - - public ReadServerTest(Hashtable env, - ScheduledExecutorService killSwitchPool) - throws IOException - { - super(new BindableServer(), env, killSwitchPool); - } - - public void performOp(InitialContext ctx) throws NamingException { - SearchControls scl = new SearchControls(); - scl.setSearchScope(SearchControls.SUBTREE_SCOPE); - NamingEnumeration answer = ((InitialDirContext)ctx) - .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); - } -} - -abstract class DeadServerTest extends LdapTest { - - public DeadServerTest(Hashtable env) throws IOException { - super(new DeadServer(), env); - } - - public DeadServerTest(Hashtable env, - ScheduledExecutorService killSwitchPool) - throws IOException - { - super(new DeadServer(), env, killSwitchPool); - } - - public void performOp(InitialContext ctx) throws NamingException {} -} - -class DeadServerNoTimeoutTest extends DeadServerTest { - - public DeadServerNoTimeoutTest(Hashtable env, - ScheduledExecutorService killSwitchPool) - throws IOException - { - super(env, killSwitchPool); - } - - public void handleNamingException(NamingException e, long start, long end) { - if (e instanceof InterruptedNamingException) Thread.interrupted(); - - if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) { - System.err.printf("DeadServerNoTimeoutTest fail: timeout should be " + - "at least %s ms, actual time is %s ms%n", - LdapTimeoutTest.MIN_TIMEOUT, - NANOSECONDS.toMillis(end - start)); - fail(); - } else { - pass(); - } - } -} - -class DeadServerTimeoutTest extends DeadServerTest { - - public DeadServerTimeoutTest(Hashtable env) throws IOException { - super(env); - } - public void handleNamingException(NamingException e, long start, long end) - { - // non SSL connect will timeout via readReply using connectTimeout - if (NANOSECONDS.toMillis(end - start) < 2_900) { - pass(); - } else { - System.err.println("Fail: Waited too long"); - fail(); - } - } -} + // ------ test stub servers ------ + + static class TestServer extends BaseLdapServer { - -class ReadServerNoTimeoutTest extends ReadServerTest { + private final CompletableFuture starting = new CompletableFuture<>(); - public ReadServerNoTimeoutTest(Hashtable env, - ScheduledExecutorService killSwitchPool) - throws IOException - { - super(env, killSwitchPool); - } - - public void handleNamingException(NamingException e, long start, long end) { - if (e instanceof InterruptedNamingException) Thread.interrupted(); + TestServer() throws IOException { } - if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) { - System.err.printf("ReadServerNoTimeoutTest fail: timeout should be " + - "at least %s ms, actual time is %s ms%n", - LdapTimeoutTest.MIN_TIMEOUT, - NANOSECONDS.toMillis(end - start)); - fail(); - } else { - pass(); + @Override + protected void beforeAcceptingConnections() { + starting.completeAsync(() -> null); } - } -} -class ReadServerTimeoutTest extends ReadServerTest { - - public ReadServerTimeoutTest(Hashtable env) throws IOException { - super(env); - } - - public void handleNamingException(NamingException e, long start, long end) { - System.out.println("ReadServerTimeoutTest: end-start=" + NANOSECONDS.toMillis(end - start)); - if (NANOSECONDS.toMillis(end - start) < 2_500) { - fail(); - } else { - pass(); + public CompletableFuture starting() { + return starting.copy(); } } -} + + static class BindableButNotReadableServer extends TestServer { + + BindableButNotReadableServer() throws IOException { } -class TestServer extends Thread { - ServerSocket serverSock; - boolean accepting = false; - - public TestServer() throws IOException { - this.serverSock = new ServerSocket(0); - start(); - } + private static final byte[] bindResponse = { + 0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A, + 0x01, 0x00, 0x04, 0x00, 0x04, 0x00 + }; - public int getLocalPort() { - return serverSock.getLocalPort(); - } - - public boolean accepting() { - return accepting; - } - - public void close() throws IOException { - serverSock.close(); - } -} - -class BindableServer extends TestServer { - - public BindableServer() throws IOException { - super(); + @Override + protected void handleRequest(Socket socket, + LdapMessage msg, + OutputStream out) + throws IOException { + switch (msg.getOperation()) { + case BIND_REQUEST: + out.write(bindResponse); + out.flush(); + default: + break; + } + } } - private byte[] bindResponse = { - 0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A, - 0x01, 0x00, 0x04, 0x00, 0x04, 0x00 - }; + static class NotBindableServer extends TestServer { - public void run() { - try { - accepting = true; - Socket socket = serverSock.accept(); - InputStream in = socket.getInputStream(); - OutputStream out = socket.getOutputStream(); - - // Read the LDAP BindRequest - while (in.read() != -1) { - in.skip(in.available()); - break; - } + NotBindableServer() throws IOException { } - // Write an LDAP BindResponse - out.write(bindResponse); - out.flush(); - } catch (IOException e) { - // ignore - } - } -} - -class DeadServer extends TestServer { - - public DeadServer() throws IOException { - super(); - } - - public void run() { - while(true) { + @Override + protected void beforeConnectionHandled(Socket socket) { try { - accepting = true; - Socket socket = serverSock.accept(); - } catch (Exception e) { - break; + TimeUnit.DAYS.sleep(Integer.MAX_VALUE); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } } } -} -public class LdapTimeoutTest { + // ------ timeouts check utilities ------ - private static final ExecutorService testPool = - Executors.newFixedThreadPool(3); - private static final ScheduledExecutorService killSwitchPool = - Executors.newScheduledThreadPool(3); - public static int MIN_TIMEOUT = 18_000; + /* + * Asserts that the specified executable yields a result or an exception + * within the specified time frame. Interrupts the executable + * unconditionally. + * + * If the executable yields a result or an exception within the specified + * time frame, the result will be returned and the exception will be + * rethrown respectively in a transparent fashion as if the executable was + * executed directly. + */ + public static T assertCompletion(long loMillis, + long hiMillis, + Callable code) + throws Throwable { + if (loMillis < 0 || hiMillis < 0 || loMillis > hiMillis) { + throw new IllegalArgumentException("loMillis=" + loMillis + + ", hiMillis=" + hiMillis); + } + Objects.requireNonNull(code); - static Hashtable createEnv() { - Hashtable env = new Hashtable(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - return env; - } + // this queue acts both as an exchange point and a barrier + SynchronousQueue startTime = new SynchronousQueue<>(); + + Callable wrappedTask = () -> { + // by the time this value reaches the "stopwatch" thread it might be + // well outdated and that's okay, we will adjust the wait time + startTime.put(System.nanoTime()); + return code.call(); + }; - public static void main(String[] args) throws Exception { + FutureTask task = new FutureTask<>(wrappedTask); + Thread t = new Thread(task); + t.start(); - InitialContext ctx = null; - List results = new ArrayList<>(); + final long startNanos; + try { + startNanos = startTime.take(); // (1) wait for the initial time mark + } catch (Throwable e) { + t.interrupt(); + throw e; + } + + final long waitTime = hiMillis - + NANOSECONDS.toMillis(System.nanoTime() - startNanos); // (2) adjust wait time try { - // run the DeadServerTest with no timeouts set - // this should get stuck indefinitely, so we need to kill - // it after a timeout - System.out.println("Running connect timeout test with 20s kill switch"); - Hashtable env = createEnv(); - results.add( - testPool.submit(new DeadServerNoTimeoutTest(env, killSwitchPool))); - - // run the ReadServerTest with connect timeout set - // this should get stuck indefinitely so we need to kill - // it after a timeout - System.out.println("Running read timeout test with 10ms connect timeout & 20s kill switch"); - Hashtable env1 = createEnv(); - env1.put("com.sun.jndi.ldap.connect.timeout", "10"); - results.add(testPool.submit( - new ReadServerNoTimeoutTest(env1, killSwitchPool))); - - // run the ReadServerTest with no timeouts set - // this should get stuck indefinitely, so we need to kill - // it after a timeout - System.out.println("Running read timeout test with 20s kill switch"); - Hashtable env2 = createEnv(); - results.add(testPool.submit( - new ReadServerNoTimeoutTest(env2, killSwitchPool))); - - // run the DeadServerTest with connect / read timeouts set - // this should exit after the connect timeout expires - System.out.println("Running connect timeout test with 10ms connect timeout, 3000ms read timeout"); - Hashtable env3 = createEnv(); - env3.put("com.sun.jndi.ldap.connect.timeout", "10"); - env3.put("com.sun.jndi.ldap.read.timeout", "3000"); - results.add(testPool.submit(new DeadServerTimeoutTest(env3))); - - - // run the ReadServerTest with connect / read timeouts set - // this should exit after the connect timeout expires - // - // NOTE: commenting this test out as it is failing intermittently. - // - // System.out.println("Running read timeout test with 10ms connect timeout, 3000ms read timeout"); - // Hashtable env4 = createEnv(); - // env4.put("com.sun.jndi.ldap.connect.timeout", "10"); - // env4.put("com.sun.jndi.ldap.read.timeout", "3000"); - // results.add(testPool.submit(new ReadServerTimeoutTest(env4))); - - // run the DeadServerTest with connect timeout set - // this should exit after the connect timeout expires - System.out.println("Running connect timeout test with 10ms connect timeout"); - Hashtable env5 = createEnv(); - env5.put("com.sun.jndi.ldap.connect.timeout", "10"); - results.add(testPool.submit(new DeadServerTimeoutTest(env5))); - - // 8000487: Java JNDI connection library on ldap conn is - // not honoring configured timeout - System.out.println("Running simple auth connection test"); - Hashtable env6 = createEnv(); - env6.put("com.sun.jndi.ldap.connect.timeout", "10"); - env6.put("com.sun.jndi.ldap.read.timeout", "3000"); - env6.put(Context.SECURITY_AUTHENTICATION, "simple"); - env6.put(Context.SECURITY_PRINCIPAL, "user"); - env6.put(Context.SECURITY_CREDENTIALS, "password"); - results.add(testPool.submit(new DeadServerTimeoutTest(env6))); - - boolean testFailed = false; - for (Future test : results) { - while (!test.isDone()) { - if ((Boolean) test.get() == false) - testFailed = true; - } + T r = task.get(waitTime, MILLISECONDS); // (3) wait for the task to complete + long elapsed = NANOSECONDS.toMillis(System.nanoTime() - startNanos); + if (elapsed < loMillis || elapsed > hiMillis) { + throw new RuntimeException(format( + "After %s ms. (waitTime %s ms.) returned result '%s'", elapsed, waitTime, r)); } - - if (testFailed) { - throw new AssertionError("some tests failed"); + return r; + } catch (ExecutionException e) { + long elapsed = NANOSECONDS.toMillis(System.nanoTime() - startNanos); + if (elapsed < loMillis || elapsed > hiMillis) { + throw new RuntimeException(format( + "After %s ms. (waitTime %s ms.) thrown exception", elapsed, waitTime), e); } - + throw e.getCause(); + } catch (TimeoutException e) { + // We trust timed get not to throw TimeoutException prematurely + // (i.e. before the wait time elapses) + long elapsed = NANOSECONDS.toMillis(System.nanoTime() - startNanos); + throw new RuntimeException(format( + "After %s ms. (waitTime %s ms.) is incomplete", elapsed, waitTime)); } finally { - LdapTimeoutTest.killSwitchPool.shutdown(); - LdapTimeoutTest.testPool.shutdown(); + t.interrupt(); } } + /* + * Asserts that the specified executable yields no result and no exception + * for at least the specified amount of time. Interrupts the executable + * unconditionally. + */ + public static void assertIncompletion(long millis, Callable code) + throws Exception + { + if (millis < 0) { + throw new IllegalArgumentException("millis=" + millis); + } + Objects.requireNonNull(code); + + // this queue acts both as an exchange point and a barrier + SynchronousQueue startTime = new SynchronousQueue<>(); + + Callable wrappedTask = () -> { + // by the time this value reaches the "stopwatch" thread it might be + // well outdated and that's okay, we will adjust the wait time + startTime.put(System.nanoTime()); + return code.call(); + }; + + FutureTask task = new FutureTask<>(wrappedTask); + Thread t = new Thread(task); + t.start(); + + final long startNanos; + try { + startNanos = startTime.take(); // (1) wait for the initial time mark + } catch (Throwable e) { + t.interrupt(); + throw e; + } + + final long waitTime = millis - + NANOSECONDS.toMillis(System.nanoTime() - startNanos); // (2) adjust wait time + + try { + Object r = task.get(waitTime, MILLISECONDS); // (3) wait for the task to complete + long elapsed = NANOSECONDS.toMillis(System.nanoTime() - startNanos); + if (elapsed < waitTime) { + throw new RuntimeException(format( + "After %s ms. (waitTime %s ms.) returned result '%s'", elapsed, waitTime, r)); + } + } catch (ExecutionException e) { + long elapsed = NANOSECONDS.toMillis(System.nanoTime() - startNanos); + if (elapsed < waitTime) { + throw new RuntimeException(format( + "After %s ms. (waitTime %s ms.) thrown exception", elapsed, waitTime), e); + } + } catch (TimeoutException expected) { + } finally { + t.interrupt(); + } + } + + // ------ miscellaneous utilities ------ + + private static String urlTo(TestServer server) { + String hostAddress = server.getInetAddress().getHostAddress(); + String addr; + if (hostAddress.contains(":")) { // IPv6 + addr = '[' + hostAddress + ']'; + } else { // IPv4 + addr = hostAddress; + } + return "ldap://" + addr + ":" + server.getPort(); + } + + /* + * A diagnostic aid that might help with debugging timeout issues. The idea + * is to continuously measure accuracy and responsiveness of the system that + * runs this test. If the system is overwhelmed (with something else), it + * might affect the test run. At the very least we will have traces of that + * in the logs. + * + * This utility does not automatically scale up test timeouts, it simply + * gathers information. + */ + private static void startAuxiliaryDiagnosticOutput() { + System.out.printf("Starting diagnostic output (probe)%n"); + Thread t = new Thread(() -> { + for (int i = 0; ; i = ((i % 20) + 1)) { + // 500, 1_000, 1_500, ..., 9_500, 10_000, 500, 1_000, ... + long expected = i * 500; + long start = System.nanoTime(); + try { + MILLISECONDS.sleep(expected); + } catch (InterruptedException e) { + return; + } + long stop = System.nanoTime(); + long actual = NANOSECONDS.toMillis(stop - start); + System.out.printf("(probe) expected [ms.]: %s, actual [ms.]: %s%n", + expected, actual); + + } + }, "probe"); + t.setDaemon(true); + t.start(); + } } - diff -r 1fe292a94df1 -r 68031e660872 test/jdk/com/sun/jndi/ldap/lib/BaseLdapServer.java --- a/test/jdk/com/sun/jndi/ldap/lib/BaseLdapServer.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/com/sun/jndi/ldap/lib/BaseLdapServer.java Sat Sep 14 13:18:20 2019 +0200 @@ -35,7 +35,6 @@ import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.RejectedExecutionException; import static java.lang.System.Logger.Level.INFO; @@ -44,6 +43,7 @@ * * Override the following methods to provide customized behavior * + * * beforeAcceptingConnections * * beforeConnectionHandled * * handleRequest * @@ -83,6 +83,7 @@ logger().log(INFO, "Server is accepting connections at port {0}", getPort()); try { + beforeAcceptingConnections(); while (isRunning()) { Socket socket = serverSocket.accept(); logger().log(INFO, "Accepted new connection at {0}", socket); @@ -97,10 +98,10 @@ } connectionsPool.submit(() -> handleConnection(socket)); } - } catch (IOException | RejectedExecutionException e) { + } catch (Throwable t) { if (isRunning()) { throw new RuntimeException( - "Unexpected exception while accepting connections", e); + "Unexpected exception while accepting connections", t); } } finally { logger().log(INFO, "Server stopped accepting connections at port {0}", @@ -109,6 +110,13 @@ } /* + * Called once immediately preceding the server accepting connections. + * + * Override to customize the behavior. + */ + protected void beforeAcceptingConnections() { } + + /* * A "Template Method" describing how a connection (represented by a socket) * is handled. * @@ -240,12 +248,25 @@ /** * Returns the local port this server is listening at. * + * This method can be called at any time. + * * @return the port this server is listening at */ public int getPort() { return serverSocket.getLocalPort(); } + /** + * Returns the address this server is listening at. + * + * This method can be called at any time. + * + * @return the address + */ + public InetAddress getInetAddress() { + return serverSocket.getInetAddress(); + } + /* * Returns a flag to indicate whether this server is running or not. * diff -r 1fe292a94df1 -r 68031e660872 test/jdk/java/net/CookieHandler/CookieManagerTest.java --- a/test/jdk/java/net/CookieHandler/CookieManagerTest.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/java/net/CookieHandler/CookieManagerTest.java Sat Sep 14 13:18:20 2019 +0200 @@ -26,7 +26,8 @@ * @summary Unit test for java.net.CookieManager * @bug 6244040 7150552 7051862 * @modules jdk.httpserver - * @run main/othervm -ea CookieManagerTest + * java.logging + * @run main/othervm -ea -esa CookieManagerTest * @author Edward Wang */ @@ -36,6 +37,8 @@ import java.util.List; import java.io.IOException; import java.net.*; +import java.util.logging.Level; +import java.util.logging.Logger; import static java.net.Proxy.NO_PROXY; public class CookieManagerTest { @@ -63,6 +66,11 @@ } public static void main(String[] args) throws Exception { + // logs everything... + Logger root = Logger.getLogger(""); + root.setLevel(Level.ALL); + root.getHandlers()[0].setLevel(Level.ALL); + startHttpServer(); makeHttpCall(); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/java/net/Socket/HttpProxy.java --- a/test/jdk/java/net/Socket/HttpProxy.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/java/net/Socket/HttpProxy.java Sat Sep 14 13:18:20 2019 +0200 @@ -160,6 +160,7 @@ public void run() { try { simpleWrite(os, start); } catch (Exception e) {unexpected(e); } + finally { out.println(threadName + ": done"); } }}, threadName)).start(); } @@ -170,6 +171,7 @@ b[1] = (byte) (i % 256); os.write(b); } + out.println("Wrote " + start + " -> " + (start + 100)); } void simpleRead(InputStream is, int start) throws Exception { @@ -184,6 +186,7 @@ if (r != i) throw new Exception("read " + r + " expected " +i); } + out.println("Read " + start + " -> " + (start + 100)); } int bytes(byte b1, byte b2) { @@ -249,6 +252,7 @@ // retrieve the host and port info from the status-line InetSocketAddress serverAddr = getConnectInfo(statusLine); + out.println("Proxy serving CONNECT request to " + serverAddr); //open socket to the server try (Socket serverSocket = new Socket(serverAddr.getAddress(), diff -r 1fe292a94df1 -r 68031e660872 test/jdk/java/net/Socket/NullHost.java --- a/test/jdk/java/net/Socket/NullHost.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/java/net/Socket/NullHost.java Sat Sep 14 13:18:20 2019 +0200 @@ -46,8 +46,10 @@ return svr.getLocalPort(); } + volatile boolean done; public void shutdown() { try { + done = true; svr.close(); } catch (IOException e) { } @@ -56,11 +58,12 @@ public void run() { Socket s; try { - while (true) { + while (!done) { s = svr.accept(); s.close(); } } catch (IOException e) { + if (!done) e.printStackTrace(); } } } @@ -74,13 +77,9 @@ int port = s.getPort(); s.start(); try { - Socket sock = new Socket((String)null, port); - sock.close(); - sock = new Socket((String)null, port, true); - sock.close(); - sock = new Socket((String)null, port, null, 0); - sock.close(); - + try (var sock = new Socket((String)null, port)) {} + try (var sock = new Socket((String)null, port, true)) {} + try (var sock = new Socket((String)null, port, null, 0)) {} } catch (NullPointerException e) { throw new RuntimeException("Got a NPE"); } finally { diff -r 1fe292a94df1 -r 68031e660872 test/jdk/java/util/regex/RegExTest.java --- a/test/jdk/java/util/regex/RegExTest.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/java/util/regex/RegExTest.java Sat Sep 14 13:18:20 2019 +0200 @@ -35,7 +35,7 @@ * 8027645 8035076 8039124 8035975 8074678 6854417 8143854 8147531 7071819 * 8151481 4867170 7080302 6728861 6995635 6736245 4916384 6328855 6192895 * 6345469 6988218 6693451 7006761 8140212 8143282 8158482 8176029 8184706 - * 8194667 8197462 8184692 8221431 8224789 8228352 + * 8194667 8197462 8184692 8221431 8224789 8228352 8230829 * * @library /test/lib * @library /lib/testlibrary/java/lang @@ -1070,6 +1070,22 @@ matcher.useAnchoringBounds(false); if (matcher.find()) failCount++; + + // JDK-8230829 + pattern = Pattern.compile("\\ud800\\udc61"); + matcher = pattern.matcher("\ud800\udc61"); + matcher.region(0, 1); + if (matcher.find()) { + failCount++; + System.out.println("Matched a surrogate pair" + + " that crosses border of region"); + } + if (!matcher.hitEnd()) { + failCount++; + System.out.println("Expected to hit the end when" + + " matching a surrogate pair crossing region"); + } + report("Regions"); } diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/http/KeepAliveCache/B5045306.java --- a/test/jdk/sun/net/www/http/KeepAliveCache/B5045306.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/http/KeepAliveCache/B5045306.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, 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 @@ -62,7 +62,7 @@ public static void startHttpServer() { try { httpTrans = new SimpleHttpTransaction(); - server = new TestHttpServer(httpTrans, 1, 10, 0); + server = new TestHttpServer(httpTrans, 1, 10, InetAddress.getLocalHost(), 0); } catch (IOException e) { e.printStackTrace(); } @@ -71,13 +71,14 @@ public static void clientHttpCalls() { try { System.out.println("http server listen on: " + server.getLocalPort()); - String baseURLStr = "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + - server.getLocalPort() + "/"; + String hostAddr = InetAddress.getLocalHost().getHostAddress(); + if (hostAddr.indexOf(':') > -1) hostAddr = "[" + hostAddr + "]"; + String baseURLStr = "http://" + hostAddr + ":" + server.getLocalPort() + "/"; URL bigDataURL = new URL (baseURLStr + "firstCall"); URL smallDataURL = new URL (baseURLStr + "secondCall"); - HttpURLConnection uc = (HttpURLConnection)bigDataURL.openConnection(); + HttpURLConnection uc = (HttpURLConnection)bigDataURL.openConnection(Proxy.NO_PROXY); //Only read 1 byte of response data and close the stream InputStream is = uc.getInputStream(); @@ -88,7 +89,7 @@ // Allow the KeepAliveStreamCleaner thread to read the data left behind and cache the connection. try { Thread.sleep(2000); } catch (Exception e) {} - uc = (HttpURLConnection)smallDataURL.openConnection(); + uc = (HttpURLConnection)smallDataURL.openConnection(Proxy.NO_PROXY); uc.getResponseCode(); if (SimpleHttpTransaction.failed) @@ -96,7 +97,7 @@ // Part 2 URL part2Url = new URL (baseURLStr + "part2"); - uc = (HttpURLConnection)part2Url.openConnection(); + uc = (HttpURLConnection)part2Url.openConnection(Proxy.NO_PROXY); is = uc.getInputStream(); is.close(); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsClient/ServerIdentityTest.java --- a/test/jdk/sun/net/www/protocol/https/HttpsClient/ServerIdentityTest.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsClient/ServerIdentityTest.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -42,7 +42,10 @@ import java.io.BufferedWriter; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.Proxy; import java.net.URL; +import java.net.UnknownHostException; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -64,6 +67,10 @@ (new ServerIdentityTest()).run(); } + ServerIdentityTest() throws UnknownHostException { + serverAddress = InetAddress.getByName(hostname); + } + @Override protected boolean isCustomizedClientConnection() { return true; @@ -88,7 +95,7 @@ HttpURLConnection urlc = null; InputStream is = null; try { - urlc = (HttpURLConnection)url.openConnection(); + urlc = (HttpURLConnection)url.openConnection(Proxy.NO_PROXY); is = urlc.getInputStream(); } finally { if (is != null) { diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2015, 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 @@ -651,8 +651,13 @@ serverModulus, serverPrivateExponent, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + // doClientSide() connects to "localhost" + InetAddress localHost = InetAddress.getByName("localhost"); + InetSocketAddress address = new InetSocketAddress(localHost, serverPort); + sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); /* @@ -717,7 +722,7 @@ System.out.println("url is "+url.toString()); try { - http = (HttpsURLConnection)url.openConnection(); + http = (HttpsURLConnection)url.openConnection(Proxy.NO_PROXY); int respCode = http.getResponseCode(); System.out.println("respCode = "+respCode); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressDNSIdentities.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressDNSIdentities.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressDNSIdentities.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, 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 @@ -650,8 +650,13 @@ serverModulus, serverPrivateExponent, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + // doClientSide() connects to the loopback address + InetAddress loopback = InetAddress.getLoopbackAddress(); + InetSocketAddress address = new InetSocketAddress(loopback, serverPort); + sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); /* @@ -721,7 +726,7 @@ System.out.println("url is "+url.toString()); try { - http = (HttpsURLConnection)url.openConnection(); + http = (HttpsURLConnection)url.openConnection(Proxy.NO_PROXY); int respCode = http.getResponseCode(); System.out.println("respCode = " + respCode); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressIPIdentities.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressIPIdentities.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPAddressIPIdentities.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2015, 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 @@ -654,8 +654,13 @@ serverModulus, serverPrivateExponent, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + // doClientSide() connects to the loopback address + InetAddress loopback = InetAddress.getLoopbackAddress(); + InetSocketAddress address = new InetSocketAddress(loopback, serverPort); + sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); /* @@ -725,7 +730,7 @@ System.out.println("url is "+url.toString()); try { - http = (HttpsURLConnection)url.openConnection(); + http = (HttpsURLConnection)url.openConnection(Proxy.NO_PROXY); int respCode = http.getResponseCode(); System.out.println("respCode = "+respCode); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/IPIdentities.java Sat Sep 14 13:18:20 2019 +0200 @@ -29,6 +29,7 @@ /* @test * @summary X509 certificate hostname checking is broken in JDK1.6.0_10 * @bug 6766775 + * @library /test/lib * @run main/othervm IPIdentities * @author Xuelei Fan */ @@ -45,6 +46,7 @@ import java.security.spec.*; import java.security.interfaces.*; import java.math.BigInteger; +import jdk.test.lib.net.URIBuilder; /* * Certificates and key used in the test. @@ -652,8 +654,13 @@ serverModulus, serverPrivateExponent, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + // doClientSide() connects to the loopback address + InetAddress loopback = InetAddress.getLoopbackAddress(); + InetSocketAddress address = new InetSocketAddress(loopback, serverPort); + sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); /* @@ -713,11 +720,16 @@ HttpsURLConnection http = null; /* establish http connection to server */ - URL url = new URL("https://localhost:" + serverPort+"/"); + URL url = URIBuilder.newBuilder() + .scheme("https") + .loopback() + .port(serverPort) + .path("/") + .toURL(); System.out.println("url is "+url.toString()); try { - http = (HttpsURLConnection)url.openConnection(); + http = (HttpsURLConnection)url.openConnection(Proxy.NO_PROXY); int respCode = http.getResponseCode(); System.out.println("respCode = "+respCode); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/Identities.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/Identities.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/Identities.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2015, 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 @@ -651,8 +651,13 @@ serverModulus, serverPrivateExponent, passphrase); SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + // doClientSide() connects to "localhost" + InetAddress localHost = InetAddress.getByName("localhost"); + InetSocketAddress address = new InetSocketAddress(localHost, serverPort); + sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); /* @@ -717,7 +722,7 @@ System.out.println("url is "+url.toString()); try { - http = (HttpsURLConnection)url.openConnection(); + http = (HttpsURLConnection)url.openConnection(Proxy.NO_PROXY); int respCode = http.getResponseCode(); System.out.println("respCode = "+respCode); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java --- a/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/HttpsURLConnection/ImpactOnSNI.java Sat Sep 14 13:18:20 2019 +0200 @@ -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 @@ -95,6 +95,16 @@ * smart about it.... */ + private SSLServerSocket createServerSocket(SSLServerSocketFactory sslssf) + throws Exception { + SSLServerSocket sslServerSocket = + (SSLServerSocket)sslssf.createServerSocket(); + InetAddress localHost = InetAddress.getLocalHost(); + InetSocketAddress address = new InetSocketAddress(localHost, serverPort); + sslServerSocket.bind(address); + return sslServerSocket; + } + /* * Define the server side of the test. * @@ -104,8 +114,7 @@ private void doServerSide() throws Exception { SSLServerSocketFactory sslssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); - try (SSLServerSocket sslServerSocket = - (SSLServerSocket)sslssf.createServerSocket(serverPort)) { + try (SSLServerSocket sslServerSocket = createServerSocket(sslssf)) { serverPort = sslServerSocket.getLocalPort(); diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java --- a/test/jdk/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -135,8 +135,14 @@ SSLServerSocketFactory sslssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + + // doClientSide() connects to "localhost" + InetAddress localHost = InetAddress.getByName("localhost"); + InetSocketAddress address = new InetSocketAddress(localHost, serverPort); + SSLServerSocket sslServerSocket = - (SSLServerSocket) sslssf.createServerSocket(serverPort); + (SSLServerSocket) sslssf.createServerSocket(); + sslServerSocket.bind(address); serverPort = sslServerSocket.getLocalPort(); String ciphers[]= { "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA" }; @@ -205,7 +211,7 @@ URL url = new URL("https://" + "localhost:" + serverPort + "/etc/hosts"); - URLConnection urlc = url.openConnection(); + URLConnection urlc = url.openConnection(Proxy.NO_PROXY); if (!(urlc instanceof javax.net.ssl.HttpsURLConnection)) { throw new Exception( diff -r 1fe292a94df1 -r 68031e660872 test/jdk/sun/net/www/protocol/jar/B4957695.java --- a/test/jdk/sun/net/www/protocol/jar/B4957695.java Sat Sep 14 13:15:10 2019 +0200 +++ b/test/jdk/sun/net/www/protocol/jar/B4957695.java Sat Sep 14 13:18:20 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -96,7 +96,10 @@ public static void main (String[] args) throws Exception { String tmpdir = System.getProperty("java.io.tmpdir"); String[] list1 = listTmpFiles(tmpdir); - ServerSocket serverSocket = new ServerSocket(0); + InetAddress localHost = InetAddress.getByName("localhost"); + InetSocketAddress address = new InetSocketAddress(localHost, 0); + ServerSocket serverSocket = new ServerSocket(); + serverSocket.bind(address); server = new Server(serverSocket); server.start(); int port = serverSocket.getLocalPort(); @@ -108,7 +111,9 @@ read (is); is.close(); } catch (IOException e) { - System.out.println ("Received IOException as expected"); + System.out.println ("Received IOException as expected: " + e); + } finally { + try {serverSocket.close();} catch (IOException x) {} } String[] list2 = listTmpFiles(tmpdir); if (!sameList (list1, list2)) {