From bb2407bb2b712b33355d8c3df751bd1ecde1f971 Mon Sep 17 00:00:00 2001 From: Don Slutz Date: Wed, 30 Oct 2013 17:17:24 -0400 Subject: [PATCH 1/2] kexec: v9a -- Fix error handling if do_kimage_alloc() reports an error Signed-off-by: Don Slutz --- xen/common/kimage.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/xen/common/kimage.c b/xen/common/kimage.c index 6bee9cf..f2b331e 100644 --- a/xen/common/kimage.c +++ b/xen/common/kimage.c @@ -179,7 +179,7 @@ static int do_kimage_alloc(struct kexec_image **rimage, paddr_t entry, page_to_maddr(image->control_code_page), page_to_maddr(image->control_code_page)); if ( result < 0 ) - return result; + goto out; /* Add an empty indirection page. */ image->entry_page = kimage_alloc_control_page(image, 0); @@ -188,7 +188,7 @@ static int do_kimage_alloc(struct kexec_image **rimage, paddr_t entry, result = machine_kexec_add_page(image, page_to_maddr(image->entry_page), page_to_maddr(image->entry_page)); if ( result < 0 ) - return result; + goto out; image->head = page_to_maddr(image->entry_page); @@ -510,15 +510,14 @@ static void kimage_free_entry(kimage_entry_t entry) free_domheap_page(page); } -void kimage_free(struct kexec_image *image) +static void kimage_free_all_entries(struct kexec_image *image) { kimage_entry_t *ptr, entry; kimage_entry_t ind = 0; - if ( !image ) + if ( !image->head ) return; - kimage_free_extra_pages(image); for_each_kimage_entry(image, ptr, entry) { if ( entry & IND_INDIRECTION ) @@ -537,8 +536,15 @@ void kimage_free(struct kexec_image *image) /* Free the final indirection page. */ if ( ind & IND_INDIRECTION ) kimage_free_entry(ind); +} - /* Free the kexec control pages. */ +void kimage_free(struct kexec_image *image) +{ + if ( !image ) + return; + + kimage_free_extra_pages(image); + kimage_free_all_entries(image); kimage_free_page_list(&image->control_pages); xfree(image->segments); xfree(image); -- 1.7.11.7