diff options
author | Chad Dupuis <cdupuis@marvell.com> | 2019-03-26 03:38:46 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2019-03-27 21:54:52 -0400 |
commit | 627cc7dd73f6aa3025398507c729b97fb19c270b (patch) | |
tree | 14ce2ee34ec79f0ff00b3702c7f3a0f7b3535d11 /drivers/scsi/qedf | |
parent | 78a8ab3cc0f95a66c8fb2429030289103de173e7 (diff) |
scsi: qedf: Add additional checks for io_req->sc_cmd validity
- Check the validity of various pointers before processing.
Signed-off-by: Chad Dupuis <cdupuis@marvell.com>
Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/qedf')
-rw-r--r-- | drivers/scsi/qedf/qedf_io.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/drivers/scsi/qedf/qedf_io.c b/drivers/scsi/qedf/qedf_io.c index ab6705660e67..8d09cf3fe49b 100644 --- a/drivers/scsi/qedf/qedf_io.c +++ b/drivers/scsi/qedf/qedf_io.c | |||
@@ -1324,7 +1324,7 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req, | |||
1324 | 1324 | ||
1325 | if (!virt_addr_valid(sc_cmd)) { | 1325 | if (!virt_addr_valid(sc_cmd)) { |
1326 | QEDF_ERR(&qedf->dbg_ctx, "sc_cmd=%p is not valid.", sc_cmd); | 1326 | QEDF_ERR(&qedf->dbg_ctx, "sc_cmd=%p is not valid.", sc_cmd); |
1327 | return; | 1327 | goto bad_scsi_ptr; |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | if (!sc_cmd->SCp.ptr) { | 1330 | if (!sc_cmd->SCp.ptr) { |
@@ -1336,7 +1336,34 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req, | |||
1336 | if (!sc_cmd->device) { | 1336 | if (!sc_cmd->device) { |
1337 | QEDF_ERR(&qedf->dbg_ctx, "Device for sc_cmd %p is NULL.\n", | 1337 | QEDF_ERR(&qedf->dbg_ctx, "Device for sc_cmd %p is NULL.\n", |
1338 | sc_cmd); | 1338 | sc_cmd); |
1339 | return; | 1339 | goto bad_scsi_ptr; |
1340 | } | ||
1341 | |||
1342 | if (!virt_addr_valid(sc_cmd->device)) { | ||
1343 | QEDF_ERR(&qedf->dbg_ctx, | ||
1344 | "Device pointer for sc_cmd %p is bad.\n", sc_cmd); | ||
1345 | goto bad_scsi_ptr; | ||
1346 | } | ||
1347 | |||
1348 | if (!sc_cmd->sense_buffer) { | ||
1349 | QEDF_ERR(&qedf->dbg_ctx, | ||
1350 | "sc_cmd->sense_buffer for sc_cmd %p is NULL.\n", | ||
1351 | sc_cmd); | ||
1352 | goto bad_scsi_ptr; | ||
1353 | } | ||
1354 | |||
1355 | if (!virt_addr_valid(sc_cmd->sense_buffer)) { | ||
1356 | QEDF_ERR(&qedf->dbg_ctx, | ||
1357 | "sc_cmd->sense_buffer for sc_cmd %p is bad.\n", | ||
1358 | sc_cmd); | ||
1359 | goto bad_scsi_ptr; | ||
1360 | } | ||
1361 | |||
1362 | if (!sc_cmd->scsi_done) { | ||
1363 | QEDF_ERR(&qedf->dbg_ctx, | ||
1364 | "sc_cmd->scsi_done for sc_cmd %p is NULL.\n", | ||
1365 | sc_cmd); | ||
1366 | goto bad_scsi_ptr; | ||
1340 | } | 1367 | } |
1341 | 1368 | ||
1342 | qedf_unmap_sg_list(qedf, io_req); | 1369 | qedf_unmap_sg_list(qedf, io_req); |
@@ -1365,6 +1392,14 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req, | |||
1365 | sc_cmd->SCp.ptr = NULL; | 1392 | sc_cmd->SCp.ptr = NULL; |
1366 | sc_cmd->scsi_done(sc_cmd); | 1393 | sc_cmd->scsi_done(sc_cmd); |
1367 | kref_put(&io_req->refcount, qedf_release_cmd); | 1394 | kref_put(&io_req->refcount, qedf_release_cmd); |
1395 | |||
1396 | bad_scsi_ptr: | ||
1397 | /* | ||
1398 | * Clear the io_req->sc_cmd backpointer so we don't try to process | ||
1399 | * this again | ||
1400 | */ | ||
1401 | io_req->sc_cmd = NULL; | ||
1402 | kref_put(&io_req->refcount, qedf_release_cmd); /* ID: 001 */ | ||
1368 | } | 1403 | } |
1369 | 1404 | ||
1370 | /* | 1405 | /* |