Skip to content

Commit 2dfa668

Browse files
steffen-maiermartinkpetersen
authored andcommitted
scsi: zfcp: fix use-after-free by not tracing WKA port open/close on failed send
Dan Carpenter kindly reported: <quote> The patch d27a7cb: "zfcp: trace on request for open and close of WKA port" from Aug 10, 2016, leads to the following static checker warning: drivers/s390/scsi/zfcp_fsf.c:1615 zfcp_fsf_open_wka_port() warn: 'req' was already freed. drivers/s390/scsi/zfcp_fsf.c 1609 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); 1610 retval = zfcp_fsf_req_send(req); 1611 if (retval) 1612 zfcp_fsf_req_free(req); ^^^ Freed. 1613 out: 1614 spin_unlock_irq(&qdio->req_q_lock); 1615 if (req && !IS_ERR(req)) 1616 zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); ^^^^^^^^^^^ Use after free. 1617 return retval; 1618 } Same thing for zfcp_fsf_close_wka_port() as well. </quote> Rather than relying on req being NULL (or ERR_PTR) for all cases where we don't want to trace or should not trace, simply check retval which is unconditionally initialized with -EIO != 0 and it can only become 0 on successful retval = zfcp_fsf_req_send(req). With that we can also remove the then again unnecessary unconditional initialization of req which was introduced with that earlier commit. Reported-by: Dan Carpenter <[email protected]> Suggested-by: Benjamin Block <[email protected]> Signed-off-by: Steffen Maier <[email protected]> Fixes: d27a7cb ("zfcp: trace on request for open and close of WKA port") Cc: <[email protected]> #2.6.38+ Reviewed-by: Benjamin Block <[email protected]> Reviewed-by: Jens Remus <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 8af8e1c commit 2dfa668

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/s390/scsi/zfcp_fsf.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,7 +1583,7 @@ static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
15831583
int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
15841584
{
15851585
struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1586-
struct zfcp_fsf_req *req = NULL;
1586+
struct zfcp_fsf_req *req;
15871587
int retval = -EIO;
15881588

15891589
spin_lock_irq(&qdio->req_q_lock);
@@ -1612,7 +1612,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
16121612
zfcp_fsf_req_free(req);
16131613
out:
16141614
spin_unlock_irq(&qdio->req_q_lock);
1615-
if (req && !IS_ERR(req))
1615+
if (!retval)
16161616
zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id);
16171617
return retval;
16181618
}
@@ -1638,7 +1638,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
16381638
int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
16391639
{
16401640
struct zfcp_qdio *qdio = wka_port->adapter->qdio;
1641-
struct zfcp_fsf_req *req = NULL;
1641+
struct zfcp_fsf_req *req;
16421642
int retval = -EIO;
16431643

16441644
spin_lock_irq(&qdio->req_q_lock);
@@ -1667,7 +1667,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
16671667
zfcp_fsf_req_free(req);
16681668
out:
16691669
spin_unlock_irq(&qdio->req_q_lock);
1670-
if (req && !IS_ERR(req))
1670+
if (!retval)
16711671
zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id);
16721672
return retval;
16731673
}

0 commit comments

Comments
 (0)