Commit d72118ce authored by Marcelo Tosatti's avatar Marcelo Tosatti

KVM: properly check max PIC pin in irq route setup

Otherwise memory beyond irq_states[16] might be accessed.

Noticed by Juan Quintela.

Cc: stable@kernel.org
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
Acked-by: default avatarJuan Quintela <quintela@redhat.com>
Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
parent f1d1c309
...@@ -302,6 +302,7 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt, ...@@ -302,6 +302,7 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt,
{ {
int r = -EINVAL; int r = -EINVAL;
int delta; int delta;
unsigned max_pin;
struct kvm_kernel_irq_routing_entry *ei; struct kvm_kernel_irq_routing_entry *ei;
struct hlist_node *n; struct hlist_node *n;
...@@ -322,12 +323,15 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt, ...@@ -322,12 +323,15 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt,
switch (ue->u.irqchip.irqchip) { switch (ue->u.irqchip.irqchip) {
case KVM_IRQCHIP_PIC_MASTER: case KVM_IRQCHIP_PIC_MASTER:
e->set = kvm_set_pic_irq; e->set = kvm_set_pic_irq;
max_pin = 16;
break; break;
case KVM_IRQCHIP_PIC_SLAVE: case KVM_IRQCHIP_PIC_SLAVE:
e->set = kvm_set_pic_irq; e->set = kvm_set_pic_irq;
max_pin = 16;
delta = 8; delta = 8;
break; break;
case KVM_IRQCHIP_IOAPIC: case KVM_IRQCHIP_IOAPIC:
max_pin = KVM_IOAPIC_NUM_PINS;
e->set = kvm_set_ioapic_irq; e->set = kvm_set_ioapic_irq;
break; break;
default: default:
...@@ -335,7 +339,7 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt, ...@@ -335,7 +339,7 @@ static int setup_routing_entry(struct kvm_irq_routing_table *rt,
} }
e->irqchip.irqchip = ue->u.irqchip.irqchip; e->irqchip.irqchip = ue->u.irqchip.irqchip;
e->irqchip.pin = ue->u.irqchip.pin + delta; e->irqchip.pin = ue->u.irqchip.pin + delta;
if (e->irqchip.pin >= KVM_IOAPIC_NUM_PINS) if (e->irqchip.pin >= max_pin)
goto out; goto out;
rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi; rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment