[cherry-pick](SSL) Fix ssl connection close 2.1 (#38587) (#38677)

## Proposed changes

Issue Number: close #38590 

If SSL connection closed, a specified packet will sent to indicate the
closing of connection. The SSL engine will be shut down and output an
empty unwrapped result.

Therefore, handle this case correctly to avoid buffer overflow by
breaking the reading flow and do the cleanup stuff initiatively.
This commit is contained in:
Siyang Tang
2024-08-01 16:06:30 +08:00
committed by GitHub
parent 9d23ccf1f2
commit cafcf7acc1
2 changed files with 6 additions and 1 deletions

View File

@ -314,7 +314,7 @@ public class MysqlChannel implements BytesChannel {
// before read, set limit to make read only one packet
result.limit(result.position() + packetLen);
readLen = readAll(result, false);
if (isSslMode && remainingBuffer.position() == 0) {
if (isSslMode && remainingBuffer.position() == 0 && result.hasRemaining()) {
byte[] header = result.array();
int packetId = header[3] & 0xFF;
if (packetId != sequenceId) {

View File

@ -343,6 +343,11 @@ public class MysqlConnectProcessor extends ConnectProcessor {
LOG.warn("Null packet received from network. remote: {}", channel.getRemoteHostPortString());
throw new IOException("Error happened when receiving packet.");
}
if (!packetBuf.hasRemaining()) {
LOG.info("No more data to be read. Close connection. remote={}", channel.getRemoteHostPortString());
ctx.setKilled();
return;
}
} catch (AsynchronousCloseException e) {
// when this happened, timeout checker close this channel
// killed flag in ctx has been already set, just return