]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid crashes when ':eval' deletes our frame
authorEli Zaretskii <eliz@gnu.org>
Sat, 23 Dec 2017 11:59:07 +0000 (13:59 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 23 Dec 2017 11:59:07 +0000 (13:59 +0200)
* src/xdisp.c (display_mode_element): Signal an error if
':eval' somehow deletes the frame whose window we are
redisplaying. (Bug#29726)

src/xdisp.c

index 538c3e6b87e33b389ded8ac1be57540ff88c2bb7..f6e98daa3290f5a097ae3b0712123f359d88ff07 100644 (file)
@@ -23685,6 +23685,14 @@ display_mode_element (struct it *it, int depth, int field_width, int precision,
              {
                Lisp_Object spec;
                spec = safe__eval (true, XCAR (XCDR (elt)));
+               /* The :eval form could delete the frame stored in the
+                  iterator, which will cause a crash if we try to
+                  access faces and other fields (e.g., FRAME_KBOARD)
+                  on that frame.  This is a nonsensical thing to do,
+                  and signaling an error from redisplay might be
+                  dangerous, but we cannot continue with an invalid frame.  */
+               if (!FRAME_LIVE_P (it->f))
+                 signal_error (":eval deleted the frame being displayed", elt);
                n += display_mode_element (it, depth, field_width - n,
                                           precision - n, spec, props,
                                           risky);