Fix blatant issue where we leave a freed assigned device node on
the list if irq assignment fails.

Signed-off-by: Mark McLoughlin <[EMAIL PROTECTED]>
---
 qemu/hw/device-assignment.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c
index b39617a..fde17ac 100644
--- a/qemu/hw/device-assignment.c
+++ b/qemu/hw/device-assignment.c
@@ -449,12 +449,14 @@ static uint32_t calc_assigned_dev_id(uint8_t bus, uint8_t 
devfn)
  */
 void assigned_dev_update_irq(PCIDevice *d)
 {
-    int irq, r;
-    AssignedDevice *assigned_dev;
     AssignedDevInfo *adev;
 
-    LIST_FOREACH(adev, &adev_head, next) {
-        assigned_dev = adev->assigned_dev;
+    adev = LIST_FIRST(&adev_head);
+    while (adev) {
+        AssignedDevInfo *next = LIST_NEXT(adev, next);
+        AssignedDevice *assigned_dev = adev->assigned_dev;
+        int irq, r;
+
         irq = pci_map_irq(&assigned_dev->dev, assigned_dev->intpin);
         irq = piix_get_irq(irq);
 
@@ -477,12 +479,15 @@ void assigned_dev_update_irq(PCIDevice *d)
                         adev->name, strerror(-r));
                 fprintf(stderr, "Perhaps you re you assigning a device "
                         "that shares IRQ with another device?\n");
+                LIST_REMOVE(adev, next);
                 pci_unregister_device(&assigned_dev->dev);
-                /* FIXME: Delete node from list */
+                adev = next;
                 continue;
             }
             assigned_dev->girq = irq;
         }
+
+        adev = next;
     }
 }
 
-- 
1.5.4.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to