aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2012-12-04 18:50:01 +0000
committerJan Beulich <jbeulich@suse.com>2012-12-04 18:50:01 +0000
commitb535076955fbe0a54b794959eafc9b918adb3629 (patch)
tree26d2b32ae14d19c449d37c238d0ba309c3d93721
parent778b7171ca02e9f6eec3b56d2b23e0691839edf5 (diff)
downloadxen-b535076955fbe0a54b794959eafc9b918adb3629.tar.gz
xen-b535076955fbe0a54b794959eafc9b918adb3629.tar.bz2
xen-b535076955fbe0a54b794959eafc9b918adb3629.zip
xen: fix error handling of guest_physmap_mark_populate_on_demand()
The only user of the "out" label bypasses a necessary unlock, thus enabling the caller to lock up Xen. Also, the function was never meant to be called by a guest for itself, so rather than inspecting the code paths in depth for potential other problems this might cause, and adjusting e.g. the non-guest printk() in the above error path, just disallow the guest access to it. Finally, the printk() (considering its potential of spamming the log, the more that it's not using XENLOG_GUEST), is being converted to P2M_DEBUG(), as debugging is what it apparently was added for in the first place. This is XSA-30 / CVE-2012-5514. Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: George Dunlap <george.dunlap@eu.citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
-rw-r--r--xen/arch/x86/mm/p2m.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index f494d2541d..036848f221 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -2412,6 +2412,9 @@ guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
mfn_t omfn;
int rc = 0;
+ if ( !IS_PRIV_FOR(current->domain, d) )
+ return -EPERM;
+
if ( !paging_mode_translate(d) )
return -EINVAL;
@@ -2430,8 +2433,7 @@ guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
omfn = gfn_to_mfn_query(p2m, gfn + i, &ot);
if ( p2m_is_ram(ot) )
{
- printk("%s: gfn_to_mfn returned type %d!\n",
- __func__, ot);
+ P2M_DEBUG("gfn_to_mfn returned type %d!\n", ot);
rc = -EBUSY;
goto out;
}
@@ -2453,10 +2455,10 @@ guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
BUG_ON(p2m->pod.entry_count < 0);
}
+out:
audit_p2m(p2m, 1);
p2m_unlock(p2m);
-out:
return rc;
}