From 0061970b7afa17da007044973cb45245e6dad2be Mon Sep 17 00:00:00 2001 From: Simon Frankenberger <simon-alpine@fraho.eu> Date: Wed, 20 Jul 2022 08:09:25 +0000 Subject: [PATCH] community/openjdk11: upgrade to 11.0.16 --- community/openjdk11/APKBUILD | 19 +- community/openjdk11/aarch64.patch | 17 - community/openjdk11/build.patch | 534 ------------------------------ 3 files changed, 11 insertions(+), 559 deletions(-) delete mode 100644 community/openjdk11/aarch64.patch delete mode 100644 community/openjdk11/build.patch diff --git a/community/openjdk11/APKBUILD b/community/openjdk11/APKBUILD index 86cd33ce8d54..b43a7b6d2049 100644 --- a/community/openjdk11/APKBUILD +++ b/community/openjdk11/APKBUILD @@ -1,15 +1,16 @@ # Contributor: Simon Frankenberger <simon-alpine@fraho.eu> # Maintainer: Simon Frankenberger <simon-alpine@fraho.eu> pkgname=openjdk11 -pkgver=11.0.15_p10 +pkgver=11.0.16_p8 _pkgver=${pkgver%_p*}-ga -pkgrel=1 +pkgrel=0 pkgdesc="Oracle OpenJDK 11" provider_priority=11 url="https://github.com/openjdk/jdk11u" # oracle dropped support for 32 bit # riscv64 blocked by openjdk10 -arch="all !x86 !armhf !armv7 !riscv64" +# s390x fails with SIGILL, disabled for further investigation +arch="all !x86 !armhf !armv7 !riscv64 !s390x" license="GPL-2.0-with-classpath-exception" makedepends="autoconf bash @@ -45,8 +46,6 @@ subpackages="$pkgname-jmods:_jmods:noarch $pkgname-jdk:_jdk" source="jdk-$_pkgver.tar.gz::https://github.com/openjdk/jdk11u/archive/jdk-$_pkgver.tar.gz - build.patch - aarch64.patch ppc64le.patch fix-bootjdk-check.patch @@ -77,6 +76,12 @@ case "$CARCH" in esac # secfixes: +# 11.0.16_p8-r0: +# - CVE-2022-21540 +# - CVE-2022-21541 +# - CVE-2022-21549 +# - CVE-2022-25647 +# - CVE-2022-34169 # 11.0.15_p10-r0: # - CVE-2021-44531 # - CVE-2021-44532 @@ -417,9 +422,7 @@ _jdk() { } sha512sums=" -9d9e631046769d3ad95229172f392649ef4162161eb2d6fa7371665619600a04db440e1b3d30c580e283ad2b6bd7580d1199fc854fad3cb962d79f18b2347c67 jdk-11.0.15-ga.tar.gz -b12077649a0553cd607f04854faf6cd21807a572e1321be2ea209c09e18517ea784a7c141da8fc8d0332242f90baf9024765530fce6485c5d72500083e8ff3a4 build.patch -f7fd94b04740e2a3f966577a5c02f7d6db38ef0ab3ef7b3183cd3ba3d8ff7304e3151fba03a4bcbb9f82f380a723d7823794e168ebf9f2fa8d5e7a9dbc895ce9 aarch64.patch +d27e1e377803ed65a9940a135ed812f8b95069458481291d5355dcd31df9b5f37955a81442636d0f4e61b29bfebd11508e500c809a51cffcce0994a5b8f80eca jdk-11.0.16-ga.tar.gz e8d2213b5995bc0811f9a0036a9794150568ff9de4e202674e218ece7996553b1f222cff43dd21222c378f4f95a1471da25859b5a82ee496ed64df85f34ff199 ppc64le.patch 53d0596fdb7bda21948ca233e3a402e60fd167c9147d86eac0c743f7987652840cc49aeaa1c0d3770ee8e37d8f4c5cd86aa85b4b83f8c8e8bf3248c258737d03 fix-bootjdk-check.patch d1767dddd8e0956e25c0f77ed45c6fc86a1191bae1704a6dc33be490fd20eaa50461fe5c2a3349512059d555651e2eb41437dd3c1096c351e8ee68b4534a2579 HelloWorld.java diff --git a/community/openjdk11/aarch64.patch b/community/openjdk11/aarch64.patch deleted file mode 100644 index 3f088dd9ccf1..000000000000 --- a/community/openjdk11/aarch64.patch +++ /dev/null @@ -1,17 +0,0 @@ -Subject: Remove fpu_control.h include -Upstream: No -Author: Simon Frankenberger <simon-alpine@fraho.eu> - -The header is not present with musl and including it results in build error. -It's not needed anyways. - ---- old/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp -+++ new/src/hotspot/os_cpu/linux_aarch64/os_linux_aarch64.cpp -@@ -74,7 +74,6 @@ - # include <pwd.h> - # include <poll.h> - # include <ucontext.h> --# include <fpu_control.h> - - #define REG_FP 29 - #define REG_LR 30 diff --git a/community/openjdk11/build.patch b/community/openjdk11/build.patch deleted file mode 100644 index 8ffb3ef1a6e1..000000000000 --- a/community/openjdk11/build.patch +++ /dev/null @@ -1,534 +0,0 @@ -Subject: Fix compilation issues with musl libc -Upstream: No -Author: The portola team at https://openjdk.java.net/projects/portola/ - With modifications by Simon Frankenberger <simon-alpine@fraho.eu> - -This giant patch makes it possible to compile openjdk with musl libc. -The base was taken from a diff with the portola project and adjusted for latest musl libc. - ---- old/make/ReleaseFile.gmk -+++ new/make/ReleaseFile.gmk -@@ -53,6 +53,7 @@ - $(call info-file-item, "JAVA_VERSION_DATE", "$(VERSION_DATE)") - $(call info-file-item, "OS_NAME", "$(RELEASE_FILE_OS_NAME)") - $(call info-file-item, "OS_ARCH", "$(RELEASE_FILE_OS_ARCH)") -+ $(call info-file-item, "LIBC", "musl") - endef - - # Param 1 - The file containing the MODULES list ---- old/make/autoconf/build-aux/config.guess -+++ new/make/autoconf/build-aux/config.guess -@@ -30,6 +30,17 @@ - DIR=`dirname $0` - OUT=`. $DIR/autoconf-config.guess` - -+# config.guess doesn't identify systems running the musl C library, and will -+# instead return a string with a -gnu suffix. This block detects musl and -+# modifies the string to have a -musl suffix instead. -+echo $OUT | grep -- -linux- > /dev/null 2> /dev/null -+if test $? = 0; then -+ ldd_version=`ldd --version 2>&1 | head -1 | cut -f1 -d' '` -+ if [ x"${ldd_version}" = x"musl" ]; then -+ OUT=`echo $OUT | sed 's/-gnu/-musl/'` -+ fi -+fi -+ - # Test and fix solaris on x86_64 - echo $OUT | grep i386-pc-solaris > /dev/null 2> /dev/null - if test $? = 0; then ---- old/make/hotspot/lib/CompileJvm.gmk -+++ new/make/hotspot/lib/CompileJvm.gmk -@@ -79,6 +79,7 @@ - -DHOTSPOT_BUILD_USER='"$(USERNAME)"' \ - -DHOTSPOT_VM_DISTRO='"$(HOTSPOT_VM_DISTRO)"' \ - -DCPU='"$(OPENJDK_TARGET_CPU_VM_VERSION)"' \ -+ -DLIBC='"musl"' \ - # - - ################################################################################ ---- old/make/lib/CoreLibraries.gmk -+++ new/make/lib/CoreLibraries.gmk -@@ -219,6 +219,7 @@ - endif - - LIBJLI_CFLAGS += $(LIBZ_CFLAGS) -+LIBJLI_CFLAGS += -DLIBC=\"musl\" - - ifneq ($(USE_EXTERNAL_LIBZ), true) - LIBJLI_EXTRA_FILES += \ ---- old/src/hotspot/os/linux/os_linux.cpp -+++ new/src/hotspot/os/linux/os_linux.cpp -@@ -101,7 +101,6 @@ - # include <string.h> - # include <syscall.h> - # include <sys/sysinfo.h> --# include <gnu/libc-version.h> - # include <sys/ipc.h> - # include <sys/shm.h> - # include <link.h> -@@ -594,6 +593,11 @@ - // detecting pthread library - - void os::Linux::libpthread_init() { -+#if !defined(__GLIBC__) && !defined(__UCLIBC__) -+ // Hard code Alpine Linux supported musl compatible settings -+ os::Linux::set_glibc_version("glibc 2.9"); -+ os::Linux::set_libpthread_version("NPTL"); -+#else - // Save glibc and pthread version strings. - #if !defined(_CS_GNU_LIBC_VERSION) || \ - !defined(_CS_GNU_LIBPTHREAD_VERSION) -@@ -611,6 +615,7 @@ - str = (char *)malloc(n, mtInternal); - confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n); - os::Linux::set_libpthread_version(str); -+#endif - } - - ///////////////////////////////////////////////////////////////////////////// -@@ -3109,20 +3114,36 @@ - extern "C" JNIEXPORT void numa_warn(int number, char *where, ...) { } - extern "C" JNIEXPORT void numa_error(char *where) { } - -+static void* dlvsym_if_available(void* handle, const char* name, const char* version) { -+ typedef void* (*dlvsym_func_type)(void* handle, const char* name, const char* version); -+ static dlvsym_func_type dlvsym_func; -+ static bool initialized = false; -+ -+ if (!initialized) { -+ dlvsym_func = (dlvsym_func_type)dlsym(RTLD_NEXT, "dlvsym"); -+ initialized = true; -+ } -+ -+ if (dlvsym_func != NULL) { -+ void *f = dlvsym_func(handle, name, version); -+ if (f != NULL) { -+ return f; -+ } -+ } -+ -+ return dlsym(handle, name); -+} -+ - // Handle request to load libnuma symbol version 1.1 (API v1). If it fails - // load symbol from base version instead. - void* os::Linux::libnuma_dlsym(void* handle, const char *name) { -- void *f = dlvsym(handle, name, "libnuma_1.1"); -- if (f == NULL) { -- f = dlsym(handle, name); -- } -- return f; -+ return dlvsym_if_available(handle, name, "libnuma_1.1"); - } - - // Handle request to load libnuma symbol version 1.2 (API v2) only. - // Return NULL if the symbol is not defined in this particular version. - void* os::Linux::libnuma_v2_dlsym(void* handle, const char* name) { -- return dlvsym(handle, name, "libnuma_1.2"); -+ return dlvsym_if_available(handle, name, "libnuma_1.2"); - } - - bool os::Linux::libnuma_init() { ---- old/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp -+++ new/src/hotspot/os_cpu/linux_x86/os_linux_x86.cpp -@@ -75,9 +75,6 @@ - # include <pwd.h> - # include <poll.h> - # include <ucontext.h> --#ifndef AMD64 --# include <fpu_control.h> --#endif - - #ifdef AMD64 - #define REG_SP REG_RSP ---- old/src/hotspot/share/gc/shared/genCollectedHeap.cpp -+++ new/src/hotspot/share/gc/shared/genCollectedHeap.cpp -@@ -1144,7 +1144,7 @@ - static ScratchBlock *removeSmallestScratch(ScratchBlock **prev_ptr) { - bool first = true; - size_t min_size = 0; // "first" makes this conceptually infinite. -- ScratchBlock **smallest_ptr, *smallest; -+ ScratchBlock **smallest_ptr = NULL, *smallest; - ScratchBlock *cur = *prev_ptr; - while (cur) { - assert(*prev_ptr == cur, "just checking"); ---- old/src/hotspot/share/utilities/globalDefinitions_gcc.hpp -+++ new/src/hotspot/share/utilities/globalDefinitions_gcc.hpp -@@ -204,7 +204,7 @@ - #elif defined(__APPLE__) - inline int g_isnan(double f) { return isnan(f); } - #elif defined(LINUX) || defined(_ALLBSD_SOURCE) --inline int g_isnan(float f) { return isnanf(f); } -+inline int g_isnan(float f) { return isnan(f); } - inline int g_isnan(double f) { return isnan(f); } - #else - #error "missing platform-specific definition here" ---- old/src/java.base/linux/native/libnet/linux_close.c -+++ new/src/java.base/linux/native/libnet/linux_close.c -@@ -60,7 +60,7 @@ - /* - * Signal to unblock thread - */ --static int sigWakeup = (__SIGRTMAX - 2); -+static int sigWakeup; - - /* - * fdTable holds one entry per file descriptor, up to a certain -@@ -149,6 +149,7 @@ - /* - * Setup the signal handler - */ -+ sigWakeup = SIGRTMAX - 2; - sa.sa_handler = sig_wakeup; - sa.sa_flags = 0; - sigemptyset(&sa.sa_mask); ---- old/src/java.base/unix/native/libjava/childproc.c -+++ new/src/java.base/unix/native/libjava/childproc.c -@@ -238,7 +238,13 @@ - { - if (envp == NULL || (char **) envp == environ) { - execvp(file, (char **) argv); -- return; -+ // ENOEXEC indicates that the file header was not recognized. The musl C -+ // library does not implement the fallback to /bin/sh for that case, so fall -+ // through to the code below which implements that fallback using -+ // execve_with_shell_fallback. -+ if (errno != ENOEXEC) { -+ return; -+ } - } - - if (*file == '\0') { ---- old/src/java.base/unix/native/libjava/jdk_util_md.h -+++ new/src/java.base/unix/native/libjava/jdk_util_md.h -@@ -37,7 +37,7 @@ - #define ISNAND(d) isnan(d) - #elif defined(__linux__) || defined(_ALLBSD_SOURCE) - #include <math.h> --#define ISNANF(f) isnanf(f) -+#define ISNANF(f) isnan(f) - #define ISNAND(d) isnan(d) - #elif defined(_AIX) - #include <math.h> ---- old/src/java.base/unix/native/libjli/java_md_solinux.c -+++ new/src/java.base/unix/native/libjli/java_md_solinux.c -@@ -236,6 +236,39 @@ - char *dmllp = NULL; - char *p; /* a utility pointer */ - -+#ifdef __linux -+#ifndef LIBC -+#error "LIBC not set" -+#endif -+ -+ if (strcmp(LIBC, "musl") == 0) { -+ /* -+ * The musl library loader requires LD_LIBRARY_PATH to be set in -+ * order to correctly resolve the dependency libjava.so has on libjvm.so. -+ * -+ * Specifically, it differs from glibc in the sense that even if -+ * libjvm.so has already been loaded it will not be considered a -+ * candidate for resolving the dependency unless the *full* path -+ * of the already loaded library matches the dependency being loaded. -+ * -+ * libjvm.so is being loaded by the launcher using a long path to -+ * dlopen, not just the basename of the library. Typically this -+ * is something like "../lib/server/libjvm.so". However, if/when -+ * libjvm.so later tries to dlopen libjava.so (which it does in -+ * order to get access to a few functions implemented in -+ * libjava.so) the musl loader will, as part of loading -+ * dependent libraries, try to load libjvm.so using only its -+ * basename "libjvm.so". Since this does not match the longer -+ * path path it was first loaded with, the already loaded -+ * library is not considered a candidate, and the loader will -+ * instead look for libjvm.so elsewhere. If it's not in -+ * LD_LIBRARY_PATH the dependency load will fail, and libjava.so -+ * will therefore fail as well. -+ */ -+ return JNI_TRUE; -+ } -+#endif -+ - #ifdef AIX - /* We always have to set the LIBPATH on AIX because ld doesn't support $ORIGIN. */ - return JNI_TRUE; ---- old/src/java.base/unix/native/libnio/ch/NativeThread.c -+++ new/src/java.base/unix/native/libnio/ch/NativeThread.c -@@ -36,7 +36,7 @@ - #ifdef __linux__ - #include <pthread.h> - /* Also defined in net/linux_close.c */ -- #define INTERRUPT_SIGNAL (__SIGRTMAX - 2) -+ #define INTERRUPT_SIGNAL (SIGRTMAX - 2) - #elif _AIX - #include <pthread.h> - /* Also defined in net/aix_close.c */ ---- old/src/java.desktop/unix/native/libawt_xawt/xawt/XToolkit.c -+++ new/src/java.desktop/unix/native/libawt_xawt/xawt/XToolkit.c -@@ -27,9 +27,6 @@ - #include <X11/Xutil.h> - #include <X11/Xos.h> - #include <X11/Xatom.h> --#ifdef __linux__ --#include <execinfo.h> --#endif - - #include <jvm.h> - #include <jni.h> -@@ -783,26 +780,6 @@ - } - return ret; - } -- --#ifdef __linux__ --void print_stack(void) --{ -- void *array[10]; -- size_t size; -- char **strings; -- size_t i; -- -- size = backtrace (array, 10); -- strings = backtrace_symbols (array, size); -- -- fprintf (stderr, "Obtained %zd stack frames.\n", size); -- -- for (i = 0; i < size; i++) -- fprintf (stderr, "%s\n", strings[i]); -- -- free (strings); --} --#endif - - Window get_xawt_root_shell(JNIEnv *env) { - static jclass classXRootWindow = NULL; ---- old/src/jdk.jdwp.agent/share/native/libjdwp/util.h -+++ new/src/jdk.jdwp.agent/share/native/libjdwp/util.h -@@ -35,15 +35,15 @@ - #ifdef DEBUG - /* Just to make sure these interfaces are not used here. */ - #undef free -- #define free(p) Do not use this interface. -+ #define free do_not_use_this_interface_free - #undef malloc -- #define malloc(p) Do not use this interface. -+ #define malloc do_not_use_this_interface_malloc - #undef calloc -- #define calloc(p) Do not use this interface. -+ #define calloc do_not_use_this_interface_calloc - #undef realloc -- #define realloc(p) Do not use this interface. -+ #define realloc do_not_use_this_interface_realloc - #undef strdup -- #define strdup(p) Do not use this interface. -+ #define strdup do_not_use_this_interface_strdup - #endif - - #include "log_messages.h" ---- old/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c -+++ new/test/hotspot/jtreg/runtime/StackGuardPages/exeinvoke.c -@@ -33,6 +33,7 @@ - - #include <assert.h> - #include <jni.h> -+#include <jvm.h> - #include <alloca.h> - #include <signal.h> - #include <string.h> -@@ -91,6 +92,20 @@ - } - } - -+int get_java_stacksize () { -+ size_t stacksize; -+ pthread_attr_t attr; -+ JDK1_1InitArgs jdk_args; -+ -+ jdk_args.version = JNI_VERSION_1_1; -+ JNI_GetDefaultJavaVMInitArgs(&jdk_args); -+ if (jdk_args.javaStackSize <= 0) { -+ fprintf(stderr, "Test ERROR. Can't get a valid value for the default stacksize.\n"); -+ exit(7); -+ } -+ return jdk_args.javaStackSize; -+} -+ - void *run_java_overflow (void *p) { - JNIEnv *env; - jclass class_id; -@@ -258,13 +273,19 @@ - exit(7); - } - -+ int stack_size = get_java_stacksize(); - pthread_t thr; -+ pthread_attr_t thread_attr; - -+ pthread_attr_init(&thread_attr); -+ pthread_attr_setstacksize(&thread_attr, stack_size); -+ - if (argc > 1 && strcmp(argv[1], "test_java_overflow") == 0) { - printf("\nTesting JAVA_OVERFLOW\n"); - - printf("Testing stack guard page behaviour for other thread\n"); -- pthread_create (&thr, NULL, run_java_overflow, NULL); -+ -+ pthread_create (&thr, &thread_attr, run_java_overflow, NULL); - pthread_join (thr, NULL); - - printf("Testing stack guard page behaviour for initial thread\n"); -@@ -277,7 +298,7 @@ - printf("\nTesting NATIVE_OVERFLOW\n"); - - printf("Testing stack guard page behaviour for other thread\n"); -- pthread_create (&thr, NULL, run_native_overflow, NULL); -+ pthread_create (&thr, &thread_attr, run_native_overflow, NULL); - pthread_join (thr, NULL); - - printf("Testing stack guard page behaviour for initial thread\n"); ---- old/test/jdk/java/lang/ProcessBuilder/Basic.java -+++ new/test/jdk/java/lang/ProcessBuilder/Basic.java -@@ -400,8 +400,8 @@ - if (failed != 0) throw new Error("null PATH"); - } else if (action.equals("PATH search algorithm")) { - equal(System.getenv("PATH"), "dir1:dir2:"); -- check(new File("/bin/true").exists()); -- check(new File("/bin/false").exists()); -+ check(new File(TrueExe.path()).exists()); -+ check(new File(FalseExe.path()).exists()); - String[] cmd = {"prog"}; - ProcessBuilder pb1 = new ProcessBuilder(cmd); - ProcessBuilder pb2 = new ProcessBuilder(cmd); -@@ -442,13 +442,13 @@ - checkPermissionDenied(pb); - - // continue searching if EACCES -- copy("/bin/true", "dir2/prog"); -+ copy(TrueExe.path(), "dir2/prog"); - equal(run(pb).exitValue(), True.exitValue()); - new File("dir1/prog").delete(); - new File("dir2/prog").delete(); - - new File("dir2/prog").mkdirs(); -- copy("/bin/true", "dir1/prog"); -+ copy(TrueExe.path(), "dir1/prog"); - equal(run(pb).exitValue(), True.exitValue()); - - // Check empty PATH component means current directory. -@@ -464,10 +464,10 @@ - pb.command(command); - File prog = new File("./prog"); - // "Normal" binaries -- copy("/bin/true", "./prog"); -+ copy(TrueExe.path(), "./prog"); - equal(run(pb).exitValue(), - True.exitValue()); -- copy("/bin/false", "./prog"); -+ copy(FalseExe.path(), "./prog"); - equal(run(pb).exitValue(), - False.exitValue()); - prog.delete(); -@@ -522,12 +522,12 @@ - new File("dir2/prog").delete(); - new File("prog").delete(); - new File("dir3").mkdirs(); -- copy("/bin/true", "dir1/prog"); -- copy("/bin/false", "dir3/prog"); -+ copy(TrueExe.path(), "dir1/prog"); -+ copy(FalseExe.path(), "dir3/prog"); - pb.environment().put("PATH","dir3"); - equal(run(pb).exitValue(), True.exitValue()); -- copy("/bin/true", "dir3/prog"); -- copy("/bin/false", "dir1/prog"); -+ copy(TrueExe.path(), "dir3/prog"); -+ copy(FalseExe.path(), "dir1/prog"); - equal(run(pb).exitValue(), False.exitValue()); - - } finally { -@@ -624,6 +624,13 @@ - new File("/bin/false").exists()); - } - -+ static class BusyBox { -+ public static boolean is() { return is; } -+ private static final boolean is = -+ (! Windows.is() && -+ new File("/bin/busybox").exists()); -+ } -+ - static class UnicodeOS { - public static boolean is() { return is; } - private static final String osName = System.getProperty("os.name"); -@@ -662,6 +669,45 @@ - } - } - -+ // On alpine linux, /bin/true and /bin/false are just links to /bin/busybox. -+ // Some tests copy /bin/true and /bin/false to files with a different filename. -+ // However, copying the busbox executable into a file with a different name -+ // won't result in the expected return codes. As workaround, we create -+ // executable files that can be copied and produce the exepected return -+ // values. We use this workaround, if we find the busybox executable. -+ -+ private static class TrueExe { -+ public static String path() { return path; } -+ private static final String path = path0(); -+ private static String path0(){ -+ if (!BusyBox.is()) { -+ return "/bin/true"; -+ } -+ else { -+ File trueExe = new File("true"); -+ setFileContents(trueExe, "#!/bin/true\n"); -+ trueExe.setExecutable(true); -+ return trueExe.getAbsolutePath(); -+ } -+ } -+ } -+ -+ private static class FalseExe { -+ public static String path() { return path; } -+ private static final String path = path0(); -+ private static String path0(){ -+ if (!BusyBox.is()) { -+ return "/bin/false"; -+ } -+ else { -+ File falseExe = new File("false"); -+ setFileContents(falseExe, "#!/bin/false\n"); -+ falseExe.setExecutable(true); -+ return falseExe.getAbsolutePath(); -+ } -+ } -+ } -+ - static class EnglishUnix { - private static final Boolean is = - (! Windows.is() && isEnglish("LANG") && isEnglish("LC_ALL")); -@@ -1965,7 +2011,7 @@ - //---------------------------------------------------------------- - try { - new File("suBdiR").mkdirs(); -- copy("/bin/true", "suBdiR/unliKely"); -+ copy(TrueExe.path(), "suBdiR/unliKely"); - final ProcessBuilder pb = - new ProcessBuilder(new String[]{"unliKely"}); - pb.environment().put("PATH", "suBdiR"); ---- old/test/jdk/java/lang/ProcessHandle/InfoTest.java -+++ new/test/jdk/java/lang/ProcessHandle/InfoTest.java -@@ -298,7 +298,14 @@ - } - if (info.command().isPresent()) { - String command = info.command().get(); -- String expected = Platform.isWindows() ? "sleep.exe" : "sleep"; -+ String expected = "sleep"; -+ if (Platform.isWindows()) { -+ expected = "sleep.exe"; -+ } else if (new File("/bin/busybox").exists()) { -+ // With busybox sleep is just a sym link to busybox. -+ // The busbox executable is seen as ProcessHandle.Info command. -+ expected = "busybox"; -+ } - Assert.assertTrue(command.endsWith(expected), "Command: expected: \'" + - expected + "\', actual: " + command); - -- GitLab