RFR: 8299505: findVirtual on array classes incorrectly restricts the receiver type
Mandy Chung
mchung at openjdk.org
Tue May 30 23:47:57 UTC 2023
On Sat, 6 May 2023 18:15:56 GMT, Chen Liang <liach at openjdk.org> wrote:
> The access hack for array class clone is only applied to `checkAccess` but missing before call to `restrictProtectedReceiver`, causing the array receiver type to be incorrectly replaced by the lookupClass type. This patch fixes that and adds a test to ensure an original lookup resolves `clone` for both array classes (public) and Object (inherited protected) correctly, and restores the old MethodHandlesGeneralTest from [JDK-8001105](https://bugs.openjdk.org/browse/JDK-8001105) which ensures correctness for publicLookup (which is already correct).
Thanks for taking this. The patch looks right. It should special case `Object.clone` for array types not to restrict the receiver to the lookup class.
src/java.base/share/classes/java/lang/invoke/MethodHandles.java line 4023:
> 4021: // The accessing class only has the right to use a protected member
> 4022: // on itself or a subclass. Enforce that restriction, from JVMS 5.4.4, etc.
> 4023: // Since array have access hacks, need to guard against array clone() before
I suggest to move this new comment to `getDirectMethodCommon`, the relevant caller of this method. See suggested wordings below.
src/java.base/share/classes/java/lang/invoke/MethodHandles.java line 4112:
> 4110: (MethodHandleNatives.refKindHasReceiver(refKind) &&
> 4111: !isArrayClone(refKind, refc, method) &&
> 4112: restrictProtectedReceiver(method))) {
Suggestion:
(MethodHandleNatives.refKindHasReceiver(refKind) &&
restrictProtectedReceiver(method) &&
// All arrays simply inherit the protected Object.clone method.
// The leading argument is restricted to the requested array type
// (not the lookup class).
!isArrayClone(refKind, refc, method))) {
test/jdk/java/lang/invoke/findVirtual/FindVirtualArrayCloneTest.java line 28:
> 26: * @bug 8299505
> 27: * @run junit FindVirtualArrayCloneTest
> 28: * @summary Ensures Arrays' clone doesn't have incorrect receiver type bound
Suggestion:
* @summary Test invocation of Object.clone for arrays
-------------
PR Review: https://git.openjdk.org/jdk/pull/13855#pullrequestreview-1451988301
PR Review Comment: https://git.openjdk.org/jdk/pull/13855#discussion_r1210934822
PR Review Comment: https://git.openjdk.org/jdk/pull/13855#discussion_r1210935373
PR Review Comment: https://git.openjdk.org/jdk/pull/13855#discussion_r1210936278
More information about the core-libs-dev
mailing list