From 19a244c682d2d9d9d83f4aaaa8abbb7eecf35472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C5=8Dan?= Date: Thu, 12 Mar 2026 22:30:20 -0600 Subject: [PATCH] fix: free EVP_PKEY_CTX leak in _new_key_from_parameters() test_ctx allocated via EVP_PKEY_CTX_new_from_pkey() at line 649 was never freed on either success or error paths (OpenSSL 3.x only). Save the EVP_PKEY_check() result, free test_ctx immediately, then THROW on failure. Also guard against NULL test_ctx before calling EVP_PKEY_check. Co-Authored-By: Claude Opus 4.6 --- RSA.xs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RSA.xs b/RSA.xs index 75cad1a..41bd247 100644 --- a/RSA.xs +++ b/RSA.xs @@ -657,9 +657,9 @@ _new_key_from_parameters(proto, n, e, d, p, q) int status = EVP_PKEY_fromdata(pctx, &rsa, EVP_PKEY_KEYPAIR, params); THROW( status > 0 && rsa != NULL ); EVP_PKEY_CTX* test_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, rsa, NULL); - int check_ok = EVP_PKEY_check(test_ctx); + int check_ok = (test_ctx != NULL && EVP_PKEY_check(test_ctx) == 1); EVP_PKEY_CTX_free(test_ctx); - THROW(check_ok == 1); + THROW(check_ok); #else THROW(RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp)); #endif