diff options
author | Roland Levillain <rpl@google.com> | 2016-05-18 12:25:38 +0100 |
---|---|---|
committer | Roland Levillain <rpl@google.com> | 2016-05-18 12:25:38 +0100 |
commit | 90328ac545f65759a8e4fb217a75332906795518 (patch) | |
tree | 8429852d0d40d1b7cdc69249fa98cf079c000003 /runtime/class_linker.cc | |
parent | cd38fb20995d8fa7fc6979335d038d7eaac24745 (diff) | |
download | android_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.cc | 13 |
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()); |