From: Wei Liu Date: Sun, 26 Feb 2017 15:49:32 +0000 (+0000) Subject: x86: fix memory leak in pvh_setup_acpi_xsdt X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~2674 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2f63fa20fa5b040c2a3ecd031ecaa1c62716ad1d;p=xen.git x86: fix memory leak in pvh_setup_acpi_xsdt Switch to use goto style error handling to avoid leaking xsdt. Coverity-ID: 1401535 Signed-off-by: Wei Liu Reviewed-by: Roger Pau Monné Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 1f18f9283f..d74296509a 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -2459,7 +2459,8 @@ static int __init pvh_setup_acpi_xsdt(struct domain *d, paddr_t madt_addr, if ( !xsdt ) { printk("Unable to allocate memory for XSDT table\n"); - return -ENOMEM; + rc = -ENOMEM; + goto out; } /* Copy the native XSDT table header. */ @@ -2467,7 +2468,8 @@ static int __init pvh_setup_acpi_xsdt(struct domain *d, paddr_t madt_addr, if ( !rsdp ) { printk("Unable to map RSDP\n"); - return -EINVAL; + rc = -EINVAL; + goto out; } xsdt_paddr = rsdp->xsdt_physical_address; acpi_os_unmap_memory(rsdp, sizeof(*rsdp)); @@ -2475,7 +2477,8 @@ static int __init pvh_setup_acpi_xsdt(struct domain *d, paddr_t madt_addr, if ( !table ) { printk("Unable to map XSDT\n"); - return -EINVAL; + rc = -EINVAL; + goto out; } xsdt->header = *table; acpi_os_unmap_memory(table, sizeof(*table)); @@ -2505,7 +2508,8 @@ static int __init pvh_setup_acpi_xsdt(struct domain *d, paddr_t madt_addr, if ( pvh_steal_ram(d, size, 0, GB(4), addr) ) { printk("Unable to find guest RAM for XSDT\n"); - return -ENOMEM; + rc = -ENOMEM; + goto out; } /* Mark this region as E820_ACPI. */ @@ -2516,11 +2520,15 @@ static int __init pvh_setup_acpi_xsdt(struct domain *d, paddr_t madt_addr, if ( rc ) { printk("Unable to copy XSDT into guest memory\n"); - return rc; + goto out; } + + rc = 0; + + out: xfree(xsdt); - return 0; + return rc; } static int __init pvh_setup_acpi(struct domain *d, paddr_t start_info)