sbp-target: fix error path in sbp_make_tpg()

If the TPG memory is allocated successfully, but we fail further along
in the function, a dangling pointer to freed memory is left in the TPort
structure. This is mostly harmless, but does prevent re-trying the
operation without first removing the TPort altogether.

Reported-by: Chen Gang <gang.chen@asianux.com>
Signed-off-by: Chris Boot <bootc@bootc.net>
Cc: Andy Grover <agrover@redhat.com>
Cc: Nicholas A. Bellinger <nab@linux-iscsi.org>
Cc: stable@vger.kernel.org
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Chris Boot 2012-12-11 21:58:48 +00:00 committed by Nicholas Bellinger
parent 37419d674c
commit e1fe2060d7
1 changed files with 10 additions and 7 deletions

View File

@ -2208,20 +2208,23 @@ static struct se_portal_group *sbp_make_tpg(
tport->mgt_agt = sbp_management_agent_register(tport); tport->mgt_agt = sbp_management_agent_register(tport);
if (IS_ERR(tport->mgt_agt)) { if (IS_ERR(tport->mgt_agt)) {
ret = PTR_ERR(tport->mgt_agt); ret = PTR_ERR(tport->mgt_agt);
kfree(tpg); goto out_free_tpg;
return ERR_PTR(ret);
} }
ret = core_tpg_register(&sbp_fabric_configfs->tf_ops, wwn, ret = core_tpg_register(&sbp_fabric_configfs->tf_ops, wwn,
&tpg->se_tpg, (void *)tpg, &tpg->se_tpg, (void *)tpg,
TRANSPORT_TPG_TYPE_NORMAL); TRANSPORT_TPG_TYPE_NORMAL);
if (ret < 0) { if (ret < 0)
sbp_management_agent_unregister(tport->mgt_agt); goto out_unreg_mgt_agt;
kfree(tpg);
return ERR_PTR(ret);
}
return &tpg->se_tpg; return &tpg->se_tpg;
out_unreg_mgt_agt:
sbp_management_agent_unregister(tport->mgt_agt);
out_free_tpg:
tport->tpg = NULL;
kfree(tpg);
return ERR_PTR(ret);
} }
static void sbp_drop_tpg(struct se_portal_group *se_tpg) static void sbp_drop_tpg(struct se_portal_group *se_tpg)