diff options
author | Jakub Jelen <jjelen@redhat.com> | 2020-01-14 16:48:50 +0100 |
---|---|---|
committer | Jakub Jelen <jjelen@redhat.com> | 2020-01-23 09:48:11 +0100 |
commit | 6644f8ca3babcc37244f69c9bad4124747722c27 (patch) | |
tree | ce256676e894c0eee73789f79f2e546a97d48cc2 /src | |
parent | 06d25497ffa7cdabad97f17586fa0aa5340a2b0b (diff) | |
download | libssh-6644f8ca3babcc37244f69c9bad4124747722c27.tar.gz libssh-6644f8ca3babcc37244f69c9bad4124747722c27.tar.xz libssh-6644f8ca3babcc37244f69c9bad4124747722c27.zip |
curve25519: Avoid memory leaks
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/curve25519.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/src/curve25519.c b/src/curve25519.c index 1d482a71..c13b3604 100644 --- a/src/curve25519.c +++ b/src/curve25519.c @@ -180,7 +180,7 @@ static int ssh_curve25519_build_k(ssh_session session) EVP_PKEY_CTX *pctx = NULL; EVP_PKEY *pkey = NULL, *pubkey = NULL; size_t shared_key_len = sizeof(k); - int rc; + int rc, ret = SSH_ERROR; pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL, session->next_crypto->curve25519_privkey, @@ -197,8 +197,7 @@ static int ssh_curve25519_build_k(ssh_session session) SSH_LOG(SSH_LOG_TRACE, "Failed to initialize X25519 context: %s", ERR_error_string(ERR_get_error(), NULL)); - EVP_PKEY_free(pkey); - return SSH_ERROR; + goto out; } rc = EVP_PKEY_derive_init(pctx); @@ -206,9 +205,7 @@ static int ssh_curve25519_build_k(ssh_session session) SSH_LOG(SSH_LOG_TRACE, "Failed to initialize X25519 key derivation: %s", ERR_error_string(ERR_get_error(), NULL)); - EVP_PKEY_free(pkey); - EVP_PKEY_CTX_free(pctx); - return SSH_ERROR; + goto out; } if (session->server) { @@ -224,9 +221,7 @@ static int ssh_curve25519_build_k(ssh_session session) SSH_LOG(SSH_LOG_TRACE, "Failed to create X25519 public key EVP_PKEY: %s", ERR_error_string(ERR_get_error(), NULL)); - EVP_PKEY_free(pkey); - EVP_PKEY_CTX_free(pctx); - return SSH_ERROR; + goto out; } rc = EVP_PKEY_derive_set_peer(pctx, pubkey); @@ -234,10 +229,7 @@ static int ssh_curve25519_build_k(ssh_session session) SSH_LOG(SSH_LOG_TRACE, "Failed to set peer X25519 public key: %s", ERR_error_string(ERR_get_error(), NULL)); - EVP_PKEY_free(pkey); - EVP_PKEY_free(pubkey); - EVP_PKEY_CTX_free(pctx); - return SSH_ERROR; + goto out; } rc = EVP_PKEY_derive(pctx, k, &shared_key_len); @@ -245,10 +237,15 @@ static int ssh_curve25519_build_k(ssh_session session) SSH_LOG(SSH_LOG_TRACE, "Failed to derive X25519 shared secret: %s", ERR_error_string(ERR_get_error(), NULL)); - EVP_PKEY_free(pkey); - EVP_PKEY_free(pubkey); - EVP_PKEY_CTX_free(pctx); - return SSH_ERROR; + goto out; + } + ret = SSH_OK; +out: + EVP_PKEY_free(pkey); + EVP_PKEY_free(pubkey); + EVP_PKEY_CTX_free(pctx); + if (ret == SSH_ERROR) { + return ret; } #else if (session->server) { |