KVM: fix lock imbalance
PATCH 1/1 KVM: fix lock imbalance
Stanse found 2 lock imbalances in kvm_request_irq_source_id and kvm_free_irq_source_id. They omit to unlock kvm->irq_lock on fail paths.
Fix that by adding unlock labels at the end of the functions and jump there from the fail paths.
Signed-off-by Jiri Slaby <[email protected]>
Cc Avi Kivity <[email protected]>
Cc Marcelo Tosatti <[email protected]>
--- virt/kvm/irq_comm.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-)
virt/kvm/irq_comm.c +5 -2
@@ -220,11 +220,13 @@ int kvm_request_irq_source_id(struct kvm *kvm)if (irq_source_id >=sizeof (kvm->arch.irq_sources_bitmap)) {printk (KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n" ); -return -EFAULT ; + irq_source_id = -EFAULT ; + goto unlock; }ASSERT (irq_source_id !=KVM_USERSPACE_IRQ_SOURCE_ID );set_bit (irq_source_id, bitmap); +unlock:mutex_unlock (&kvm->irq_lock);return irq_source_id;
@@ -240,7 +242,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)if (irq_source_id <0 || irq_source_id >=sizeof (kvm->arch.irq_sources_bitmap)) {printk (KERN_ERR "kvm: IRQ source ID out of range!\n" ); -return ; + goto unlock; }for (i =0 ; i <KVM_IOAPIC_NUM_PINS ; i++) {clear_bit (irq_source_id, &kvm->arch.vioapic->irq_states[i]);
@@ -251,6 +253,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)#endif }clear_bit (irq_source_id, &kvm->arch.irq_sources_bitmap); +unlock:mutex_unlock (&kvm->irq_lock); }
Signature · 1 line
1.6.4.2
Avi Kivity
AppliedQuoted 6 lines · Jiri Slaby
Stanse found 2 lock imbalances in
kvm_request_irq_source_idandkvm_free_irq_source_id. They omit to unlockkvm->irq_lockon fail paths.Fix that by adding unlock labels at the end of the functions and jump there from the fail paths.
Applied, thanks.
Signature · 1 line
Do not meddle in the internals of kernels, for they are subtle and quick to panic.