]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid putting a dead buffer in the minibuffer window (Bug#72487)
authorMartin Rudalics <rudalics@gmx.at>
Fri, 23 Aug 2024 08:27:12 +0000 (10:27 +0200)
committerEshel Yaron <me@eshelyaron.com>
Wed, 4 Sep 2024 07:51:25 +0000 (09:51 +0200)
* src/minibuf.c (minibuffer_unwind): Make sure that the buffer
referenced by the first element of the list of previous buffers
of the minibuffer window is live before assigning it to the
minibuffer window (Bug#72487).
* src/window.c (set_window_buffer): Assert that BUFFER is live.

(cherry picked from commit 25f537216682eecedf3905c4e005f02be007ed9c)

src/minibuf.c
src/window.c

index d4a05e55bbac0ccf9ba0c4c9681fe6cbaa49d2e6..2865e3ede570434b3794b13f88fffeadb8bb3c58 100644 (file)
@@ -59,7 +59,7 @@ EMACS_INT minibuf_level;
 
 Lisp_Object last_minibuf_string;
 
-/* The frame containinug the most recently opened Minibuffer.  This is
+/* The frame containing the most recently opened minibuffer.  This is
    used only when `minibuffer-follows-selected-frame' is neither nil
    nor t.  */
 
@@ -1179,27 +1179,36 @@ static void
 minibuffer_unwind (void)
 {
   struct frame *f;
-  struct window *w;
-  Lisp_Object window;
-  Lisp_Object entry;
 
   if (NILP (exp_MB_frame)) return; /* "Can't happen." */
   f = XFRAME (exp_MB_frame);
-  window = f->minibuffer_window;
-  w = XWINDOW (window);
   if (FRAME_LIVE_P (f))
     {
-      /* minibuf_window = sf->minibuffer_window; */
-      if (!NILP (w->prev_buffers))
+      Lisp_Object window = f->minibuffer_window;
+
+      if (WINDOW_LIVE_P (window))
        {
-         entry = Fcar (w->prev_buffers);
-         w->prev_buffers = Fcdr (w->prev_buffers);
-         set_window_buffer (window, Fcar (entry), 0, 0);
-         Fset_window_start (window, Fcar (Fcdr (entry)), Qnil);
-         Fset_window_point (window, Fcar (Fcdr (Fcdr (entry))));
+         struct window *w = XWINDOW (window);
+
+         /* minibuf_window = sf->minibuffer_window; */
+         if (!NILP (w->prev_buffers))
+           {
+             Lisp_Object entry = Fcar (w->prev_buffers);
+
+             if (BUFFERP (Fcar (entry))
+                 && BUFFER_LIVE_P (XBUFFER (Fcar (entry))))
+               {
+                 wset_prev_buffers (w, Fcdr (w->prev_buffers));
+                 set_window_buffer (window, Fcar (entry), 0, 0);
+                 Fset_window_start (window, Fcar (Fcdr (entry)), Qnil);
+                 Fset_window_point (window, Fcar (Fcdr (Fcdr (entry))));
+               }
+             else
+               set_window_buffer (window, nth_minibuffer (0), 0, 0);
+           }
+         else
+           set_window_buffer (window, nth_minibuffer (0), 0, 0);
        }
-      else
-       set_window_buffer (window, nth_minibuffer (0), 0, 0);
     }
 }
 
index 559919689a3905a1daec1ce631086c1d8ecd3164..35092ddd582eb7e103b46029597e1012307813cd 100644 (file)
@@ -4230,6 +4230,9 @@ set_window_buffer (Lisp_Object window, Lisp_Object buffer,
   specpdl_ref count = SPECPDL_INDEX ();
   bool samebuf = EQ (buffer, w->contents);
 
+  /* It's never OK to assign WINDOW a dead buffer.  */
+  eassert (BUFFER_LIVE_P (b));
+
   wset_buffer (w, buffer);
 
   if (EQ (window, selected_window))