Commit 9948199e authored by Ming Lu's avatar Ming Lu Committed by Kleber Sacilotto de Souza

scsi: libfc: free skb when receiving invalid flogi resp

BugLink: https://bugs.launchpad.net/bugs/1822271

[ Upstream commit 5d8fc4a9 ]

The issue to be fixed in this commit is when libfc found it received a
invalid FLOGI response from FC switch, it would return without freeing the
fc frame, which is just the skb data. This would cause memory leak if FC
switch keeps sending invalid FLOGI responses.

This fix is just to make it execute `fc_frame_free(fp)` before returning
from function `fc_lport_flogi_resp`.
Signed-off-by: default avatarMing Lu <ming.lu@citrix.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarStefan Bader <stefan.bader@canonical.com>
Acked-by: default avatarJuerg Haefliger <juerg.haefliger@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent dbb3bee8
...@@ -1739,14 +1739,14 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1739,14 +1739,14 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
fc_frame_payload_op(fp) != ELS_LS_ACC) { fc_frame_payload_op(fp) != ELS_LS_ACC) {
FC_LPORT_DBG(lport, "FLOGI not accepted or bad response\n"); FC_LPORT_DBG(lport, "FLOGI not accepted or bad response\n");
fc_lport_error(lport, fp); fc_lport_error(lport, fp);
goto err; goto out;
} }
flp = fc_frame_payload_get(fp, sizeof(*flp)); flp = fc_frame_payload_get(fp, sizeof(*flp));
if (!flp) { if (!flp) {
FC_LPORT_DBG(lport, "FLOGI bad response\n"); FC_LPORT_DBG(lport, "FLOGI bad response\n");
fc_lport_error(lport, fp); fc_lport_error(lport, fp);
goto err; goto out;
} }
mfs = ntohs(flp->fl_csp.sp_bb_data) & mfs = ntohs(flp->fl_csp.sp_bb_data) &
...@@ -1756,7 +1756,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1756,7 +1756,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, " FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, "
"lport->mfs:%hu\n", mfs, lport->mfs); "lport->mfs:%hu\n", mfs, lport->mfs);
fc_lport_error(lport, fp); fc_lport_error(lport, fp);
goto err; goto out;
} }
if (mfs <= lport->mfs) { if (mfs <= lport->mfs) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment