mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
x86, hvm: Fix double-free of vpmu->context
When `opcontrol --shutdown' is called after xenoprof is used on Dom0, the vpmu owner becomes PMU_OWNER_NONE. So it is possible to acquire the owner as PMU_OWNER_HVM and to allocate vpmu->context twice. As a result, the hypervisor panics because of double-alloc/free of vpmu->context. Signed-off-by: Kazuhiro Suzuki <kaz@jp.fujitsu.com>
This commit is contained in:
1 parent
d046c2261f
commit
d532e54c26
2 files changed
+5
-1
No files matched your search
@@ -296,7 +296,8 @@ static int core2_vpmu_msr_common_check(u32 msr_index, int *type, int *index)
|
||||
return 0;
|
||||
|
||||
if ( unlikely(!(vpmu->flags & VPMU_CONTEXT_ALLOCATED)) &&
|
||||
!core2_vpmu_alloc_resource(current) )
|
||||
(vpmu->context != NULL ||
|
||||
!core2_vpmu_alloc_resource(current)) )
|
||||
return 0;
|
||||
vpmu->flags |= VPMU_CONTEXT_ALLOCATED;
|
||||
|
||||
@@ -488,6 +489,7 @@ static void core2_vpmu_destroy(struct vcpu *v)
|
||||
if ( cpu_has_vmx_msr_bitmap )
|
||||
core2_vpmu_unset_msr_bitmap(v->arch.hvm_vmx.msr_bitmap);
|
||||
release_pmu_ownship(PMU_OWNER_HVM);
|
||||
vpmu->flags &= ~VPMU_CONTEXT_ALLOCATED;
|
||||
}
|
||||
|
||||
struct arch_vpmu_ops core2_vpmu_ops = {
|
||||
|
||||
@@ -219,6 +219,8 @@ static void ppro_free_msr(struct vcpu *v)
|
||||
{
|
||||
struct vpmu_struct *vpmu = vcpu_vpmu(v);
|
||||
|
||||
if ( !(vpmu->flags & PASSIVE_DOMAIN_ALLOCATED) )
|
||||
return;
|
||||
xfree(vpmu->context);
|
||||
vpmu->flags &= ~PASSIVE_DOMAIN_ALLOCATED;
|
||||
}
|
||||
|
||||