]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crash after X error
authorPo Lu <luangruo@yahoo.com>
Sat, 24 Dec 2022 06:14:51 +0000 (14:14 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 24 Dec 2022 06:15:04 +0000 (14:15 +0800)
* src/xdisp.c (redisplay_internal): Catch another crash if
gcscrollbars after an X error.

src/xdisp.c

index 06c8b7730cdbe414e50dbd895f4d9b959294724d..4e5250486f5a44e5dce2b4806563ffb823724539 100644 (file)
@@ -16838,6 +16838,13 @@ redisplay_internal (void)
                /* Only GC scrollbars when we redisplay the whole frame.  */
                = f->redisplay || !REDISPLAY_SOME_P ();
              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
                 the ones we want when we redisplay their windows.  */
              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))
                {
-
                  /* Don't allow freeing images and faces for this
                     frame as long as the frame's update wasn't
                     completed.  This prevents crashes when some Lisp
@@ -16861,10 +16867,6 @@ redisplay_internal (void)
              else if (!REDISPLAY_SOME_P ())
                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
                 nuked should now go away.  */
              if (gcscrollbars && FRAME_TERMINAL (f)->judge_scroll_bars_hook)