diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-02-12 09:54:42 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-12 18:48:40 +0100 |
commit | 1e8ba6fba5050ec11bba90c8622aa2ed95ff711f (patch) | |
tree | 4dfc7c1c8a6119648978f25c1065b344123638cb /drivers | |
parent | [PATCH] kvm: Fix mismatch between 32-bit and 64-bit abi (diff) | |
download | linux-1e8ba6fba5050ec11bba90c8622aa2ed95ff711f.tar.xz linux-1e8ba6fba5050ec11bba90c8622aa2ed95ff711f.zip |
[PATCH] kvm: fix vcpu freeing bug
vcpu_load() can return NULL and it sometimes does in failure paths (for
example when the userspace ABI version is too old) - causing a preemption
count underflow in the ->vcpu_free() later on. So check for NULL.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/kvm/kvm_main.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index eb3931ca680a..9b79d3451f6f 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -272,7 +272,9 @@ static void kvm_free_physmem(struct kvm *kvm) static void kvm_free_vcpu(struct kvm_vcpu *vcpu) { - vcpu_load(vcpu->kvm, vcpu_slot(vcpu)); + if (!vcpu_load(vcpu->kvm, vcpu_slot(vcpu))) + return; + kvm_mmu_destroy(vcpu); vcpu_put(vcpu); kvm_arch_ops->vcpu_free(vcpu); |