diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-02-12 03:54:42 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-12 12:48:40 -0500 |
commit | 1e8ba6fba5050ec11bba90c8622aa2ed95ff711f (patch) | |
tree | 4dfc7c1c8a6119648978f25c1065b344123638cb | |
parent | 8cd133073f9b5cd335c0b2e4740aceb025d50ca9 (diff) |
[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>
-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) | |||
272 | 272 | ||
273 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) | 273 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) |
274 | { | 274 | { |
275 | vcpu_load(vcpu->kvm, vcpu_slot(vcpu)); | 275 | if (!vcpu_load(vcpu->kvm, vcpu_slot(vcpu))) |
276 | return; | ||
277 | |||
276 | kvm_mmu_destroy(vcpu); | 278 | kvm_mmu_destroy(vcpu); |
277 | vcpu_put(vcpu); | 279 | vcpu_put(vcpu); |
278 | kvm_arch_ops->vcpu_free(vcpu); | 280 | kvm_arch_ops->vcpu_free(vcpu); |