On 05/19/2017 01:14 PM, Alan Bateman wrote:
On 19/05/2017 11:58, Peter Levart wrote:

:

...the example works (does not throw exception), but when run with:

    --add-opens java.base/jdk.internal.misc=ALL-UNNAMED

...the example still works!!!! OOOPS - this is a bug!!! This is definitely a bug.
No, the behavior is correct as jdk.internal.misc.Unsafe is public and it's getUnsafe is public. It's different to sun.misc.Unsafe.

However, you do have a point that opening all packages by default means that the internal Unsafe might need to be looked at again. The long term plan is to reduce the need for sun.misc.Unsafe but not by having libraries move to the internal Unsafe.

BTW: For the security manager case then I assume you code fragment would need to accessClassInPackage.jdk.internal.misc permission.

Right, but such permission should not be sufficient, since it is required only to obtain the jdk.internal.misc.Unsafe.class object (i.e. for Class.forName("jdk.internal.misc.Unsafe"). I can play a trick here to obtain such Class instance. For example:

public class Test {
    public static void main(String[] args) throws Exception {
        System.setSecurityManager(new SecurityManager());
Class<?> unsafeClass = java.io.File.class.getDeclaredField("UNSAFE").getType();
        Object theUnsafe = unsafeClass.getMethod("getUnsafe").invoke(null);
    }
}


Ok, I need "accessDeclaredMembers" permission here, but you get the picture...

Regards, Peter


-Alan

Reply via email to