From: Jan Beulich Date: Tue, 3 Jun 2014 14:11:52 +0000 (+0200) Subject: x86/HVM: eliminate vulnerabilities from hvm_inject_msi() X-Git-Tag: 4.2.5-rc1~3 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=46345224b938cd17e2440380b7430f86e93a3424;p=xen.git x86/HVM: eliminate vulnerabilities from hvm_inject_msi() - pirq_info() returns NULL for a non-allocated pIRQ, and hence we mustn't unconditionally de-reference it, and we need to invoke it another time after having called map_domain_emuirq_pirq() - don't use printk(), namely without XENLOG_GUEST, for error reporting This is XSA-96. Signed-off-by: Jan Beulich master commit: 6f4cc0ac41625a054861b417ea1fc3ab88e2e40a master date: 2014-06-03 15:17:14 +0200 --- diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index f44f3b957e..87f656dce2 100644 --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -289,20 +289,18 @@ void hvm_inject_msi(struct domain *d, uint64_t addr, uint32_t data) struct pirq *info = pirq_info(d, pirq); /* if it is the first time, allocate the pirq */ - if (info->arch.hvm.emuirq == IRQ_UNBOUND) + if ( !info || info->arch.hvm.emuirq == IRQ_UNBOUND ) { spin_lock(&d->event_lock); map_domain_emuirq_pirq(d, pirq, IRQ_MSI_EMU); spin_unlock(&d->event_lock); + info = pirq_info(d, pirq); + if ( !info ) + return; } else if (info->arch.hvm.emuirq != IRQ_MSI_EMU) - { - printk("%s: pirq %d does not correspond to an emulated MSI\n", __func__, pirq); return; - } send_guest_pirq(d, info); return; - } else { - printk("%s: error getting pirq from MSI: pirq = %d\n", __func__, pirq); } }