From c9f5bc920aa65b8c684cc650edb647430a02783c Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 23 May 2018 16:07:15 +0200 Subject: [PATCH] HHH-12614 Respect the protection domain when proxying classes --- .../internal/bytebuddy/BasicProxyFactoryImpl.java | 4 +++- .../bytecode/internal/bytebuddy/ByteBuddyState.java | 9 ++------- .../internal/bytebuddy/BytecodeProviderImpl.java | 4 ++-- .../proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BasicProxyFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BasicProxyFactoryImpl.java index 0c99ac157c..dc7eeb11f5 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BasicProxyFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BasicProxyFactoryImpl.java @@ -37,6 +37,8 @@ public class BasicProxyFactoryImpl implements BasicProxyFactory { throw new AssertionFailure( "attempting to build proxy without any superclass or interfaces" ); } + Class superClassOrMainInterface = superClass != null ? superClass : interfaces[0]; + Set key = new HashSet(); if ( superClass != null ) { key.add( superClass ); @@ -55,7 +57,7 @@ public class BasicProxyFactoryImpl implements BasicProxyFactory { .implement( ProxyConfiguration.class ) .intercept( FieldAccessor.ofField( ProxyConfiguration.INTERCEPTOR_FIELD_NAME ).withAssigner( Assigner.DEFAULT, Assigner.Typing.DYNAMIC ) ) .make() - .load( BasicProxyFactory.class.getClassLoader(), ByteBuddyState.getLoadingStrategy() ) + .load( superClassOrMainInterface.getClassLoader(), ByteBuddyState.resolveClassLoadingStrategy( superClassOrMainInterface ) ) .getLoaded(); } diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/ByteBuddyState.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/ByteBuddyState.java index 2aa5c1a576..b541ea72b3 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/ByteBuddyState.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/ByteBuddyState.java @@ -24,11 +24,6 @@ public final class ByteBuddyState { */ private static final ByteBuddy buddy = new ByteBuddy().with( TypeValidation.DISABLED ); - /** - * This will need to change depending on the runtime JDK. - */ - private static final ClassLoadingStrategy loadingStrategy = new ClassLoadingStrategy.ForUnsafeInjection(); - /** * This currently needs to be static: the BytecodeProvider is a static field of Environment and * is being accessed from static methods. @@ -81,8 +76,8 @@ public final class ByteBuddyState { return buddy; } - public static ClassLoadingStrategy getLoadingStrategy() { - return loadingStrategy; + public static ClassLoadingStrategy resolveClassLoadingStrategy(Class originalClass) { + return new ClassLoadingStrategy.ForUnsafeInjection( originalClass.getProtectionDomain() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java index 18d06ac676..9c2085de21 100644 --- a/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java @@ -67,7 +67,7 @@ public class BytecodeProviderImpl implements BytecodeProvider { .method( newInstanceMethodName ) .intercept( MethodCall.construct( constructor ) ) .make() - .load( clazz.getClassLoader(), ByteBuddyState.getLoadingStrategy() ) + .load( clazz.getClassLoader(), ByteBuddyState.resolveClassLoadingStrategy( clazz ) ) .getLoaded(); final Class bulkAccessor = bytebuddy.getCurrentyByteBuddy() @@ -80,7 +80,7 @@ public class BytecodeProviderImpl implements BytecodeProvider { .method( getPropertyNamesMethodName ) .intercept( MethodCall.call( new CloningPropertyCall( getterNames ) ) ) .make() - .load( clazz.getClassLoader(), ByteBuddyState.getLoadingStrategy() ) + .load( clazz.getClassLoader(), ByteBuddyState.resolveClassLoadingStrategy( clazz ) ) .getLoaded(); try { diff --git a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java index 273bd615a9..dc5c2cd51c 100644 --- a/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/proxy/pojo/bytebuddy/ByteBuddyProxyFactory.java @@ -113,7 +113,7 @@ public class ByteBuddyProxyFactory implements ProxyFactory, Serializable { .implement( ProxyConfiguration.class ) .intercept( FieldAccessor.ofField( ProxyConfiguration.INTERCEPTOR_FIELD_NAME ).withAssigner( Assigner.DEFAULT, Assigner.Typing.DYNAMIC ) ) .make() - .load( persistentClass.getClassLoader(), ByteBuddyState.getLoadingStrategy() ) + .load( persistentClass.getClassLoader(), ByteBuddyState.resolveClassLoadingStrategy( persistentClass ) ) .getLoaded(), cacheForProxies ); }