diff options
Diffstat (limited to 'app-emulation/xen-tools/files/xen-tools-4.2-xen_disk_leak.patch')
-rw-r--r-- | app-emulation/xen-tools/files/xen-tools-4.2-xen_disk_leak.patch | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app-emulation/xen-tools/files/xen-tools-4.2-xen_disk_leak.patch b/app-emulation/xen-tools/files/xen-tools-4.2-xen_disk_leak.patch new file mode 100644 index 000000000000..481eb65c4302 --- /dev/null +++ b/app-emulation/xen-tools/files/xen-tools-4.2-xen_disk_leak.patch @@ -0,0 +1,74 @@ +From: Roger Pau Monne +Subject: [Qemu-devel] [PATCH RFC 2/3] xen_disk: fix memory leak +Date: Mon, 31 Dec 2012 13:16:13 +0100 + +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 <address@hidden> +Signed-off-by: Roger Pau Monné <address@hidden> +Cc: address@hidden +Cc: Stefano Stabellini <address@hidden> +Cc: Anthony PERARD <address@hidden> +--- + hw/xen_disk.c | 28 ++++++++++++++++++++++++++-- + 1 files changed, 26 insertions(+), 2 deletions(-) + +diff --git a/hw/xen_disk.c b/hw/xen_disk.c +index a159ee5..1eb485a 100644 +--- a/tools/qemu-xen/hw/xen_disk.c ++++ b/tools/qemu-xen/hw/xen_disk.c +@@ -113,6 +113,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) + { + struct ioreq *ioreq = NULL; +@@ -130,7 +155,6 @@ static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) + /* get one from freelist */ + ioreq = QLIST_FIRST(&blkdev->freelist); + QLIST_REMOVE(ioreq, list); +- qemu_iovec_reset(&ioreq->v); + } + QLIST_INSERT_HEAD(&blkdev->inflight, ioreq, list); + blkdev->requests_inflight++; +@@ -154,7 +178,7 @@ static void ioreq_release(struct ioreq *ioreq, bool finish) + struct XenBlkDev *blkdev = ioreq->blkdev; + + QLIST_REMOVE(ioreq, list); +- memset(ioreq, 0, sizeof(*ioreq)); ++ ioreq_reset(ioreq); + ioreq->blkdev = blkdev; + QLIST_INSERT_HEAD(&blkdev->freelist, ioreq, list); + if (finish) { +-- +1.7.7.5 (Apple Git-26) + |