Fix crash after X error

* src/xdisp.c (redisplay_internal): Catch another crash if
gcscrollbars after an X error.
This commit is contained in:
Po Lu 2022-12-24 14:14:51 +08:00
parent 9a3b08061f
commit 0e39ad6fa5

View file

@ -16838,6 +16838,13 @@ redisplay_internal (void)
/* Only GC scrollbars when we redisplay the whole frame. */ /* Only GC scrollbars when we redisplay the whole frame. */
= f->redisplay || !REDISPLAY_SOME_P (); = f->redisplay || !REDISPLAY_SOME_P ();
bool f_redisplay_flag = f->redisplay; bool f_redisplay_flag = f->redisplay;
/* The X error handler may have deleted that frame
before we went back to retry_frame. This must come
before any accesses to f->terminal. */
if (!FRAME_LIVE_P (f))
continue;
/* Mark all the scroll bars to be removed; we'll redeem /* Mark all the scroll bars to be removed; we'll redeem
the ones we want when we redisplay their windows. */ the ones we want when we redisplay their windows. */
if (gcscrollbars && FRAME_TERMINAL (f)->condemn_scroll_bars_hook) if (gcscrollbars && FRAME_TERMINAL (f)->condemn_scroll_bars_hook)
@ -16845,7 +16852,6 @@ redisplay_internal (void)
if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f)) if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f))
{ {
/* Don't allow freeing images and faces for this /* Don't allow freeing images and faces for this
frame as long as the frame's update wasn't frame as long as the frame's update wasn't
completed. This prevents crashes when some Lisp completed. This prevents crashes when some Lisp
@ -16861,10 +16867,6 @@ redisplay_internal (void)
else if (!REDISPLAY_SOME_P ()) else if (!REDISPLAY_SOME_P ())
f->redisplay = true; f->redisplay = true;
/* The X error handler may have deleted that frame. */
if (!FRAME_LIVE_P (f))
continue;
/* Any scroll bars which redisplay_windows should have /* Any scroll bars which redisplay_windows should have
nuked should now go away. */ nuked should now go away. */
if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook) if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook)