8285794: AsyncGetCallTrace might acquire a lock via JavaThread::thread_from_jni_environment

Reviewed-by: dholmes, mdoerr, jbachorik
This commit is contained in:
Johannes Bechberger 2022-05-09 08:18:31 +00:00 committed by Martin Doerr
parent 39f4434f44
commit d4474b5816

View File

@ -564,10 +564,13 @@ extern "C" {
JNIEXPORT
void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
// Can't use thread_from_jni_environment as it may also perform a VM exit check that is unsafe to
// do from this context.
Thread* raw_thread = Thread::current_or_null_safe();
JavaThread* thread;
if (trace->env_id == NULL ||
(thread = JavaThread::thread_from_jni_environment(trace->env_id))->is_exiting()) {
if (trace->env_id == NULL || raw_thread == NULL || !raw_thread->is_Java_thread() ||
(thread = JavaThread::cast(raw_thread))->is_exiting()) {
// bad env_id, thread has exited or thread is exiting
trace->num_frames = ticks_thread_exit; // -8
return;
@ -579,7 +582,8 @@ void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
return;
}
assert(JavaThread::current() == thread,
// This is safe now as the thread has not terminated and so no VM exit check occurs.
assert(thread == JavaThread::thread_from_jni_environment(trace->env_id),
"AsyncGetCallTrace must be called by the current interrupted thread");
if (!JvmtiExport::should_post_class_load()) {