Skip to content

Commit 52e02d6

Browse files
steffen-maiergregkh
authored andcommitted
scsi: zfcp: fix use-after-free by not tracing WKA port open/close on failed send
commit 2dfa6688aafdc3f74efeb1cf05fb871465d67f79 upstream. Dan Carpenter kindly reported: <quote> The patch d27a7cb91960: "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 <dan.carpenter@oracle.com> Suggested-by: Benjamin Block <bblock@linux.vnet.ibm.com> Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com> Fixes: d27a7cb91960 ("zfcp: trace on request for open and close of WKA port") Reviewed-by: Benjamin Block <bblock@linux.vnet.ibm.com> Reviewed-by: Jens Remus <jremus@linux.vnet.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f2d256a commit 52e02d6

1 file changed

Lines changed: 4 additions & 4 deletions

File tree

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)