xen: make xen loader callable multiple times
The loader for xen paravirtualized environment isn't callable multiple times as it won't free any memory in case of failure. Call grub_relocator_unload() as other modules do it before allocating a new relocator or when unloading the module. Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
a620876e3b
commit
4231927e44
1 changed files with 19 additions and 8 deletions
|
@ -316,11 +316,23 @@ grub_xen_boot (void)
|
||||||
xen_inf.virt_base);
|
xen_inf.virt_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
grub_xen_reset (void)
|
||||||
|
{
|
||||||
|
grub_memset (&next_start, 0, sizeof (next_start));
|
||||||
|
xen_module_info_page = NULL;
|
||||||
|
n_modules = 0;
|
||||||
|
|
||||||
|
grub_relocator_unload (relocator);
|
||||||
|
relocator = NULL;
|
||||||
|
loaded = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_xen_unload (void)
|
grub_xen_unload (void)
|
||||||
{
|
{
|
||||||
|
grub_xen_reset ();
|
||||||
grub_dl_unref (my_mod);
|
grub_dl_unref (my_mod);
|
||||||
loaded = 0;
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,10 +415,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
|
||||||
grub_loader_unset ();
|
grub_loader_unset ();
|
||||||
|
|
||||||
grub_memset (&next_start, 0, sizeof (next_start));
|
grub_xen_reset ();
|
||||||
|
|
||||||
xen_module_info_page = NULL;
|
|
||||||
n_modules = 0;
|
|
||||||
|
|
||||||
grub_create_loader_cmdline (argc - 1, argv + 1,
|
grub_create_loader_cmdline (argc - 1, argv + 1,
|
||||||
(char *) next_start.cmd_line,
|
(char *) next_start.cmd_line,
|
||||||
|
@ -503,16 +512,18 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
/* grub_errno might be clobbered by further calls, save the error reason. */
|
||||||
|
err = grub_errno;
|
||||||
|
|
||||||
if (elf)
|
if (elf)
|
||||||
grub_elf_close (elf);
|
grub_elf_close (elf);
|
||||||
else if (file)
|
else if (file)
|
||||||
grub_file_close (file);
|
grub_file_close (file);
|
||||||
|
|
||||||
if (grub_errno != GRUB_ERR_NONE)
|
if (err != GRUB_ERR_NONE)
|
||||||
loaded = 0;
|
grub_xen_reset ();
|
||||||
|
|
||||||
return grub_errno;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
|
|
Loading…
Reference in a new issue