From 4d7726c551503e98442483c919f2acc9788f14f0 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Thu, 6 Apr 2006 21:50:37 +0000 Subject: [PATCH] Plug leaks caused by not using OpenSSL's EVP interface correctly --- README | 2 ++ src/kex.c | 4 ++++ src/session.c | 2 ++ 3 files changed, 8 insertions(+) diff --git a/README b/README index 9ddcd533..594b2795 100644 --- a/README +++ b/README @@ -4,6 +4,8 @@ libssh2 - SSH2 library Version 0.14 ------------ + Plug leaks in EVP cipher init/shutdown. (Selcuk Gueney) + Allow socket_fd == 0 in libssh2_session_startup(). (puudeli) Version 0.13 diff --git a/src/kex.c b/src/kex.c index 60ead260..a810828c 100644 --- a/src/kex.c +++ b/src/kex.c @@ -314,6 +314,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S /* Calculate IV/Secret/Key for each direction */ if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->local.crypt_abstract) { + EVP_CIPHER_CTX_cleanup(session->local.crypt_abstract); LIBSSH2_FREE(session, session->local.crypt_abstract); session->local.crypt_abstract = NULL; } @@ -342,6 +343,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S ret = -1; goto clean_exit; } + EVP_CIPHER_CTX_init(ctx); EVP_CipherInit(ctx, cipher, secret, iv, 1); session->local.crypt_abstract = ctx; free_iv = 1; @@ -366,6 +368,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->remote.crypt_abstract) { + EVP_CIPHER_CTX_cleanup(session->remote.crypt_abstract); LIBSSH2_FREE(session, session->remote.crypt_abstract); session->remote.crypt_abstract = NULL; } @@ -394,6 +397,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S ret = -1; goto clean_exit; } + EVP_CIPHER_CTX_init(ctx); EVP_CipherInit(ctx, cipher, secret, iv, 0); session->remote.crypt_abstract = ctx; free_iv = 1; diff --git a/src/session.c b/src/session.c index cbda226f..48e0f697 100644 --- a/src/session.c +++ b/src/session.c @@ -411,6 +411,7 @@ LIBSSH2_API void libssh2_session_free(LIBSSH2_SESSION *session) if (session->local.crypt) { if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->local.crypt_abstract) { + EVP_CIPHER_CTX_cleanup(session->local.crypt_abstract); LIBSSH2_FREE(session, session->local.crypt_abstract); session->local.crypt_abstract = NULL; } @@ -432,6 +433,7 @@ LIBSSH2_API void libssh2_session_free(LIBSSH2_SESSION *session) if (session->remote.crypt) { if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->remote.crypt_abstract) { + EVP_CIPHER_CTX_cleanup(session->remote.crypt_abstract); LIBSSH2_FREE(session, session->remote.crypt_abstract); session->remote.crypt_abstract = NULL; }