diff options
author | 2017-09-22 14:19:18 -0700 | |
---|---|---|
committer | 2017-09-22 14:19:18 -0700 | |
commit | ba461c3c5b588b0b65d3cc99aa12fe46a673962c (patch) | |
tree | c21c70e45fd0426a0a284d2801f1668ee47e44a9 /openjdkjvmti/ti_thread.cc | |
parent | 0ac2e5c1013cb41d73aa87c885fd99d4e5eb7d11 (diff) |
Ensure GetThreadState works with Thread subtypes
We were incorrectly assuming that Thread has no subclasses. This is
not accurate.
Bug: 66704836
Test: ./test.py --host -j50
Change-Id: I4abd85b6c4e6add6d62854adb4f8912777292315
Diffstat (limited to 'openjdkjvmti/ti_thread.cc')
-rw-r--r-- | openjdkjvmti/ti_thread.cc | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/openjdkjvmti/ti_thread.cc b/openjdkjvmti/ti_thread.cc index d437e52d0f..da1c1bccc7 100644 --- a/openjdkjvmti/ti_thread.cc +++ b/openjdkjvmti/ti_thread.cc @@ -484,13 +484,18 @@ jvmtiError ThreadUtil::GetThreadState(jvmtiEnv* env ATTRIBUTE_UNUSED, } art::ScopedObjectAccess soa(self); + art::StackHandleScope<1> hs(self); // Need to read the Java "started" field to know whether this is starting or terminated. - art::ObjPtr<art::mirror::Object> peer = soa.Decode<art::mirror::Object>(thread); - art::ObjPtr<art::mirror::Class> klass = peer->GetClass(); - art::ArtField* started_field = klass->FindDeclaredInstanceField("started", "Z"); + art::Handle<art::mirror::Object> peer(hs.NewHandle(soa.Decode<art::mirror::Object>(thread))); + art::ObjPtr<art::mirror::Class> thread_klass = + soa.Decode<art::mirror::Class>(art::WellKnownClasses::java_lang_Thread); + if (!thread_klass->IsAssignableFrom(peer->GetClass())) { + return ERR(INVALID_THREAD); + } + art::ArtField* started_field = thread_klass->FindDeclaredInstanceField("started", "Z"); CHECK(started_field != nullptr); - bool started = started_field->GetBoolean(peer) != 0; + bool started = started_field->GetBoolean(peer.Get()) != 0; constexpr jint kStartedState = JVMTI_JAVA_LANG_THREAD_STATE_NEW; constexpr jint kTerminatedState = JVMTI_THREAD_STATE_TERMINATED | JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED; |