From 3de8ed09ab46b9922e15aaf0cc8884b41087c996 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 10 Jun 2023 11:48:37 +0300 Subject: [PATCH] Avoid infinite recursion in 'window_wants_header_line' * src/window.c (null_header_line_format): Avoid infinite recursion by disallowing :eval on recursive calls. (Bug#63988) --- src/window.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/window.c b/src/window.c index 3802efb992a..e22fea0bb7a 100644 --- a/src/window.c +++ b/src/window.c @@ -5470,6 +5470,7 @@ window_wants_mode_line (struct window *w) && WINDOW_PIXEL_HEIGHT (w) > WINDOW_FRAME_LINE_HEIGHT (w)); } +static int header_line_eval_called = 0; /** * null_header_line_format: @@ -5497,9 +5498,18 @@ null_header_line_format (Lisp_Object fmt, struct frame *f) { if (EQ (car, QCeval)) { + if (header_line_eval_called > 0) + return false; + eassert (header_line_eval_called == 0); + header_line_eval_called++; val = safe_eval_inhibit_quit (XCAR (XCDR (fmt))); + header_line_eval_called--; + eassert (header_line_eval_called == 0); if (!FRAME_LIVE_P (f)) - signal_error (":eval deleted the frame being displayed", fmt); + { + header_line_eval_called = 0; + signal_error (":eval deleted the frame being displayed", fmt); + } return NILP (val); } val = find_symbol_value (car); -- 2.39.2