aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2020-01-14 16:48:50 +0100
committerJakub Jelen <jjelen@redhat.com>2020-01-23 09:48:11 +0100
commit6644f8ca3babcc37244f69c9bad4124747722c27 (patch)
treece256676e894c0eee73789f79f2e546a97d48cc2 /src
parent06d25497ffa7cdabad97f17586fa0aa5340a2b0b (diff)
downloadlibssh-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.c31
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) {