]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: qce - unregister previously registered algos in error path
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 3 Dec 2024 09:19:30 +0000 (10:19 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 14 Dec 2024 09:21:43 +0000 (17:21 +0800)
If we encounter an error when registering alorithms with the crypto
framework, we just bail out and don't unregister the ones we
successfully registered in prior iterations of the loop.

Add code that goes back over the algos and unregisters them before
returning an error from qce_register_algs().

Cc: stable@vger.kernel.org
Fixes: ec8f5d8f6f76 ("crypto: qce - Qualcomm crypto engine driver")
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qce/core.c

index 58ea93220f0156d12f9af44fe6460582e47c56b7..848e5e802b92b91a901c0fb108c81ce297a46fe4 100644 (file)
@@ -51,16 +51,19 @@ static void qce_unregister_algs(struct qce_device *qce)
 static int qce_register_algs(struct qce_device *qce)
 {
        const struct qce_algo_ops *ops;
-       int i, ret = -ENODEV;
+       int i, j, ret = -ENODEV;
 
        for (i = 0; i < ARRAY_SIZE(qce_ops); i++) {
                ops = qce_ops[i];
                ret = ops->register_algs(qce);
-               if (ret)
-                       break;
+               if (ret) {
+                       for (j = i - 1; j >= 0; j--)
+                               ops->unregister_algs(qce);
+                       return ret;
+               }
        }
 
-       return ret;
+       return 0;
 }
 
 static int qce_handle_request(struct crypto_async_request *async_req)