mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
xen/blkback: fix memory leaks
In read_per_ring_refs(), after 'req' and related memory regions are allocated, xen_blkif_map() is invoked to map the shared frame, irq, and etc. However, if this mapping process fails, no cleanup is performed, leading to memory leaks. To fix this issue, invoke the cleanup before returning the error. Acked-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e26cc08265
commit
ae78ca3cf3
@ -965,6 +965,7 @@ static int read_per_ring_refs(struct xen_blkif_ring *ring, const char *dir)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = -ENOMEM;
|
||||||
for (i = 0; i < nr_grefs * XEN_BLKIF_REQS_PER_PAGE; i++) {
|
for (i = 0; i < nr_grefs * XEN_BLKIF_REQS_PER_PAGE; i++) {
|
||||||
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
||||||
if (!req)
|
if (!req)
|
||||||
@ -987,7 +988,7 @@ static int read_per_ring_refs(struct xen_blkif_ring *ring, const char *dir)
|
|||||||
err = xen_blkif_map(ring, ring_ref, nr_grefs, evtchn);
|
err = xen_blkif_map(ring, ring_ref, nr_grefs, evtchn);
|
||||||
if (err) {
|
if (err) {
|
||||||
xenbus_dev_fatal(dev, err, "mapping ring-ref port %u", evtchn);
|
xenbus_dev_fatal(dev, err, "mapping ring-ref port %u", evtchn);
|
||||||
return err;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1007,8 +1008,7 @@ fail:
|
|||||||
}
|
}
|
||||||
kfree(req);
|
kfree(req);
|
||||||
}
|
}
|
||||||
return -ENOMEM;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int connect_ring(struct backend_info *be)
|
static int connect_ring(struct backend_info *be)
|
||||||
|
Loading…
Reference in New Issue
Block a user