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 | |
| 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>
| -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) |
