From c6adb20ec75208b14761c037180b84e3f6dc9113 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 12 Jun 2026 16:37:53 +0200 Subject: [PATCH] chapoly: Fix memory leak on failed ICV verification if not using in-place decryption Fixes: 370fb3feb04b ("chapoly: Provide a generic ChaCha20/Poly1305 AEAD supporting driver backends") --- src/libstrongswan/plugins/chapoly/chapoly_aead.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libstrongswan/plugins/chapoly/chapoly_aead.c b/src/libstrongswan/plugins/chapoly/chapoly_aead.c index 82684d83c..aeb574d6c 100644 --- a/src/libstrongswan/plugins/chapoly/chapoly_aead.c +++ b/src/libstrongswan/plugins/chapoly/chapoly_aead.c @@ -216,6 +216,8 @@ METHOD(aead_t, decrypt, bool, chunk_t *plain) { u_char *out, icv[POLY_ICV_SIZE]; + bool valid; + if (iv.len != CHACHA_IV_SIZE || encr.len < POLY_ICV_SIZE) { return FALSE; @@ -233,7 +235,12 @@ METHOD(aead_t, decrypt, bool, memcpy(out, encr.ptr, encr.len); } do_decrypt(this, encr.len, out, iv.ptr, assoc.len, assoc.ptr, icv); - return memeq_const(icv, encr.ptr + encr.len, POLY_ICV_SIZE); + valid = memeq_const(icv, encr.ptr + encr.len, POLY_ICV_SIZE); + if (!valid && plain) + { + chunk_free(plain); + } + return valid; } METHOD(aead_t, get_block_size, size_t,