diff options
author | Daiki Ueno <ueno@gnu.org> | 2020-06-02 05:34:29 +0200 |
---|---|---|
committer | Daiki Ueno <ueno@gnu.org> | 2020-06-02 05:44:07 +0200 |
commit | 6e79dc3811c0fabb65786c5c217322bf97e9883d (patch) | |
tree | 6e5b53252c2471f8e384f15585b78fb730692fb0 /lib/crypto-api.c | |
parent | 52e78f1e3a95a6d9e4f1f9a72f6d77102e80f196 (diff) | |
download | gnutls-6e79dc3811c0fabb65786c5c217322bf97e9883d.tar.gz |
gnutls_aead_cipher_init: fix potential memleak
When _gnutls_aead_cipher_init() fails, the function returns without
freeing the allocted handle. This was once fixed in commit
502be130493e8ce802cdf60fffdbb5f1885352a5 but regressed after a code
reorganization in commit 2eef509ce5f2d250f8dcaeffa46444dd2b694e91.
Reported by Miroslav Lichvar.
Signed-off-by: Daiki Ueno <ueno@gnu.org>
Diffstat (limited to 'lib/crypto-api.c')
-rw-r--r-- | lib/crypto-api.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/crypto-api.c b/lib/crypto-api.c index 45be64ed1f..311c819a32 100644 --- a/lib/crypto-api.c +++ b/lib/crypto-api.c @@ -755,6 +755,7 @@ int gnutls_aead_cipher_init(gnutls_aead_cipher_hd_t *handle, { api_aead_cipher_hd_st *h; const cipher_entry_st *e; + int ret; if (is_cipher_algo_forbidden(cipher)) return gnutls_assert_val(GNUTLS_E_UNWANTED_ALGORITHM); @@ -763,15 +764,21 @@ int gnutls_aead_cipher_init(gnutls_aead_cipher_hd_t *handle, if (e == NULL || e->type != CIPHER_AEAD) return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); - *handle = gnutls_calloc(1, sizeof(api_aead_cipher_hd_st)); - if (*handle == NULL) { + h = gnutls_calloc(1, sizeof(api_aead_cipher_hd_st)); + if (h == NULL) { gnutls_assert(); return GNUTLS_E_MEMORY_ERROR; } - h = *handle; + ret = _gnutls_aead_cipher_init(h, cipher, key); + if (ret < 0) { + gnutls_free(h); + return ret; + } - return _gnutls_aead_cipher_init(h, cipher, key); + *handle = h; + + return ret; } /** |