]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
gnutls_aead_cipher_init: fix potential memleak
authorDaiki Ueno <ueno@gnu.org>
Tue, 2 Jun 2020 03:34:29 +0000 (05:34 +0200)
committerDaiki Ueno <ueno@gnu.org>
Tue, 2 Jun 2020 03:44:07 +0000 (05:44 +0200)
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>
lib/crypto-api.c

index 45be64ed1f3d0d236155006a28a3c433b18bacbe..311c819a3200a47ead003aeb63c12f9ae2582add 100644 (file)
@@ -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;
 }
 
 /**