mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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@ambarella.com> Signed-off-by: Julien Grall <jgrall@amazon.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
3b368340c4
commit
33bc2a8495
2 files changed
+11
No files matched your search
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||