normal/main: Unregister commands on module unload

When the normal module is loaded, the normal and normal_exit commands
are registered but aren't unregistered when the module is unloaded. We
need to add calls to grub_unregister_command() when unloading the module
for these commands.

Fixes: CVE-2025-61663
Fixes: CVE-2025-61664

Reported-by: Alec Brown <alec.r.brown@oracle.com>
Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Alec Brown 2025-08-21 21:14:07 +00:00 committed by Daniel Kiper
parent 8ed78fd9f0
commit 05d3698b8b

View File

@ -510,7 +510,7 @@ grub_mini_cmd_clear (struct grub_command *cmd __attribute__ ((unused)),
return 0; return 0;
} }
static grub_command_t cmd_clear; static grub_command_t cmd_clear, cmd_normal, cmd_normal_exit;
static void (*grub_xputs_saved) (const char *str); static void (*grub_xputs_saved) (const char *str);
static const char *features[] = { static const char *features[] = {
@ -554,10 +554,10 @@ GRUB_MOD_INIT(normal)
grub_env_export ("pager"); grub_env_export ("pager");
/* Register a command "normal" for the rescue mode. */ /* Register a command "normal" for the rescue mode. */
grub_register_command ("normal", grub_cmd_normal, cmd_normal = grub_register_command ("normal", grub_cmd_normal,
0, N_("Enter normal mode.")); 0, N_("Enter normal mode."));
grub_register_command ("normal_exit", grub_cmd_normal_exit, cmd_normal_exit = grub_register_command ("normal_exit", grub_cmd_normal_exit,
0, N_("Exit from normal mode.")); 0, N_("Exit from normal mode."));
/* Reload terminal colors when these variables are written to. */ /* Reload terminal colors when these variables are written to. */
grub_register_variable_hook ("color_normal", NULL, grub_env_write_color_normal); grub_register_variable_hook ("color_normal", NULL, grub_env_write_color_normal);
@ -599,4 +599,6 @@ GRUB_MOD_FINI(normal)
grub_register_variable_hook ("color_highlight", NULL, NULL); grub_register_variable_hook ("color_highlight", NULL, NULL);
grub_fs_autoload_hook = 0; grub_fs_autoload_hook = 0;
grub_unregister_command (cmd_clear); grub_unregister_command (cmd_clear);
grub_unregister_command (cmd_normal);
grub_unregister_command (cmd_normal_exit);
} }