[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] xen/gunzip: Allow perform_gunzip() to be called multiple times
commit 33bc2a8495f755510f63629ed3f011134416310c Author: Julien Grall <jgrall@xxxxxxxxxx> AuthorDate: Wed Mar 3 19:27:56 2021 +0000 Commit: Julien Grall <jgrall@xxxxxxxxxx> CommitDate: Tue Apr 6 19:30:33 2021 +0100 xen/gunzip: Allow perform_gunzip() to be called multiple times Currently perform_gunzip() can only be called once because the the internal state (e.g allocate) is not fully re-initialized. This works fine if you are only booting dom0. But this will break when booting multiple using the dom0less that uses compressed kernel images. This can be resolved by re-initializing bytes_out, malloc_ptr, malloc_count every time perform_gunzip() is called. Note the latter is only re-initialized for hardening purpose as there is no guarantee that every malloc() are followed by free() (It should in theory!). Take the opportunity to check the return of alloc_heap_pages() to return an error rather than dereferencing a NULL pointer later on failure. Reported-by: Charles Chiou <cchiou@xxxxxxxxxxxxx> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/common/gunzip.c | 5 +++++ xen/common/inflate.c | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/xen/common/gunzip.c b/xen/common/gunzip.c index db4efcd34b..425d64e904 100644 --- a/xen/common/gunzip.c +++ b/xen/common/gunzip.c @@ -114,11 +114,16 @@ __init int perform_gunzip(char *output, char *image, unsigned long image_len) window = (unsigned char *)output; free_mem_ptr = (unsigned long)alloc_xenheap_pages(HEAPORDER, 0); + if ( !free_mem_ptr ) + return -ENOMEM; + free_mem_end_ptr = free_mem_ptr + (PAGE_SIZE << HEAPORDER); + init_allocator(); inbuf = (unsigned char *)image; insize = image_len; inptr = 0; + bytes_out = 0; makecrc(); diff --git a/xen/common/inflate.c b/xen/common/inflate.c index f99c985d61..d8c28a3e95 100644 --- a/xen/common/inflate.c +++ b/xen/common/inflate.c @@ -238,6 +238,12 @@ STATIC const ush mask_bits[] = { static unsigned long INITDATA malloc_ptr; static int INITDATA malloc_count; +static void init_allocator(void) +{ + malloc_ptr = free_mem_ptr; + malloc_count = 0; +} + static void *INIT malloc(int size) { void *p; -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |