summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorHui Tang <tanghui20@huawei.com>2021-03-19 13:45:27 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2021-03-26 12:15:57 +0300
commit670fefb9240950fe9e3e4740039a7e13e5910470 (patch)
treee12e3d97a426edc90b657d443ea19a4cc0072625 /drivers
parenta9214b0b6ed245b0c5239e0576b7de509815c2a0 (diff)
downloadlinux-670fefb9240950fe9e3e4740039a7e13e5910470.tar.xz
crypto: hisilicon/hpre - fix "hpre_ctx_init" resource leak
When calling "hpre_ctx_set" fails, stop and put qp, otherwise will leak qp resource. Signed-off-by: Hui Tang <tanghui20@huawei.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/crypto/hisilicon/hpre/hpre_crypto.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/crypto/hisilicon/hpre/hpre_crypto.c b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
index c90d0b82c3fa..d743c540d602 100644
--- a/drivers/crypto/hisilicon/hpre/hpre_crypto.c
+++ b/drivers/crypto/hisilicon/hpre/hpre_crypto.c
@@ -454,9 +454,16 @@ static void hpre_alg_cb(struct hisi_qp *qp, void *resp)
req->cb(ctx, resp);
}
+static void hpre_stop_qp_and_put(struct hisi_qp *qp)
+{
+ hisi_qm_stop_qp(qp);
+ hisi_qm_free_qps(&qp, 1);
+}
+
static int hpre_ctx_init(struct hpre_ctx *ctx, u8 type)
{
struct hisi_qp *qp;
+ int ret;
qp = hpre_get_qp_and_start(type);
if (IS_ERR(qp))
@@ -465,7 +472,11 @@ static int hpre_ctx_init(struct hpre_ctx *ctx, u8 type)
qp->qp_ctx = ctx;
qp->req_cb = hpre_alg_cb;
- return hpre_ctx_set(ctx, qp, QM_Q_DEPTH);
+ ret = hpre_ctx_set(ctx, qp, QM_Q_DEPTH);
+ if (ret)
+ hpre_stop_qp_and_put(qp);
+
+ return ret;
}
static int hpre_msg_request_set(struct hpre_ctx *ctx, void *req, bool is_rsa)