]> xenbits.xensource.com Git - xen.git/commitdiff
x86, hvm: Fix double-free of vpmu->context
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 19 Mar 2009 10:05:01 +0000 (10:05 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 19 Mar 2009 10:05:01 +0000 (10:05 +0000)
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>
xen/arch/x86/hvm/vmx/vpmu_core2.c
xen/arch/x86/oprofile/op_model_ppro.c

index 240f1bf7baedccb74f7f18fd5fa4b34decc3ebe1..37054f22ebf327d5d59ec9b7ec5eca57de1555c8 100644 (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 = {
index 90b5d2887a1dc434d770251b40755647b7d901c0..0dc962dfe6b004c7db2a860c95aa45de5d71de0e 100644 (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;
 }