crypto: ccree - rearrange init calls to avoid race
authorGilad Ben-Yossef <gilad@benyossef.com>
Wed, 6 Apr 2022 08:11:38 +0000 (11:11 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 15 Apr 2022 08:34:25 +0000 (16:34 +0800)
Rearrange init calls to avoid the rare race condition of
the cipher algs being registered and used while we still
init the hash code which uses the HW without proper lock.

Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Reported-by: Dung Nguyen <dung.nguyen.zy@renesas.com>
Tested-by: Jing Dan <jing.dan.nx@renesas.com>
Tested-by: Dung Nguyen <dung.nguyen.zy@renesas.com>
Fixes: 63893811b0fc("crypto: ccree - add ahash support")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccree/cc_driver.c

index 790fa9058a36d02382e7239f33805ecfbe887165..7d1bee86d58108fa8409d86d5740eda1eb3f324a 100644 (file)
@@ -529,24 +529,26 @@ static int init_cc_resources(struct platform_device *plat_dev)
                goto post_req_mgr_err;
        }
 
-       /* Allocate crypto algs */
-       rc = cc_cipher_alloc(new_drvdata);
+       /* hash must be allocated first due to use of send_request_init()
+        * and dependency of AEAD on it
+        */
+       rc = cc_hash_alloc(new_drvdata);
        if (rc) {
-               dev_err(dev, "cc_cipher_alloc failed\n");
+               dev_err(dev, "cc_hash_alloc failed\n");
                goto post_buf_mgr_err;
        }
 
-       /* hash must be allocated before aead since hash exports APIs */
-       rc = cc_hash_alloc(new_drvdata);
+       /* Allocate crypto algs */
+       rc = cc_cipher_alloc(new_drvdata);
        if (rc) {
-               dev_err(dev, "cc_hash_alloc failed\n");
-               goto post_cipher_err;
+               dev_err(dev, "cc_cipher_alloc failed\n");
+               goto post_hash_err;
        }
 
        rc = cc_aead_alloc(new_drvdata);
        if (rc) {
                dev_err(dev, "cc_aead_alloc failed\n");
-               goto post_hash_err;
+               goto post_cipher_err;
        }
 
        /* If we got here and FIPS mode is enabled
@@ -558,10 +560,10 @@ static int init_cc_resources(struct platform_device *plat_dev)
        pm_runtime_put(dev);
        return 0;
 
-post_hash_err:
-       cc_hash_free(new_drvdata);
 post_cipher_err:
        cc_cipher_free(new_drvdata);
+post_hash_err:
+       cc_hash_free(new_drvdata);
 post_buf_mgr_err:
         cc_buffer_mgr_fini(new_drvdata);
 post_req_mgr_err:
@@ -593,8 +595,8 @@ static void cleanup_cc_resources(struct platform_device *plat_dev)
                (struct cc_drvdata *)platform_get_drvdata(plat_dev);
 
        cc_aead_free(drvdata);
-       cc_hash_free(drvdata);
        cc_cipher_free(drvdata);
+       cc_hash_free(drvdata);
        cc_buffer_mgr_fini(drvdata);
        cc_req_mgr_fini(drvdata);
        cc_fips_fini(drvdata);