mirror of https://github.com/xqemu/xqemu.git
xen_disk: fix memory leak
On ioreq_release the full ioreq was memset to 0, loosing all the data and memory allocations inside the QEMUIOVector, which leads to a memory leak. Create a new function to specifically reset ioreq. Reported-by: Maik Wessler <maik.wessler@yahoo.com> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
parent
a507db9599
commit
282c6a2f29
|
@ -112,6 +112,31 @@ struct XenBlkDev {
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
/* ------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static void ioreq_reset(struct ioreq *ioreq)
|
||||||
|
{
|
||||||
|
memset(&ioreq->req, 0, sizeof(ioreq->req));
|
||||||
|
ioreq->status = 0;
|
||||||
|
ioreq->start = 0;
|
||||||
|
ioreq->presync = 0;
|
||||||
|
ioreq->postsync = 0;
|
||||||
|
ioreq->mapped = 0;
|
||||||
|
|
||||||
|
memset(ioreq->domids, 0, sizeof(ioreq->domids));
|
||||||
|
memset(ioreq->refs, 0, sizeof(ioreq->refs));
|
||||||
|
ioreq->prot = 0;
|
||||||
|
memset(ioreq->page, 0, sizeof(ioreq->page));
|
||||||
|
ioreq->pages = NULL;
|
||||||
|
|
||||||
|
ioreq->aio_inflight = 0;
|
||||||
|
ioreq->aio_errors = 0;
|
||||||
|
|
||||||
|
ioreq->blkdev = NULL;
|
||||||
|
memset(&ioreq->list, 0, sizeof(ioreq->list));
|
||||||
|
memset(&ioreq->acct, 0, sizeof(ioreq->acct));
|
||||||
|
|
||||||
|
qemu_iovec_reset(&ioreq->v);
|
||||||
|
}
|
||||||
|
|
||||||
static struct ioreq *ioreq_start(struct XenBlkDev *blkdev)
|
static struct ioreq *ioreq_start(struct XenBlkDev *blkdev)
|
||||||
{
|
{
|
||||||
struct ioreq *ioreq = NULL;
|
struct ioreq *ioreq = NULL;
|
||||||
|
@ -129,7 +154,6 @@ static struct ioreq *ioreq_start(struct XenBlkDev *blkdev)
|
||||||
/* get one from freelist */
|
/* get one from freelist */
|
||||||
ioreq = QLIST_FIRST(&blkdev->freelist);
|
ioreq = QLIST_FIRST(&blkdev->freelist);
|
||||||
QLIST_REMOVE(ioreq, list);
|
QLIST_REMOVE(ioreq, list);
|
||||||
qemu_iovec_reset(&ioreq->v);
|
|
||||||
}
|
}
|
||||||
QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list);
|
QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list);
|
||||||
blkdev->requests_inflight++;
|
blkdev->requests_inflight++;
|
||||||
|
@ -153,7 +177,7 @@ static void ioreq_release(struct ioreq *ioreq, bool finish)
|
||||||
struct XenBlkDev *blkdev = ioreq->blkdev;
|
struct XenBlkDev *blkdev = ioreq->blkdev;
|
||||||
|
|
||||||
QLIST_REMOVE(ioreq, list);
|
QLIST_REMOVE(ioreq, list);
|
||||||
memset(ioreq, 0, sizeof(*ioreq));
|
ioreq_reset(ioreq);
|
||||||
ioreq->blkdev = blkdev;
|
ioreq->blkdev = blkdev;
|
||||||
QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list);
|
QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list);
|
||||||
if (finish) {
|
if (finish) {
|
||||||
|
|
Loading…
Reference in New Issue