Fixes infinite loop during handshake in SslHandler in Android devices

Motivation:

On Android devices with version less than Lollipop, HarmonyJSSE is used for SSL. After completion of handshake, handshake status is NOT_HANDSHAKING instead of FINISHED. Also encrypting empty buffer after handshake should cause underflow exception and produce 0 bytes, but here it happily encrypts it causing for loop to never break

Modification:

Since 0 bytes should only be consumed in handshake process. Added a condition to break loop when 0 bytes are consumed and handshake status is NOT_HANDSHAKING

Result:

Sucessful ssl handshake on Android devices, no infinite loop now
This commit is contained in:
Vineet Garg 2015-08-19 18:43:17 +05:30 committed by Norman Maurer
parent ad0b7ca56d
commit 052a171a52

View File

@ -624,6 +624,12 @@ public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundH
if (result.bytesProduced() == 0) { if (result.bytesProduced() == 0) {
break; break;
} }
// It should not consume empty buffers when it is not handshaking
// Fix for Android, where it was encrypting empty buffers even when not handshaking
if (result.bytesConsumed() == 0 && result.getHandshakeStatus() == HandshakeStatus.NOT_HANDSHAKING) {
break;
}
} }
} catch (SSLException e) { } catch (SSLException e) {
setHandshakeFailure(ctx, e); setHandshakeFailure(ctx, e);