Hi Mandy,

On 05/02/2017 04:37 AM, Mandy Chung wrote:
Webrev:
   http://cr.openjdk.java.net/~mchung/jdk9/webrevs/8020801/webrev.00/

The big hammer check disallowing MethodHandles::lookup be called by system
classes defined by the bootstrap class loader was added as defense-in-depth
to prevent this caller-sensitive method being called from JDK internal classes
via Method::invoke.  It was intended as a point fix and to be replaced
with a long-term approach.  Lookup.privateLookupIn() returns a Lookup object
and IAE is thrown if the lookup class is almost all java.* and sun.* [1].
We should fix this in JDK 9.

This patch replaces this restriction and now allow MethodHandles::lookup to
be called statically by any code.  But disallow Method::invoke of
MethodHandles.lookup from system classes defined by the bootstrap class loader
e.g. java.base.  It is expected that no reflective call to
MethodHandles::lookup is made by the system classes and so this approach
would provide a better mechanism as a defense-in-depth.

Mandy
[1] http://mail.openjdk.java.net/pipermail/jigsaw-dev/2017-April/012267.html

I don't quite understand the need for bypassing the inflation of native into generated method accessor when the reflected method is a @CallerSensitive method which has a substitute method declared to be called by reflection (like with the MethodHandles.[reflected$]lookup() pair), in the following fragment of ReflectionFactory:

 179     public MethodAccessor newMethodAccessor(Method method) {
 180         checkInitted();
 181
 182         boolean noInflation = ReflectionFactory.noInflation;
 183         if (Reflection.isCallerSensitive(method)) {
 184             Method altMethod = findMethodForReflection(method);
 185             if (altMethod != null) {
 186                 method = altMethod;
 187                 noInflation = true;  // in this case only
 188             }
 189         }
 190
191 if (noInflation && !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())) {
 192             return new MethodAccessorGenerator().
 193                 generateMethod(method.getDeclaringClass(),
 194                                method.getName(),
 195                                method.getParameterTypes(),
 196                                method.getReturnType(),
 197                                method.getExceptionTypes(),
 198                                method.getModifiers());
 199         } else {
 200             NativeMethodAccessorImpl acc =
 201                 new NativeMethodAccessorImpl(method);
 202             DelegatingMethodAccessorImpl res =
 203                 new DelegatingMethodAccessorImpl(acc);
 204             acc.setParent(res);
 205             return res;
 206         }
 207     }

Is DelegatingMethodAccessorImpl/NativeMethodAccessorImpl combo not treated correctly (i.e. skipped) by the Reflection.getCallerClass(), while generated MethodAccessorImpl subclass is?

Regards, Peter



Reply via email to