diff options
author | Andreas Gampe <agampe@google.com> | 2014-08-16 13:41:10 -0700 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-08-17 00:53:21 -0700 |
commit | 760172c3ccd6e75f6f1a89d8006934e8ffb1303e (patch) | |
tree | aa7b9c6c1690d09a36adb1dc7822fde80d057dd0 /runtime/monitor.cc | |
parent | ebee8de725d5fa83483642786b19ea453d865762 (diff) | |
download | art-760172c3ccd6e75f6f1a89d8006934e8ffb1303e.tar.gz art-760172c3ccd6e75f6f1a89d8006934e8ffb1303e.tar.bz2 art-760172c3ccd6e75f6f1a89d8006934e8ffb1303e.zip |
ART: Do not recursively abort when visiting locks in a bad state
This avoids a nested abort in VisitLocks.
Bug: 17080621, 16382675
Change-Id: Id604976ac9dcac0e319fb25cab4d2cbc98d7ee24
Diffstat (limited to 'runtime/monitor.cc')
-rw-r--r-- | runtime/monitor.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/runtime/monitor.cc b/runtime/monitor.cc index 4c780ee9e6..107efd702e 100644 --- a/runtime/monitor.cc +++ b/runtime/monitor.cc @@ -979,7 +979,7 @@ mirror::Object* Monitor::GetContendedMonitor(Thread* thread) { } void Monitor::VisitLocks(StackVisitor* stack_visitor, void (*callback)(mirror::Object*, void*), - void* callback_context) { + void* callback_context, bool abort_on_failure) { mirror::ArtMethod* m = stack_visitor->GetMethod(); CHECK(m != NULL); @@ -1012,10 +1012,19 @@ void Monitor::VisitLocks(StackVisitor* stack_visitor, void (*callback)(mirror::O return; // No "tries" implies no synchronization, so no held locks to report. } + // Get the dex pc. If abort_on_failure is false, GetDexPc will not abort in the case it cannot + // find the dex pc, and instead return kDexNoIndex. Then bail out, as it indicates we have an + // inconsistent stack anyways. + uint32_t dex_pc = stack_visitor->GetDexPc(abort_on_failure); + if (!abort_on_failure && dex_pc == DexFile::kDexNoIndex) { + LOG(ERROR) << "Could not find dex_pc for " << PrettyMethod(m); + return; + } + // Ask the verifier for the dex pcs of all the monitor-enter instructions corresponding to // the locks held in this stack frame. std::vector<uint32_t> monitor_enter_dex_pcs; - verifier::MethodVerifier::FindLocksAtDexPc(m, stack_visitor->GetDexPc(), &monitor_enter_dex_pcs); + verifier::MethodVerifier::FindLocksAtDexPc(m, dex_pc, &monitor_enter_dex_pcs); if (monitor_enter_dex_pcs.empty()) { return; } |