On 3/28/19 7:48 AM, Peter Levart wrote:
Hi,

On 3/28/19 9:40 AM, Alan Bateman wrote:
On 27/03/2019 23:17, Mandy Chung wrote:
:

The proposed fix is to perform proper access check.  When there is no
caller frame, it only allows to access to public members of a public type
in an unconditional exported API package.

The approach seems reasonable to me and we should, at some point, try to align the other @CS methods with this behavior. As Mandy knows, this is unspecified behavior and we aren't consistent in the JDK on how to handle "no caller frame" case. Some @CS methods will throw NPE if invoked directly, others detect the caller is null and throw or treat it as Object.class.

In the patch, shouldn't slowVerifyAccess check that memberClass is public?

I think it should. If we pretend that the check should be equivalent as if performed from an unrelated class in an unrelated module, then the check for public member class should be included.

In addition, if access from null caller is granted and it is performed to a member in a "concealed" package, there's no warning displayed (the further logic in the AccessibleObject is skipped).

What would it look like if AccessibleObject was left intact and only Reflection was modified to accommodate for null currentClass - caller/accessor. Like the in the following patch:


I intentionally do not change Reflection::verifyMemberAccess to accept null caller and see
the patch:

125 Objects.requireNonNull(currentClass);
126 Objects.requireNonNull(memberClass);

Although it is a reasonable default for a null caller to allow access public member in a public type of an unconditional exported API package, the caller should carefully consider how it behaves in this edge case.    This forces the caller to address it properly rather than falling through.  I'm okay to add a new Reflection::verifyPublicMemberAccess
which can be called by other if appropriate.

Updated webrev:
http://cr.openjdk.java.net/~mchung/jdk13/webrevs/8221530/webrev.01

Mandy

Reply via email to