Hi Peter, You beat me to it!
My plan was to define a private method, accepting the lookup and teleporting class, and encapsulating the doPrivileged block. Then i could call that method for all usages in TLR. It does mean three doPrivileged executions, but that is probably ok. Thanks, Paul. > On 11 Jan 2017, at 03:14, Peter Levart <peter.lev...@gmail.com> wrote: > > Hi Paul, > > On 01/11/2017 02:55 AM, Paul Sandoz wrote: >> I am concerned it’s getting too late to twiddle with the security setting so >> i took the plunge and wrapped the privateLookupIn calls in doPrivileged >> blocks. It’s ugly but avoids the circularity (JPRT core/hotspot testing has >> not failed). >> >> http://cr.openjdk.java.net/~psandoz/jdk9/8160710-thread-to-tlr/webrev/ >> <http://cr.openjdk.java.net/~psandoz/jdk9/8160710-thread-to-tlr/webrev/> >> >> I’’ll resend this out for closer review by Martin and Doug. > > You could simplify the static initializer in TLR.ThreadGroupCreator a bit: > > static { > try { > // Teleport the lookup to access fields in Thread and ThreadGroup > MethodHandles.Lookup[] l = > java.security.AccessController.doPrivileged( > new > java.security.PrivilegedExceptionAction<MethodHandles.Lookup[]>() { > public MethodHandles.Lookup[] run() { > MethodHandles.Lookup lookup = MethodHandles.lookup(); > return new MethodHandles.Lookup[] { > MethodHandles.privateLookupIn(Thread.class, > lookup), > MethodHandles.privateLookupIn(ThreadGroup.class, > lookup) > }; > } > }); > THREAD_GROUP = > l[0].findVarHandle(Thread.class, "group", ThreadGroup.class); > THREAD_GROUP_PARENT = > l[1].findVarHandle(ThreadGroup.class, "parent", > ThreadGroup.class); > } catch (Exception e) { > throw new Error(e); > } > } > > > Regards, Peter > >> Paul. >> >> >>> On 10 Jan 2017, at 05:00, Alan Bateman <alan.bate...@oracle.com> >>> <mailto:alan.bate...@oracle.com> wrote: >>> >>> >>> >>> On 09/01/2017 19:09, Paul Sandoz wrote: >>>>> On 9 Jan 2017, at 05:36, Alan Bateman <alan.bate...@oracle.com> >>>>> <mailto:alan.bate...@oracle.com> wrote: >>>>> >>>>> On 05/01/2017 19:01, Paul Sandoz wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I encountered some circularity issues with security manager and >>>>>> VarHandles, specifically when attempting to use the new >>>>>> MethodHandles.privateLookupIn, so say ThreadLocalRandom has access to >>>>>> fields in Thread [1]. >>>>>> >>>>>> When running with a security manager ThreadLocalRandom clinit depends on >>>>>> various security stuff that eventually depends on ConcurrentSkipListMap >>>>>> which depends on ThreadLocalRandom, whose static state has not been >>>>>> fully initialzed. >>>>>> >>>>>> The current security permission check in MethodHandles.privateLookupIn >>>>>> may be a too blunt and possibly should be refined along similar lines to >>>>>> Lookup.checkSecurityManager e.g. no check should be needed for classes >>>>>> within the same module (since this is a refined/controlled/principled >>>>>> form of setAccessible, plus no pounding on final fields). That would >>>>>> solve the problem in this case. But, the general point remains, and i >>>>>> have not thought too hard if there are other ways to solve this. >>>>>> >>>>> This would mean inconsistency with setAccessible where you need this >>>>> blunt permission when suppressing access. Also I think >>>>> Lookup.checkSecurityManager will do different checks when you don't have >>>>> a full power lookup so it would mean adjusting the privateLookupIn. >>>> Some adjustment would definitely be required, the perhaps the simplest >>>> solution is not to perform a security check if within the same module? >>>> >>> It might be okay when the lookup is a full-power lookup to class in >>> java.base and it's called to get a full-power look to some other class in >>> java.base. However, generalizing this would probably need security eyes. >>> Consider two libraries on the class path (same unnamed module) for example. >>> Also the inconsistency with setAccessible where it always checks the >>> permission when running with a security manager. >>> >>> -Alan >