|
CSR :
|
Summary
-------
Specify `MethodHandles::lookup` to throw `IllegalCallerException` if invoked from JNI attached thread with no caller frame
Problem
-------
The `MethodHandles::lookup` method is a caller sensitive method but does not specify what should happen when there are no stack frames to determine the caller. A NullPointerException results which doesn't provide much diagnostic information. If a call is made from JNI attached thread, the thread will have no call frame to determine the caller.
Solution
--------
When there is no caller frame on the stack, simply throw an `IllegalCallerException` to provide better diagnostics.
Specification
-------------
The spec of `java.lang.invoke.MethodHandles::lookup` is updated as follows:
```
@@ -107,18 +107,29 @@
* This lookup object is a <em>capability</em> which may be delegated to trusted agents.
* Do not store it in place where untrusted code can access it.
* <p>
* This method is caller sensitive, which means that it may return different
* values to different callers.
+ * In cases where {@code MethodHandles.lookup} is called from a context where
+ * there is no caller frame on the stack (e.g. when called directly
+ * from a JNI attached thread), {@code IllegalCallerException} is thrown.
+ * To obtain a {@link Lookup lookup object} in such a context, use an auxiliary class that will
+ * implicitly be identified as the caller, or use {@link MethodHandles#publicLookup()}
+ * to obtain a low-privileged lookup instead.
* @return a lookup object for the caller of this method, with
* {@linkplain Lookup#ORIGINAL original} and
* {@linkplain Lookup#hasFullPrivilegeAccess() full privilege access}.
+ * @throws IllegalCallerException if there is no caller frame on the stack.
*/
```