Lambda in security manager initialization fail

Brian Goetz brian.goetz at oracle.com
Mon Mar 30 20:12:43 UTC 2015


The NPE is at BytecodeDescriptor.parseSig#83, which says:

                    return loader.loadClass(name);

so the null ref seems likely to be loader.  The loader is initially 
passed in from BoundMethodHandle#817, which provides a null loader, 
indicating that it wants the system loader.  At the start of 
parseMethod, we see:

         if (loader == null)
             loader = ClassLoader.getSystemClassLoader();

so the loader variable that is being deref'ed is the result of 
ClassLoader.getSystemClassLoader, which must be null in order to NPE 
here.  ClassLoader.getSystemClassLoader checks for a security manager, 
but since you're still initializing the security manager, this is likely 
to be null.  So you're going to get the value of `scl` after 
`initSystemClassLoader` has completed.

Overall this smells of a bootstrapping issue; you're calling into the MH 
machinery possibly before the classloading machinery (and definitely 
before the security manager) is fully initialized, and you're getting 
back a null from ClassLoader.getSystemClassLoader.

HTH,
-Brian

On 3/30/2015 11:24 AM, Wang Weijun wrote:
> I have a customized security manager:
>
> import java.security.AccessController;
> import java.security.PrivilegedAction;
>
> public class A3 extends SecurityManager {
>      public A3() {
>          // 1. Using lambda
>          AccessController.doPrivileged((PrivilegedAction<Void>)
>                  () -> null);
>          // 2. Using inner class
>          AccessController.doPrivileged(new PrivilegedAction<Void>() {
>              @Override
>              public Void run() {
>                  return null;
>              }
>          });
>      }
> }
>
> If I use the inner class, everything is OK. If the lambda, I see this error:
>
> $ java -Djava.security.manager=A3
> Error occurred during initialization of VM
> java.lang.ExceptionInInitializerError
> 	at java.lang.invoke.BoundMethodHandle.<clinit>(BoundMethodHandle.java:829)
> 	at java.lang.invoke.LambdaForm.createIdentityForms(LambdaForm.java:1753)
> 	at java.lang.invoke.LambdaForm.<clinit>(LambdaForm.java:1808)
> 	at java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(DirectMethodHandle.java:223)
> 	at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(DirectMethodHandle.java:188)
> 	at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(DirectMethodHandle.java:177)
> 	at java.lang.invoke.DirectMethodHandle.make(DirectMethodHandle.java:84)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1655)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(MethodHandles.java:1612)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodForConstant(MethodHandles.java:1797)
> 	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1746)
> 	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
> 	at A3.<init>(A3.java:6)
> 	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> 	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
> 	at java.lang.Class.newInstance(Class.java:444)
> 	at sun.misc.Launcher.<init>(Launcher.java:96)
> 	at sun.misc.Launcher.<clinit>(Launcher.java:57)
> 	at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1440)
> 	at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1425)
> Caused by: java.lang.NullPointerException
> 	at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:83)
> 	at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:54)
> 	at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41)
> 	at java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1065)
> 	at java.lang.invoke.BoundMethodHandle$Factory.makeCbmhCtor(BoundMethodHandle.java:817)
> 	at java.lang.invoke.BoundMethodHandle$Factory.makeCtors(BoundMethodHandle.java:772)
> 	at java.lang.invoke.BoundMethodHandle$SpeciesData.initForBootstrap(BoundMethodHandle.java:358)
> 	at java.lang.invoke.BoundMethodHandle$SpeciesData.<clinit>(BoundMethodHandle.java:447)
> 	at java.lang.invoke.BoundMethodHandle.<clinit>(BoundMethodHandle.java:829)
> 	at java.lang.invoke.LambdaForm.createIdentityForms(LambdaForm.java:1753)
> 	at java.lang.invoke.LambdaForm.<clinit>(LambdaForm.java:1808)
> 	at java.lang.invoke.DirectMethodHandle.makePreparedLambdaForm(DirectMethodHandle.java:223)
> 	at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(DirectMethodHandle.java:188)
> 	at java.lang.invoke.DirectMethodHandle.preparedLambdaForm(DirectMethodHandle.java:177)
> 	at java.lang.invoke.DirectMethodHandle.make(DirectMethodHandle.java:84)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodCommon(MethodHandles.java:1655)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodNoSecurityManager(MethodHandles.java:1612)
> 	at java.lang.invoke.MethodHandles$Lookup.getDirectMethodForConstant(MethodHandles.java:1797)
> 	at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1746)
> 	at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477)
> 	at A3.<init>(A3.java:6)
> 	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
> 	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
> 	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> 	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
> 	at java.lang.Class.newInstance(Class.java:444)
>
> Any reason why?
>
> Thanks
> Max
>
>


More information about the lambda-dev mailing list