diff options
author | Andreas Gampe <agampe@google.com> | 2014-09-23 10:38:30 -0700 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-09-29 11:40:16 -0700 |
commit | c0d8229898c44c0f604f08a5df1de83ff56c18fd (patch) | |
tree | 13b150e68e806204c547e04bc071246c06199c37 /runtime/reflection.cc | |
parent | c70535b4f9f1ff3e3da451734bb7d9601012ccc1 (diff) | |
download | android_art-c0d8229898c44c0f604f08a5df1de83ff56c18fd.tar.gz android_art-c0d8229898c44c0f604f08a5df1de83ff56c18fd.tar.bz2 android_art-c0d8229898c44c0f604f08a5df1de83ff56c18fd.zip |
ART: Better IllegalAccessException message
Bug: 17618578
Bug: 17614623
Change-Id: I0e3f15e676acd6ed5844fc86e136f75cc335372d
Diffstat (limited to 'runtime/reflection.cc')
-rw-r--r-- | runtime/reflection.cc | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc index 0705d402b6..23f8076e0f 100644 --- a/runtime/reflection.cc +++ b/runtime/reflection.cc @@ -592,9 +592,16 @@ jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject javaM } // If method is not set to be accessible, verify it can be accessed by the caller. - if (!accessible && !VerifyAccess(soa.Self(), receiver, declaring_class, m->GetAccessFlags())) { - ThrowIllegalAccessException(nullptr, StringPrintf("Cannot access method: %s", - PrettyMethod(m).c_str()).c_str()); + mirror::Class* calling_class = nullptr; + if (!accessible && !VerifyAccess(soa.Self(), receiver, declaring_class, m->GetAccessFlags(), + &calling_class)) { + ThrowIllegalAccessException(nullptr, + StringPrintf("Class %s cannot access %s method %s of class %s", + calling_class == nullptr ? "null" : PrettyClass(calling_class).c_str(), + PrettyJavaAccessFlags(m->GetAccessFlags()).c_str(), + PrettyMethod(m).c_str(), + m->GetDeclaringClass() == nullptr ? "null" : + PrettyClass(m->GetDeclaringClass()).c_str()).c_str()); return nullptr; } @@ -815,7 +822,8 @@ bool UnboxPrimitiveForResult(const ThrowLocation& throw_location, mirror::Object return UnboxPrimitive(&throw_location, o, dst_class, nullptr, unboxed_value); } -bool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_class, uint32_t access_flags) { +bool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_class, + uint32_t access_flags, mirror::Class** calling_class) { if ((access_flags & kAccPublic) != 0) { return true; } @@ -829,6 +837,8 @@ bool VerifyAccess(Thread* self, mirror::Object* obj, mirror::Class* declaring_cl if (caller_class == declaring_class) { return true; } + ScopedAssertNoThreadSuspension sants(self, "verify-access"); + *calling_class = caller_class; if ((access_flags & kAccPrivate) != 0) { return false; } |