From: Keir Fraser Date: Thu, 24 Jul 2008 10:18:53 +0000 (+0100) Subject: libxc: Fix after xc_map_foreign_ranges() patch. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14165^2~137 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=28f8960f3e0417f1ba8d916ed2d04778d009aa68;p=xen.git libxc: Fix after xc_map_foreign_ranges() patch. Must munmap() region after loading elf image. Signed-off-by: Keir Fraser --- diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c index f442a791f8..a174b430a1 100644 --- a/tools/libxc/xc_hvm_build.c +++ b/tools/libxc/xc_hvm_build.c @@ -126,19 +126,21 @@ static int loadelfimage( for ( i = 0; i < pages; i++ ) entries[i].mfn = parray[(elf->pstart >> PAGE_SHIFT) + i]; - elf->dest = xc_map_foreign_ranges(xch, dom, pages << PAGE_SHIFT, - PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, - entries, pages); - if (elf->dest == NULL) + elf->dest = xc_map_foreign_ranges( + xch, dom, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, + entries, pages); + if ( elf->dest == NULL ) goto err; /* Load the initial elf image. */ elf_load_binary(elf); rc = 0; + munmap(elf->dest, pages << PAGE_SHIFT); + elf->dest = NULL; + err: - if ( entries ) - free(entries); + free(entries); return rc; } diff --git a/tools/libxc/xc_linux.c b/tools/libxc/xc_linux.c index 6df3e9957d..2480b3ce72 100644 --- a/tools/libxc/xc_linux.c +++ b/tools/libxc/xc_linux.c @@ -123,16 +123,16 @@ void *xc_map_foreign_ranges(int xc_handle, uint32_t dom, privcmd_mmap_entry_t entries[], int nentries) { privcmd_mmap_t ioctlx; - int i, rc; void *addr; addr = mmap(NULL, size, prot, MAP_SHARED, xc_handle, 0); - if (addr == MAP_FAILED) + if ( addr == MAP_FAILED ) goto mmap_failed; - for (i = 0; i < nentries; i++) { - entries[i].va = (uintptr_t)addr + (i * chunksize); + for ( i = 0; i < nentries; i++ ) + { + entries[i].va = (unsigned long)addr + (i * chunksize); entries[i].npages = chunksize >> PAGE_SHIFT; } @@ -141,14 +141,14 @@ void *xc_map_foreign_ranges(int xc_handle, uint32_t dom, ioctlx.entry = entries; rc = ioctl(xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx); - if (rc) + if ( rc ) goto ioctl_failed; return addr; ioctl_failed: rc = munmap(addr, size); - if (rc == -1) + if ( rc == -1 ) ERROR("%s: error in error path\n", __FUNCTION__); mmap_failed: