[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] VT-d: fix iommu_domain_destroy



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1262595996 0
# Node ID bf43d35585fb283f33df02ec9bfd4887de24cf11
# Parent  b76fe58d07018a12f934aacb43a3e880323a2ede
VT-d: fix iommu_domain_destroy

Currently, g2m_ioport list and mapped_rmrrs always won't be released
in iommu_domain_destroy, because the function returns before those
code. It causes potential leak. This patch releases them, and thus
avoid the potential leak.

Signed-off-by: Weidong Han <Weidong.han@xxxxxxxxx>
---
 xen/drivers/passthrough/iommu.c |   39 +++++++++++++++------------------------
 1 files changed, 15 insertions(+), 24 deletions(-)

diff -r b76fe58d0701 -r bf43d35585fb xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c   Mon Jan 04 09:06:02 2010 +0000
+++ b/xen/drivers/passthrough/iommu.c   Mon Jan 04 09:06:36 2010 +0000
@@ -195,34 +195,25 @@ void iommu_domain_destroy(struct domain 
     if ( !iommu_enabled || !hd->platform_ops )
         return;
 
-    if ( !need_iommu(d)  )
-        return;
-
     if ( need_iommu(d) )
     {
         d->need_iommu = 0;
         hd->platform_ops->teardown(d);
-        return;
-    }
-
-    if ( hd )
-    {
-        list_for_each_safe ( ioport_list, tmp, &hd->g2m_ioport_list )
-        {
-            ioport = list_entry(ioport_list, struct g2m_ioport, list);
-            list_del(&ioport->list);
-            xfree(ioport);
-        }
-
-        list_for_each_safe ( rmrr_list, tmp, &hd->mapped_rmrrs )
-        {
-            mrmrr = list_entry(rmrr_list, struct mapped_rmrr, list);
-            list_del(&mrmrr->list);
-            xfree(mrmrr);
-        }
-    }
-
-    return hd->platform_ops->teardown(d);
+    }
+
+    list_for_each_safe ( ioport_list, tmp, &hd->g2m_ioport_list )
+    {
+        ioport = list_entry(ioport_list, struct g2m_ioport, list);
+        list_del(&ioport->list);
+        xfree(ioport);
+    }
+
+    list_for_each_safe ( rmrr_list, tmp, &hd->mapped_rmrrs )
+    {
+        mrmrr = list_entry(rmrr_list, struct mapped_rmrr, list);
+        list_del(&mrmrr->list);
+        xfree(mrmrr);
+    }
 }
 
 int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.