|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.3] IOMMU: clear "don't flush" override on error paths
commit 8940a13d6de1295cfdc4a189e0a5610849a9ef59
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Tue Dec 10 16:20:38 2013 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Dec 10 16:20:38 2013 +0100
IOMMU: clear "don't flush" override on error paths
Both xenmem_add_to_physmap() and iommu_populate_page_table() each have
an error path that fails to clear that flag, thus suppressing further
flushes on the respective pCPU.
In iommu_populate_page_table() also slightly re-arrange code to avoid
the false impression of the flag in question being guarded by a
domain's page_alloc_lock.
This is CVE-2013-6400 / XSA-80.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
master commit: 552b7fcb9a70f1d4dd0e0cd5fb4d3d9da410104a
master date: 2013-12-10 16:10:37 +0100
---
xen/arch/x86/mm.c | 2 +-
xen/drivers/passthrough/iommu.c | 24 +++++++++++++-----------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 91d2c2b..1103cbe 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4651,7 +4651,7 @@ static int xenmem_add_to_physmap(struct domain *d,
{
rc = xenmem_add_to_physmap_once(d, xatp);
if ( rc < 0 )
- return rc;
+ break;
xatp->idx++;
xatp->gpfn++;
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index 93ad122..bf8b6ba 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -306,11 +306,11 @@ static int iommu_populate_page_table(struct domain *d)
{
struct hvm_iommu *hd = domain_hvm_iommu(d);
struct page_info *page;
- int rc;
+ int rc = 0;
+ this_cpu(iommu_dont_flush_iotlb) = 1;
spin_lock(&d->page_alloc_lock);
- this_cpu(iommu_dont_flush_iotlb) = 1;
page_list_for_each ( page, &d->page_list )
{
if ( is_hvm_domain(d) ||
@@ -320,18 +320,20 @@ static int iommu_populate_page_table(struct domain *d)
rc = hd->platform_ops->map_page(
d, mfn_to_gmfn(d, page_to_mfn(page)), page_to_mfn(page),
IOMMUF_readable|IOMMUF_writable);
- if (rc)
- {
- spin_unlock(&d->page_alloc_lock);
- hd->platform_ops->teardown(d);
- return rc;
- }
+ if ( rc )
+ break;
}
}
- this_cpu(iommu_dont_flush_iotlb) = 0;
- iommu_iotlb_flush_all(d);
+
spin_unlock(&d->page_alloc_lock);
- return 0;
+ this_cpu(iommu_dont_flush_iotlb) = 0;
+
+ if ( !rc )
+ iommu_iotlb_flush_all(d);
+ else
+ hd->platform_ops->teardown(d);
+
+ return rc;
}
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.3
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |