summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorPip Cet <pipcet@protonmail.com>2026-04-10 11:59:23 +0000
committerPip Cet <pipcet@protonmail.com>2026-04-10 18:16:54 +0000
commitc05037ba1cddb20fee7446c4b2c73deb310b194c (patch)
treee139489f0ec7c254a3a6e8d28d7aa868604e36ca /src/xterm.c
parent2edcc6d4223a2837e594ff83c13832533b5e3ef8 (diff)
Don't continue FOR_EACH_FRAME loops after delete_frame (bug#80789)
* src/xterm.c (x_connection_closed, x_delete_terminal): Restart FOR_EACH_FRAME loops after deleting one (or potentially more) frames.
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 48fb78a6f63..b02380a7171 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -26861,6 +26861,7 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
/* First delete frames whose mini-buffers are on frames
that are on the dead display. */
+ delete_more_minibuffer_frames:
FOR_EACH_FRAME (tail, frame)
{
/* Tooltip frames don't have these, so avoid crashing. */
@@ -26875,12 +26876,16 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
&& FRAME_X_P (XFRAME (minibuf_frame))
&& ! EQ (frame, minibuf_frame)
&& FRAME_DISPLAY_INFO (XFRAME (minibuf_frame)) == dpyinfo)
- delete_frame (frame, Qnoelisp);
+ {
+ delete_frame (frame, Qnoelisp);
+ goto delete_more_minibuffer_frames;
+ }
}
/* Now delete all remaining frames on the dead display.
We are now sure none of these is used as the mini-buffer
for another frame that we need to delete. */
+ delete_more_frames:
FOR_EACH_FRAME (tail, frame)
if (FRAME_X_P (XFRAME (frame))
&& FRAME_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
@@ -26889,6 +26894,7 @@ x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
trying to find a replacement. */
kset_default_minibuffer_frame (FRAME_KBOARD (XFRAME (frame)), Qt);
delete_frame (frame, Qnoelisp);
+ goto delete_more_frames;
}
/* If DPYINFO is null, this means we didn't open the display in the
@@ -32029,13 +32035,17 @@ x_delete_terminal (struct terminal *terminal)
/* Delete all remaining frames on the display that is going away.
Otherwise, font backends assume the display is still up, and
xftfont_end_for_frame crashes. */
+ delete_more_frames:
FOR_EACH_FRAME (tail, frame)
{
f = XFRAME (frame);
if (FRAME_LIVE_P (f) && f->terminal == terminal)
- /* Pass Qnoelisp rather than Qt. */
- delete_frame (frame, Qnoelisp);
+ {
+ /* Pass Qnoelisp rather than Qt. */
+ delete_frame (frame, Qnoelisp);
+ goto delete_more_frames;
+ }
}
#ifdef HAVE_X_I18N