mm: Temporarily disable grub_mm_debug while calling grub_vprintf() in grub_printf()

To prevent infinite recursion when grub_mm_debug is on, disable it when
calling grub_vprintf(). One such call loop is:
  grub_vprintf() -> parse_printf_args() -> parse_printf_arg_fmt() ->
    grub_debug_calloc() -> grub_printf() -> grub_vprintf().

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Glenn Washburn 2022-02-15 12:36:43 -06:00 committed by Daniel Kiper
parent 701295516d
commit a4430355a3

View File

@ -113,10 +113,30 @@ grub_printf (const char *fmt, ...)
va_list ap;
int ret;
#if defined(MM_DEBUG) && !defined(GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
/*
* To prevent infinite recursion when grub_mm_debug is on, disable it
* when calling grub_vprintf(). One such call loop is:
* grub_vprintf() -> parse_printf_args() -> parse_printf_arg_fmt() ->
* grub_debug_calloc() -> grub_printf() -> grub_vprintf().
*/
int grub_mm_debug_save = 0;
if (grub_mm_debug)
{
grub_mm_debug_save = grub_mm_debug;
grub_mm_debug = 0;
}
#endif
va_start (ap, fmt);
ret = grub_vprintf (fmt, ap);
va_end (ap);
#if defined(MM_DEBUG) && !defined(GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
grub_mm_debug = grub_mm_debug_save;
#endif
return ret;
}