Commit ec1bca94 authored by Christophe Jaillet's avatar Christophe Jaillet Committed by Herbert Xu

crypto: chcr - Fix error handling related to 'chcr_alloc_shash'

Up to now, 'crypto_alloc_shash()' may return a valid pointer, an error
pointer or NULL (in case of invalid parameter)
Update it to always return an error pointer in case of error. It now
returns ERR_PTR(-EINVAL) instead of NULL in case of invalid parameter.

This simplifies error handling.

Also fix a crash in 'chcr_authenc_setkey()' if 'chcr_alloc_shash()'
returns an error pointer and the "goto out" path is taken.
Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 69b34844
...@@ -294,7 +294,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key, ...@@ -294,7 +294,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,
static struct crypto_shash *chcr_alloc_shash(unsigned int ds) static struct crypto_shash *chcr_alloc_shash(unsigned int ds)
{ {
struct crypto_shash *base_hash = NULL; struct crypto_shash *base_hash = ERR_PTR(-EINVAL);
switch (ds) { switch (ds) {
case SHA1_DIGEST_SIZE: case SHA1_DIGEST_SIZE:
...@@ -2305,7 +2305,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key, ...@@ -2305,7 +2305,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
int err = 0, i, key_ctx_len = 0; int err = 0, i, key_ctx_len = 0;
unsigned char ck_size = 0; unsigned char ck_size = 0;
unsigned char pad[CHCR_HASH_MAX_BLOCK_SIZE_128] = { 0 }; unsigned char pad[CHCR_HASH_MAX_BLOCK_SIZE_128] = { 0 };
struct crypto_shash *base_hash = NULL; struct crypto_shash *base_hash = ERR_PTR(-EINVAL);
struct algo_param param; struct algo_param param;
int align; int align;
u8 *o_ptr = NULL; u8 *o_ptr = NULL;
...@@ -2408,7 +2408,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key, ...@@ -2408,7 +2408,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
} }
out: out:
aeadctx->enckey_len = 0; aeadctx->enckey_len = 0;
if (base_hash) if (!IS_ERR(base_hash))
chcr_free_shash(base_hash); chcr_free_shash(base_hash);
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment