Skip to content

Commit 13bcc23

Browse files
parttimenerdJaroslav Bachorik
authored and
Jaroslav Bachorik
committed
8285794: AsyncGetCallTrace might acquire a lock via JavaThread::thread_from_jni_environment
Reviewed-by: phh
1 parent b5555c1 commit 13bcc23

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

src/hotspot/share/prims/forte.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -521,12 +521,14 @@ static void forte_fill_call_trace_given_top(JavaThread* thd,
521521
extern "C" {
522522
JNIEXPORT
523523
void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
524-
JavaThread* thread;
525524

526-
if (trace->env_id == NULL ||
527-
(thread = JavaThread::thread_from_jni_environment(trace->env_id)) == NULL ||
528-
thread->is_exiting()) {
525+
// Can't use thread_from_jni_environment as it may also perform a VM exit check that is unsafe to
526+
// do from this context.
527+
Thread* raw_thread = Thread::current_or_null_safe();
528+
JavaThread* thread;
529529

530+
if (trace->env_id == NULL || raw_thread == NULL || !raw_thread->is_Java_thread() ||
531+
(thread = ((JavaThread*)raw_thread))->is_exiting()) {
530532
// bad env_id, thread has exited or thread is exiting
531533
trace->num_frames = ticks_thread_exit; // -8
532534
return;
@@ -538,7 +540,8 @@ void AsyncGetCallTrace(ASGCT_CallTrace *trace, jint depth, void* ucontext) {
538540
return;
539541
}
540542

541-
assert(JavaThread::current() == thread,
543+
// This is safe now as the thread has not terminated and so no VM exit check occurs.
544+
assert(thread == JavaThread::thread_from_jni_environment(trace->env_id),
542545
"AsyncGetCallTrace must be called by the current interrupted thread");
543546

544547
if (!JvmtiExport::should_post_class_load()) {

0 commit comments

Comments
 (0)