References: CVE-2012-4537 XSA-22 bnc#786517 # HG changeset patch # User Ian Jackson # Date 1352892962 0 # Node ID 6b6a4007a6091610a29b71cc32908c74113b852b # Parent bf58b94b3cef4db8d9ad9c8686bf10910ccc0644 x86/physmap: Prevent incorrect updates of m2p mappings In certain conditions, such as low memory, set_p2m_entry() can fail. Currently, the p2m and m2p tables will get out of sync because we still update the m2p table after the p2m update has failed. If that happens, subsequent guest-invoked memory operations can cause BUG()s and ASSERT()s to kill Xen. This is fixed by only updating the m2p table iff the p2m was successfully updated. This is a security problem, XSA-22 / CVE-2012-4537. Signed-off-by: Andrew Cooper Acked-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Jackson --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -654,7 +654,10 @@ guest_physmap_add_entry(struct domain *d if ( mfn_valid(_mfn(mfn)) ) { if ( !set_p2m_entry(p2m, gfn, _mfn(mfn), page_order, t, p2m->default_access) ) + { rc = -EINVAL; + goto out; /* Failed to update p2m, bail without updating m2p. */ + } if ( !p2m_is_grant(t) ) { for ( i = 0; i < (1UL << page_order); i++ ) @@ -677,6 +680,7 @@ guest_physmap_add_entry(struct domain *d } } +out: p2m_unlock(p2m); return rc;