crypto: aesni-intel - Fix remaining leak in rfc4106_set_hash_key

Fix up previous patch that failed to properly fix mem leak in 
rfc4106_set_hash_subkey(). This add-on patch; fixes the leak. moves 
kfree() out of the error path, returns -ENOMEM rather than -EINVAL when 
ablkcipher_request_alloc() fails.

Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Jesper Juhl 2011-02-16 13:04:09 +11:00 committed by Herbert Xu
parent 36be070ac6
commit fc9044e2db

View File

@ -874,19 +874,17 @@ rfc4106_set_hash_subkey(u8 *hash_subkey, const u8 *key, unsigned int key_len)
ret = crypto_ablkcipher_setkey(ctr_tfm, key, key_len); ret = crypto_ablkcipher_setkey(ctr_tfm, key, key_len);
if (ret) if (ret)
goto out;
req = ablkcipher_request_alloc(ctr_tfm, GFP_KERNEL);
if (!req) {
ret = -EINVAL;
goto out_free_ablkcipher; goto out_free_ablkcipher;
}
ret = -ENOMEM;
req = ablkcipher_request_alloc(ctr_tfm, GFP_KERNEL);
if (!req)
goto out_free_ablkcipher;
req_data = kmalloc(sizeof(*req_data), GFP_KERNEL); req_data = kmalloc(sizeof(*req_data), GFP_KERNEL);
if (!req_data) { if (!req_data)
ret = -ENOMEM;
goto out_free_request; goto out_free_request;
}
memset(req_data->iv, 0, sizeof(req_data->iv)); memset(req_data->iv, 0, sizeof(req_data->iv));
/* Clear the data in the hash sub key container to zero.*/ /* Clear the data in the hash sub key container to zero.*/
@ -911,12 +909,11 @@ rfc4106_set_hash_subkey(u8 *hash_subkey, const u8 *key, unsigned int key_len)
if (!ret) if (!ret)
ret = req_data->result.err; ret = req_data->result.err;
} }
kfree(req_data);
out_free_request: out_free_request:
ablkcipher_request_free(req); ablkcipher_request_free(req);
kfree(req_data);
out_free_ablkcipher: out_free_ablkcipher:
crypto_free_ablkcipher(ctr_tfm); crypto_free_ablkcipher(ctr_tfm);
out:
return ret; return ret;
} }