diff options
author | Glenn Washburn <development@efficientek.com> | 2022-02-15 12:36:43 -0600 |
---|---|---|
committer | Daniel Kiper <daniel.kiper@oracle.com> | 2022-03-07 15:26:21 +0100 |
commit | a4430355a3237fc756480349e9167667b0e89476 (patch) | |
tree | 0370c0fa2637656f20da790d576749b7862d8d35 | |
parent | 701295516d0bd50d101d5b7ddeac16849ae53163 (diff) | |
download | grub-a4430355a3237fc756480349e9167667b0e89476.tar.gz |
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>
-rw-r--r-- | grub-core/kern/misc.c | 20 |
1 files changed, 20 insertions, 0 deletions
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; } |