Always release the sslEngine inside SslHandler's handlerRemoved0 (#11605)

Motivation:
Make SslHandler's handlerRemoved0 method release the sslEngine
even if it fails in the middle.
See details in https://github.com/netty/netty/issues/11595.

Modifications:
Wrap the release of sslEngine into a finally block.

Result:
The sslEngine would be released eventually.

Co-authored-by: Chen Liu <cliu@splunk.com>
This commit is contained in:
Chen Liu 2021-08-20 09:50:19 -07:00 committed by GitHub
parent fd47554669
commit 36eb399b4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -37,7 +37,6 @@ import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.DecoderException;
import io.netty.handler.codec.UnsupportedMessageTypeException;
import io.netty.util.ReferenceCountUtil;
import io.netty.util.ReferenceCounted;
import io.netty.util.concurrent.DefaultPromise;
import io.netty.util.concurrent.EventExecutor;
import io.netty.util.concurrent.Future;
@ -674,6 +673,7 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
@Override
public void handlerRemoved0(ChannelHandlerContext ctx) throws Exception {
try {
if (!pendingUnencryptedWrites.isEmpty()) {
// Check if queue is not empty first because create a new ChannelException is expensive
pendingUnencryptedWrites.releaseAndFailAll(ctx,
@ -697,9 +697,8 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
}
notifyClosePromise(cause);
}
if (engine instanceof ReferenceCounted) {
((ReferenceCounted) engine).release();
} finally {
ReferenceCountUtil.release(engine);
}
}