8161129 Unsafe::getUnsafe should allow the platform class loader to access it
Peter Levart
peter.levart at gmail.com
Mon Jul 18 16:33:49 UTC 2016
Hi Paul,
Just curious, what was the purpose of hiding a public method in a public
class in an exported package from reflection? I'm talking about
sun.misc.Unsafe::getUnsafe ...
Regards, Peter
On 07/18/2016 06:06 PM, Paul Sandoz wrote:
> Hi,
>
> Please review the patch below.
>
> Since Jigsaw encapsulates jdk.internal.misc.Unsafe there is no need to perform any runtime checks such as:
>
> - hiding the getUnsafe method from reflection; and
> - checking the class loader of the calling class for invocation of getUnsafe.
>
> This more cleanly enables qualified modules to utilise the internal Unsafe without reflection gymnastics, even though we should be reviewing that usage and to reduce it where possible.
>
> I also took the opportunity to hide the “theInternalUnsafe” field in the sun.misc.Unsafe. That just avoids any futile attempts to obtain the field’s value after which any reflective access on that value will fail.
>
> Paul.
>
> diff -r 4f5f82c457af src/java.base/share/classes/jdk/internal/misc/Unsafe.java
> --- a/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Mon Jul 18 13:13:52 2016 +0800
> +++ b/src/java.base/share/classes/jdk/internal/misc/Unsafe.java Mon Jul 18 17:50:20 2016 +0200
> @@ -26,8 +26,6 @@
> package jdk.internal.misc;
>
> import jdk.internal.HotSpotIntrinsicCandidate;
> -import jdk.internal.reflect.CallerSensitive;
> -import jdk.internal.reflect.Reflection;
> import jdk.internal.vm.annotation.ForceInline;
>
> import java.lang.reflect.Field;
> @@ -57,7 +55,6 @@
> private static native void registerNatives();
> static {
> registerNatives();
> - Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");
> }
>
> private Unsafe() {}
> @@ -87,16 +84,8 @@
> * }}</pre>
> *
> * (It may assist compilers to make the local variable {@code final}.)
> - *
> - * @throws SecurityException if the class loader of the caller
> - * class is not in the system domain in which all permissions
> - * are granted.
> */
> - @CallerSensitive
> public static Unsafe getUnsafe() {
> - Class<?> caller = Reflection.getCallerClass();
> - if (!VM.isSystemDomainLoader(caller.getClassLoader()))
> - throw new SecurityException("Unsafe");
> return theUnsafe;
> }
>
> diff -r 4f5f82c457af src/jdk.unsupported/share/classes/sun/misc/Unsafe.java
> --- a/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Mon Jul 18 13:13:52 2016 +0800
> +++ b/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java Mon Jul 18 17:50:20 2016 +0200
> @@ -56,6 +56,7 @@
>
> static {
> Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");
> + Reflection.registerFieldsToFilter(Unsafe.class, "theInternalUnsafe");
> }
>
> private Unsafe() {}
More information about the core-libs-dev
mailing list