summary refs log tree commit diff stats
path: root/hw/scsi/vhost-user-scsi.c
diff options
context:
space:
mode:
authorJian Wang <wangjian161@huawei.com>2018-12-22 18:27:28 +0800
committerMichael S. Tsirkin <mst@redhat.com>2019-01-14 19:31:04 -0500
commita5390d936714482ac5996e1635a6ffd9c3c133df (patch)
tree7787614c302406064a9c79e20095bdaaf51e1ff3 /hw/scsi/vhost-user-scsi.c
parent5a0e75f0a9ad063ebaa7eb19b82104f00acb80a0 (diff)
downloadfocaccia-qemu-a5390d936714482ac5996e1635a6ffd9c3c133df.tar.gz
focaccia-qemu-a5390d936714482ac5996e1635a6ffd9c3c133df.zip
qemu: avoid memory leak while remove disk
Memset vhost_dev to zero in the vhost_dev_cleanup function.
This causes dev.vqs to be NULL, so that
vqs does not free up space when calling the g_free function.
This will result in a memory leak. But you can't release vqs
directly in the vhost_dev_cleanup function, because vhost_net
will also call this function, and vhost_net's vqs is assigned by array.
In order to solve this problem, we first save the pointer of vqs,
and release the space of vqs after vhost_dev_cleanup is called.

Signed-off-by: Jian Wang <wangjian161@huawei.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/scsi/vhost-user-scsi.c')
-rw-r--r--hw/scsi/vhost-user-scsi.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/hw/scsi/vhost-user-scsi.c b/hw/scsi/vhost-user-scsi.c
index 2e1ba4a87b..6728878a52 100644
--- a/hw/scsi/vhost-user-scsi.c
+++ b/hw/scsi/vhost-user-scsi.c
@@ -121,12 +121,13 @@ static void vhost_user_scsi_unrealize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VHostUserSCSI *s = VHOST_USER_SCSI(dev);
     VHostSCSICommon *vsc = VHOST_SCSI_COMMON(s);
+    struct vhost_virtqueue *vqs = vsc->dev.vqs;
 
     /* This will stop the vhost backend. */
     vhost_user_scsi_set_status(vdev, 0);
 
     vhost_dev_cleanup(&vsc->dev);
-    g_free(vsc->dev.vqs);
+    g_free(vqs);
 
     virtio_scsi_common_unrealize(dev, errp);