undefect. CWE-407 — 63 sites patched across 27 ecosystems
Authors: russell@unturf.com · brackishbert@gmail.com · foxhop.net · TimeHexOn.com Patches, unit tests, benchmarks, whitepaper, and outreach briefs. Public domain — no copyright claimed. Use freely.
This commit is contained in:
commit
0a580b313d
70422 changed files with 17213626 additions and 0 deletions
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Copyright (c) 2022, 2023, 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 8287982
|
||||
* @summary Test native threads attaching to the VM with JNI AttachCurrentThread
|
||||
* @requires (os.family == "linux" | os.family == "mac")
|
||||
* @library /test/lib
|
||||
* @compile ExplicitAttach.java
|
||||
* @run main AttachTest ExplicitAttach 1
|
||||
* @run main AttachTest ExplicitAttach 2
|
||||
* @run main AttachTest ExplicitAttach 4
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @summary Test native threads attaching implicitly to the VM by means of an upcall
|
||||
* @requires (os.family == "linux" | os.family == "mac") & (sun.arch.data.model == "64")
|
||||
* @library /test/lib
|
||||
* @compile ImplicitAttach.java
|
||||
* @run main AttachTest --enable-native-access=ALL-UNNAMED ImplicitAttach 1
|
||||
* @run main AttachTest --enable-native-access=ALL-UNNAMED ImplicitAttach 2
|
||||
* @run main AttachTest --enable-native-access=ALL-UNNAMED ImplicitAttach 4
|
||||
*/
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import jdk.test.lib.process.ProcessTools;
|
||||
import jdk.test.lib.process.OutputAnalyzer;
|
||||
|
||||
public class AttachTest {
|
||||
static final String TEST_CLASSES = System.getProperty("test.classes");
|
||||
static final String JAVA_LIBRARY_PATH = System.getProperty("java.library.path");
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// prepend -cp ${test.classes} -Djava.library.path=${java.library.path}
|
||||
String[] opts = Stream.concat(Stream.of(
|
||||
"-cp", TEST_CLASSES,
|
||||
"-Djava.library.path=" + JAVA_LIBRARY_PATH),
|
||||
Stream.of(args))
|
||||
.toArray(String[]::new);
|
||||
OutputAnalyzer outputAnalyzer = ProcessTools
|
||||
.executeTestJava(opts)
|
||||
.outputTo(System.out)
|
||||
.errorTo(System.out);
|
||||
outputAnalyzer.shouldHaveExitValue(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 2022, 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.
|
||||
*/
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* Test native threads attaching to the VM with JNI AttachCurrentThread.
|
||||
*/
|
||||
public class ExplicitAttach {
|
||||
private static volatile CountDownLatch latch;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int threadCount;
|
||||
if (args.length > 0) {
|
||||
threadCount = Integer.parseInt(args[0]);
|
||||
} else {
|
||||
threadCount = 2;
|
||||
}
|
||||
latch = new CountDownLatch(threadCount);
|
||||
|
||||
// start the threads and wait for the threads to call home
|
||||
startThreads(threadCount);
|
||||
latch.await();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked by attached threads.
|
||||
*/
|
||||
private static void callback() {
|
||||
System.out.println(Thread.currentThread());
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start n native threads that attach to the VM and invoke callback.
|
||||
*/
|
||||
private static native void startThreads(int n);
|
||||
|
||||
static {
|
||||
System.loadLibrary("ExplicitAttach");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* Copyright (c) 2022, 2023, 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.
|
||||
*/
|
||||
|
||||
import java.lang.foreign.*;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* Test native threads attaching implicitly to the VM by means of an upcall.
|
||||
*/
|
||||
public class ImplicitAttach {
|
||||
private static final ValueLayout.OfInt C_INT = ValueLayout.JAVA_INT;
|
||||
private static final AddressLayout C_POINTER = ValueLayout.ADDRESS;
|
||||
|
||||
private static volatile CountDownLatch latch;
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
int threadCount;
|
||||
if (args.length > 0) {
|
||||
threadCount = Integer.parseInt(args[0]);
|
||||
} else {
|
||||
threadCount = 2;
|
||||
}
|
||||
latch = new CountDownLatch(threadCount);
|
||||
|
||||
Linker abi;
|
||||
try {
|
||||
abi = Linker.nativeLinker();
|
||||
} catch (UnsupportedOperationException e) {
|
||||
System.out.println("Test skipped, no native linker on this platform");
|
||||
return;
|
||||
}
|
||||
|
||||
// stub to invoke callback
|
||||
MethodHandle callback = MethodHandles.lookup()
|
||||
.findStatic(ImplicitAttach.class, "callback", MethodType.methodType(void.class));
|
||||
MemorySegment upcallStub = abi.upcallStub(callback,
|
||||
FunctionDescriptor.ofVoid(),
|
||||
Arena.global());
|
||||
|
||||
// void start_threads(int count, void *(*f)(void *))
|
||||
SymbolLookup symbolLookup = SymbolLookup.loaderLookup();
|
||||
MemorySegment symbol = symbolLookup.find("start_threads").orElseThrow();
|
||||
FunctionDescriptor desc = FunctionDescriptor.ofVoid(C_INT, C_POINTER);
|
||||
MethodHandle start_threads = abi.downcallHandle(symbol, desc);
|
||||
|
||||
// start the threads and wait for the threads to call home
|
||||
start_threads.invoke(threadCount, upcallStub);
|
||||
latch.await();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked from native thread.
|
||||
*/
|
||||
private static void callback() {
|
||||
System.out.println(Thread.currentThread());
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
static {
|
||||
System.loadLibrary("ImplicitAttach");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2022, 2025, 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 <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include "jni.h"
|
||||
|
||||
#define STACK_SIZE 0x100000
|
||||
|
||||
static JavaVM *vm;
|
||||
|
||||
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void* reserved) {
|
||||
vm = jvm;
|
||||
return JNI_VERSION_1_8;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach the current thread with JNI AttachCurrentThread, call a method, and detach.
|
||||
*/
|
||||
void* thread_main(void* arg) {
|
||||
JNIEnv *env;
|
||||
jint res;
|
||||
|
||||
res = (*vm)->AttachCurrentThread(vm, (void **) &env, NULL);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "AttachCurrentThreadAsDaemon failed: %d\n", res);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// call ExplicitAttach.callback()
|
||||
jclass clazz = (*env)->FindClass(env, "ExplicitAttach");
|
||||
if (clazz == NULL) {
|
||||
fprintf(stderr, "FindClass failed\n");
|
||||
goto detach;
|
||||
}
|
||||
jmethodID mid = (*env)->GetStaticMethodID(env, clazz, "callback", "()V");
|
||||
if (mid == NULL) {
|
||||
fprintf(stderr, "GetStaticMethodID failed\n");
|
||||
goto detach;
|
||||
}
|
||||
(*env)->CallStaticVoidMethod(env, clazz, mid);
|
||||
if ((*env)->ExceptionOccurred(env)) {
|
||||
fprintf(stderr, "CallStaticVoidMethod failed\n");
|
||||
goto detach;
|
||||
}
|
||||
|
||||
detach:
|
||||
res = (*vm)->DetachCurrentThread(vm);
|
||||
if (res != JNI_OK) {
|
||||
fprintf(stderr, "DetachCurrentThread failed: %d\n", res);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_ExplicitAttach_startThreads(JNIEnv *env, jclass clazz, int n) {
|
||||
pthread_t tid;
|
||||
pthread_attr_t attr;
|
||||
int i;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_setstacksize(&attr, STACK_SIZE);
|
||||
for (i = 0; i < n ; i++) {
|
||||
int res = pthread_create(&tid, &attr, thread_main, NULL);
|
||||
if (res != 0) {
|
||||
fprintf(stderr, "pthread_create failed: %d\n", res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (c) 2022, 2024, 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 <pthread.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "export.h"
|
||||
|
||||
#define STACK_SIZE 0x100000
|
||||
|
||||
/**
|
||||
* Creates n threads to execute the given function.
|
||||
*/
|
||||
EXPORT void start_threads(int n, void *(*f)(void *)) {
|
||||
pthread_t tid;
|
||||
pthread_attr_t attr;
|
||||
int i;
|
||||
|
||||
pthread_attr_init(&attr);
|
||||
pthread_attr_setstacksize(&attr, STACK_SIZE);
|
||||
for (i = 0; i < n ; i++) {
|
||||
int res = pthread_create(&tid, &attr, f, NULL);
|
||||
if (res != 0) {
|
||||
fprintf(stderr, "pthread_create failed: %d\n", res);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue