From fb68395dcd267e60a8eae61dbbc8ff24052ce96d Mon Sep 17 00:00:00 2001 From: Michael McMahon Date: Fri, 8 Jan 2021 15:59:45 +0000 Subject: [PATCH 1/5] 8259014: (so) ServerSocketChannel.bind(UnixDomainSocketAddress)/SocketChannel.bind(UnixDomainSocketAddress) will have unknown user and group owner (win) Reviewed-by: alanb --- .../windows/native/libnio/ch/UnixDomainSockets.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/java.base/windows/native/libnio/ch/UnixDomainSockets.c b/src/java.base/windows/native/libnio/ch/UnixDomainSockets.c index 1869009a1f9..af033676815 100644 --- a/src/java.base/windows/native/libnio/ch/UnixDomainSockets.c +++ b/src/java.base/windows/native/libnio/ch/UnixDomainSockets.c @@ -92,7 +92,16 @@ Java_sun_nio_ch_UnixDomainSockets_socketSupported(JNIEnv *env, jclass cl) return JNI_FALSE; } closesocket(s); - return JNI_TRUE; + + /* Check for build 18362 or newer, due to Windows bug described in 8259014 */ + + OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; + DWORDLONG cond_mask = 0; + + VER_SET_CONDITION(cond_mask, VER_BUILDNUMBER, VER_GREATER_EQUAL); + osvi.dwBuildNumber = 18362; // Windows 10 (1903) or newer + + return VerifyVersionInfoW(&osvi, VER_BUILDNUMBER, cond_mask) != 0; } JNIEXPORT jint JNICALL From 020ec8485251698d1187204ac13321f4726e45ea Mon Sep 17 00:00:00 2001 From: Erik Joelsson Date: Fri, 8 Jan 2021 18:30:38 +0000 Subject: [PATCH 2/5] 8259429: Update reference to README.md Reviewed-by: iris --- make/conf/jib-profiles.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/make/conf/jib-profiles.js b/make/conf/jib-profiles.js index 632953e8e88..96e0fdf66d2 100644 --- a/make/conf/jib-profiles.js +++ b/make/conf/jib-profiles.js @@ -1001,9 +1001,9 @@ var getJibProfilesProfiles = function (input, common, data) { // test tasks. Care must however be taken not to polute that work dir by // setting the appropriate make variables to control output directories. // - // Use the existance of the top level README as indication of if this is + // Use the existance of the top level README.md as indication of if this is // the full source or just src.conf. - if (!new java.io.File(__DIR__, "../../README").exists()) { + if (!new java.io.File(__DIR__, "../../README.md").exists()) { var runTestPrebuiltSrcFullExtra = { dependencies: "src.full", work_dir: input.get("src.full", "install_path"), From e05f36f463870e9f2bee262fe8768b4aed8da434 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Mon, 11 Jan 2021 13:45:35 +0000 Subject: [PATCH 3/5] 8259043: More Zero architectures need linkage with libatomic Co-authored-by: Matthias Klose Reviewed-by: erikj --- make/autoconf/libraries.m4 | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/make/autoconf/libraries.m4 b/make/autoconf/libraries.m4 index f13a7fe8597..6ad9715a9fb 100644 --- a/make/autoconf/libraries.m4 +++ b/make/autoconf/libraries.m4 @@ -124,12 +124,18 @@ AC_DEFUN_ONCE([LIB_SETUP_LIBRARIES], BASIC_JVM_LIBS="$BASIC_JVM_LIBS -lpthread" fi - # Libatomic library - # 32-bit MIPS needs fallback library for 8-byte atomic ops - if test "x$OPENJDK_TARGET_OS" = xlinux && - (test "x$OPENJDK_TARGET_CPU" = xmips || - test "x$OPENJDK_TARGET_CPU" = xmipsel); then - BASIC_JVM_LIBS="$BASIC_JVM_LIBS -latomic" + # Atomic library + # 32-bit platforms needs fallback library for 8-byte atomic ops on Zero + if HOTSPOT_CHECK_JVM_VARIANT(zero); then + if test "x$OPENJDK_TARGET_OS" = xlinux && + (test "x$OPENJDK_TARGET_CPU" = xarm || + test "x$OPENJDK_TARGET_CPU" = xm68k || + test "x$OPENJDK_TARGET_CPU" = xmips || + test "x$OPENJDK_TARGET_CPU" = xmipsel || + test "x$OPENJDK_TARGET_CPU" = xppc || + test "x$OPENJDK_TARGET_CPU" = xsh); then + BASIC_JVM_LIBS="$BASIC_JVM_LIBS -latomic" + fi fi # perfstat lib From d60a937e876f1b38a958d96f10791c8d7a1c9277 Mon Sep 17 00:00:00 2001 From: Maurizio Cimadamore Date: Mon, 11 Jan 2021 16:14:56 +0000 Subject: [PATCH 4/5] 8259028: ClassCastException when using custom filesystem with wrapper FileChannel impl Reviewed-by: chegar, alanb, uschindler --- .../classes/jdk/incubator/foreign/MemorySegment.java | 7 +++---- .../jdk/internal/foreign/MappedMemorySegmentImpl.java | 11 +++++++++-- test/jdk/java/foreign/TestByteBuffer.java | 7 +++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemorySegment.java b/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemorySegment.java index d5360101dd3..64c8dc2b637 100644 --- a/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemorySegment.java +++ b/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemorySegment.java @@ -876,10 +876,9 @@ allocateNative(bytesSize, 1); * @param mapMode a file mapping mode, see {@link FileChannel#map(FileChannel.MapMode, long, long)}; the chosen mapping mode * might affect the behavior of the returned memory mapped segment (see {@link MappedMemorySegments#force(MemorySegment)}). * @return a new confined mapped memory segment. - * @throws IllegalArgumentException if {@code bytesOffset < 0}. - * @throws IllegalArgumentException if {@code bytesSize < 0}. - * @throws UnsupportedOperationException if an unsupported map mode is specified, or if the {@code path} is associated - * with a provider that does not support creating file channels. + * @throws IllegalArgumentException if {@code bytesOffset < 0}, {@code bytesSize < 0}, or if {@code path} is not associated + * with the default file system. + * @throws UnsupportedOperationException if an unsupported map mode is specified. * @throws IOException if the specified path does not point to an existing file, or if some other I/O error occurs. * @throws SecurityException If a security manager is installed and it denies an unspecified permission required by the implementation. * In the case of the default provider, the {@link SecurityManager#checkRead(String)} method is invoked to check diff --git a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/MappedMemorySegmentImpl.java b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/MappedMemorySegmentImpl.java index 62e40072824..36a0e83323e 100644 --- a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/MappedMemorySegmentImpl.java +++ b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/MappedMemorySegmentImpl.java @@ -34,6 +34,8 @@ import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.OpenOption; import java.nio.file.Path; import java.nio.file.StandardOpenOption; @@ -114,8 +116,13 @@ public class MappedMemorySegmentImpl extends NativeMemorySegmentImpl { Objects.requireNonNull(mapMode); if (bytesSize < 0) throw new IllegalArgumentException("Requested bytes size must be >= 0."); if (bytesOffset < 0) throw new IllegalArgumentException("Requested bytes offset must be >= 0."); - try (FileChannelImpl channelImpl = (FileChannelImpl)FileChannel.open(path, openOptions(mapMode))) { - UnmapperProxy unmapperProxy = channelImpl.mapInternal(mapMode, bytesOffset, bytesSize); + FileSystem fs = path.getFileSystem(); + if (fs != FileSystems.getDefault() || + fs.getClass().getModule() != Object.class.getModule()) { + throw new IllegalArgumentException("Unsupported file system"); + } + try (FileChannel channelImpl = FileChannel.open(path, openOptions(mapMode))) { + UnmapperProxy unmapperProxy = ((FileChannelImpl)channelImpl).mapInternal(mapMode, bytesOffset, bytesSize); int modes = defaultAccessModes(bytesSize); if (mapMode == FileChannel.MapMode.READ_ONLY) { modes &= ~WRITE; diff --git a/test/jdk/java/foreign/TestByteBuffer.java b/test/jdk/java/foreign/TestByteBuffer.java index 46e288a2ece..a396ec48ec5 100644 --- a/test/jdk/java/foreign/TestByteBuffer.java +++ b/test/jdk/java/foreign/TestByteBuffer.java @@ -47,6 +47,7 @@ import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.URI; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -513,6 +514,12 @@ public class TestByteBuffer { } } + @Test(expectedExceptions = IllegalArgumentException.class) + public void testMapCustomPath() throws IOException { + Path path = Path.of(URI.create("jrt:/")); + MemorySegment.mapFile(path, 0L, 0L, FileChannel.MapMode.READ_WRITE); + } + @Test(dataProvider="resizeOps") public void testCopyHeapToNative(Consumer checker, Consumer initializer, SequenceLayout seq) { checkByteArrayAlignment(seq.elementLayout()); From 2cb271e691b7d3d2a849503247b52fc57019c8ba Mon Sep 17 00:00:00 2001 From: Jonathan Gibbons Date: Mon, 11 Jan 2021 17:35:50 +0000 Subject: [PATCH 5/5] 8253996: Javac error on jdk16 build 18: invalid flag: -Xdoclint:-missing Reviewed-by: hannesw --- .../com/sun/tools/doclint/DocLint.java | 8 +- .../sun/tools/javac/api/BasicJavacTask.java | 10 ++- .../tools/javac/resources/compiler.properties | 3 + .../doclets/formats/html/HtmlOptions.java | 6 +- .../tools/javac/diags/examples.not-yet.txt | 1 + .../tools/javac/doclint/LimitedImage.java | 75 +++++++++++++++++++ 6 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 test/langtools/tools/javac/doclint/LimitedImage.java diff --git a/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java b/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java index f4e6e241bbe..ff05f7160d8 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/doclint/DocLint.java @@ -76,12 +76,16 @@ public abstract class DocLint implements Plugin { @Override public void init(JavacTask task, String... args) { - // ignore + throw new IllegalStateException("doclint not available"); } @Override public boolean isValidOption(String s) { - return false; + // passively accept all "plausible" options + return s.equals(XMSGS_OPTION) + || s.startsWith(XMSGS_CUSTOM_PREFIX) + || s.startsWith(XHTML_VERSION_PREFIX) + || s.startsWith(XCHECK_PACKAGE); } } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java index 0277d57b237..0e88ed29961 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/api/BasicJavacTask.java @@ -55,6 +55,7 @@ import com.sun.tools.javac.platform.PlatformDescription; import com.sun.tools.javac.platform.PlatformDescription.PluginInfo; import com.sun.tools.javac.processing.JavacProcessingEnvironment; import com.sun.tools.javac.resources.CompilerProperties.Errors; +import com.sun.tools.javac.resources.CompilerProperties.Warnings; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.DefinedBy; @@ -257,8 +258,11 @@ public class BasicJavacTask extends JavacTask { public void initDocLint(List docLintOpts) { if (docLintOpts.isEmpty()) return; - - DocLint.newDocLint().init(this, docLintOpts.toArray(new String[docLintOpts.size()])); - JavaCompiler.instance(context).keepComments = true; + try { + DocLint.newDocLint().init(this, docLintOpts.toArray(new String[docLintOpts.size()])); + JavaCompiler.instance(context).keepComments = true; + } catch (IllegalStateException e) { + Log.instance(context).warning(Warnings.DoclintNotAvailable); + } } } diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index 27909bae1bc..6b9362f8b9f 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -2049,6 +2049,9 @@ compiler.warn.deprecated.annotation.has.no.effect=\ compiler.warn.invalid.path=\ Invalid filename: {0} +compiler.warn.doclint.not.available=\ + No service provider for doclint is available + # 0: string compiler.err.invalid.path=\ Invalid filename: {0} diff --git a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java index f7b19aed7e0..ce5f7def06f 100644 --- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java +++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlOptions.java @@ -32,12 +32,12 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import com.sun.tools.doclint.DocLint; import jdk.javadoc.internal.doclets.toolkit.BaseOptions; import jdk.javadoc.internal.doclets.toolkit.Messages; import jdk.javadoc.internal.doclets.toolkit.Resources; import jdk.javadoc.internal.doclets.toolkit.util.DocFile; import jdk.javadoc.internal.doclets.toolkit.util.Utils; +import jdk.javadoc.internal.doclint.DocLint; /** * Storage for all options supported by the @@ -405,7 +405,7 @@ public class HtmlOptions extends BaseOptions { messages.error("doclet.Option_doclint_no_qualifiers"); return false; } - if (!DocLint.newDocLint().isValidOption(dopt)) { + if (!(new DocLint()).isValidOption(dopt)) { messages.error("doclet.Option_doclint_invalid_arg"); return false; } @@ -418,7 +418,7 @@ public class HtmlOptions extends BaseOptions { @Override public boolean process(String opt, List args) { String dopt = opt.replace("-Xdoclint/package:", DocLint.XCHECK_PACKAGE); - if (!DocLint.newDocLint().isValidOption(dopt)) { + if (!(new DocLint()).isValidOption(dopt)) { messages.error("doclet.Option_doclint_package_invalid_arg"); return false; } diff --git a/test/langtools/tools/javac/diags/examples.not-yet.txt b/test/langtools/tools/javac/diags/examples.not-yet.txt index 0161b2b7d76..fa8b2313fb5 100644 --- a/test/langtools/tools/javac/diags/examples.not-yet.txt +++ b/test/langtools/tools/javac/diags/examples.not-yet.txt @@ -110,6 +110,7 @@ compiler.misc.wrong.version # ClassReader compiler.warn.annotation.method.not.found # ClassReader compiler.warn.annotation.method.not.found.reason # ClassReader compiler.warn.big.major.version # ClassReader +compiler.warn.doclint.not.available # requires restricted image compiler.warn.future.attr # ClassReader compiler.warn.illegal.char.for.encoding compiler.warn.incubating.modules # requires adjusted classfile diff --git a/test/langtools/tools/javac/doclint/LimitedImage.java b/test/langtools/tools/javac/doclint/LimitedImage.java new file mode 100644 index 00000000000..e77a295e39b --- /dev/null +++ b/test/langtools/tools/javac/doclint/LimitedImage.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * 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 8253996 + * @summary Verify doclint behavior when doclint not available + * @library /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @run main/othervm --limit-modules jdk.compiler,jdk.zipfs LimitedImage + */ + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +import toolbox.JavacTask; +import toolbox.Task.Expect; +import toolbox.Task.Mode; +import toolbox.Task.OutputKind; +import toolbox.ToolBox; + +public class LimitedImage { + public static void main(String... args) throws IOException { + ToolBox tb = new ToolBox(); + + //showing help should be OK + new JavacTask(tb, Mode.CMDLINE) + .options("--help") + .run().writeAll(); + + Path testSource = Path.of("Test.java"); + tb.writeFile(testSource, "class Test {}"); + + List actualOutput; + List expectedOutput = List.of( + "- compiler.warn.doclint.not.available", + "1 warning" + ); + + //check proper diagnostics when doclint provider not present: + System.err.println("Test -Xdoclint when doclint not available"); + actualOutput = new JavacTask(tb, Mode.CMDLINE) + .options("-XDrawDiagnostics", "-Xdoclint") + .files(testSource) + .outdir(".") + .run(Expect.SUCCESS) + .writeAll() + .getOutputLines(OutputKind.DIRECT); + + tb.checkEqual(expectedOutput, actualOutput); + } + +}