x86/pv: Fix error handling in dom0_construct_pv()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Mon, 20 May 2019 10:14:01 +0000 (10:14 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 23 May 2019 14:59:00 +0000 (15:59 +0100)
One path in dom0_construct_pv() returns -1 unlike all other error paths.
Switch it to returning -EINVAL.

This was last modified by c/s c84481fb XSA-55, but the bug predates that
series.  However, this patch did (for no obvious reason) introduce a
bifurcated tail to the function with two subtly different elf_check_broken()
clauses.

As the elf_check_broken() is just a warning and doesn't influence the further
boot, fold the exit paths together and use a single clause.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/pv/dom0_build.c

index cef2d42254ebe6564f8f8c3394b0f86f54867958..064a10ed1fe5f9ccde801fee648b8f6ab197e666 100644 (file)
@@ -735,7 +735,7 @@ int __init dom0_construct_pv(struct domain *d,
             mapcache_override_current(NULL);
             switch_cr3_cr4(current->arch.cr3, read_cr4());
             printk("Invalid HYPERCALL_PAGE field in ELF notes.\n");
-            rc = -1;
+            rc = -EINVAL;
             goto out;
         }
         hypercall_page_initialise(
@@ -903,21 +903,15 @@ int __init dom0_construct_pv(struct domain *d,
     rc = dom0_setup_permissions(d);
     BUG_ON(rc != 0);
 
-    if ( elf_check_broken(&elf) )
-        printk(" Xen warning: dom0 kernel broken ELF: %s\n",
-               elf_check_broken(&elf));
-
     if ( d->domain_id == hardware_domid )
         iommu_hwdom_init(d);
 
     v->is_initialised = 1;
     clear_bit(_VPF_down, &v->pause_flags);
 
-    return 0;
-
 out:
     if ( elf_check_broken(&elf) )
-        printk(" Xen dom0 kernel broken ELF: %s\n",
+        printk(XENLOG_WARNING "Dom0 kernel broken ELF: %s\n",
                elf_check_broken(&elf));
 
     return rc;