Fix race in double verifying super class

Change-Id: I75089d0be8ad13b22300dd59bcc88da61d349e0d
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 8c46a7e..4226ea5 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 @@
   "[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<ClassLinker> class_linker(new ClassLinker(intern_table));
diff --git a/src/dex_verifier.cc b/src/dex_verifier.cc
index 25fadb0..1172186 100644
--- a/src/dex_verifier.cc
+++ b/src/dex_verifier.cc
@@ -900,6 +900,9 @@
     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 f9aca10..0412858 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)