Commit 4e044035 authored by Chenghai Huang's avatar Chenghai Huang Committed by 白凤
Browse files

crypto: hisilicon/debugfs - Fix debugfs uninit process issue

maillist inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9GMIW
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev.git/commit/?id=8be091338971



----------------------------------------------------------------------

During the zip probe process, the debugfs failure does not stop
the probe. When debugfs initialization fails, jumping to the
error branch will also release regs, in addition to its own
rollback operation.

As a result, it may be released repeatedly during the regs
uninit process. Therefore, the null check needs to be added to
the regs uninit process.

Fixes: 3f2aebe9 ("crypto: hisilicon/debugfs - Fix debugfs uninit process issue")
Signed-off-by: default avatarChenghai Huang <huangchenghai2@huawei.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarJangShui Yang <yangjiangshui@h-partners.com>
Signed-off-by: default avatarXiaoFeng Ma <maxiaofeng14@h-partners.com>
parent 009ad833
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -809,8 +809,14 @@ static void dfx_regs_uninit(struct hisi_qm *qm,
{
	int i;

	if (!dregs)
		return;

	/* Setting the pointer is NULL to prevent double free */
	for (i = 0; i < reg_len; i++) {
		if (!dregs[i].regs)
			continue;

		kfree(dregs[i].regs);
		dregs[i].regs = NULL;
	}
@@ -860,14 +866,21 @@ static struct dfx_diff_registers *dfx_regs_init(struct hisi_qm *qm,
static int qm_diff_regs_init(struct hisi_qm *qm,
		struct dfx_diff_registers *dregs, u32 reg_len)
{
	int ret;

	qm->debug.qm_diff_regs = dfx_regs_init(qm, qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
	if (IS_ERR(qm->debug.qm_diff_regs))
		return PTR_ERR(qm->debug.qm_diff_regs);
	if (IS_ERR(qm->debug.qm_diff_regs)) {
		ret = PTR_ERR(qm->debug.qm_diff_regs);
		qm->debug.qm_diff_regs = NULL;
		return ret;
	}

	qm->debug.acc_diff_regs = dfx_regs_init(qm, dregs, reg_len);
	if (IS_ERR(qm->debug.acc_diff_regs)) {
		dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
		return PTR_ERR(qm->debug.acc_diff_regs);
		ret = PTR_ERR(qm->debug.acc_diff_regs);
		qm->debug.acc_diff_regs = NULL;
		return ret;
	}

	return 0;
@@ -908,7 +921,9 @@ static int qm_last_regs_init(struct hisi_qm *qm)
static void qm_diff_regs_uninit(struct hisi_qm *qm, u32 reg_len)
{
	dfx_regs_uninit(qm, qm->debug.acc_diff_regs, reg_len);
	qm->debug.acc_diff_regs = NULL;
	dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
	qm->debug.qm_diff_regs = NULL;
}

/**