From 152ae623c21843a7dec3cab823f2debc41349203 Mon Sep 17 00:00:00 2001 From: Jakub Jelen Date: Tue, 11 Sep 2018 15:11:12 +0200 Subject: [PATCH] pki_mbedcrypto: pki_pubkey_build_rsa: properly clean up on error Signed-off-by: Jakub Jelen Reviewed-by: Andreas Schneider (cherry picked from commit 8cc0672c0cf116221418626ca8b7b1234c31af43) --- src/pki_mbedcrypto.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/pki_mbedcrypto.c b/src/pki_mbedcrypto.c index 534e375d..a5954980 100644 --- a/src/pki_mbedcrypto.c +++ b/src/pki_mbedcrypto.c @@ -229,25 +229,31 @@ int pki_pubkey_build_rsa(ssh_key key, ssh_string e, ssh_string n) pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA); mbedtls_pk_setup(key->rsa, pk_info); - if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA)) { - rsa = mbedtls_pk_rsa(*key->rsa); - rc = mbedtls_mpi_read_binary(&rsa->N, ssh_string_data(n), - ssh_string_len(n)); - if (rc != 0) { - return SSH_ERROR; - } - rc = mbedtls_mpi_read_binary(&rsa->E, ssh_string_data(e), - ssh_string_len(e)); - if (rc != 0) { - return SSH_ERROR; - } - - rsa->len = (mbedtls_mpi_bitlen(&rsa->N) + 7) >> 3; - } else { - return SSH_ERROR; + rc = mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA); + if (rc == 0) { + goto fail; } + rsa = mbedtls_pk_rsa(*key->rsa); + rc = mbedtls_mpi_read_binary(&rsa->N, ssh_string_data(n), + ssh_string_len(n)); + if (rc != 0) { + goto fail; + } + rc = mbedtls_mpi_read_binary(&rsa->E, ssh_string_data(e), + ssh_string_len(e)); + if (rc != 0) { + goto fail; + } + + rsa->len = (mbedtls_mpi_bitlen(&rsa->N) + 7) >> 3; + return SSH_OK; + +fail: + mbedtls_pk_free(key->rsa); + SAFE_FREE(key->rsa); + return SSH_ERROR; } ssh_key pki_key_dup(const ssh_key key, int demote)