From 6764775bb4af73f09c890d45193b14c5e3020945 Mon Sep 17 00:00:00 2001 From: Brian Neradt Date: Wed, 2 Jun 2021 19:34:41 +0000 Subject: [PATCH] Ensure TS_VCONN_CLOSE_HOOK hook is called during TS_EVENT_VCONN_CLOSE. This causes the VCONN_CLOSE hooks to be called more consistently in the event of TS_EVENT_VCONN_CLOSE. Without this patch it got missed under some circumstances, causing situations where plugins would receive a TS_EVENT_VCONN_START but never a TS_EVENT_VCONN_CLOSE for some connections. --- iocore/net/SSLNetVConnection.cc | 65 +++++++++++++++++---------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/iocore/net/SSLNetVConnection.cc b/iocore/net/SSLNetVConnection.cc index b6be2c6bbe4..02339f24cf3 100644 --- a/iocore/net/SSLNetVConnection.cc +++ b/iocore/net/SSLNetVConnection.cc @@ -1694,39 +1694,40 @@ SSLNetVConnection::callHooks(TSEvent eventId) Debug("ssl", "sslHandshakeHookState=%d eventID=%d", this->sslHandshakeHookState, eventId); // Move state if it is appropriate - switch (this->sslHandshakeHookState) { - case HANDSHAKE_HOOKS_PRE: - case HANDSHAKE_HOOKS_OUTBOUND_PRE: - if (eventId == TS_EVENT_SSL_CLIENT_HELLO) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_CLIENT_HELLO; - } else if (eventId == TS_EVENT_SSL_SERVERNAME) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_SNI; - } else if (eventId == TS_EVENT_SSL_VERIFY_SERVER) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_VERIFY_SERVER; - } else if (eventId == TS_EVENT_SSL_CERT) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; - } - break; - case HANDSHAKE_HOOKS_CLIENT_HELLO: - if (eventId == TS_EVENT_SSL_SERVERNAME) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_SNI; - } else if (eventId == TS_EVENT_SSL_CERT) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; - } else if (eventId == TS_EVENT_VCONN_CLOSE) { - // Jump to the end - this->sslHandshakeHookState = HANDSHAKE_HOOKS_DONE; - } - break; - case HANDSHAKE_HOOKS_SNI: - if (eventId == TS_EVENT_SSL_CERT) { - this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; - } else if (eventId == TS_EVENT_VCONN_CLOSE) { - // Jump to the end - this->sslHandshakeHookState = HANDSHAKE_HOOKS_DONE; + if (eventId == TS_EVENT_VCONN_CLOSE) { + // Regardless of state, if the connection is closing, then transition to + // the DONE state. This will trigger us to call the appropriate cleanup + // routines. + this->sslHandshakeHookState = HANDSHAKE_HOOKS_DONE; + } else { + switch (this->sslHandshakeHookState) { + case HANDSHAKE_HOOKS_PRE: + case HANDSHAKE_HOOKS_OUTBOUND_PRE: + if (eventId == TS_EVENT_SSL_CLIENT_HELLO) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_CLIENT_HELLO; + } else if (eventId == TS_EVENT_SSL_SERVERNAME) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_SNI; + } else if (eventId == TS_EVENT_SSL_VERIFY_SERVER) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_VERIFY_SERVER; + } else if (eventId == TS_EVENT_SSL_CERT) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; + } + break; + case HANDSHAKE_HOOKS_CLIENT_HELLO: + if (eventId == TS_EVENT_SSL_SERVERNAME) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_SNI; + } else if (eventId == TS_EVENT_SSL_CERT) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; + } + break; + case HANDSHAKE_HOOKS_SNI: + if (eventId == TS_EVENT_SSL_CERT) { + this->sslHandshakeHookState = HANDSHAKE_HOOKS_CERT; + } + break; + default: + break; } - break; - default: - break; } // Look for hooks associated with the event