diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2013-02-17 09:26:52 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2013-02-17 09:26:52 +0100 |
commit | 1c4215259fdbb129a1e3f2f2d8c6a65313dd2151 (patch) | |
tree | 2fd78d4112471cc952ec76d889975064208bf7fa | |
parent | 0843843e91b1d74dbe1871d1bc78b33cf2af87dd (diff) | |
download | gnutls-1c4215259fdbb129a1e3f2f2d8c6a65313dd2151.tar.gz |
better cleanup on error on export case
-rw-r--r-- | lib/auth/rsa.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/lib/auth/rsa.c b/lib/auth/rsa.c index 02ae265ec6..f2b9d5e850 100644 --- a/lib/auth/rsa.c +++ b/lib/auth/rsa.c @@ -94,7 +94,6 @@ _gnutls_get_public_rsa_params (gnutls_session_t session, } gnutls_pk_params_init(params); - params->params_nr = RSA_PUBLIC_PARAMS; /* EXPORT case: */ if (_gnutls_cipher_suite_get_kx_algo @@ -109,25 +108,36 @@ _gnutls_get_public_rsa_params (gnutls_session_t session, goto cleanup; } - for (i = 0; i < params->params_nr; i++) + for (i = 0; i < RSA_PUBLIC_PARAMS; i++) { params->params[i] = _gnutls_mpi_copy (session->key.rsa[i]); + if (params->params[i] != NULL) + params->params_nr++; + else + { + ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + goto cleanup; + } } - - ret = 0; - goto cleanup; + + goto done; } ret = _gnutls_pubkey_get_mpis(peer_cert.pubkey, params); if (ret < 0) { ret = gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR); - goto cleanup; + goto cleanup2; } - ret = 0; +done: + gnutls_pcert_deinit (&peer_cert); + return 0; cleanup: + for (i=0;i<params->params_nr;i++) + _gnutls_mpi_release(params->params[i]); +cleanup2: gnutls_pcert_deinit (&peer_cert); return ret; |