summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.patch74
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)
+