]> xenbits.xensource.com Git - xen.git/commitdiff
arm: handle races between relinquish_memory and free_domheap_pages
authorIan Campbell <ian.campbell@citrix.com>
Thu, 29 Oct 2015 13:24:17 +0000 (14:24 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 29 Oct 2015 13:24:17 +0000 (14:24 +0100)
Primarily this means XENMEM_decrease_reservation from a toolstack
domain.

Unlike x86 we have no requirement right now to queue such pages onto
a separate list, if we hit this race then the other code has already
fully accepted responsibility for freeing this page and therefore
there is no more for relinquish_memory to do.

This is CVE-2015-7814 / XSA-147.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Reviewed-by: Julien Grall <julien.grall@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: 1ef01396fdff88b1c3331a09ca5c69619b90f4ea
master date: 2015-10-29 13:34:17 +0100

xen/arch/arm/domain.c

index 4c434a1b63e64187f164a3298eb978cd9bd8f41e..e806bc65518be634b3d1a91780b5cd5f0e2f6be8 100644 (file)
@@ -600,8 +600,15 @@ static int relinquish_memory(struct domain *d, struct page_list_head *list)
     {
         /* Grab a reference to the page so it won't disappear from under us. */
         if ( unlikely(!get_page(page, d)) )
-            /* Couldn't get a reference -- someone is freeing this page. */
-            BUG();
+            /*
+             * Couldn't get a reference -- someone is freeing this page and
+             * has already committed to doing so, so no more to do here.
+             *
+             * Note that the page must be left on the list, a list_del
+             * here will clash with the list_del done by the other
+             * party in the race and corrupt the list head.
+             */
+            continue;
 
         if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
             put_page(page);