429
430 static bool can_relax_access_check_for(const Klass* accessor,
431 const Klass* accessee,
432 bool classloader_only) {
433
434 const InstanceKlass* accessor_ik = InstanceKlass::cast(accessor);
435 const InstanceKlass* accessee_ik = InstanceKlass::cast(accessee);
436
437 // If either is on the other's host_klass chain, access is OK,
438 // because one is inside the other.
439 if (under_host_klass(accessor_ik, accessee) ||
440 under_host_klass(accessee_ik, accessor))
441 return true;
442
443 if ((RelaxAccessControlCheck &&
444 accessor_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION &&
445 accessee_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION) ||
446 (accessor_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION &&
447 accessee_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION)) {
448 return classloader_only &&
449 Verifier::relax_verify_for(accessor_ik->class_loader()) &&
450 accessor_ik->protection_domain() == accessee_ik->protection_domain() &&
451 accessor_ik->class_loader() == accessee_ik->class_loader();
452 }
453
454 return false;
455 }
456
457 /*
458 Type Accessibility check for public types: Callee Type T is accessible to Caller Type S if:
459
460 Callee T in Callee T in package PT,
461 unnamed module runtime module MT
462 ------------------------------------------------------------------------------------------------
463
464 Caller S in package If MS is loose: YES If same classloader/package (PS == PT): YES
465 PS, runtime module MS If MS can read T's If same runtime module: (MS == MT): YES
466 unnamed module: YES
467 Else if (MS can read MT (Establish readability) &&
468 MT exports PT to MS or to all modules): YES
469
|
429
430 static bool can_relax_access_check_for(const Klass* accessor,
431 const Klass* accessee,
432 bool classloader_only) {
433
434 const InstanceKlass* accessor_ik = InstanceKlass::cast(accessor);
435 const InstanceKlass* accessee_ik = InstanceKlass::cast(accessee);
436
437 // If either is on the other's host_klass chain, access is OK,
438 // because one is inside the other.
439 if (under_host_klass(accessor_ik, accessee) ||
440 under_host_klass(accessee_ik, accessor))
441 return true;
442
443 if ((RelaxAccessControlCheck &&
444 accessor_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION &&
445 accessee_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION) ||
446 (accessor_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION &&
447 accessee_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION)) {
448 return classloader_only &&
449 Verifier::relax_access_for(accessor_ik->class_loader()) &&
450 accessor_ik->protection_domain() == accessee_ik->protection_domain() &&
451 accessor_ik->class_loader() == accessee_ik->class_loader();
452 }
453
454 return false;
455 }
456
457 /*
458 Type Accessibility check for public types: Callee Type T is accessible to Caller Type S if:
459
460 Callee T in Callee T in package PT,
461 unnamed module runtime module MT
462 ------------------------------------------------------------------------------------------------
463
464 Caller S in package If MS is loose: YES If same classloader/package (PS == PT): YES
465 PS, runtime module MS If MS can read T's If same runtime module: (MS == MT): YES
466 unnamed module: YES
467 Else if (MS can read MT (Establish readability) &&
468 MT exports PT to MS or to all modules): YES
469
|