crypto: hisilicon/debugfs - Fix debugfs uninit process issue
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. Signed-off-by: Chenghai Huang <huangchenghai2@huawei.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
5307147b5e
commit
8be0913389
@ -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 @@ alloc_error:
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user