diff options
author | James Smart <jsmart2021@gmail.com> | 2017-08-14 14:20:32 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2017-08-16 04:06:18 -0400 |
commit | 16a5a480f067f945fd27bf91ffdce3f959b0d4b6 (patch) | |
tree | d04bb93e2ec23fa0fa679794e954943920396b5d | |
parent | 42819eb7a0957cc340ad4ed8bba736bab5ebc464 (diff) |
nvmet-fc: correct use after free on list teardown
Use list_for_each_entry_safe to prevent list handling from referencing
next pointers directly after list_del's
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | drivers/nvme/target/fc.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c index 1b7f2520a20d..b200f9aadd52 100644 --- a/drivers/nvme/target/fc.c +++ b/drivers/nvme/target/fc.c | |||
@@ -704,7 +704,7 @@ nvmet_fc_delete_target_queue(struct nvmet_fc_tgt_queue *queue) | |||
704 | { | 704 | { |
705 | struct nvmet_fc_tgtport *tgtport = queue->assoc->tgtport; | 705 | struct nvmet_fc_tgtport *tgtport = queue->assoc->tgtport; |
706 | struct nvmet_fc_fcp_iod *fod = queue->fod; | 706 | struct nvmet_fc_fcp_iod *fod = queue->fod; |
707 | struct nvmet_fc_defer_fcp_req *deferfcp; | 707 | struct nvmet_fc_defer_fcp_req *deferfcp, *tempptr; |
708 | unsigned long flags; | 708 | unsigned long flags; |
709 | int i, writedataactive; | 709 | int i, writedataactive; |
710 | bool disconnect; | 710 | bool disconnect; |
@@ -735,7 +735,8 @@ nvmet_fc_delete_target_queue(struct nvmet_fc_tgt_queue *queue) | |||
735 | } | 735 | } |
736 | 736 | ||
737 | /* Cleanup defer'ed IOs in queue */ | 737 | /* Cleanup defer'ed IOs in queue */ |
738 | list_for_each_entry(deferfcp, &queue->avail_defer_list, req_list) { | 738 | list_for_each_entry_safe(deferfcp, tempptr, &queue->avail_defer_list, |
739 | req_list) { | ||
739 | list_del(&deferfcp->req_list); | 740 | list_del(&deferfcp->req_list); |
740 | kfree(deferfcp); | 741 | kfree(deferfcp); |
741 | } | 742 | } |