HHH-15808 ByteBuddyProxyFactory#getHibernateProxy is triggering type pollution via generic PrivilegedAction
This commit is contained in:
parent
bdc67f81b1
commit
ded4c433ac
|
@ -89,7 +89,6 @@ public class ByteBuddyProxyFactory implements ProxyFactory, Serializable {
|
||||||
overridesEquals
|
overridesEquals
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
final HibernateProxy proxy = getHibernateProxy();
|
final HibernateProxy proxy = getHibernateProxy();
|
||||||
( (ProxyConfiguration) proxy ).$$_hibernate_set_interceptor( interceptor );
|
( (ProxyConfiguration) proxy ).$$_hibernate_set_interceptor( interceptor );
|
||||||
|
|
||||||
|
@ -97,22 +96,32 @@ public class ByteBuddyProxyFactory implements ProxyFactory, Serializable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private HibernateProxy getHibernateProxy()
|
private HibernateProxy getHibernateProxy() {
|
||||||
throws HibernateException {
|
final PrimeAmongSecondarySupertypes internal = getHibernateProxyInternal();
|
||||||
|
final HibernateProxy hibernateProxy = internal.asHibernateProxy();
|
||||||
final PrivilegedAction<HibernateProxy> action = new PrivilegedAction<HibernateProxy>() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public HibernateProxy run() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
PrimeAmongSecondarySupertypes instance = (PrimeAmongSecondarySupertypes) proxyClass.getConstructor().newInstance();
|
|
||||||
final HibernateProxy hibernateProxy = instance.asHibernateProxy();
|
|
||||||
if ( hibernateProxy == null ) {
|
if ( hibernateProxy == null ) {
|
||||||
throw new HibernateException( "Produced proxy does not correctly implement HibernateProxy" );
|
throw new HibernateException( "Produced proxy does not correctly implement HibernateProxy" );
|
||||||
}
|
}
|
||||||
return hibernateProxy;
|
return hibernateProxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This technically returns a HibernateProxy, but declaring that type as the return
|
||||||
|
* type for the privileged action triggers an implicit case of type pollution.
|
||||||
|
* We therefore declare it as PrimeAmongSecondarySupertypes, and require the
|
||||||
|
* invoker to perform the narrowing
|
||||||
|
*/
|
||||||
|
private PrimeAmongSecondarySupertypes getHibernateProxyInternal()
|
||||||
|
throws HibernateException {
|
||||||
|
|
||||||
|
final PrivilegedAction<PrimeAmongSecondarySupertypes> action = new PrivilegedAction<PrimeAmongSecondarySupertypes>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PrimeAmongSecondarySupertypes run() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
return (PrimeAmongSecondarySupertypes) proxyClass.getConstructor().newInstance();
|
||||||
|
}
|
||||||
catch (NoSuchMethodException e) {
|
catch (NoSuchMethodException e) {
|
||||||
String logMessage = LOG.bytecodeEnhancementFailedBecauseOfDefaultConstructor( entityName );
|
String logMessage = LOG.bytecodeEnhancementFailedBecauseOfDefaultConstructor( entityName );
|
||||||
LOG.error( logMessage, e );
|
LOG.error( logMessage, e );
|
||||||
|
@ -127,6 +136,6 @@ public class ByteBuddyProxyFactory implements ProxyFactory, Serializable {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return SystemSecurityManager.isSecurityManagerEnabled() ? AccessController.doPrivileged( action ) : action.run();
|
return SystemSecurityManager.isSecurityManagerEnabled() ? AccessController.doPrivileged( action ) : action.run();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue