From 672f520b125639c090cc38c9ae7231e0dfbd31dd Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Thu, 12 Jan 2012 18:06:40 -0800 Subject: Fix race in double verifying super class Change-Id: I75089d0be8ad13b22300dd59bcc88da61d349e0d --- src/class_linker.cc | 30 ------------------------------ src/dex_verifier.cc | 3 +++ src/object_utils.h | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/class_linker.cc b/src/class_linker.cc index 8c46a7e403..4226ea5bb6 100644 --- a/src/class_linker.cc +++ b/src/class_linker.cc @@ -23,7 +23,6 @@ #include "intern_table.h" #include "leb128.h" #include "logging.h" -#include "monitor.h" #include "oat_file.h" #include "object.h" #include "object_utils.h" @@ -193,35 +192,6 @@ const char* ClassLinker::class_roots_descriptors_[] = { "[Ljava/lang/StackTraceElement;", }; -class ObjectLock { - public: - explicit ObjectLock(Object* object) : self_(Thread::Current()), obj_(object) { - CHECK(object != NULL); - obj_->MonitorEnter(self_); - } - - ~ObjectLock() { - obj_->MonitorExit(self_); - } - - void Wait() { - return Monitor::Wait(self_, obj_, 0, 0, false); - } - - void Notify() { - obj_->Notify(); - } - - void NotifyAll() { - obj_->NotifyAll(); - } - - private: - Thread* self_; - Object* obj_; - DISALLOW_COPY_AND_ASSIGN(ObjectLock); -}; - ClassLinker* ClassLinker::Create(const std::string& boot_class_path, InternTable* intern_table) { CHECK_NE(boot_class_path.size(), 0U); UniquePtr class_linker(new ClassLinker(intern_table)); diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc index 25fadb0c91..117218657b 100644 --- a/src/dex_verifier.cc +++ b/src/dex_verifier.cc @@ -900,6 +900,9 @@ bool DexVerifier::VerifyClass(const Class* klass) { return false; } if (super != NULL) { + // Acquire lock to prevent races on verifying the super class + ObjectLock lock(super); + if (!super->IsVerified() && !super->IsErroneous()) { Runtime::Current()->GetClassLinker()->VerifyClass(super); } diff --git a/src/object_utils.h b/src/object_utils.h index f9aca10e65..0412858084 100644 --- a/src/object_utils.h +++ b/src/object_utils.h @@ -21,6 +21,7 @@ #include "dex_cache.h" #include "dex_file.h" #include "intern_table.h" +#include "monitor.h" #include "object.h" #include "runtime.h" #include "UniquePtr.h" @@ -29,6 +30,35 @@ namespace art { +class ObjectLock { + public: + explicit ObjectLock(Object* object) : self_(Thread::Current()), obj_(object) { + CHECK(object != NULL); + obj_->MonitorEnter(self_); + } + + ~ObjectLock() { + obj_->MonitorExit(self_); + } + + void Wait() { + return Monitor::Wait(self_, obj_, 0, 0, false); + } + + void Notify() { + obj_->Notify(); + } + + void NotifyAll() { + obj_->NotifyAll(); + } + + private: + Thread* self_; + Object* obj_; + DISALLOW_COPY_AND_ASSIGN(ObjectLock); +}; + class ClassHelper { public: ClassHelper(const Class* c = NULL, ClassLinker* l = NULL) -- cgit v1.2.3-59-g8ed1b