Revert^2: "ART: Restrict some checks in the verifier to P+"
Reinstate old behavior for apps targeting earlier releases.
This reverts commit 5ff2596da427351308992a1677348e460a398591.
Bug: 111969862
Bug: 113863780
Test: m test-art-host
Test: cts-tradefed run commandAndExit cts --m vm-tests-tf
Change-Id: I4fd967271cf43e21af34739a08907a1a7953539a
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 2064fc4..5fce892 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -3675,9 +3675,11 @@
// the access-checks interpreter. If result is primitive, skip the access check.
//
// Note: we do this for unresolved classes to trigger re-verification at runtime.
- if (C == CheckAccess::kYes && result->IsNonZeroReferenceTypes()) {
+ if (C == CheckAccess::kYes &&
+ result->IsNonZeroReferenceTypes() &&
+ (api_level_ >= 28u || !result->IsUnresolvedTypes())) {
const RegType& referrer = GetDeclaringClass();
- if (!referrer.CanAccess(*result)) {
+ if ((api_level_ >= 28u || !referrer.IsUnresolvedTypes()) && !referrer.CanAccess(*result)) {
Fail(VERIFY_ERROR_ACCESS_CLASS) << "(possibly) illegal class access: '"
<< referrer << "' -> '" << *result << "'";
}
@@ -4560,7 +4562,7 @@
}
if (klass_type.IsUnresolvedTypes()) {
// Accessibility checks depend on resolved fields.
- DCHECK(klass_type.Equals(GetDeclaringClass()) || !failures_.empty());
+ DCHECK(klass_type.Equals(GetDeclaringClass()) || !failures_.empty() || api_level_ < 28u);
return nullptr; // Can't resolve Class so no more to do here, will do checking at runtime.
}
@@ -4601,7 +4603,7 @@
}
if (klass_type.IsUnresolvedTypes()) {
// Accessibility checks depend on resolved fields.
- DCHECK(klass_type.Equals(GetDeclaringClass()) || !failures_.empty());
+ DCHECK(klass_type.Equals(GetDeclaringClass()) || !failures_.empty() || api_level_ < 28u);
return nullptr; // Can't resolve Class so no more to do here
}
@@ -4737,7 +4739,7 @@
DCHECK(!can_load_classes_ || self_->IsExceptionPending());
self_->ClearException();
}
- } else {
+ } else if (api_level_ >= 28u) {
// If we don't have the field (it seems we failed resolution) and this is a PUT, we need to
// redo verification at runtime as the field may be final, unless the field id shows it's in
// the same class.