mirror of https://github.com/xemu-project/xemu.git
vhost: fix resource leak in error handling
vhost_verify_ring_mappings leaks mappings on error.
Fix this up.
Cc: qemu-stable@nongnu.org
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
(cherry picked from commit 8617343faa
)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
36afdba00a
commit
79bd7781dd
|
@ -309,7 +309,9 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
|
||||||
uint64_t size)
|
uint64_t size)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < dev->nvqs; ++i) {
|
int r = 0;
|
||||||
|
|
||||||
|
for (i = 0; !r && i < dev->nvqs; ++i) {
|
||||||
struct vhost_virtqueue *vq = dev->vqs + i;
|
struct vhost_virtqueue *vq = dev->vqs + i;
|
||||||
hwaddr l;
|
hwaddr l;
|
||||||
void *p;
|
void *p;
|
||||||
|
@ -321,15 +323,15 @@ static int vhost_verify_ring_mappings(struct vhost_dev *dev,
|
||||||
p = cpu_physical_memory_map(vq->ring_phys, &l, 1);
|
p = cpu_physical_memory_map(vq->ring_phys, &l, 1);
|
||||||
if (!p || l != vq->ring_size) {
|
if (!p || l != vq->ring_size) {
|
||||||
fprintf(stderr, "Unable to map ring buffer for ring %d\n", i);
|
fprintf(stderr, "Unable to map ring buffer for ring %d\n", i);
|
||||||
return -ENOMEM;
|
r = -ENOMEM;
|
||||||
}
|
}
|
||||||
if (p != vq->ring) {
|
if (p != vq->ring) {
|
||||||
fprintf(stderr, "Ring buffer relocated for ring %d\n", i);
|
fprintf(stderr, "Ring buffer relocated for ring %d\n", i);
|
||||||
return -EBUSY;
|
r = -EBUSY;
|
||||||
}
|
}
|
||||||
cpu_physical_memory_unmap(p, l, 0, 0);
|
cpu_physical_memory_unmap(p, l, 0, 0);
|
||||||
}
|
}
|
||||||
return 0;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct vhost_memory_region *vhost_dev_find_reg(struct vhost_dev *dev,
|
static struct vhost_memory_region *vhost_dev_find_reg(struct vhost_dev *dev,
|
||||||
|
|
Loading…
Reference in New Issue