Hi Paul,

On 04/14/2016 04:40 PM, Paul Sandoz wrote:
Hi Peter,

You found that annoying restriction :-) at this point i think this is mostly 
redundant.

This is something i planned to update and limit the restriction to code within 
j.l.invoke and sun.invoke packages.

sun.invoke is explicitly allowed currently.


I'll follow up with a patch soon to unblock, but feel free to beat me to it if 
you wish.

I don't quite understand this restriction. Seems to be that it was written at the time where the only classes loaded by bootstrap class loader were located in packages java.** and sun.** (was that actually true at some point?) and the restriction explicitly excludes classes in sun.invoke.** packages as though they are the only trusted code to be able to obtain such lookup. Does a Lookup with a lookup class loaded by the bootstrap class loader and allowedModes == ALL_MODES possess any special privileges that a Lookup with a lookup class loaded by the application class loader and allowedModes == ALL_MODES doesn't?

Regards, Peter


Paul.

On 14 Apr 2016, at 16:25, Peter Levart <peter.lev...@gmail.com> wrote:

Hi Paul,

I wanted to try using VarHandles for code internal to JDK but there's a problem 
with MethodHandles.lookup(). It doesn't allow the caller class loaded by the 
bootstrap class loader and located in either java.* or sun.* (but not 
sun.invoke.*) packages:


        private static void checkUnprivilegedlookupClass(Class<?> lookupClass, 
int allowedModes) {
            String name = lookupClass.getName();
            if (name.startsWith("java.lang.invoke."))
                throw newIllegalArgumentException("illegal lookupClass: 
"+lookupClass);

            // For caller-sensitive MethodHandles.lookup()
            // disallow lookup more restricted packages
            if (allowedModes == ALL_MODES && lookupClass.getClassLoader() == 
null) {
                if (name.startsWith("java.") ||
                        (name.startsWith("sun.") && 
!name.startsWith("sun.invoke."))) {
                    throw newIllegalArgumentException("illegal lookupClass: " + 
lookupClass);
                }
            }
        }


...strangely, other bootstrap class loaded callers located in jdk.* are allowed. Why such 
distinction? Is there or will there be an official way to use VarHandles in JDK code and 
not having to resort to work-arounds like 
MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP").setAccessible(true)?


Regards, Peter


Reply via email to