Close SSLEngine when connection fails.

Motivation:
When using the JdkSslEngine, the ALPN class is used keep a reference
to the engine.   In the event that the TCP connection fails, the
SSLEngine is not removed from the map, creating a memory leak.

Modification:
Always close the SSLEngine regardless of if the channel became
active.  Also, record the SSLEngine was closed in all places.

Result:
Fixes: https://github.com/grpc/grpc-java/issues/3080
This commit is contained in:
Carl Mastrangelo 2018-02-22 14:10:49 -08:00 committed by Norman Maurer
parent bf8cac4939
commit c11b23bbc1

View File

@ -1527,6 +1527,7 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
try {
// Release all resources such as internal buffers that SSLEngine
// is managing.
outboundClosed = true;
engine.closeOutbound();
if (closeInbound) {
@ -1574,6 +1575,9 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
private void closeOutboundAndChannel(
final ChannelHandlerContext ctx, final ChannelPromise promise, boolean disconnect) throws Exception {
outboundClosed = true;
engine.closeOutbound();
if (!ctx.channel().isActive()) {
if (disconnect) {
ctx.disconnect(promise);
@ -1583,9 +1587,6 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
return;
}
outboundClosed = true;
engine.closeOutbound();
ChannelPromise closeNotifyPromise = ctx.newPromise();
try {
flush(ctx, closeNotifyPromise);