[Xen-devel] [PATCH 22/32] hw/ide: fix memory leak from qemu_allocate_irqs()

2015-04-22 Thread Andrew Cooper
From: Kaifeng Zhu kaifeng@citrix.com

qemu_allocate_irqs would return an array of irqs, not store the allocated
array pointer, and subsequently leak it.

Signed-off-by: Kaifeng Zhu kaifeng@citrix.com
(defects not identified by Coverity Scan)
Reviewed-by: Andrew Cooper andrew.coop...@citrix.com
---
 hw/ide.c |2 +-
 hw/irq.c |   18 +-
 hw/irq.h |4 
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/hw/ide.c b/hw/ide.c
index 83e3c70..f372b7b 100644
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -4769,7 +4769,7 @@ struct pcmcia_card_s *dscm1_init(BlockDriverState 
*bdrv)
 md-card.cis = dscm1_cis;
 md-card.cis_len = sizeof(dscm1_cis);
 
-ide_init2(md-ide, bdrv, 0, qemu_allocate_irqs(md_set_irq, md, 1)[0]);
+ide_init2(md-ide, bdrv, 0, qemu_allocate_irq(md_set_irq, md));
 md-ide-is_cf = 1;
 md-ide-mdata_size = METADATA_SIZE;
 md-ide-mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
diff --git a/hw/irq.c b/hw/irq.c
index 7703f62..c7c4864 100644
--- a/hw/irq.c
+++ b/hw/irq.c
@@ -38,6 +38,22 @@ void qemu_set_irq(qemu_irq irq, int level)
 irq-handler(irq-opaque, irq-n, level);
 }
 
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque)
+{
+struct IRQState *irq;
+
+irq = (struct IRQState *)qemu_mallocz(sizeof(struct IRQState));
+irq-handler = handler;
+irq-opaque = opaque;
+irq-n = 0;
+return irq;
+}
+
+void qemu_free_irq(qemu_irq irq)
+{
+qemu_free(irq);
+}
+
 qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n)
 {
 qemu_irq *s;
@@ -73,5 +89,5 @@ qemu_irq qemu_irq_invert(qemu_irq irq)
 {
 /* The default state for IRQs is low, so raise the output now.  */
 qemu_irq_raise(irq);
-return qemu_allocate_irqs(qemu_notirq, irq, 1)[0];
+return qemu_allocate_irq(qemu_notirq, irq);
 }
diff --git a/hw/irq.h b/hw/irq.h
index 5daae44..da34ae3 100644
--- a/hw/irq.h
+++ b/hw/irq.h
@@ -25,6 +25,10 @@ static inline void qemu_irq_pulse(qemu_irq irq)
 qemu_set_irq(irq, 0);
 }
 
+/* Returns one IRQ.  */
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque);
+void qemu_free_irq(qemu_irq irq);
+
 /* Returns an array of N IRQs.  */
 qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
 void qemu_free_irqs(qemu_irq *s);
-- 
1.7.10.4


___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel


[Xen-devel] [PATCH 22/32] hw/ide: fix memory leak from qemu_allocate_irqs()

2015-04-22 Thread Andrew Cooper
From: Kaifeng Zhu kaifeng@citrix.com

qemu_allocate_irqs would return an array of irqs, not store the allocated
array pointer, and subsequently leak it.

Signed-off-by: Kaifeng Zhu kaifeng@citrix.com
(defects not identified by Coverity Scan)
Reviewed-by: Andrew Cooper andrew.coop...@citrix.com
---
 hw/ide.c |2 +-
 hw/irq.c |   18 +-
 hw/irq.h |4 
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/hw/ide.c b/hw/ide.c
index 83e3c70..f372b7b 100644
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -4769,7 +4769,7 @@ struct pcmcia_card_s *dscm1_init(BlockDriverState 
*bdrv)
 md-card.cis = dscm1_cis;
 md-card.cis_len = sizeof(dscm1_cis);
 
-ide_init2(md-ide, bdrv, 0, qemu_allocate_irqs(md_set_irq, md, 1)[0]);
+ide_init2(md-ide, bdrv, 0, qemu_allocate_irq(md_set_irq, md));
 md-ide-is_cf = 1;
 md-ide-mdata_size = METADATA_SIZE;
 md-ide-mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
diff --git a/hw/irq.c b/hw/irq.c
index 7703f62..c7c4864 100644
--- a/hw/irq.c
+++ b/hw/irq.c
@@ -38,6 +38,22 @@ void qemu_set_irq(qemu_irq irq, int level)
 irq-handler(irq-opaque, irq-n, level);
 }
 
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque)
+{
+struct IRQState *irq;
+
+irq = (struct IRQState *)qemu_mallocz(sizeof(struct IRQState));
+irq-handler = handler;
+irq-opaque = opaque;
+irq-n = 0;
+return irq;
+}
+
+void qemu_free_irq(qemu_irq irq)
+{
+qemu_free(irq);
+}
+
 qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n)
 {
 qemu_irq *s;
@@ -73,5 +89,5 @@ qemu_irq qemu_irq_invert(qemu_irq irq)
 {
 /* The default state for IRQs is low, so raise the output now.  */
 qemu_irq_raise(irq);
-return qemu_allocate_irqs(qemu_notirq, irq, 1)[0];
+return qemu_allocate_irq(qemu_notirq, irq);
 }
diff --git a/hw/irq.h b/hw/irq.h
index 5daae44..da34ae3 100644
--- a/hw/irq.h
+++ b/hw/irq.h
@@ -25,6 +25,10 @@ static inline void qemu_irq_pulse(qemu_irq irq)
 qemu_set_irq(irq, 0);
 }
 
+/* Returns one IRQ.  */
+qemu_irq qemu_allocate_irq(qemu_irq_handler handler, void *opaque);
+void qemu_free_irq(qemu_irq irq);
+
 /* Returns an array of N IRQs.  */
 qemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n);
 void qemu_free_irqs(qemu_irq *s);
-- 
1.7.10.4


___
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel