summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qedf
diff options
context:
space:
mode:
authorChad Dupuis <cdupuis@marvell.com>2019-03-26 03:38:46 -0400
committerMartin K. Petersen <martin.petersen@oracle.com>2019-03-27 21:54:52 -0400
commit627cc7dd73f6aa3025398507c729b97fb19c270b (patch)
tree14ce2ee34ec79f0ff00b3702c7f3a0f7b3535d11 /drivers/scsi/qedf
parent78a8ab3cc0f95a66c8fb2429030289103de173e7 (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.c39
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
1396bad_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/*