Workaround SSLEngine.unwrap(...) bug in Android 5.0
Motivation: Android 5.0 sometimes not correctly update the bytesConsumed of the SSLEngineResult when consuming data from the input ByteBuffer. This will lead to handshake failures. Modifications: Add a workaround for Android 5.0 Result: Be able to use netty on Android 5.0 by fixing https://github.com/netty/netty/issues/7758 .
This commit is contained in:
parent
48df2f66b8
commit
bf8cac4939
@ -289,9 +289,26 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
|
|||||||
SSLEngineResult unwrap(SslHandler handler, ByteBuf in, int readerIndex, int len, ByteBuf out)
|
SSLEngineResult unwrap(SslHandler handler, ByteBuf in, int readerIndex, int len, ByteBuf out)
|
||||||
throws SSLException {
|
throws SSLException {
|
||||||
int writerIndex = out.writerIndex();
|
int writerIndex = out.writerIndex();
|
||||||
final SSLEngineResult result = handler.engine.unwrap(toByteBuffer(in, readerIndex, len),
|
ByteBuffer inNioBuffer = toByteBuffer(in, readerIndex, len);
|
||||||
|
int position = inNioBuffer.position();
|
||||||
|
final SSLEngineResult result = handler.engine.unwrap(inNioBuffer,
|
||||||
toByteBuffer(out, writerIndex, out.writableBytes()));
|
toByteBuffer(out, writerIndex, out.writableBytes()));
|
||||||
out.writerIndex(writerIndex + result.bytesProduced());
|
out.writerIndex(writerIndex + result.bytesProduced());
|
||||||
|
|
||||||
|
// This is a workaround for a bug in Android 5.0. Android 5.0 does not correctly update the
|
||||||
|
// SSLEngineResult.bytesConsumed() in some cases and just return 0.
|
||||||
|
//
|
||||||
|
// See:
|
||||||
|
// - https://android-review.googlesource.com/c/platform/external/conscrypt/+/122080
|
||||||
|
// - https://github.com/netty/netty/issues/7758
|
||||||
|
if (result.bytesConsumed() == 0) {
|
||||||
|
int consumed = inNioBuffer.position() - position;
|
||||||
|
if (consumed != result.bytesConsumed()) {
|
||||||
|
// Create a new SSLEngineResult with the correct bytesConsumed().
|
||||||
|
return new SSLEngineResult(
|
||||||
|
result.getStatus(), result.getHandshakeStatus(), consumed, result.bytesProduced());
|
||||||
|
}
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user