x86/pvhvm: properly range-check PHYSDEVOP_map_pirq/MAP_PIRQ_TYPE_GSI
authorIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 5 Sep 2012 11:29:52 +0000 (12:29 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 5 Sep 2012 11:29:52 +0000 (12:29 +0100)
This is being used as a array index, and hence must be validated before
use.

This is XSA-16 / CVE-2012-3498.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/physdev.c

index b0458fdec54ffe36c5e2bba3e46a45e1dfd833c8..3aa157f7060d8e0834f679b0f2d062d772052221 100644 (file)
@@ -42,11 +42,18 @@ static int physdev_hvm_map_pirq(
         struct hvm_girq_dpci_mapping *girq;
         uint32_t machine_gsi = 0;
 
+        if ( *index < 0 || *index >= NR_HVM_IRQS )
+        {
+            ret = -EINVAL;
+            break;
+        }
+
         /* find the machine gsi corresponding to the
          * emulated gsi */
         hvm_irq_dpci = domain_get_irq_dpci(d);
         if ( hvm_irq_dpci )
         {
+            BUILD_BUG_ON(ARRAY_SIZE(hvm_irq_dpci->girq) < NR_HVM_IRQS);
             list_for_each_entry ( girq,
                                   &hvm_irq_dpci->girq[*index],
                                   list )