summaryrefslogtreecommitdiffstats
path: root/runtime/class_linker.cc
diff options
context:
space:
mode:
authorRoland Levillain <rpl@google.com>2016-05-18 12:25:38 +0100
committerRoland Levillain <rpl@google.com>2016-05-18 12:25:38 +0100
commit90328ac545f65759a8e4fb217a75332906795518 (patch)
tree8429852d0d40d1b7cdc69249fa98cf079c000003 /runtime/class_linker.cc
parentcd38fb20995d8fa7fc6979335d038d7eaac24745 (diff)
downloadandroid_art-90328ac545f65759a8e4fb217a75332906795518.tar.gz
android_art-90328ac545f65759a8e4fb217a75332906795518.tar.bz2
android_art-90328ac545f65759a8e4fb217a75332906795518.zip
Catch classes inheriting from themselves in the class linker.
Bug: 28685551 Bug: 27682580 Bug: 28830038 Change-Id: If568013bf3c82c1df9b282522712d9af5ca5945d
Diffstat (limited to 'runtime/class_linker.cc')
-rw-r--r--runtime/class_linker.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 94872ba481..649fd6ec9e 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -5317,6 +5317,19 @@ bool ClassLinker::LoadSuperAndInterfaces(Handle<mirror::Class> klass, const DexF
const DexFile::ClassDef& class_def = dex_file.GetClassDef(klass->GetDexClassDefIndex());
uint16_t super_class_idx = class_def.superclass_idx_;
if (super_class_idx != DexFile::kDexNoIndex16) {
+ // Check that a class does not inherit from itself directly.
+ //
+ // TODO: This is a cheap check to detect the straightforward case
+ // of a class extending itself (b/28685551), but we should do a
+ // proper cycle detection on loaded classes, to detect all cases
+ // of class circularity errors (b/28830038).
+ if (super_class_idx == class_def.class_idx_) {
+ ThrowClassCircularityError(klass.Get(),
+ "Class %s extends itself",
+ PrettyDescriptor(klass.Get()).c_str());
+ return false;
+ }
+
mirror::Class* super_class = ResolveType(dex_file, super_class_idx, klass.Get());
if (super_class == nullptr) {
DCHECK(Thread::Current()->IsExceptionPending());