提交 3d04bb54 编写于 作者: V vlivanov

8037326: VerifyAccess.isMemberAccessible() has incorrect access check

Reviewed-by: jrose, twisti, ahgross
上级 586c5ac8
...@@ -102,19 +102,24 @@ public class VerifyAccess { ...@@ -102,19 +102,24 @@ public class VerifyAccess {
case PUBLIC: case PUBLIC:
return true; // already checked above return true; // already checked above
case PROTECTED: case PROTECTED:
assert !defc.isInterface(); // protected members aren't allowed in interfaces
if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 && if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 &&
isSamePackage(defc, lookupClass)) isSamePackage(defc, lookupClass))
return true; return true;
if ((allowedModes & PROTECTED) == 0) if ((allowedModes & PROTECTED) == 0)
return false; return false;
// Protected members are accessible by subclasses, which does not include interfaces.
// Interfaces are types, not classes. They should not have access to
// protected members in j.l.Object, even though it is their superclass.
if ((mods & STATIC) != 0 && if ((mods & STATIC) != 0 &&
!isRelatedClass(refc, lookupClass)) !isRelatedClass(refc, lookupClass))
return false; return false;
if ((allowedModes & PROTECTED) != 0 && if ((allowedModes & PROTECTED) != 0 &&
isSuperClass(defc, lookupClass)) isSubClass(lookupClass, defc))
return true; return true;
return false; return false;
case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access. case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access.
assert !defc.isInterface(); // package-private members aren't allowed in interfaces
return ((allowedModes & PACKAGE_ALLOWED) != 0 && return ((allowedModes & PACKAGE_ALLOWED) != 0 &&
isSamePackage(defc, lookupClass)); isSamePackage(defc, lookupClass));
case PRIVATE: case PRIVATE:
...@@ -129,12 +134,13 @@ public class VerifyAccess { ...@@ -129,12 +134,13 @@ public class VerifyAccess {
static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) { static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
return (refc == lookupClass || return (refc == lookupClass ||
refc.isAssignableFrom(lookupClass) || isSubClass(refc, lookupClass) ||
lookupClass.isAssignableFrom(refc)); isSubClass(lookupClass, refc));
} }
static boolean isSuperClass(Class<?> defc, Class<?> lookupClass) { static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {
return defc.isAssignableFrom(lookupClass); return defc.isAssignableFrom(lookupClass) &&
!lookupClass.isInterface(); // interfaces are types, not classes.
} }
static int getClassModifiers(Class<?> c) { static int getClassModifiers(Class<?> c) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册