crypto: chcr - Fix error handling related to 'chcr_alloc_shash'
authorChristophe Jaillet <christophe.jaillet@wanadoo.fr>
Thu, 13 Apr 2017 18:25:15 +0000 (20:25 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Apr 2017 12:30:47 +0000 (20:30 +0800)
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: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/chelsio/chcr_algo.c

index 53d9ce4367950e5291ac5d5b79ffc0f783061b3c..f00e0d8bd03983d308536069cffc02f7458921e3 100644 (file)
@@ -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)
 {
-       struct crypto_shash *base_hash = NULL;
+       struct crypto_shash *base_hash = ERR_PTR(-EINVAL);
 
        switch (ds) {
        case SHA1_DIGEST_SIZE:
@@ -2305,7 +2305,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
        int err = 0, i, key_ctx_len = 0;
        unsigned char ck_size = 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;
        int align;
        u8 *o_ptr = NULL;
@@ -2408,7 +2408,7 @@ static int chcr_authenc_setkey(struct crypto_aead *authenc, const u8 *key,
        }
 out:
        aeadctx->enckey_len = 0;
-       if (base_hash)
+       if (!IS_ERR(base_hash))
                chcr_free_shash(base_hash);
        return -EINVAL;
 }