aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Washburn <development@efficientek.com>2022-02-15 12:36:43 -0600
committerDaniel Kiper <daniel.kiper@oracle.com>2022-03-07 15:26:21 +0100
commita4430355a3237fc756480349e9167667b0e89476 (patch)
tree0370c0fa2637656f20da790d576749b7862d8d35
parent701295516d0bd50d101d5b7ddeac16849ae53163 (diff)
downloadgrub-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.c20
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;
}