]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: caam/qi - Fix drv_ctx refcount bug
authorHerbert Xu <herbert@gondor.apana.org.au>
Tue, 8 Apr 2025 05:17:20 +0000 (13:17 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 May 2025 05:41:01 +0000 (07:41 +0200)
commit b7b39df7e710b0068356e4c696af07aa10e2cd3d upstream.

Ensure refcount is raised before request is enqueued since it could
be dequeued before the call returns.

Reported-by: Sean Anderson <sean.anderson@linux.dev>
Cc: <stable@vger.kernel.org>
Fixes: 11144416a755 ("crypto: caam/qi - optimize frame queue cleanup")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Tested-by: Sean Anderson <sean.anderson@linux.dev>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/crypto/caam/qi.c

index 8e9f6097114e399c20b2e9653c7adbc0d85d6a9a..82afae9ca90798c2d278287381bc29875ad9fa64 100644 (file)
@@ -115,12 +115,12 @@ int caam_qi_enqueue(struct device *qidev, struct caam_drv_req *req)
        qm_fd_addr_set64(&fd, addr);
 
        do {
+               refcount_inc(&req->drv_ctx->refcnt);
                ret = qman_enqueue(req->drv_ctx->req_fq, &fd);
-               if (likely(!ret)) {
-                       refcount_inc(&req->drv_ctx->refcnt);
+               if (likely(!ret))
                        return 0;
-               }
 
+               refcount_dec(&req->drv_ctx->refcnt);
                if (ret != -EBUSY)
                        break;
                num_retries++;