OSDN Git Service

Fix for potential moving GC bugs around proxy class.
authorHiroshi Yamauchi <yamauchi@google.com>
Thu, 21 May 2015 19:05:27 +0000 (12:05 -0700)
committerHiroshi Yamauchi <yamauchi@google.com>
Tue, 26 May 2015 17:00:49 +0000 (10:00 -0700)
commit679b1cf291f364dcc3a142f53a07b0ad15c01e9a
tree09df9c6c9a7dd5a7c62e6d42c281db7e68594b38
parentca27be7a95e1b238c76a4a5fccaad2a3416766c2
Fix for potential moving GC bugs around proxy class.

- Handlerize proxy_class which is live across multiple allocation
  points in ClassLinker::CreateProxyClass().

- In ClassLinker::CreateProxyClass(), insert a proxy class into the
  class table before creating ArtFields for it (and update it later in
  LinkClass()) because the field roots (ArtField::declaring_class_)
  won't be updated by GC unless the class is in the class table. If GC
  happens before they are updated by FixupTemporaryDeclaringClass()
  from LinkClass(), FixupTemporaryDeclaringClass() may not update the
  field roots correctly because the old class may already be moved but
  the fields roots may not. Reduce a window of time where the fields
  roots could be stale.

- In ClassLinker::LinkClass(), directly wrap a new class in a handle
  to avoid a window of time where new_class may be potentially stale.

- Print more diagnostic info about the holder of the field upon a mark
  sweep invalid ref crash.

- Add an additional sanity check in Field::GetArtField().

(cherry pick commit 08d1b5f2296c0f51507b8b443f4e39dfc161572c)

Bug: 20557050

Change-Id: I9ad32d304922da96b7e1fad262d97de21cbac776
runtime/class_linker.cc
runtime/class_linker.h
runtime/gc/collector/mark_sweep.cc
runtime/mirror/field.cc