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:
Keir Fraser committed 2009-03-19 10:05:01 +00:00
1 parent d046c2261f
commit d532e54c26
2 files changed
+5 -1

No files matched your search

+3 -1
View File
@@ -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 = {
+2
View File
@@ -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;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.