]> xenbits.xensource.com Git - xen.git/commitdiff
gnttab: set page refcount for copy-on-grant-transfer
authorJan Beulich <jbeulich@suse.com>
Tue, 5 Mar 2019 14:51:44 +0000 (15:51 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 5 Mar 2019 14:51:44 +0000 (15:51 +0100)
Commit 5cc77f9098 ("32-on-64: Fix domain address-size clamping,
implement"), which introduced this functionality, took care of clearing
the old page's PGC_allocated, but failed to set the bit (and install the
associated reference) on the newly allocated one. Furthermore the "mfn"
local variable was never updated, and hence the wrong MFN was passed to
guest_physmap_add_page() (and back to the destination domain) in this
case, leading to an IOMMU mapping into an unowned page.

Ideally the code would use assign_pages(), but the call to
gnttab_prepare_for_transfer() sits in the middle of the actions
mirroring that function.

This is XSA-284.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: George Dunlap <george.dunlap@citrix.com>
master commit: 6d4f36c3fecc0a6a0991716199612c81d909316e
master date: 2019-03-05 13:45:58 +0100

xen/common/grant_table.c

index 52ab6ac11175e0bd788d82aa7ddb3f8b95f8b7b9..ad44b963039280279121608f0abfb66e84d5427c 100644 (file)
@@ -2011,6 +2011,8 @@ gnttab_transfer(
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
             page = new_page;
+            page->count_info = PGC_allocated | 1;
+            mfn = page_to_mfn(page);
         }
 
         spin_lock(&e->page_alloc_lock);