diff options
| author | 2018-04-09 12:24:55 +0100 | |
|---|---|---|
| committer | 2018-05-08 10:31:05 +0100 | |
| commit | 9a13d423c71517bc9cb3cf40e97dd0f6f5d5c72c (patch) | |
| tree | db25de5c310f8c3b14dbaad91bfe3b02a8a4c5b3 /runtime/native/java_lang_Class.cc | |
| parent | 9a81945ca49de3c5b3969cc85278ecbadf238c84 (diff) | |
Consider whitelist when listing class members.
Previously, only the enforcement policy was considered when getting
declared fields or members, meaning whitelisted APIs would still not be
discoverable. Fix this by calling hiddenapi::GetMemberAction from within
IsDiscoverable.
Bug: 77787686
Bug: 64382372
Test: cts/tests/signature/runSignatureTests.sh (with ag/3863796)
Test: art/test.py --host -t 674-hiddenapi
Merged-In: I234d274f47f377e3e105c81aae2d49072287992a
Change-Id: I234d274f47f377e3e105c81aae2d49072287992a
(cherry picked from commit 64ee8aeaeb70aa2d5d1c3ff57a682a5001869653)
Diffstat (limited to 'runtime/native/java_lang_Class.cc')
| -rw-r--r-- | runtime/native/java_lang_Class.cc | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index bfd7f69cef..2c1c963ed6 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -128,19 +128,20 @@ ALWAYS_INLINE static bool ShouldBlockAccessToMember(T* member, Thread* self) // the criteria. Some reflection calls only return public members // (public_only == true), some members should be hidden from non-boot class path // callers (enforce_hidden_api == true). +template<typename T> ALWAYS_INLINE static bool IsDiscoverable(bool public_only, bool enforce_hidden_api, - uint32_t access_flags) { - if (public_only && ((access_flags & kAccPublic) == 0)) { - return false; - } - - if (enforce_hidden_api && - hiddenapi::GetActionFromAccessFlags(access_flags) == hiddenapi::kDeny) { + T* member) + REQUIRES_SHARED(Locks::mutator_lock_) { + if (public_only && ((member->GetAccessFlags() & kAccPublic) == 0)) { return false; } - return true; + return hiddenapi::GetMemberAction(member, + nullptr, + [enforce_hidden_api] (Thread*) { return !enforce_hidden_api; }, + hiddenapi::kNone) + != hiddenapi::kDeny; } ALWAYS_INLINE static inline ObjPtr<mirror::Class> DecodeClass( @@ -269,12 +270,12 @@ static mirror::ObjectArray<mirror::Field>* GetDeclaredFields( bool enforce_hidden_api = ShouldEnforceHiddenApi(self); // Lets go subtract all the non discoverable fields. for (ArtField& field : ifields) { - if (!IsDiscoverable(public_only, enforce_hidden_api, field.GetAccessFlags())) { + if (!IsDiscoverable(public_only, enforce_hidden_api, &field)) { --array_size; } } for (ArtField& field : sfields) { - if (!IsDiscoverable(public_only, enforce_hidden_api, field.GetAccessFlags())) { + if (!IsDiscoverable(public_only, enforce_hidden_api, &field)) { --array_size; } } @@ -285,7 +286,7 @@ static mirror::ObjectArray<mirror::Field>* GetDeclaredFields( return nullptr; } for (ArtField& field : ifields) { - if (IsDiscoverable(public_only, enforce_hidden_api, field.GetAccessFlags())) { + if (IsDiscoverable(public_only, enforce_hidden_api, &field)) { auto* reflect_field = mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, &field, force_resolve); @@ -300,7 +301,7 @@ static mirror::ObjectArray<mirror::Field>* GetDeclaredFields( } } for (ArtField& field : sfields) { - if (IsDiscoverable(public_only, enforce_hidden_api, field.GetAccessFlags())) { + if (IsDiscoverable(public_only, enforce_hidden_api, &field)) { auto* reflect_field = mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, &field, force_resolve); @@ -521,7 +522,7 @@ static ALWAYS_INLINE inline bool MethodMatchesConstructor( DCHECK(m != nullptr); return m->IsConstructor() && !m->IsStatic() && - IsDiscoverable(public_only, enforce_hidden_api, m->GetAccessFlags()); + IsDiscoverable(public_only, enforce_hidden_api, m); } static jobjectArray Class_getDeclaredConstructorsInternal( @@ -591,7 +592,7 @@ static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaT uint32_t modifiers = m.GetAccessFlags(); // Add non-constructor declared methods. if ((modifiers & kAccConstructor) == 0 && - IsDiscoverable(public_only, enforce_hidden_api, modifiers)) { + IsDiscoverable(public_only, enforce_hidden_api, &m)) { ++num_methods; } } @@ -605,7 +606,7 @@ static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaT for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) { uint32_t modifiers = m.GetAccessFlags(); if ((modifiers & kAccConstructor) == 0 && - IsDiscoverable(public_only, enforce_hidden_api, modifiers)) { + IsDiscoverable(public_only, enforce_hidden_api, &m)) { DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize); DCHECK(!Runtime::Current()->IsActiveTransaction()); auto* method = |