diff options
author | Asias He <asias@redhat.com> | 2013-04-10 03:06:14 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-04-11 04:48:27 -0400 |
commit | 7ea206cf3b06704cf2bfc9c9c395094b24dc44a2 (patch) | |
tree | a270c2a06611ddd9d062ef01ed5df54fb911e752 /drivers/vhost | |
parent | f6da51c3ef07c593a410551af4cad093e2fbe755 (diff) |
tcm_vhost: Fix tv_cmd leak in vhost_scsi_handle_vq
If we fail to submit the allocated tv_vmd to tcm_vhost_submission_work,
we will leak the tv_vmd. Free tv_vmd on fail path.
Signed-off-by: Asias He <asias@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/vhost')
-rw-r--r-- | drivers/vhost/tcm_vhost.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/vhost/tcm_vhost.c b/drivers/vhost/tcm_vhost.c index 28c112f23830..210d59e222fc 100644 --- a/drivers/vhost/tcm_vhost.c +++ b/drivers/vhost/tcm_vhost.c | |||
@@ -724,7 +724,7 @@ static void vhost_scsi_handle_vq(struct vhost_scsi *vs, | |||
724 | " exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n", | 724 | " exceeds SCSI_MAX_VARLEN_CDB_SIZE: %d\n", |
725 | scsi_command_size(tv_cmd->tvc_cdb), | 725 | scsi_command_size(tv_cmd->tvc_cdb), |
726 | TCM_VHOST_MAX_CDB_SIZE); | 726 | TCM_VHOST_MAX_CDB_SIZE); |
727 | break; /* TODO */ | 727 | goto err; |
728 | } | 728 | } |
729 | tv_cmd->tvc_lun = ((v_req.lun[2] << 8) | v_req.lun[3]) & 0x3FFF; | 729 | tv_cmd->tvc_lun = ((v_req.lun[2] << 8) | v_req.lun[3]) & 0x3FFF; |
730 | 730 | ||
@@ -737,7 +737,7 @@ static void vhost_scsi_handle_vq(struct vhost_scsi *vs, | |||
737 | data_direction == DMA_TO_DEVICE); | 737 | data_direction == DMA_TO_DEVICE); |
738 | if (unlikely(ret)) { | 738 | if (unlikely(ret)) { |
739 | vq_err(vq, "Failed to map iov to sgl\n"); | 739 | vq_err(vq, "Failed to map iov to sgl\n"); |
740 | break; /* TODO */ | 740 | goto err; |
741 | } | 741 | } |
742 | } | 742 | } |
743 | 743 | ||
@@ -758,6 +758,11 @@ static void vhost_scsi_handle_vq(struct vhost_scsi *vs, | |||
758 | } | 758 | } |
759 | 759 | ||
760 | mutex_unlock(&vq->mutex); | 760 | mutex_unlock(&vq->mutex); |
761 | return; | ||
762 | |||
763 | err: | ||
764 | vhost_scsi_free_cmd(tv_cmd); | ||
765 | mutex_unlock(&vq->mutex); | ||
761 | } | 766 | } |
762 | 767 | ||
763 | static void vhost_scsi_ctl_handle_kick(struct vhost_work *work) | 768 | static void vhost_scsi_ctl_handle_kick(struct vhost_work *work) |