Fix invokeExact(...) usage in JdkAlpnSslUtils (#10471)

Motivation:

fd0d06e introduced the usage of MethodHandles and so also introduced some usages of invokeExact(...). Unfortunally when calling this method we missed to also cast the return value in the static init block of JdkAlpnSslUtils which lead to an exception to be thrown as the JVM did assume the return value is void which is not true.

Modifications:

Correctly cast the return value of invokeExact(...)

Result:

ALPN can be used in master with JDK again
This commit is contained in:
Norman Maurer 2020-08-11 16:04:15 +02:00 committed by GitHub
parent 1208f27070
commit 6aa30b2b6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -56,12 +56,14 @@ final class JdkAlpnSslUtils {
AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () -> AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () ->
lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocol", lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocol",
MethodType.methodType(String.class))); MethodType.methodType(String.class)));
getHandshakeApplicationProtocol.invokeExact(engine); // Invoke and specify the return type so the compiler doesnt try to use void
String getHandshakeApplicationProtocolRes = (String) getHandshakeApplicationProtocol.invokeExact(engine);
getApplicationProtocol = AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () -> getApplicationProtocol = AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () ->
lookup.findVirtual(SSLEngine.class, "getApplicationProtocol", lookup.findVirtual(SSLEngine.class, "getApplicationProtocol",
MethodType.methodType(String.class))); MethodType.methodType(String.class)));
getApplicationProtocol.invokeExact(engine); // Invoke and specify the return type so the compiler doesnt try to use void
String getApplicationProtocolRes = (String) getApplicationProtocol.invokeExact(engine);
setApplicationProtocols = AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () -> setApplicationProtocols = AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () ->
lookup.findVirtual(SSLParameters.class, "setApplicationProtocols", lookup.findVirtual(SSLParameters.class, "setApplicationProtocols",
@ -79,6 +81,10 @@ final class JdkAlpnSslUtils {
AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () -> AccessController.doPrivileged((PrivilegedExceptionAction<MethodHandle>) () ->
lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocolSelector", lookup.findVirtual(SSLEngine.class, "getHandshakeApplicationProtocolSelector",
MethodType.methodType(BiFunction.class))); MethodType.methodType(BiFunction.class)));
// Invoke and specify the return type so the compiler doesnt try to use void
@SuppressWarnings("unchecked")
BiFunction<SSLEngine, List<String>, String> getHandshakeApplicationProtocolSelectorRes =
(BiFunction<SSLEngine, List<String>, String>)
getHandshakeApplicationProtocolSelector.invokeExact(engine); getHandshakeApplicationProtocolSelector.invokeExact(engine);
} catch (Throwable t) { } catch (Throwable t) {
int version = PlatformDependent.javaVersion(); int version = PlatformDependent.javaVersion();