From: Glenn Washburn Date: Tue, 15 Feb 2022 18:36:43 +0000 (-0600) Subject: mm: Temporarily disable grub_mm_debug while calling grub_vprintf() in grub_printf() X-Git-Tag: grub-2.12-rc1~476 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4430355a3237fc756480349e9167667b0e89476;p=thirdparty%2Fgrub.git 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 Reviewed-by: Daniel Kiper --- diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index de40f566d..18bde5d50 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -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; }