From 4feb31d0e6bc2fc4b3aef165d662977fe675f2aa Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Mon, 13 Jul 2026 19:21:41 +0200 Subject: [PATCH] tls-peer: Fix memory leak when processing Finished messages with TLS 1.3 fails Fixes: 7a2b02667c30 ("libtls: Implement TLS 1.3 handshake on client-side") --- src/libtls/tls_peer.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/libtls/tls_peer.c b/src/libtls/tls_peer.c index bfdba3eab..ed2031128 100644 --- a/src/libtls/tls_peer.c +++ b/src/libtls/tls_peer.c @@ -1013,7 +1013,7 @@ static status_t process_hello_done(private_tls_peer_t *this, */ static status_t process_finished(private_tls_peer_t *this, bio_reader_t *reader) { - chunk_t received, verify_data; + chunk_t received, verify_data = chunk_empty; u_char buf[12]; if (this->tls->get_version_max(this->tls) < TLS_1_3) @@ -1040,7 +1040,7 @@ static status_t process_finished(private_tls_peer_t *this, bio_reader_t *reader) { DBG1(DBG_TLS, "calculating server finished failed"); this->alert->add(this->alert, TLS_FATAL, TLS_INTERNAL_ERROR); - return NEED_MORE; + goto out; } } @@ -1048,16 +1048,17 @@ static status_t process_finished(private_tls_peer_t *this, bio_reader_t *reader) { DBG1(DBG_TLS, "received server finished invalid"); this->alert->add(this->alert, TLS_FATAL, TLS_DECRYPT_ERROR); - return NEED_MORE; - } - - if (verify_data.ptr != buf) - { - chunk_free(&verify_data); + goto out; } this->crypto->append_handshake(this->crypto, TLS_FINISHED, received); this->state = STATE_FINISHED_RECEIVED; + +out: + if (verify_data.ptr && verify_data.ptr != buf) + { + chunk_free(&verify_data); + } return NEED_MORE; }