summaryrefslogtreecommitdiff
path: root/openjdkjvmti/ti_thread.cc
diff options
context:
space:
mode:
author Alex Light <allight@google.com> 2017-09-22 14:19:18 -0700
committer Alex Light <allight@google.com> 2017-09-22 14:19:18 -0700
commitba461c3c5b588b0b65d3cc99aa12fe46a673962c (patch)
treec21c70e45fd0426a0a284d2801f1668ee47e44a9 /openjdkjvmti/ti_thread.cc
parent0ac2e5c1013cb41d73aa87c885fd99d4e5eb7d11 (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.cc13
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;