1
1

Plug leaks caused by not using OpenSSL's EVP interface correctly

Этот коммит содержится в:
Sara Golemon 2006-04-06 21:50:37 +00:00
родитель 37307a8778
Коммит 4d7726c551
3 изменённых файлов: 8 добавлений и 0 удалений

2
README
Просмотреть файл

@ -4,6 +4,8 @@ libssh2 - SSH2 library
Version 0.14 Version 0.14
------------ ------------
Plug leaks in EVP cipher init/shutdown. (Selcuk Gueney)
Allow socket_fd == 0 in libssh2_session_startup(). (puudeli) Allow socket_fd == 0 in libssh2_session_startup(). (puudeli)
Version 0.13 Version 0.13

Просмотреть файл

@ -314,6 +314,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S
/* Calculate IV/Secret/Key for each direction */ /* Calculate IV/Secret/Key for each direction */
if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
if (session->local.crypt_abstract) { if (session->local.crypt_abstract) {
EVP_CIPHER_CTX_cleanup(session->local.crypt_abstract);
LIBSSH2_FREE(session, session->local.crypt_abstract); LIBSSH2_FREE(session, session->local.crypt_abstract);
session->local.crypt_abstract = NULL; session->local.crypt_abstract = NULL;
} }
@ -342,6 +343,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S
ret = -1; ret = -1;
goto clean_exit; goto clean_exit;
} }
EVP_CIPHER_CTX_init(ctx);
EVP_CipherInit(ctx, cipher, secret, iv, 1); EVP_CipherInit(ctx, cipher, secret, iv, 1);
session->local.crypt_abstract = ctx; session->local.crypt_abstract = ctx;
free_iv = 1; 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->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
if (session->remote.crypt_abstract) { if (session->remote.crypt_abstract) {
EVP_CIPHER_CTX_cleanup(session->remote.crypt_abstract);
LIBSSH2_FREE(session, session->remote.crypt_abstract); LIBSSH2_FREE(session, session->remote.crypt_abstract);
session->remote.crypt_abstract = NULL; session->remote.crypt_abstract = NULL;
} }
@ -394,6 +397,7 @@ static int libssh2_kex_method_diffie_hellman_groupGP_sha1_key_exchange(LIBSSH2_S
ret = -1; ret = -1;
goto clean_exit; goto clean_exit;
} }
EVP_CIPHER_CTX_init(ctx);
EVP_CipherInit(ctx, cipher, secret, iv, 0); EVP_CipherInit(ctx, cipher, secret, iv, 0);
session->remote.crypt_abstract = ctx; session->remote.crypt_abstract = ctx;
free_iv = 1; free_iv = 1;

Просмотреть файл

@ -411,6 +411,7 @@ LIBSSH2_API void libssh2_session_free(LIBSSH2_SESSION *session)
if (session->local.crypt) { if (session->local.crypt) {
if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->local.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
if (session->local.crypt_abstract) { if (session->local.crypt_abstract) {
EVP_CIPHER_CTX_cleanup(session->local.crypt_abstract);
LIBSSH2_FREE(session, session->local.crypt_abstract); LIBSSH2_FREE(session, session->local.crypt_abstract);
session->local.crypt_abstract = NULL; 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) {
if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) { if (session->remote.crypt->flags & LIBSSH2_CRYPT_METHOD_FLAG_EVP) {
if (session->remote.crypt_abstract) { if (session->remote.crypt_abstract) {
EVP_CIPHER_CTX_cleanup(session->remote.crypt_abstract);
LIBSSH2_FREE(session, session->remote.crypt_abstract); LIBSSH2_FREE(session, session->remote.crypt_abstract);
session->remote.crypt_abstract = NULL; session->remote.crypt_abstract = NULL;
} }